초기 컴퓨터 시스템은 한 번에 하나의 프로그램만 실행하였다. 반면 현대의 컴퓨터 시스템은 메모리에 다수의 프로그램을 적재하고 동시(병행적)에 실행된다. 따라서 다양한 프로그램 제어 및 메모리 분할의 필요성이 증가하였고, 프로세스라는 개념이 탄생하였다.
프로그램 (Program)
프로그램(Program)은 컴퓨터에서 실행할 수 있는 명령어들의 집합으로, 기억 장치에 저장되어 파일 시스템에 존재하는 실행 파일이다. 프로그램은 명령어들의 집합일 뿐 그 자체만으로는 아무것도 할 수 없는 수동적인 존재(Passive Entity)이다.
[프로그램의 메모리 구조]
| Text(Code) Section | 실행 코드가 저장되는 영역으로 코드 영역이라고도 부르며, 프로그램에서 정의한 모든 함수의 기계어를 담고 있다. |
|
| Data Section | .data Section | 초기 값을 가진 모든 전역 변수 및 정적 변수가 저장되는 영역 |
| .BSS Section | 초기화되지 않은 모든 전역 변수 및 정적 변수가 저장되는 영역 | |
| .rodata Section | 읽기 전용(Constant) 전역 변수가 저장되는 영역 | |
- .rodata Section
부동소수타입 상수(const float PI = 3.141592f), const 키워드로 정의된 전역 인스턴스(const MyClass gMyclass) 등이 해당된다. 정수타입 상수의 경우 매니페스트 상수(Manifest constant) 처럼 취급되어 사용되는 기계어 코드 위치에 직접 삽입되기 때문에 .rodata Section에 저장되지 않는다.
프로세스 (Process)
프로세스(Process)는 실행 중인 프로그램이다. 즉, 프로그램이 메모리에 로드되고 운영체제의 제어를 받는 상태를 의미한다.
[프로세스의 메모리 구조]
프로그램을 실행하도록 운영체제에 요청하면, 운영체제는 프로그램을 메모리에 로드한다. 이는 프로세스가 자신만의 메모리 영역, 즉 주소 공간을 가지게 됨을 의미한다. 이 메모리 영역(Section)은 보통 Text, Data, Heap, Stack 으로 구분된다.

| Text(Code) Section | 실행 코드가 저장되는 영역으로 코드 영역이라고도 부르며, 프로그램에서 정의한 모든 함수의 기계어를 담고 있다. |
|
| Data Section | .data Section | 초기 값을 가진 모든 전역 변수 및 정적 변수가 저장되는 영역 |
| .BSS Section | 초기화되지 않은 모든 전역 변수 및 정적 변수가 저장되는 영역 | |
| .rodata Section | 읽기 전용(Constant) 전역 변수가 저장되는 영역 | |
| Stack Section | 함수 호출과 관련된 임시 데이터가 저장되는 영역으로, 함수의 매개변수, 복귀 주소, 지역 변수 등이 저장된다. |
|
| Heap Section | 프로그램 실행 중 동적으로 할당된 데이터가 저장되는 영역으로, 사용자가 직접 관리해야 하는 메모리 영역이다. |
|
프로그램이 실행되는 동안 텍스트 영역(Text Section)과 데이터 영역(Data Section)의 크기는 고정적이지만, 스택 영역(Stack Section)과 힙 영역(Heap Section)의 크기는 동적으로 커지거나 작아진다.
- 스택 영역 : 스택 영역은 메모리의 높은 주소에서 낮은 주소 방향으로 커진다. 함수가 호출될 때마다 활성화 레코드(Activation Record)가 스택에 푸시(Push)되어 크기가 커지며, 함수가 종료될 때 팝(Pop)되어 크기가 작아진다.
- 힙 영역 : 힙 영역은 메모리의 낮은 주소에서 높은 주소 방향으로 커진다. 메모리가 동적으로 할당됨에 따라 크기가 커지고, 메모리가 시스템에 반환되면 작아진다.
만약 프로그램이 실행되는 동안 스택과 힙이 모두 계속해서 커진다면, 결국 두 영역이 충돌하거나 겹치는 상황이 발생할 수 있다. 운영체제는 이를 방지하기 위해 다양한 조치를 취한다.
프로세스의 상태
프로세스가 생성되어 실행을 마치고 종료될때 까지 프로세스는 여러가지의 상태를 갖게 되고, 상태 변화에 따라 프로세스가 동작한다.
| 생성 (New) | 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태 |
| 준비 (Ready) | CPU를 할당 받으려고 기다리는 상태 프로세스가 CPU만 보유하면 당장 명령을 실핼할 수 있지만 CPU를 할당 받지 못한 상태 |
| 실행 (Running) | CPU를 할당 받은 상태 프로세스가 CPU를 보유하고, 기계어 명령을 실행하고 있는 상태 |
| 대기 (Waiting) | CPU를 할당 받더라도 당장 명령을 실행할 수 없는 상태 입출력 요청 또는 시간이 오래 걸리는 작업을 진행하기 위해 대기하는 상태 |
| 종료 (Terminated) | 프로세스는 종료되었으나 관련 자료구조는 완전히 정리하지 못한 상태 |
[프로세스의 상태 전이]
프로세스가 가질 수 있는 상태 중에서 대기 상태를 제외한 다른 상태들은 운영체제에 의해 제어된다. 운영체제는 프로세스의 상태를 감시하고, 현재 프로세스의 상태를 기반으로 프로세스 스케쥴링을 통해 프로세스를 관리하고 제어한다.

