티스토리 뷰
Q. 프로세스란?
A. Process is a program in execution, 운영체제의 자원을 할당받는 작업의 단위
프로그램이 프로세스가 되기 위해서는 메모리의 적당한 위치로 프로그램을 가져오고, 그와 동시에 커널의 data영역에 해당 프로세스의 제어 블록 (PCB)를 생성한다. 프로세스가 종료될 때 PCB도 같이 폐기된다.
- 프로세스 = 프로그램 + PCB
- 프로그램 = 프로세스 - PCB
프로세스의 문맥(context)
프로세스의 실행은 program counter(PC)가 프로세스의 code를 가리키면서 instruction(명령어)을 하나씩 읽고, cpu에 가져와서 레지스터에 값을 넣고, 산술논리연산 장치에서 연산을 하고, 결과를 레지스터나 프로세스의 메모리에 저장을 한다.
이러한 실행의 특정 시점에 프로그램의 정확한 상태를 나타내기 위해서 PC가 어디까지 가리키는지, 프로세스의 메모리에 어떤 값을 갖고있는지, data에 담긴 변수의 값은 뭔지, cpu의 레지스터는 어떤값을 갖고있고 어디까지 연산을 했는지를 알아야 한다. 이를 프로세스의 문맥이라 한다.
프로세스 문맥 4가지
- CPU의 수행상태를 나타내는 하드웨어 문맥
- 이 프로세스가 instruction을 어디까지 실행했는지 알기위해 레지스터가 어떤값을 갖고있고, PC가 어디를 가르키고있는지
- 프로세스의 주소공간
- 현재 시점의 프로세스의 code, data, stack에 어떤값이 들어있는지
- 프로세스 관련 커널 자료구조 PCB
- 프로세스를 관리하고있는 운영체제는 프로세스가 시작할 때마다 자신의 data영역에 해당 프로세스의 제어 블록을 갖고있는다 == PCB (Process Control Block), 운영체제가 이 프로세스를 위해 관리하는 데이터 구조이다.
- PCB에는 프로세스 구분자 (PID), 프로세스의 메모리 상주 위치, PC, 레지스터 등 각종 중간값이 들어있다.
- 프로세스별 커널 스택
- 프로세스가 실행하다가 자신이 처리할수 없는 것을 운영체제에 요청할 수가 있다 == 시스템 콜
- 시스템 콜이 발생하면, PC는 커널의 Code를 가리키게 되고 커널의 함수를 호출하게 된다. 이때 각 프로세스마다 호출하는 code를 관리하기 위해 프로세스별로 커널 스택을 갖게 된다. 따라서, 해당 프로세스의 커널 스택의 값이 뭔지 필요하다.
프로세스는 Time-Sharing방식으로 진행이 되므로, 각 프로세스의 문맥을 알아야 실행이 멈췄다가 진행될 때 바로 이어서 실행이 가능하다.
프로세스의 상태
❗️싱글 코어 CPU라 가정하고 정의한다.
- Ready
- 준비상태는 프로세스가 가상 메모리 공간, 물리적 메모리 등 모든 준비가 되어있고 cpu만 받으면 바로 실행할 수 있는 상태이다.
- 실행대기 중인 프로세스가 CPU를 기다리는 프로세스의 상태
- Running
- CPU를 잡고있는 프로세스는 매순간 하나로, 현재 instruction을 수행중인 상태
- 실행 상태에 있는 프로세스는 할당 받은 시간 (타임 슬라이스)동안만 실행이 가능하며
- 해당 시간 내에 완료되지 못하면 timeout 인터럽트가 발생한다 : Running -> Ready
- 할당 시간 내에 작업이 완료되어 종료되면 exit 인터럽트가 발생한다 : Running -> Terminated
- 할당 시간 내에 입출력을 요청하면 시스템 콜로 인해 인터럽트가 발생하고, block된다 : Running -> Blocked
- 실행 상태에서 문맥교환이 발생한다.
- Blocked (wait, sleep)
- CPU를 줘도 당장 instruction을 수행할 수 없는 상태
- process 자신이 요청한 이벤트 혹은 I/O가 완료되기를 대기하는 상태로, 프로세스의 현재 실행 코드가 메인 메모리에 올라와 있지 않고 Swap Area에 있다면 시간이 오래 걸리므로 당장 instruction수행이 불가능하다.
- 입출력이 완료되면 wakeUp 인터럽트가 발생한다 : Blocked -> Ready
중기 스케쥴러로 인해 추가된 프로세스의 상태
- Suspended (Stopped)
- 보류상태 프로세스는 메모리에서 통째로 디스크로 swap out된다.
- running, ready, blocked는 cpu가 아니면 외부에서 일을하거나, 기다리는 상태지만 suspended는 아예 일을 멈춘 상태이다.
- cpu뿐만 아니라 외부에서도 일을 하지 않고 프로세스의 수행이 정지된 상태.
- 입출력 대기 중(Block)에 Suspend 상태가 되면 Block Suspend Status이고, 이때 입출력 완료 인터럽트가 발생하면
Ready Suspend Status가 된다. 결국 둘다 Suspended 상태.
Suspended : 외부에서 resume해 줘야 Active한 상태가 된다
Blocked : 자신이 요청한 event가 만족되면 Ready가 된다
*New : 프로세스가 막 생성중인 상태
*Terminated : 수행은 끝났지만 종료되지는 않는 상태, 종료를 위해 마무리하는 중인 상태
- 초록볼 : Process
- CPU를 점유하는 process는 하나이고, 나머지는 기다리거나, 입출력 대기중이거나, swap area(disk)등의 file을 읽거나, 공유데이터를 읽는 등을 하게 된다.
- 이들은 운영체제의 Data내 프로세스별 PCB의 관리하에 운용된다.
PCB - Process Control Block
- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 커널 Data 영역에 유지하는 정보
- 프로세스를 실행하는데 필요한 중요한 정보를 보관하기 위한 자료구조
- OS가 관리상 사용하는 정보
- Pointer, Process state, Process ID
- sheduling information, priority(우선순위를 위한 알고리즘이 존재한다. 무조건 먼저 왔다고 처리하는게 아니다)
- 포인터 : 초록볼 대기 큐에서 봤듯이 프로세스를 큐에서 관리하기 위해 포인터를 사용
- 프로세스 상태 : 위에서 정리한 Create, Ready, Running, Block, Terminate, Suspend 상태
- 프로세스 넘버 : 프로세스를 구별하기 위한 숫자
- 우선순위 : 프로세스 대기 큐에서 정렬을 위한 우선순위
- CPU 수행 관련 하드웨어 값
- 해당 프로세스가 어떤값들을 갖고있었는지
- Program counter, register
- 프로그램 카운터 : 다음에 실행될 명령어의 위치를 가리키는 PC
- 레지스터 정보 : 프로세스 실행 중 사용된 레지스터 값들 (Accumulator, Index register, Stack Pointer) 등
- 메모리 관련 (문맥)
- Code, Data, Stack의 위치 정보
- 메모리 관리 정보 : 프로세스가 물리적 메모리의 어느 위치에 존재하는지 나타내는 위치 정보
- : 물리적 메모리의 보호를 위한 경계 레지스터 값, 한계 레지스터 값 등이 저장
- : 세그멘테이션 테이블, 페이지 테이블 정보 등을 저장
- 파일 관련
- Open file descriptors ..
- 어떤파일을 열어놨는지 등
문맥 교환 Context Switch
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
교환시 CPU 내 레지스터, PC 값들을 실행상태에서 나가는 Process의 PCB에 저장하고, 들어오는 Process의 PCB의 값을 가지고 문맥을 찾아서 CPU의 하드웨어에 복원을 시킨다.
❗️System call 이나 interrupt 발생해도 반드시 Context Switch가 발생하는 것은 아니다
문맥 교환이 발생하지 않는 경우
User-mode(프로세스 A) → Kernel-mode → User-mode(프로세스 A)
- system call이나 외부의 interrupt가 발생한 경우 (I/O X, 타이머 인터럽트 X)
- 일단 커널 모드로 넘어가고 오랜 시간이 소요되지 않는다면 다시 기존 프로그램을 실행하게 된다. 이때는 문맥교환이 발생하지 않는다
문맥 교환이 발생하는 경우
User-mode(프로세스 A) → Kernel-mode → User-mode(프로세스 B)
- I/O system call이나 외부의 timer interrupt가 발생한 경우
- 시간이 오래걸리는 작업, 혹은 프로세스에 할당된 시간이 끝나는 경우로, 이때는 다른 프로세스로 변경하게 되고 문맥교환이 이뤄진다
참고
문맥 교환시 Cache memory flush가 이뤄지는데 cpu와 메인 메모리 사이에 존재하는 작은 메모리 공간으로 프로세스가 바뀔 때 cache memory를 밀어버리게 된다. 이 작업의 오버헤드가 크다. 캐시를 밀어버림으로써 캐시 히트가 줄어들게 되고 초반 프로세스의 작업속도가 느릴 수 있다.
프로세스들을 스케쥴링하기위한 큐
- Job queue - 현재 시스템 내 모든 프로세스 집합
- Ready queue - CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- Device queue - 입출력 장치의 처리를 기다리는 프로세스의 집
큐에서 기다리는 프로세스는 각 프로세스의 PCB로 이뤄져있다. 그래서 각 큐에는 프로세스별 PCB가 꼬리를 물고 줄서있는 모습을 갖는다.
프로세스 스케듈러 - Scheduler
Short-term scheduler (CPU scheduler, 단기)
- 매우 짧은 시간 간격(millisecond 단위)을 가지고 관리하게 된다
- CPU를 어떤 프로세스한테 줄지, Runnig할지 결정한다
Long-term scheduler (Job scheduler, 장기)
- memory를 어떤 프로세스한테 줄지 결정
- 프로세스가 시작이 되고 ready로 넘어오게 되는데, 이때 프로세스가 메인 메모리에 올라가는 것이 admitted되면 그제서야 ready로 넘어가게 된다. 이를 결정하는 스케쥴러이다.
- degree of Multi-Programming을 제어, 한번에 얼마나 많은 프로세스가 메모리에 올라갈지 관리한다.
- 현대 Time-Sharing 시스템에는 장기 스케쥴러가 없다. 바로 ready상태가 된다 → 이를 중기 스케쥴러가 대신 관리
Medium-term sheduler (Swapper, 중기)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아낸다.
- 프로세스에게서 memory를 뺏는 문제이다.
- 결과적으로 degree of Multi-Programming을 제어
- 중기 스케쥴러에 의해 Swap Area로 쫓겨난 프로세스는 Suspended 상태가 되고 (inactive), 나중에 Resume 인터럽트를 통해 다시 메모리에 올라오게 된다 (Actice).
장기 스케쥴러는 얼마나 메모리에 올릴지 결정하는 반면, 중기 스케쥴러는 일단 전부 Ready상태로 메모리에 올리고, 공간이 부족하면 그 때 특정 프로세스를 메모리에서 디스크로 쫒아내는 방식이다.
프로세스 관점의 상태도
Running (user mode), Running (monitor mode) 둘다 프로세스가 Running 상태인 것으로 인지한다.
단지 커널 모드냐 유저 모드냐 의 차이이다. 커널 모드로 넘어갔다는 것은 시스템 콜, 인터럽트, 트랩 등이 발생한 것으로 해당 로직을 처리하러 CPU가 잠시 떠난 상태이지만, 다른 프로세스로 CPU 제어권이 넘어가는 것이 아니라면 "커널 모드에서 해당 프로세스는 Running 상태이다" 라고 받아들이면 된다.
Wakeup
- Suspended 상태면 CPU에서는 아무것도 할수 없지만, I/O작업 등 외부 작업은 이뤄질수 있으므로 suspended내에서 blocked와 ready로 구분
- Active상태에서도 마찬가지로 cpu를 점유하지 않아도 외부 작업은 진행이 가능하므로 해당 작업 상태에 맞춰서 blocked와 ready상태를 구분
'CS > 운영체제 정리' 카테고리의 다른 글
3주차. 프로세스의 연산 - fork(), exec()... 와 IPC (0) | 2021.09.24 |
---|---|
3주차. Thread 정리 (0) | 2021.09.24 |
2주차. System Structure & Program Execution 2 (0) | 2021.09.17 |
2주차. System Structure & Program Execution 1 (0) | 2021.09.17 |
1주차. 운영체제란 무엇인가? (2) | 2021.09.10 |
- Total
- Today
- Yesterday