📌 스레드

프로세스를 구성하는 실행의 흐름 단위다.
하나의 프로세스는 여러 개의 스레드를 생성하여 병렬 또는 동시 실행을 수행 할 수 있다.

 

1️⃣ 스레드의 개념

스레드는 운영체제에서 최소 실행 단위로 간주되고, '프로세스'내에서 실행되는 서브 작업( Subtask )이다.

모든 쓰레드는 동일한 메모리 공간(= 주소공간)을 공유한다.

 

2️⃣ 스레드의 유형

  1. 커널 스레드( Kernel Thread )
    • 운영 체제가 직접 관리하는 스레드
    • 커널이 스케줄링을 담당하며, 시스템 호출을 통해 생성 및 관리한다.
    • 커널 모드에서 실행되므로 성능 오버헤드가 발생할 수 있다.
  2. 사용자 스레드( User Thread )
    • 사용자 수준에서 관리되는 스레드
    • 커널의 개입 없이 사용자 프로그램이 직접 스레드를 생성 및 관리한다.
    • 커널이 관여하지 않아서 문맥 전환 비용이 낮다
    • 하지만 커널이 단일 스레드로 인식해서 한 스레드가 블록되면 전체 프로그램이 멈출 수 있다.

3️⃣ 스레드의 장점과 단점

 ✅ 장점

  • 프로세스보다 가볍고, 프로세스 문맥 전환에 비해 스레드 문맥 전환이 비용이 적다.
  • 동일한 프로세스 내에서 메모리 및 자원을 공유하여 효율적인 데이터 교환이 가능하다.

 ❌ 단점

  • 여러 스레드가 동일한 자원에 접근하면 데이터 충돌이 발생할 수 있다.
  • 과도한 스레드 생성 시 문맥 전환 비용이 증가하여 성능이 저하 될 수 있다.

📌스레드 자원

1️⃣ 스레드가 공유하는 자원

앞서 언급한대로 스레드는 같은 프로세스에 속하기 때문에 메모리 공간과 일부 시스템 자원을 공유한다.

  1. 코드( Code ) 영역
  2. 데이터( Data ) 영역
  3. 힙( Heap ) 영역
  4. 파일 디스크립터

위 4가지를 프로세스 내에서 스레드들이 모두 공유한다.

2️⃣ 스레드가 독립적으로 가지는 자원

  1. 레지스터
  2. 스택

정리