| ① Admitted (New → Ready) | - |
| ② Exit (Runngin → Terminated) | - |
| ③ Interrupt (Running → Ready) | 프로세스 실행 중 인터럽트가 발생하여 CPU 제어권을 이전하고 준비 상태로 전환 |
| ④ Dispatch (Ready → Running) | 프로세스 스케줄러가 준비 상태에 있는 프로세스 중 실행할 프로세스를 선택하고, CPU를 해당 프로세스에게 할당하여 실행 상태로 전환 |
| ⑤ Wake Up (Wait → Ready) | CPU를 사용하지 않고 긴 대기 시간이 필요한 작업(입출력 이벤트, 자원 할당 대기 등)으로 인해 대기 상태로 전환된 프로세스가 해당 작업이 완료되어 다시 스케줄러에 의해 선택될 준비 상태로 전환 |
| ⑥ Block (Running → Wait) | CPU를 사용하지 않고 긴 대기 시간이 필요한 작업(입출력 이벤트, 자원 할당 대기 등)이 발생하여 CPU 제어권을 반환하고 대기 상태로 전환 |
문맥 교환 (Context Switching)
문맥 교환(Context Switching)은 CPU의 제어가 한 프로세스에서 다른 프로세스로 전환될 때 발생하는 프로세스 상태 및 관련 정보의 변경 과정을 말한다.
[문맥 교환 과정]
문맥 교환 과정은 아래와 같은 단계로 이루어진다.
- 현재 프로세스의 상태 저장(= 현재 프로세스의 PCB 저장)
- 다음 프로세스의 상태 복원(= 다음 프로세스의 PCB 로드)
- CPU 제어권 이동

1) CPU가 Process P1 을 실행한다.
2) 인터럽트가 발생하면 현재 실행중인 Process P1의 상태를 PCB1 에 저장한다.
3) 프로세스 스케줄러가 다음 실행할 프로세스를 선택한다.
4) 선택된 Process P2 의 상태를 PCB2에서 로드한다.
5) 인터럽트가 발생하면 현재 실행중인 Process P2의 상태를 PCB2에 저장한다.
6) 프로세스 스케줄러가 다음 실행할 프로세스를 선택한다
7) 선택된 Process P1 의 상태를 PCB1에서 로드한다.
8) 로드된 PCB1에는 이전 실행 상태의 작업 진행도를 저장하고 있기 때문에 해당 지점부터 다시 작업을 수행한다.
[프로세스 제어 블록 (PCB, Process Control Block)]
프로세스 제어 블록(PCB, Process Control Black)은 프로세스를 관리하는데 필요한 모든 상태 정보(실행 정보)를 담고 있는 커널 내의 자료구조로 해당 프로세스가 생성될 때 함께 생성되며 종료 시 삭제된다.
프로세스 제어 블록에 저장되는 주요 정보는 아래와 같다.
- 운영체제가 관리상 사용하는 정보
1) 프로세스 식별자 (PID, Process ID) : 각 프로세스를 고유하게 식별하는 값
2) 프로세스의 상태 (Process State) : 프로세스의 현재 상태
3) 스케줄링 정보 (Scheduling Info) : 프로세스 스케줄링을 위한 정보 (CPU 점유 시간, 스케줄링 큐 위치 등) - 프로세스 실행 관련 하드웨어 값 정보
4) 프로그램 카운터 (PC, Program Counter) : 다음 실행할 명령어의 주소
5) 레지스터 상태 (Register State) : 현재 실행 중인 프로세스의 레지스터들에 값 - 메모리 관련 정보
6) 메모리 관리 정보 (Memory Management Info) : 프로세스가 할당된 메모리 영역과 관련된 정보
[문맥 교환 오버해드]
내용을 적어주세요.
프로세스의 자원 공유
'OS' 카테고리의 다른 글
| [OS] 프로세스 스케줄링(Process Scheduling) (0) | 2024.07.29 |
|---|---|
| [OS] 프로세스 (Process) (0) | 2024.07.26 |
| [OS] 메모리 관리 (0) | 2024.01.13 |
| [OS] 5. 상호배제 (Mutual Exclusion) - 작성중 (0) | 2024.01.13 |
| [OS] 컴퓨터 시스템의 동작 (0) | 2024.01.13 |