되자!백엔드개발자
[OS] 3-1: 프로세스(Process) (1) - Context Switching, PCB, Scheduler 본문
Process Context
💡 process context : 프로세스가 어떤 상태에서 수행되고 있는지 정확히 규명하기위해 필요한 정보.
하나의 단어가 여러 의미로 사용된다. 그 단어가 어떤 의미로 사용되는 지는 문맥에 따라 결정된다.
이와 같이 프로세스도 특정 시점을 놓고 봤을 때 해당 프로세스가 어느 instruction을 실행하고 있었는지, 어떤 데이터를 가지고 있는지 파악할 수 있어야하고 이러한 정보를 context라고 한다.
프로세스가 수행되는 과정은 아래와 같다.
지난 게시글에서 프로세스마다 독자적인 주소공간(stack, data, code)을 만든다고 했다. 프로세스가 CPU를 잡게 되면 Program Counter(이하 PC)라는 레지스터가 프로세스 주소공간의 code 부분을 가리키며 기계어를 읽어드린다. 그렇게 생성된 instruction을 CPU의 레지스터 넣고 산술연산장치에서 연산을 하고, 그 결과를 레지스터나 메모리에 저장한다.
이렇게 계속 진행하다가 특정 시점에 프로세스는 어느 상태인지 규명하는 것이 프로세스의 문맥이다.
왜 프로세스 문맥이 중요한가?
타임 쉐어링, 멀티 테스킹 으로 프로세스가 번갈아하며 실행되기 떄문이다. 한 프로세스가 CPU제어권을 뺏기고 다시 해당 프로세스를 실행되는데, 프로세스의 뺏기던 시점의 문맥을 기억해둬야지 다시 실행했을 때 다시 처음부터 시작하는 불상사를 막을 수 있다.
특정 시점의 프로세스 정보는 아래의 정보를 모두 알아야한다.
- Program Counter이 어느 부분을 가리키고 있는지(code)
- 프로세스의 메모리에 어떤 내용을 담고있는지(stack)
- 지금 변수의 값이 얼마인지(data),
- 레지스터에 어떤 것을 담아놓고 어떤 instruction까지 실행했는지
process context 3가지
- 하드웨어 문맥 : CPU의 수행 상태를 나타내는 것으로 PC와 각종 레지스터에 저장하고 있는 값을 말한다.
- 프로세스의 주소 공간 : 메모리 관련으로 code, data, stack 으로 구성된 프로세스의 독자적인 주소 공간을 말한다.
- 커널상의 문맥 : 운영체제와 가지고 있는 것으로 프로세스를 관리하기 위한 자료구조인 PCB와 Kenal stack으을 말한다.
프로세슥 실행하다가 I/O같이 본인이 못하는 것이 오면 System call 을 불러 OS에게 대신 해달라고 요청한다. 그럼 Program counter이 커널 주소공간의 Code의 가리키면서 커널 코드를 실행한다. 커널 코드도 함수로 이루어졌기 때문에 실행하면서 stack에 관련된 정보를 쌓아놓는다. 근데 커널의 code는 여러 process가 공유하는 코드다. 그래서 정보가 꼬이는 위험을 막기 위해 프로세스 별로 stack을 별도로 두고 있다.
프로세스의 상태
프로세스는 상태(state)가 변경되며 수행된다. CPU관점으로 상태가 서술된다.
상태 종류
- Running: CPU를 잡고 instruction을 수행중인 상태
- Ready: CPU를 잡고 기다리는 상태(메모리 등 다른 조건을 모두 만족)
- Blocked (wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- 프로세스 자신이 요청한 event가 즉시 만족되지 않아 기다리는 상태
- ex) 디스크에서 file을 읽어와야하는 경우
- ex) I/O 수행 중인 경우
- ex) 메모리에 실행해야하는 것이 안 올라가있는 경우(아직 Disk에 있는 경우)
- Suspended(stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다.
- ex) 사용자가 프로그램을 일시정지시킨 경우
- ex) 메모리에 너무 많은 프로세스가 올라와서 Swapper이 메모리를 뺏어 Disk에 옮긴 경우
💡 Suspended와 Blocked의 차이
Blocked는 CPU입장에서는 막힌거지만 아닌 곳에서 열심히 일을 하고 있다. 그런데 Suspended는 프로세스에서 메모리를 뺏은 상태이다.
- Blocked : 자신이 요청한 event가 만족되면 Ready로 돌아갈 수 있음
- Suspended: 외부에서 정지시켜놓은거라 외부에서 Resume해주어야 Active한 상태로 넘어갈 수 있다.
💡 경우에 따라 상태를 2개를 더 추가하기도 한다.
- New: 프로세스가 생성중인 상태
- Terminated: 수행이 끝난 상태(프로세스가 아닌데 정리가 아직 안된 경우)
프로세스 상태도
- ready인 상태에도 Memory에 적재되어있는 상태라는 것 주의
- running
- → Ready: 할당된 시간이 끝나서 CPU 뻇김
- → terminated: 프로세스 종료
- → waiting : 자진해서 CPU를 넘김
컴퓨터 시스템 관점의 프로세스 상태변화
- 프로세스가 running되던 상태 → 타임interrupt가 들어오면 Ready queue에 다시 offer되고 다음것이 poll 됨
- running상태의 프로세스가 Disk에서 파일을 읽어야하는 상황 → blocked상태로 변하고 Disk의 서비스를 받는 것에 queue에 offere됨. → 끝나면 DiskController가 CPU에 interrupt → CPU는 진행중인 프로세스를 잠시 멈추고 OS에게 CPU 제어권 넘김 → OS는 프로세스 메모리 영역에 IO결과를 넘겨주고, 상태를 blocked에서 ready로 바꿔 Ready queue에 넣어 CPU를 얻을 수 있는 자격을 준다.
- 공유데이터도 프로세스가 접근중이면 다른 프로세스는 접근을 막아야 동시성 문제가 해결되서 blocked 상태로 둠
- 오래 기다리는 상태는 blocked상태라고 보면 된다.
- queue는 운영체제 커널이 본인의 data영역에 자료구조로 queue를 만들어놓고 프로세스의 상태를 바꿔가면서 CPU제어권을 넘기는 것이다.
Process Control Block(PCB)
프로세스마다 OS가 PCB 생성하여 관리한다.
PCB 이미지 부가 설명
- - CPU가 프로세스에 먼저 온 순서대로만 처리하지 않음. 정확한 CPU Scheduling은 우선순위를 봄. 그것에 관한 값을 저장하는 공간
- - 프로세스의 문맥을 표시하기 위한 정보.
- - 메모리 관련된 문맥
- - 프로세스가 오픈하고 있는 파일같이 그 외의 리소스 관련 정보
Context Switch(문맥 교환)
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정이다.
위에서 공부한대로 실행중이던 프로세스가 CPU제어권을 뺏길 때 context를 커널의 PCB에 save한다.
그런데 System call이나 Interrupt(하드웨어)발생 시 반드시 context switch가 일어나는 것이 아니다.
정확히 말하면 사용자 프로세스에서 운영체제로 CPU제어권이 넘어가게되는데 그 이후 다른 사용자 프로세스로 넘어갈 때를 Context switch가 발생하고, 다시 원래의 프로세스로 넘어가면 Context switch가 발생하지 않는다.
문맥교환이 발생하며 CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행한다.
- CPU를 내어주는 프로세스의 문맥(context)를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 문맥(context)을 PCB로부터 읽어 실제 하드웨어로 복원
프로세스를 스케줄링하기 위한 큐
- Job queue: 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue: 현재 메모리 내에 있으면서 CPU의 제어권을 잡고 실행되기를 기다리는 프로세스의 집합
- Device queue: I/O Device마다 처리를 기다리는 프로세스의 집합
Ready queue와 Device queue는 공통분모가 없다.
queue에는 프로세스를 넣는게 아니라 정확하게는 PCB를 넣어놓는 것이다.
스케줄러(Scheduler)
어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드를 말한다. 쉽게말해 각 자원별로 순서를 정해주는 역할을 한다.
- Long-term scheduler( = job scheduler)
- 메모리를 어떤 프로세스에게 줄지를 결정하는 문제
- new 에서 ready상태로 가기 위해서는 프로세스가 메모리에 올라가야하는데 이 것을 결정한다.
- 시작 프로세스 중에 어떤 것을 ready queue로 보낼지 결정
- degree of Mulitprogramming을 제어
- degree of Mulitprogramming: 메모리에 몇 개의 프로그램을 동시에 올려놓을지.
- time sharing system에는 보통 장기 스케쥴러가 없다(무조건 ready)
- Short-term scheduler(= CPU scheduler)
- 짧은 시간단위로 스키줄이 정해지기 때문에 충분히 빨라야한다.(ms단위)
- 어떤 프로세스를 다음번에 running시킬지 결정
- 어떤 프로세스에 CPU를 줄지를 결정하는 문제
- Medium-term scheduler(= Swapper)
- 메모리에 너무 많은 프로그램이 올라가 있으면 일부 프로그램을 메모리에서 디스크로 쫓아낸다.
- 프로세스에게서 메모리를 뺏는 문제
- degree of Multiprogramming을 제어하는 것
프로세스 상태도 (suspended 추가)
💡 주의
프로세스가 실행 중에 OS에 요청해서 운영체제가 CPU제어권을 갖고 있다고 하더라도 운영체제가 Running하고 있다고 보지 않는다.
프로세스가 user mode로 Running하고있다가 해당 프로세스가 kenal mode로 Running하고 있다고 본다.
'CS > 운영체제' 카테고리의 다른 글
[OS] 4-1: 프로세스 매니저(Process Manager) - 프로세스 관련 시스템 콜 (0) | 2023.07.06 |
---|---|
[OS] 3-2: 프로세스(Process)(2) - 쓰레드(Thread) (0) | 2023.06.27 |
[OS] 2-2: 컴퓨터 시스템 구조&프로그램 실행(2) (0) | 2023.06.22 |
[OS] 2-1: 컴퓨터 시스템 구조&프로그램 실행(1) (0) | 2023.06.21 |
[OS] 1-1: 운영체제의 개념과 구조 (0) | 2023.06.21 |