자원 공유 여부 설명
코드 영역 ✅ 공유 모든 스레드가 같은 명령어 실행 가능
데이터 영역 ✅ 공유 전역 변수, static 변수
힙 영역 ✅ 공유 malloc(), new 로 할당한 동적 메모리
파일 디스크립터 ✅ 공유 파일, 소켓, 파이프 공유
레지스터 ❌ 독립 프로그램 카운터, 스택 포인터 등
스택 ❌ 독립 지역 변수, 함수 호출 정보

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 동기화  (0) 2025.02.12
[CS] CPU 스케줄링  (0) 2025.02.11
[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10

📌 프로세스 계층구조

Windows 운영체제에서는 프로세스가 계층 구조를 가지지 않지만,
다른 수 많은 운영체제는 프로세스가 계층 구조를 가지기 때문에 알아둬야 할 필요가 있다.

 

⚠️ 아래 내용은 Winsdows 운영체제는 해당 하지 않음


✅ 운영체제에서 부모-자식 관계를 기반으로 트리( Tree ) 구조를 형성하는 방식이다.

  • 모든 프로세스는 부모 프로세스에 의해 생성되고, 새로 생성된 프로세스는 자식 프로세스가 된다.
  • 최상위 부모는 init( 또는 systemd ) 프로세스( PID 1 )
  • 계층 구조는 ps 명령어나 pstree 명령어를 사용해 확인이 가능하다.
  • 부모 프로세스와 자식 프로세스는 엄연히 다른 프로세스라서 각기 다른 PID를 가진다. ( 일부 운영체제에서는 자식 프로세스의 PCB에 부모 프로세스의 PID인 PPID( Parent PID )가 기록되기도 한다.

📌 프로세스 생성 기법

부모 프로세스가 자식 프로세스를 어떻게 만들어 내고, 자식 프로세스는 어떻게 자신만의 코드를 실행하는지 알아보자

 

부모 프로세스를 통해 생성된 자식 프로세스들은 복제와 옷 갈아입기를 통해 실행된다.

📝 1. fork()를 이용한 계층 구조 유지( 복제 )

fork()는 현재 실행 중인 프로세스를 복제하여 새로운 자식 프로세를 생성한다.

  • 부모 프로세스가 fork()를 호출하면, 자식 프로세스가 생성되며 부모-자식 관계가 유지된다.
  • 자식 프로세스는 부모의 메모리 공간을 복사하지만, 독립적으로 실행된다.
  • 자식 프로세스는 새로운 PID를 가지고, 부모의 PID를 PPID로 가진다.

📝 2. exec()을 이용한 새로운 프로그램 실행( 옷 갈아 입기 )

exec()는 새로운 프로그램을 실행하며, 기존 프로세스의 주소 공간을 새로운 프로그램으로 교체한다.

  • fork() 후 exec()을 호출하면 새로운 프로세스를 생성하면서 새로운 프로그램으로 실행이 가능하다.
  • 자식 프로세스는 기존 부모 프로세스와 계층 구조를 유지하지만, 실행 코드가 변경된다.

'CS > 혼공컴운' 카테고리의 다른 글

[CS] CPU 스케줄링  (0) 2025.02.11
[CS] 스레드  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10
[CS] 문맥 교환  (0) 2025.02.10

📌 sleep() 함수란

sleep 함수는 Windows API에서 제공하는 함수로, 현재 실행 중인 쓰레드를 일정 시간 동안 일시 중지 상태로 만들고,
CPU를 다른 쓰레드에게 양보( Yield )하도록 한다.
#include <windows.h>

int main() {
    printf("쓰레드 1초 재우기\n");
    Sleep(1000);  // 1000ms 동안 현재 쓰레드가 대기
    printf("쓰레드 깨어남\n");
    return 0;
}

 

sleep(1000) : 현재 쓰레드를 1000ms( 1초 ) 동안 멈춤
sleep(0) : 현재 쓰레드의 남은 타임 슬라이스를 포기하고, 우선순위가 같은 쓰레드로 CPU 할당을 넘긴다.

 

'CS' 카테고리의 다른 글

[cs] 문자열 상수  (0) 2025.02.23
[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23
[CS] 디스패처( Dispatcher )  (0) 2025.02.11
[CS] 디자인 패턴  (0) 2024.11.11
[CS] IP 주소의 체계, 사설망, 공인망  (0) 2024.10.07

📌 디스패처

디스패처는 CPU 스케줄러에 의해 선택된 프로세스를 실행 상태( Running )로 전환하는 역할을 수행한다.
즉, 준비( Ready ) 큐에 있는 프로세스가 CPU를 할당받아 실행되는 과정을 담당한다.

 

프로세스가 준비 상태에서 실행 상태로 전환되는 것을 '디스패치'라 한다.

📌주요 기능

1️⃣ 문맥 복원( Context Restoration )

  • CPU가 이전에 다른 프로세스를 실행 중이었다면, 새롭게 실행될 프로세스의 PCB를 로드한다.

2️⃣ CPU 모드 전환( User Mode 전환 )

  • 운영체제는 일반적으로 '커널 모드'에서 실행되지만, 일반 프로세스는 '사용자 모드'에서 실행된다.
  • 디스패처는 CPU 모드를 커널 모드에서 사용자 모드( User Mode )로 전환하여 프로세스를 실행할 수 있도록 한다.

3️⃣ 프로그램 카운터( PC, Program Counter ) 설정

  • 실행할 프로세스의 PCB에서 프로그램 카운터의 값을 읽어와 CPU에 설정해준다.
  • 프로그램 카운터는 프로세스가 마지막으로 실행되던 명령어의 위치를 가리키는 레지스터다.

4️⃣ 프로세스 실행( CPU 제어권 넘김 )

  • CPU가 해당 프로세스를 실행하도록 제어권을 넘긴다.
  • 프로세스가 실행 상태로 전환된다.

📌 디스패처의 동작 과정

🔹 단계 1 : 스케줄러가 실행할 프로세스 선택

  • 운영체제의 CPU 스케줄러가 준비 큐에서 실행할 프로세스를 선택한다.

🔹 단계 2 : 문맥( Context ) 복원 및 CPU 설정

  1. 디스패처가 선택된 프로세스의 PCB 정보를 로드
    • PCB에서 CPU 레지스터, 프로그램 카운터, 스택 포인터 값을 복원
    • 이전에 수행하던 명령어 위치를 CPU에 설정
  2. CPU 모드를 커널 모드에서 사용자 모드로 전환

🔹 단계 3 : 실행 상태로 전환 및 프로세스 시작

  1. 디스패처가 CPU의 제어권을 프로세스에 넘긴다.
  2. 프로세스가 실행( Running ) 상태로 전환되어 명령어 수행 시작

✅ 이제 프로세스가 CPU를 점유하고 실행을 시작한다고 볼 수 있다.

'CS' 카테고리의 다른 글

[CS] 빅 엔디안, 리틀 엔디안  (0) 2025.02.23
[CS] sleep 함수  (0) 2025.02.11
[CS] 디자인 패턴  (0) 2024.11.11
[CS] IP 주소의 체계, 사설망, 공인망  (0) 2024.10.07
[CS] 랜카드, MAC 주소  (0) 2024.10.02
프로세스는 실행되는 동안 CPU 스케줄링, I/O 대기, 실행 중단 등의 다양한 상황을 거친다.
운영체제는 이러한 상황을 효과적으로 관리하기 위해 프로세스의 상태를 PCB를 통해 인식하고 관리한다.

 

📌  프로세스의 주요 상태

운영체제마다 다소 차이는 있지만, 일반적으로 프로세스는 다음과 같은 상태를 가진다.

 

1️⃣ 생성 상태( New )

  • 프로세스가 생성되고, 이제 막 메모리에 적재되어 PCB를 할당 받은 상태를 말한다.
  • 생성 상태를 거쳐, 실행 준비가 완료된 프로세스는 곧바로 실행되지는 않고, 준비 상태가 되어 CPU의 할당을 기다린다.

2️⃣ 준비 상태( Ready )

  • CPU를 할당받아 실행할 수 있지만, 아직 할당받지 못한 상태를 말한다.
  • 여러개의 프로세스가 동시에 준비 상태가 될 수 있고, 운영체제의 스케줄러( Scheduler )가 이들 중 하나를 선택하여 실행한다.

3️⃣ 실행 상태( Running )

  • CPU를 할당받아 실행 중인 상태를 말한다.
  • 실행 상태인 프로세스는 할당된 일정 시간 동안만 CPU를 사용할 수 있다.
  • 할당된 시간을 모두 사용하면 다시 준비 상태가 되고, 실행 도중 입출력장치를 사용하면 입출력 작업이 끝날때까지 대기 상태가 된다.

4️⃣ 대기 상태( Waiting / Blocked )

  • 프로세스가 실행되던 중 I/O 작업( 예: 디스크 읽기, 네트워크 요청 )이 발생하거나 특정 이벤트( 예: 동기화 변수 )가 발생하면 대기하는 상태를 말한다.
  • 입출력 완료 인터럽트를 받을 때까지 대기하고, 이 동안은 CPU를 점유하지 않는다.
  • 입출력 완료 인터럽트를 받아 I/O 요청이 완료되면 다시 준비 상태가 된다.

5️⃣ 종료 상태( Terminated )

  • 프로세스가 실행을 완료하거나, 오류 또는 강제 종료에 의해 더 이상 실행되지 않는 상태를 말한다.
  • 운영체제는 종료된 프로세스의 메모리 및 리소스를 해제하고, PCB를 정리한다.

📌 프로세스 상태 전이( State Transition )

프로세스는 실행 중 다음과 같은 상태 변화를 겪는다.

 

1️⃣ 생성 ▶ 준비 ( New ▶ Ready )

  • 새로운 프로세스가 생성되면, 실행을 위해 준비 상태( Ready )로 이동한다.

2️⃣ 준비 ▶ 실행 ( Ready ▶ Running )

  • CPU 스케줄러가 준비 상태에 있는 프로세스 중 하나를 선택하여 CPU를 할당하면 실행 상태( Running )로 이동한다.

3️⃣ 실행 ▶ 준비 ( Running ▶ Ready )

  • 프로세스가 CPU 시간을 초과했거나, 우선순위가 높은 다른 프로세스가 스케줄링될 경우 다시 준비 상태( Ready )로 이동한다.

4️⃣ 실행 ▶ 대기 ( Running ▶ Waiting )

  • 프로세스가 I/O 요청으로 인해 CPU 사용을 중단해야 할 경우, 대기 상태( Waiting )로 이동한다.

5️⃣ 대기 ▶ 준비 ( Waiting ▶ Ready )

  • 대기 상태에 있던 프로세스가 I/O 작업이 완료되거나 필요한 이벤트가 발생하면, 다시 준비 상태( Ready )로 이동한다.

6️⃣ 실행 ▶ 종료 ( Running ▶ Terminated )

  • 프로세스가 정상적으로 실행을 마치거나, 오류 또는 강제 종료되면 종료 상태( Terminated )로 이동한다.

📌 추가적인 프로세스 상태

중단 상태( Suspended )

프로세스가 일시적으로 메모리에서 제거되고 보조 저장장치( 디스크 등 )에 저장된 상태를 말한다.
  • 메모리에서 프로세스가 제거된 상태( 보조 기억장치로 스왑됨 )
  • CPU를 포함한 모든 자원을 사용하지 않는다.
  • 운영체제가 직접 상태를 변경한다.

중단 상태( Suspended ) 상태가 필요한 이유

일반적인 프로세스 상태( Running, Ready, Waiting )와 달리, Suspended 상태는 프로세스가 '실행할 수 없는 상황'을 말한다. 운영체제는 아래와 같은 이유로 프로세스를 중단 상태로 전환한다.

 

1️⃣ 메모리 부족( Swapping, 스왑 아웃 )

  • RAM이 부족할 때, 운영체제는 일부 프로세스를 디스크로 옮겨 메모리를 확보한다.
  • 보통은 오랫동안 실행되지 않은 프로세스가 먼저 중단된다.
  • 메모리가 다시 확보되면, 프로세스는 디스크에서 다시 RAM으로 복원( Swapping In )되어 Ready 상태로 변경된다.

2️⃣ 외부 자원의 문제( I/O 장치 사용 불가 )

  • 프로세스가 특정 하드웨어( 프린터, 네트워크, 디스크 등 )를 기다리고 있는데, 장치가 사용할 수 없는 상태라면 운영체제는 해당 프로세스를 Suspended 상태로 변경한다.
  • 자원이 사용 가능해지면 다시 Ready 상태로 복귀한다.
    • 프린터 대기열에 있는 작업이, 프린터가 오프라인 상태라서 처리되지 못하는 경우
    • 네트워크가 끊겨 다운로드 중이던 프로그램이 일시 정지 되는 경우

 

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 스레드  (0) 2025.02.11
[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10
[CS] 문맥 교환  (0) 2025.02.10
[CS] 프로세스 개요  (0) 2025.02.10
프로세스가 생성되면 커널 영역에 PCB가 생성된다.
사용자 영역에 프로세스는 어떻게 배치될까?

 


하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.

 

1️⃣ 코드( Code ) 영역 

  • 텍스트( Text )영역이라고도 부른다.
  • 실행할 프로그램의 기계어 코드( 명령어 )가 저장되는 공간이다.
  • 실행 파일에서 .text 섹션에 해당하고, 읽기 전용 속성을 가진다.

2️⃣ 데이터( Data ) 영역

  • 전역 변수와 정적 변수가 저장되는 공간이다.
  • 실행 파일에서 .data와 .bss 섹션에 해당한다.

다시 두 가지 영역으로 나뉜다.

 1. 초기화된 데이터( Initialized Data )영역

  • 초기값이 있는 전역 변수와 정적 변수가 저장된다.
  • 실행 파일에서 .data 섹션에 해당한다.

 2. 초기화되지 않은 데이터( Uninitialized Data )영역 ( BSS: Block Started by Symbol )

  • 초기화되지 않은 전역 변수와 정적 변수가 저장된다.
  • 실행 파일에서 .bss 섹션에 해당하고, 실행 시 0으로 초기화 된다.

코드 영역과 데이터 영역은 그 크기가 변하지 않는다. 

그렇기에 크기가 고정된 영역이라 하여 '정적 할당 영역'이라고도 부른다.

 

3️⃣ 힙( Heap )영역

  • 동적 할당( malloc, new 등)에 의해 할당되는 메모리가 저장되는 공간이다.
  • 프로그램이 종료되거나 명시적으로 해제( free, delete 등 )하지 않으면 메모리 누수가 발생할 수 있다.

4️⃣ 스택( Stack )영역

  • 함수 호출 시 생성되는 지역 변수, 매개변수, 리턴 주소 등이 저장되는 공간이다.
  • 함수가 호출될 때마다 새로운 스택 프레임( Stack Frame )이 생성되고, 함수가 종료되면 해당 스택 프레임이 제거 된다.
  • 메모리 할당과 해제가 자동으로 이루어져서 빠르지만, 스택 크기를 초과하면 스택 오버플로우( Stack Overflow )가 발생할 수 있다.

힙 영역과 스택 영역은 실시간으로 그 크기가 변할 수 있기 때문에 '동적 할당 영역'이라고 부른다.

일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당되고,

스택 영역은 높은 주소에서 낮은 주소로 할당된다.

 

메모리 구조 (일반적인 프로세스 메모리 배치)
--------------------------------------
 높은 주소 (High Address)
--------------------------------------
 |   커널 영역 (Kernel Space)         |
--------------------------------------
 |   스택 (Stack)                     |
 |   - 지역 변수, 함수 호출 정보      |
 |   - 높은 주소 → 낮은 주소로 성장   |
--------------------------------------
 |   ↓ 빈 공간 (Unused Space) ↓       |  ← 힙과 스택 사이 여유 공간
--------------------------------------
 |   힙 (Heap)                        |
 |   - 동적 할당된 메모리 영역        |
 |   - 낮은 주소 → 높은 주소로 성장   |
--------------------------------------
 |   데이터 (Data) 영역               |
 | - 초기화된/초기화되지 않은 전역변수|
--------------------------------------
 |   코드 (Code / Text) 영역          |
 |   - 실행 코드(기계어) 저장         |
--------------------------------------
 낮은 주소 (Low Address)

 

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 문맥 교환  (0) 2025.02.10
[CS] 프로세스 개요  (0) 2025.02.10
[CS] C 언어 컴파일 과정  (0) 2025.02.10

문맥 교환

운영체제가 현재 실행 중인 프로세스의 실행 상태( =문맥 )를 PCB에 저장하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로부터 가져와 복원하는 과정을 말한다.

 

📌 운영체제는 문맥 전환을 통해 CPU를 여러 프로세스가 공유하도록 관리한다.


📌 문맥 교환의 과정

1️⃣ 현재 실행중인 프로세스의 PCB 저장

  • 실행 중이던 프로세스의 레지스터 값, 프로그램 카운터 값, 상태 정보 등을 PCB에 저장
  • 저장된 PCB는 프로세스 테이블에 보관된다.

2️⃣ 새로운 프로세스의 PCB 로드

  • 실행할 프로세스의 PCB 정보를 읽어온다.
  • 해당 프로세스의 프로그램 카운터와 레지스터 값을 복원한다.

3️⃣ CPU 제어권을 새로운 프로세스에 넘김

  • 새로운 프로세스가 실행되도록 CPU를 할당한다.
  • 문맥 교환 완료 후, 새로운 프로세스가 기존에 실행되던 위치부터 실행을 재개한다.

📌 문맥 교환이 발생하는 경우

1️⃣ 프로세스가 실행 시간을 초과했을 때 ( 타이머 인터럽트 )

  • 라운드 로빈 스케줄링 방식에서 타임 슬라이스 시간이 끝나면 현재 프로세스의 PCB를 저장하고, 새로운 프로세스를 실행하는 문맥 교환이 발생한다.

2️⃣ 프로세스가 I/O 작업을 요청할 때

  • 실행 중인 프로세스가 입출력 작업을 기다려야 하는 경우
  • 현재 프로세스의 PCB를 저장하고, 다른 준비 상태의 프로세스를 실행하며 문맥 교환 발생

3️⃣ 높은 우선순위의 프로세스가 실행될 때

  • 현재 실행중인 프로세스보다 우선순위가 높은 프로세스가 준비 상태에 있는 경우
  • 현재 프로세스 PCB 저장, 우선순위 높은 프로세스 실행하면서 문맥 교환 발생

4️⃣ 프로세스가 종료될 때

  • 현재 실행중인 프로세스가 실행을 마치면, PCB가 삭제되고 새로운 프로세스가 실행되며 문맥 교환 발생

📌 문맥 교환의 비용

문맥 교환은 앞서 언급한대로, 운영체제가 실행중인 프로세스에서 다른 프로세스로 전환할 때 발생하는 작업이다.
이 과정에서 발생하는 비용은 다음과 같은 요소들로 구성된다.

 

1️⃣ 레지스터 저장 및 복원

  • cpu가 실행 중인 프로세스의 레지스터 값( PC, SP, 일반 레지스터 등 )을 저장하고, 새로운 프로세스의 레지스터 값으로 복원해야 한다.
  • 당연하게도 레지스터 수가 많을수록 저장 및 복원의 비용이 증가한다.

2️⃣ 캐시 미스( Cache Miss ) 증가

  • CPU 캐시는 현재 실행 중인 프로세스의 데이터들로 채워져 있다.
  • 다른 프로세스로 전환이 되면 기존 캐시 데이터가 무효화되거나 덮어씌워지면서 '캐시 미스'가 발생할 확률이 높아진다.
  • 캐시 미스는 메모리 접근 속도를 저하시키기 때문에 전체 성능에 영향을 준다.

3️⃣ 커널 모드 전환 비용

  • 문맥 교환은 보통 운영체제 커널에서 수행된다.
  • 일반적으로 유저 모드 ➡️ 커널 모드 ➡️ 유저 모드 전환이 필요하며, 이 과정에서 추가적인 오버헤드가 발생한다.

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10
[CS] 프로세스 개요  (0) 2025.02.10
[CS] C 언어 컴파일 과정  (0) 2025.02.10

프로세스

실행 중인 프로그램을 의미.
사용자가 어떤 프로그램을 실행하면 OS가 해당 프로그램을 메모리에 적재하고 CPU를 할당하여 실행하는데,
이 실행 단위를 프로세스라 한다.

📌 프로세스의 종류

포그라운드 프로세스

사용자가 직접 실행하고 인터페이스를 통해 상호작용하는 프로세스
예 : 게임, 웹 브라우저 등

백그라운드 프로세스

사용자가 직접 조작하지 않고 시스템 내부에서 실행되는 프로세스
예: 백신 프로그램, 클라우드 동기화 프로그램 등

 

백그라운드 프로세스는 유닉스 체계의 운영체제에서는 '데몬' 이라 하고,

윈도우 운영체제에서는 서비스라 한다.


📌 프로세스 제어 블록 ( PCB : Process Control Block ) 

운영체제가 각 프로세스를 관리하기 위해 유지하는 데이터 구조
운영체제는 프로세스를 실행, 일시 정지, 재개, 종료 등의 작업을 수행하는데, 이때 프로세스의 상태 및 중요 정보를 저장하는 것이 프로세스 제어 블록 즉, PCB 다

 

PCB커널 영역생성되며, 프로세스 생성 시 만들어지고 실행이 끝나면 폐기된다.

다시 말해 '새로운 프로세스가 생성되었다'는 말은 '운영체제가 PCB를 생성했다'는 말과 같고,

'프로세스가 종료되었다'는 말은 '운영체제가 해당 PCB를 폐기했다'는 말과 같다.

 

📌 프로세스 제어 블록의 역할

  • 프로세스 식별 ( 프로세스마다 고유한 PID를 할당하여 구별 )
  • 프로세스 상태 ( 실행 중, 준비 상태, 대기 상태 등 프로세스의 현재 상태를 저장 )
  • 레지스터 값 ( 프로세스가 사용하고 있었던 레지스터 값 ( 대표적으로 프로그램 카운터 ) )
  • CPU 스케줄링 정보 ( 우선순위, 스케줄링 큐 정보 등 CPU 할당을 위한 데이터 유지 )
  • 메모리 관리 정보 ( 프로세스가 사용하는 메모리 영역 ( 코드, 데이터, 스택, 힙 등 ) 정보, 페이지 테이블, 베이스 레지스터, 한계 레지스터 등 )
  • 입출력 정보 ( 프로세스가 사용 중인 입출력 장치, 열린 파일 목록 등 )

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10
[CS] 문맥 교환  (0) 2025.02.10
[CS] C 언어 컴파일 과정  (0) 2025.02.10

1. 소스 코드 

  • 우리가 작성한 c 코드는 보통 .c 확장자를 가진 파일로 저장된다.
  • 예: main.c

2. 전처리 과정 ( Preprocessing )

명령어 : gcc -E main.c -o main.i

 

전처리 과정은 소스 코드를 처리하며 다음 작업을 수행한다.    

  • 매크로 치환 : #define 으로 정의된 매크로를 실제 값으로 치환
  • 헤더 파일 포함 : #include로 포함된 헤더 파일의 내용을 코드에 삽입
  • 조건부 컴파일 : #if, #ifdef, #ifndef 등 조건부 컴파일 지시자를 처리.
  • 주석 제거 : 코드의 모든 주석을 삭제

결과물 : 전처리된 소스 코드가 저장된 .i 파일


3. 컴파일 과정 ( Compliation )

명령어 : gcc -S main.i -o main.s

 

컴파일러는 전처리된 코드를 어셈블리 코드로 변환한다.

결과물 : 어셈블리 코드가 저장된 .s 파일


4. 어셈블 과정 ( Assembly )

명령어 : gcc -c main.s -o main.o

 

어셈블러는 어셈블리 코드를 목적 파일로 변환한다.


5. 링킹 과정 ( Linking )

명령어 : gcc main.o -o main

 

링커는 여러 개의 목적 파일과 라이브러리를 결합하여 최종 실행 파일을 생성한다.

  • c 표준 라이브러리 ( libc )와 같은 필요한 라이브러리 포함
  • 함수 호출에 대한 주소를 결정하고 실제로 연결

결과물 : 실행 가능한 파일 ( main 또는 main.exe )


컴파일 과정 요약

 

  • main.c → 전처리 → main.i
  • main.i → 컴파일 → main.s
  • main.s → 어셈블 → main.o (목적 파일)
  • main.o → 링크 → main (실행 파일)

 

'CS > 혼공컴운' 카테고리의 다른 글

[CS] 프로세스 계층 구조  (0) 2025.02.11
[CS] 프로세스 상태  (0) 2025.02.11
[CS] 프로세스의 메모리 영역  (0) 2025.02.10
[CS] 문맥 교환  (0) 2025.02.10
[CS] 프로세스 개요  (0) 2025.02.10

더미클라이언트

프로젝트에서 제작한 서버를 스트레스 테스트 하기 위해 더미클라이언트를 제작하고, 완성했다.

 

더미 클라이언트 모습

 

더미 클라이언트는 내일배움캠프에서 처음으로 제출했던 콘솔 로그라이크 과제를 참고해서 만들었다.

기본적으로 더미클라이언트는 로그인이 되어 있어야 시작 할 수 있다.

 

[1] 을 입력하고 엔터를 누르면 더미 클라를 생성할 수 있다.

 

생성할 더미 클라이언트의 개수만큼 입력하고 엔터를 눌러 더미 클라를 생성한다.

더미 클라를 생성하면 일정 시간 이후 채팅서버와 게임서버에 접속을 시도한다.

 

[2] 를 입력하면 [1] 에서 생성한 더미 클라이언트 수만큼 회원가입을 진행한다.

[3] 을 입력하면 [1] 에서 생성한 더미 클라이언트 수만큼 로그인을 진행한다.

 

로그인 작업을 마치고 나서 [4] 를 입력해 방을 생성하고 생성한 방에 더미 클라이언트를 입장 시킨 후

방마다 게임을 시작해 스트레스 테스트를 진행한다.

 

https://github.com/rettytnova/sur5val_Server/tree/main/src/dummyClient

 

sur5val_Server/src/dummyClient at main · rettytnova/sur5val_Server

Contribute to rettytnova/sur5val_Server development by creating an account on GitHub.

github.com

 

 

 

+ Recent posts