Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- GIT
- Bull
- 공룡게임
- flask
- 자료구조
- Express
- nodejs
- Sequelize
- MySQL
- 정렬
- Nest.js
- react
- 게임
- TypeScript
- dfs
- mongoose
- Queue
- nestjs
- JavaScript
- typeORM
- jest
- Python
- OCR
- cookie
- AWS
- Dinosaur
- MongoDB
- class
- game
Archives
- Today
- Total
포시코딩
[운영체제] 3. 프로세스 관리 (1) - Process 본문
728x90
키워드
프로세스, PCB, 문맥 교환, context switch, 큐, 스케줄러
프로세스
"Process is a program in execution"
즉, 실행중인 프로그램
프로세스의 문맥(context)
- '문맥'이란 단어의 뜻 그대로 어떤 프로그램에 대해
무엇을 어떻게 실행했는지, 어떤 상태에 있는지를 정확하게 나타내기 위한 개념 - 특정 시점을 봤을 때 해당 프로세스가 어디까지 수행했는지를 규명하는데 필요한 요소
- 코드가 어디까지 실행됐는가, 변수의 값은 얼마인가, 함수를 호출하면서 스택에 쌓인게 뭐고 어디까지 쌓였는지 등
- 프로세스의 현재 상태를 나타내는데 필요한 모든 요소를 '프로세스의 문맥'이라고 한다.
CPU와 관련된 하드웨어 문맥
- PC(Program Counter)
- 각종 register
메모리와 관련된 프로세스의 주소 공간
- code, data, stack
프로세스 관련 커널 자료구조
- PCB(Process Control Block)
- Kernel stack
프로세스의 상태(Process State)
프로세스는 상태(state)가 변경되며 수행된다.
Running
- CPU를 잡고 인스트럭션(instruction)을 수행중인 상태
- 주의해야할게 시스템 콜이나 인터럽트로 인해 운영체제로 제어권이 넘어갔을 때
운영체제가 running중인게 아니라
프로세스가 user mode로 running중이었던게 -> monitor mode로 running중이다 로 바뀌는 것이다.
Ready
- CPU를 기다리는 상태(메모리 등 다른 모든 조건을 만족한 상태)
- 프로그램이 CPU에서 실행되려면 필요한 부분이(CPU가 디스크 접근 등을 못하니까)
물리적인 메모리에 올라와있어야 CPU를 얻었을 때 인스트럭션을 실행할 수 있기 때문에 - Ready 상태의 프로세스들이 번갈아가며 CPU를 잡아 사용(Time sharing)
Blocked(wait, sleep)
- CPU를 줘도 당장 인스트럭션을 수행할 수 없는 상태
- 프로세스 자신이 요청한 event(I/O 같은)가 즉시 만족되지 않아 이를 기다리는 상태
- ex) 디스크에서 file을 읽어와야 하는 경우 등
Suspended(stopped)
- medium-term scheduler(중기 스케줄러) 때문에 추가된 상태
- (하단 스케줄러에서 다시 설명)
그 외
- New: 프로세스가 생성중인 상태
- Terminated: 프로세스가 종료중인 상태. 즉, 수행(execution)이 끝난 상태
PCB
(=Process Control Block)
- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
OS가 관리상 사용하는 정보
- 사진에서 (1)에 해당
- Process state, Process ID
- scheduling information, priority
CPU 수행 관련 하드웨어 값
- 사진에서 (2)에 해당
- 프로세스의 문맥을 표시하기 위한 정보
- PC(Program Counter), registers
메모리 관련
- 사진에서 (3)에 해당
- code, data, stack의 위치 정보
파일 관련
- 사진에서 (4)에 해당
- 프로세스가 오픈하고 있는 파일들에 대한 정보
문맥 교환(Context Switch)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- 어떤 프로세스가 CPU를 장악하고 계속 쓰는게 아닌
짧은 시간 간격으로 CPU를 얻었다, 뺏겼다의 과정을 반복하기 때문에
뺏겼다 다시 얻었을 때 처음부터 실행하는게 아닌
뺏기던 시점의 문맥을 기억해놨다가 그 시점부터 계속 시작할 수 있는 매커니즘이 필요 - 문맥 교환시의 작업은 다음과 같다.
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
- 보통의 경우 (1)처럼 커널로 넘어오기 전의 프로세스에 다시 넘겨준다.
이 경우는 문맥 교환이 아님 - timer interrupt는 CPU를 다른 프로세스에 넘기기 위한 의도를 가진 인터럽트기 때문에
(2)처럼 문맥 교환 발생 - 오래 걸리는 I/O 요청을 할 경우에도 문맥 교환 발생
- 단, (1)번의 경우에도 문맥 교환이 일어나진 않았지만
CPU가 사용자의 코드를 실행하다 커널의 코드를 실행하고 다시 사용자한테 CPU가 넘어가기 때문에
약간의 문맥은 save가 되야함 - 대신 문맥 교환보다는 훨씬 오버헤드가 적음(부담이 적다)
- A에서 B로 CPU가 넘어가 문맥 교환이 일어나게 되면 보통 A 프로세스가 사용하던 캐시 메모리를 다 지워야함
-> cache memory flush (상당한 오버헤드가 발생)
하지만 (1)처럼 A -> 커널 -> A일 경우에는 그 과정까진 필요로 하지 않음
프로세스를 스케줄링하기 위한 큐
Job queue
- 현재 시스템 내에 있는 모든 프로세스의 집합
- 밑의 ready queue, device queue에 있는 프로세스도 Job queue에 포함
Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- ready queue에 있으면 device queue에 없음
Device queue
- 각 I/O device마다 처리를 기다리는 프로세스의 집합
- device queue에 있으면 ready queue에서 빠짐
스케줄러(Scheduler)
자원별로 시간을 얼만큼 잡고 등을 정하는게 스케줄러
Long-Term Scheduler
(=장기 스케줄러 or job scheduler)
- 프로세스에 memory(및 각종 자원)를 주는 문제
- 프로세스가 시작될 때 new에 있는데 ready가 되려면 memory가 있어야 함
이 때, 이 메모리를 줄지 안줄지를 long-term scheduler가 결정 - 즉, 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- degree of Multiprogramming을 제어
Multiprogramming이란 메모리에 여러 프로그램이 동시에 올라가는 개념
즉, 메모리에 올라가 있는 프로세스의 수를 제어하는게 long-term scheduler의 역할 - 메모리에 동시에 너무 많은 프로그램이 올라가도 컴퓨터 성능이 안좋아짐
(각 프로그램이 메모리를 너무 조금씩만 가지고 있어서 프로그램을 실행하려해도 하지 못하는 문제 발생) - 또, 메모리에 프로그램이 너무 적게 올라가도 성능이 안좋아짐
(하나밖에 없는데 I/O하러 가면 CPU가 놀기 때문) - 이런 이유로 메모리에 프로그램 몇 개를 동시에 올려놓을지를 제어하는게
degree of Multiprogramming 제어 - but, 보통 우리가 사용하는 시스템(time sharing system)에서는 장기 스케줄러가 없음
(무조건 ready) - 보통은 장기 스케줄러가 발동해서 프로그램한테 메모리를 줄지 안줄지를 결정하는 단계 없이
어떤 프로그램이 실행되면 곧바로 메모리에 올려놓음 - 그럼 장기 스케줄러가 없는데 어떻게 degree of Multiprogramming을 조절하느냐?
-> 하단의 medium-term scheduler를 통해 조절함
Short-Term Scheduler
(=단기 스케줄러 or CPU scheduler)
- 굉장히 짧은 시간 단위로 스케줄이 이루어짐
- millisecond 단위로 스케줄이 이루어짐
- 다음번에 어떤 프로세스에 running시킬지(CPU를 줄지) 결정
- 프로세스 CPU를 주는 문제
- long-term scheduler와 반대
Medium-Term Scheduler
(=중기 스케줄러 or Swapper)
- 프로세스에게서 memory를 뺏는 문제
- 메모리에 너무 많은 프로그램이 동시에 올라가 있으면 Swapper가 일부 프로그램을 골라 메모리를 뺏음
- 다시 말해, 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아낸다.
- degree of Multiprogramming 제어
즉, 메모리에 올라가있는 프로세스의 수를 조절 - 중기 스케줄러 때문에 프로세스의 상태가 하나 추가됨
-> Suspended(stopped) 상태
Suspended(stopped) 상태
- medium-term scheduler(중기 스케줄러) 때문에 생긴 프로세스의 상태 중 하나
- 중기 스케줄러 때문에 메모리를 통째로 빼앗긴 프로세스의 상태
running, ready, blocked 중 무엇도 아니기 때문에 suspended 상태로 추가됨 - 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스가 디스크에서 통째로 swap out된 상태를 의미
- blocked와 suspended 상태의 구분
- blocked: 자신이 요청한 일을 하면서 기다리는 상태로 조건이 만족되야 ready 상태가 됨
- suspended: 외부에서 정지시켜놓은 상태기 때문에 외부에서 재개시켜줘야 active 상태가 됨
- 메모리에 너무 많은 프로세스가 올라와 있을 때 뿐만 아니라
사용자가 프로세스를 일시 정지시킬 경우에도 해당
728x90
'CS (Computer Science)' 카테고리의 다른 글
[운영체제] 3. 프로세스 관리 (3) - 생성, 종료 (0) | 2023.04.28 |
---|---|
[운영체제] 3. 프로세스 관리 (2) - Thread (0) | 2023.04.28 |
[운영체제] 2. 컴퓨터 시스템의 구조 (2) (0) | 2023.04.20 |
[운영체제] 2. 컴퓨터 시스템의 구조 (1) (0) | 2023.04.20 |
[운영체제] 1. 운영체제란 (0) | 2023.04.19 |