프로세스가 생성되면 커널 영역에 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

+ Recent posts