데이터 엔지니어

[OS Chapter 3] Process 본문

컴퓨터 과학(Computer science)/운영체제(Operating System)

[OS Chapter 3] Process

kingsmo 2020. 10. 19. 14:12

3번째 챕터입니다.

이번 챕터에서는 Process와 Thread가 무엇인지, 운영체제 위에서 어떻게 돌아가는지를 설명해주십니다.

스터디에서 아래 깃헙 레포에 각 스터디원이 문제를 출제하고 정답을 맞추는 식으로 진행중입니다.

문제에 관심 있으시면 참고하셔도 될 것 같습니다.

 

강의 3번째 챕터 링크

 

깃헙 레포: github.com/smothly/OS-study-7week-challenge

 

smothly/OS-study-7week-challenge

7주동안 진행 되는 OS 스터디. Contribute to smothly/OS-study-7week-challenge development by creating an account on GitHub.

github.com


Procss

Process is a program in execution

 

프로세스의 문맥(context)

  • 문맥은 이 프로그램이 무엇을 어떻게 실행했는지 현재 시점이 어떻게 사용
  • 특정시점을 놓고 봤을 때 어디까지 수행을 했고, 현재시점의 정확한 상태를 규명하기 위함
  • 프로세스는 독자적인 주소 공간을가지고있음
    • code, data, stack
  • CPU 수행 상태를 나타내는 하드웨어 문맥
    • Program Counter
    • 각종 register
  • 프로세스 관련 커널 자료 구조
    • PCB(Process Control Block)
      • 프로세스가 하나 실행될 때 마다 운영체제(커널)에 PCB가 생성됨
    • Kernel stack: 커널 주소 공간의 코드는 프로세스 별로 stack을 두고 있음.

왜 Context가 필요한가?

=> 프로세스의 문맥을 알지 못할 경우 CPU가 여러 프로세스를 관리하는데 프로세스를 재시작할 때 어디서부터 시작해야 할지 모르는 경우가 생긴다.


프로세스의 상태 state

 

출처: https://www.researchgate.net/figure/Process-state-transition-diagram_fig3_332546783

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)

출처: http://osfunctions.blogspot.com/2011/03/process-control-block.html

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
  • OS가 관리상 사용하는 정보
    • process state, process id
    • scheduling information, priority
  • CPU수행 관련 하드웨어 값
    • program counter, registers
  • 메모리 관련
    • code data stack
  • 파일 관련
    • open file descriptors

문맥 교환(Context Switch)

context switching 출처: https://zitoc.com/context-switching/

  • 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를 줄세운다. 

 

프로세스 스케줄링 큐 출처:https://m.blog.naver.com/PostView.nhn?blogId=4717010&logNo=60207453027&proxyReferer=https:%2F%2Fwww.google.com%2F

 

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

 

새 프로세스 상태도

출처: https://cs.nyu.edu/~gottlieb/courses/2000s/2008-09-fall/os/lectures/lecture-04.html

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을 가지고 있음.

출처: https://velog.io/@pa324/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-Thread%EC%8A%A4%EB%A0%88%EB%93%9C-rqk2kafwhw
단일 스레드 출처: http://osfunctions.blogspot.com/2011/03/process-control-block.html

공유하는 부분

  • 위의 사진에서 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스케줄링 하듯이 스레드를 넘겨줌

유저 스레드

  • 라이브러리를 통해 지원
  • 유저 프로그램이 스스로 스레드를 관리
  • 커널이 모름

리얼타임 스레드

 

커널의 지원 관점에서 바라보면 됨.

Comments