데이터 엔지니어
[OS Chapter 3] Process 본문
3번째 챕터입니다.
이번 챕터에서는 Process와 Thread가 무엇인지, 운영체제 위에서 어떻게 돌아가는지를 설명해주십니다.
스터디에서 아래 깃헙 레포에 각 스터디원이 문제를 출제하고 정답을 맞추는 식으로 진행중입니다.
문제에 관심 있으시면 참고하셔도 될 것 같습니다.
깃헙 레포: github.com/smothly/OS-study-7week-challenge
Procss
Process is a program in execution
프로세스의 문맥(context)
- 문맥은 이 프로그램이 무엇을 어떻게 실행했는지 현재 시점이 어떻게 사용
- 특정시점을 놓고 봤을 때 어디까지 수행을 했고, 현재시점의 정확한 상태를 규명하기 위함
- 프로세스는 독자적인 주소 공간을가지고있음
- code, data, stack
- CPU 수행 상태를 나타내는 하드웨어 문맥
- Program Counter
- 각종 register
- 프로세스 관련 커널 자료 구조
- PCB(Process Control Block)
- 프로세스가 하나 실행될 때 마다 운영체제(커널)에 PCB가 생성됨
- Kernel stack: 커널 주소 공간의 코드는 프로세스 별로 stack을 두고 있음.
- PCB(Process Control Block)
왜 Context가 필요한가?
=> 프로세스의 문맥을 알지 못할 경우 CPU가 여러 프로세스를 관리하는데 프로세스를 재시작할 때 어디서부터 시작해야 할지 모르는 경우가 생긴다.
프로세스의 상태 state
Running: CPU를 잡고 instruction을 수행중인 상태
Ready: CPU를 기다리는 상태(다른 조건은 다 만족한 상태, CPU만 얻으면 되는 상태)
Blocked(wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- Process 자신이 요청한 event(예로는 I/O)가 즉시 만족되지 않아 이를 기다리는 상태
New: 프로세스가 생성중인 상태
Terminated: 수행(execution)이 끝난 상태
I/O 예시
CPU는 명령어를 계속적으로 처리
I/O 작업이 요청되면 Blocked 상태가 됨
I/O 작업이 끝나면 CPU에 인터럽트를 걸어 Ready queue에 등록이 됨.
PCB(Process Control Block)
- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- OS가 관리상 사용하는 정보
- process state, process id
- scheduling information, priority
- CPU수행 관련 하드웨어 값
- program counter, registers
- 메모리 관련
- code data stack
- 파일 관련
- open file descriptors
문맥 교환(Context Switch)
- CPU를 한 프로세스 에서 다른 프로세스로 넘겨주는 과정
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
- PCB는 커널의 각 프로세스마다 가지고 있음 결국 커널에서 프로세스의 상태들을 관리하는 것
주의! System Call이나 Interrupt 발생 시 반드시 문맥 교환이 일어나는 것이 아님.
- OS가 처리를 하고 동일 프로세스를 갈 경우는 문맥 교환 x
- OS가 처리를 하고 다른 프로세스를 갈 경우는 문맥 교환 o
- 동일한 프로세스로 가더라도 문맥은 저장을 함. 하지만 문맥교환은 아님.
- 문맥 교환의 경우 프로세스 A -> B로 갈경우 캐시 메모리를 전부 지워야함. 이것이 상당한 오버헤드이다. (= cache memory flush)
프로세스를 스케줄링하기 위한 큐
- Job queue: 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue: 현재 메모리 내에 있으면서 CPU를 잡아 실행되기를 기다리는 프로세스의 집합
- Device queue: I/O device의 처리를 기다리는 프로세스의 집합
Queue는 PCB내의 포인터를 가지고 PCB를 줄세운다.
I/O request와 wait for an interrupt는 같은 얘기를 다른 관점에서 바라본 것임.
fork a child = 자식 프로세스가 실행할 때
스케줄러(Scheduler)
Long-term scheduler
- job scheduler
- 메모리를 어떤 프로세스에게 줄지
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지(= new상태에 있는 프로세스에게)
- degree of Multiprogramming을 제어 => 메모리에 올라가는 프로세스의 수를 결정
- time sharing system은 보통 장기 스케줄러가 없고 무조건 ready 상태이다. => Medium term Sheduler가 필요
Short-term scheduler
- CPU scheduler
- ms 단위
- 다음번에 어떤 프로세스에게 CPU를 줄지(= running)
Medium-term scheduler
- swapper
- time sharing system에서 장기 스케줄러를 사용하지 못해서 메모리에 올라가는 프로세스 제어를 이걸로 함
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 빼앗음
중기스케줄러 때문에 suspended(stopped)라는 상태가 추가됨
Suspended(stopped)
- 메모리를 빼앗긴 상태 CPU로는 아무 일을 할 수 없음
- 외부적인 이유로 프로세스의 수행이 정지됨
- 프로세스 통째로 디스크로 swap out이 됨
- ex) 사용자가 프로그램을 일시 정지시킨 경우, 메모리에 너무 많은 프로세스가 올라와 있을 때
주의!
- Blocked: 자신이 요청한 event가 만족되면 Ready
- Suspended: 외부에서 resume해 주어야 Active
새 프로세스 상태도
suspended blocked 에서 suspended ready로 가는 경우는 I/O가 완료되거나 event 일어났을 때이다.
주의!
running도 user mode / monitor mode로 나뉨
하지만, 커널 프로세스의 관점이 아니라 사용자 프로세스의 관점에서의 상태도임.
Thread
A thread(or lightweight process) is a basic unit of CPU utilization
- CPU를 수행하는 단위
- process는 하나만 띄워놓고 Program Counter만 여러개를 두어 공유할 수 있는건 최대한 공유
- thread 별도로 가지고 있는 건 CPU 수행과 관련된 PC나 register stack을 가지고 있음.
공유하는 부분
- 위의 사진에서 program counter와 registers의 항목을 제외한 부분들
- code section
- data section
- OS resources
Thread의 구성
- 위의 사진에서 program counter와 registers의 항목에 해당하는 부분들
- Program Counter
- register set
- stack space
장점
- 1. 응답성(Responsiveness)
- 웹브라우저 하나의 스레드 html문서는 읽어오고 다른 스레드는 이미지를 읽어옴
- 네트워크가 블록되도 display는 수행됨(일종의 비동기식 입출력)
- 2. 자원 공유(Resource Sharing)
- 프로세스의 code, data 자원들을 공유 하기 때문
- 3. 경제성 (Economy)
- 응답성과는 조금 다름
- process를 만드는 것과 thread를 만드는 것은 차이가 있음
- context switching이 CPU레벨과 process 레벨과 차이가 있음
- 4. 멀티 프로세싱 이용 (Utilization of MP Architectures)
- CPU가 여러개 있을 때 받을 수 있는 장점
- 각각의 thread가 각각의 process에서 병렬적으로 작업 가능 (ex) 행렬 곱셈)
예시
스레드가 하나면 웹 페이지 전체를 불러오기 전에 blocked 됨. 여러개면 어떤 쓰레드는 텍스트만 가져와 먼저 보여줄 수 있다.
스레드의 구현
커널 스레드
- 스레드가 여러개 있다는 사실을 OS 커널이 알고 있음
- CPU스케줄링 하듯이 스레드를 넘겨줌
유저 스레드
- 라이브러리를 통해 지원
- 유저 프로그램이 스스로 스레드를 관리
- 커널이 모름
리얼타임 스레드
커널의 지원 관점에서 바라보면 됨.
'컴퓨터 과학(Computer science) > 운영체제(Operating System)' 카테고리의 다른 글
[OS Chapter 6] Process Synchronization (0) | 2020.11.01 |
---|---|
[OS Chapter 5] CPU Scheduling (0) | 2020.10.29 |
[OS Chapter 4] Process Management (0) | 2020.10.20 |
[OS Chapter 2] System Structure & Program Execution (0) | 2020.10.12 |
[OS Chapter 1] Introduction to Operating Systems (0) | 2020.10.11 |