-
[운영체제] 프로세스(Process)운영체제 2023. 8. 10. 22:13
Overview
전에 시스템 호출에 대해 알아봤습니다.
2023.08.09 - [운영체제] - [운영체제] 시스템 호출 (System Call)
이번에는 운영체제에서 매우 중요한 프로세스에 대해 알아봅시다.
프로세스
프로세스(Process)는 '실행 중인 프로그램'을 의미합니다.
하드디스크 등 저장 공간에 있던 코드와 리소스 등을 실행하면 메모리에 올라가 실행이 되며 이 실행 중인 프로그램이 프로세스입니다.
프로세스 구조
프로세스는 크게 Code 영역, Data 영역, Heap 영역 그리고 Stack 영역으로 이루어져 있습니다.
Code 영역
- 컴파일된 코드가 저장되어 있습니다.
- 즉 CPU가 실행할 명령어가 저장되어있습니다.
Data 영역
- 전역 변수, 정적 변수가 저장되어있습니다.
- 프로그램이 시작되고 끝날 때까지 메모리에 존재할 데이터입니다.
Code, Data 영역은 도중에 값이 추가/제거가 되지 않습니다.
(프로그램 실행 도중 코드가 변경되거나 전역 변수가 어디서 추가되는 일이 없음)
즉 크기가 고정되어 있어 '정적 할당 영역'이라고 부릅니다.
Heap 영역
- 코드에서 동적으로 데이터를 할당하는 영역입니다.
- 메모리 할당을 하고 해제를 하지 않으면 메모리 낭비가 되어 메모리 누수가 발생합니다.
(https://namu.wiki/w/%EB%A9%94%EB%AA%A8%EB%A6%AC%20%EB%88%84%EC%88%98) - Swift는 ARC를 통해 자동으로 관리해 줍니다.
Stack 영역
- 데이터를 일시적으로 저장하는 영역입니다.
- 임시 데이터(함수 호출, 매개변수 등)가 저장되는 영역입니다.
Heap, Stack 영역은 실시간으로 크기가 변할 수 있어 '동적 할당 영역'이라고 부릅니다.
프로세스 제어 블록 (PCB, Process Control Block)
OS에서 프로세스를 관리하기 위해서는 프로세스의 정보가 필요합니다.
PCB는 프로세스에 대한 중요한 정보를 저장하는 자료 구조입니다.
OS는 프로세스를 관리하기 위해 프로세스 생성과 동시에 PCB를 생성합니다 (제거도 동일)
PCB 저장되는 정보
- 포인터
- Process State(프로세스 상태)
- PID(프로세스 식별자) - 프로세스가 가지고 있는 고유한 값
- PC(프로그램 카운터) - 프로세스가 다음에 실행할 명령어 주소
- Registers(레지스터)
- CPU 스케줄링 정보
- 메모리 관리 정보
- 기타
왜 PCB가 존재?
모든 프로세스가 CPU를 동시에 사용할 수 없습니다.
만약 가능하다면? 인터넷 창 키고 터미널 키고 등 여러 프로그램을 실행시키려면 그만큼 CPU가 필요할 것입니다.
즉 프로세스는 CPU의 스케줄링을 통해 프로세스들에게 적절하게 CPU를 점유할 수 있도록 합니다.
이때 진행 중이던 프로세스가 멈췄다가 다시 실행하기 위해서는 기존 정보가 필요합니다.
이 정보가 PCB입니다.
문맥 교환(Context Switching)
위에서 프로세스는 CPU 스케줄링을 통해 CPU를 점유하게 된다고 했습니다.
진행 중인 프로세스(Process 1)에서 다른 프로세스(Process 2)가 CPU를 점유하게 되면?
- Process 1이 먼저 메모리에 (Process1의) PCB를 저장합니다.
- Process 2의 PCB를 가져옵니다.
- Process 2를 실행합니다.
이처럼 PCB를 저장 및 복구를 하고 새로운 프로세스를 실행하는 것을 Context Switching이라고 합니다.
Context Switching 시점
- 멀티 태스킹
- 인터럽트 핸들링 (인터럽트? → https://ko.wikipedia.org/wiki/인터럽트)
- 사용자 모드와 커널 모드 간 전환
프로세스 상태
PCB 내부에는 Process State(프로세스 상태)가 저장된다고 위에서 말씀드렸습니다.
new
- 메모리에 적재되어 PCB 할당을 받은 상태
ready
- CPU 할당을 받아 실행할 수 있는 상태
- dispatch: ready상태에서 running상태로 바뀌는 것
running
- CPU 할당을 받아 실행 중인 상태
- 실행이 완료가 되면 terminated 상태가 됨
- 할당 시간이 끝나면 ready 상태로 돌아감 (인터럽트)
- 도중에 입출력 신호 또는 이벤트가 발생하면 waiting 상태가 될 수 있음
waiting
- 입출력 신호 또는 이벤트가 발생하여 프로세스가 대기 중인 상태
- 작업이 완료가 되면 프로세스는 ready 상태로 돌아감
- 보류(block)라고 부르기도 함
- 프로세스가 입출력 완료, 시그널 수신 등 어떤 이벤트를 기다리고 있음
terminated
- 종료된 상태
마무리
프로세스에 대해 알아봤습니다.
원래는 스레드까지 포함하려 했는데 너무 방대해지는 것 같아서 나눠서 좀 뚝 끊긴 느낌이 드네요.
macOS는 활성 상태 보기를 통해 CPU에 대한 정보를 얻을 수 있습니다.
이전 글에서 배운 커널도 보이네요 (PID = 0)
launchd는 커널이 컴퓨터를 설정하기 위해 실행하는 첫 번째 프로세스라고 합니다 (PID = 1)
(https://support.apple.com/ko-kr/guide/terminal/apdc6c1077b-5d5d-4d35-9c19-60f2397b2369/mac)
공부를 하니 뭔가 조금씩 보이기 시작해서 재미있네요 😁
읽어주셔서 감사합니다.
참고
https://ko.wikipedia.org/wiki/프로세스
https://ko.wikipedia.org/wiki/프로세스_제어_블록
'운영체제' 카테고리의 다른 글
[운영체제] 스레드(Thread) (0) 2023.08.11 [운영체제] 시스템 호출 (System Call) (0) 2023.08.09 [운영체제] 커널(Kernel) (0) 2023.08.07