GrowMe

[운영체제] 프로세스 본문

CS(Computer science)

[운영체제] 프로세스

오늘도 타는중 2022. 12. 10. 10:20
프로세스
# 프로세스의 개념
# 프로세스의 상태
# PCB
# 문맥교환
# 프로세스를 스케줄링하기 위한 큐
# 스케줄러
# Thread


✍️ 본 포스팅은 이화여자대학교 반효경 교수님의 "운영체제" 강의를 들으며 정리한 내용입니다.

 


*프로세스의 개념

  • `실행중인 프로그램`을 의미
  • 프로세스의 문맥
    • 현재 CPU 수행 상태를 나타내는 하드웨어 문맥을 의미 : Program Counter / 각종 register
    • 즉, 프로세스 현재 시점의 상태를 나타내기 위해 문맥을 사용
    • 프로세스의 주소 공간 : code, data, stack
    • 프로세스 관련 커널 자료 구조 : PCB(Process Control Block), Kernel stack

*프로세스의 상태

- 프로세스는 상태가 변경되며 수행된다

  • Running : CPU를 잡고 instruction을 수행중인 상태
  • Ready : CPU를 기다리는 상태(메모리 등 다른 모든 조건을 만족하고)
  • Blocked(wait, sleep)
    • CPU를 주어도 당장 instruction을 수행할 수 없는 상태
    • Process 자신이 요청한 event(예 : I/O)가 즉시 만족되지 않아, 이를 기다리는 상태
    • ex) 디스크에서 file을 읽어와야 하는 경우
    • 자신이 요청한 event가 만족되면 Ready
  • Suspended(stopped)
    • 외부적인 이유로 프로세스의 수행이 정지된 상태
    • 프로세스는 통째로 디스크에 swap out된다
    • 예) 사용자가 프로그램 일시 정지시킨 경우, 시스템이 여러 이유로 프로세스를 잠시 중단 시킴
      (메모리에 너무 많은 프로세스가 올라와 있을 떄)
    • 외부에서 resume해주어야 Active
  • New : 프로세스가 생성중인 상태
  • Terminated : 수행(execution)이 끝난 상태(아예끝나면 프로세스 자체가 아님. 수행이 끝나면 정리작업이 남아있는데, 그것을 진행중인 상태)

- 프로세스 상태도

- 프로세스의 상태


*Process Control Block (PCB)

  • 운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보
  • 다음의 구성 요소를 가진다(구조체로 유지)
    1. OS가 관리상 사용하는 정보
      • Process state(ready, blocked, running), Process ID
      • scheduling information, priority
    2. CPU 수행 관련 하드웨어 값 : Program counter, registers
    3. 메모리 관련 : Code, data, stack의 위치 정보
    4. 파일 관련 : Open file descriptors...

*문맥 교환

- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정

- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행

  • CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
  • CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
  • CPU를 빼앗겼다가 새로 얻었을때, 처음부터 다시하는게 아니라, 이미 저장된 내용을 기준으로 진행하는 목적

- System call이나 Interrupt 발생시 반드시 context switch가 일어나는 것은 아님

  • 즉, 운영체제로 CPU 제어권이 넘어갈 때, 문맥 교환이 일어나지 않고
  • 운영체제로 넘어가고 나서, 다른 사용자 프로그램에 CPU 제어권을 내어주면, 그때 문맥 교환이 일어남
  • 그림에서 (1)의 경우에도 CPU 수행 정보 등 프로세스 문맥의 일부를 PCB에 저장해야 하지
  • 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 크다(eg. cache memory flush)

 

*프로세스를 스케줄링하기 위한 큐

  • Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
  • Ready queue : 현재 메모리 내 있으면서 CPU를 잡아서 실행되기 기다리는 프로세스의 집합
  • Device queues : I/O device의 처리를 기다리는 프로세스의 집합
  • 프로세스들은 각 큐들을 오가며 수행된다

- Ready Queue와 다양한 Device Queue

- 프로세스 스케줄링 큐의 모습

 

*스케줄러

  • 현재 시스템에서는 대체로 Short-Term Scheduler와 Medium-Term Scheduler를 합쳐서 많이 사용 중

- Long-Term Scheduler(장기 스케줄러 or job scheduler)

  • 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
  • 어느 프로세스에 memory(및 각종 자원)을 줄 것인지 결정
  • defree of Multiprogramming(메모리에 프로그램이 올라가는 수)을 제어
  • time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)

- Short-Term Scheduler(단기 스케줄러 or CPU scheduler)

  • 어떤 프로세스를 다음번에 running 시킬지 결정
  • 프로세스에 CPU를 주는 문제
  • 충분히 빨라야 함 (millisecond 단위)

- Medium-Term Scheduler(중기 스케줄러 or Swapper)

  • 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄
  • 프로세스에게서 memory를 뺏어낸다
  • degree of Multiprogramming을 제어

- 프로세스 상태도

  • (주의) 프로그램이 Running 상태에서 시스템 콜을 통해 운영체제에
    CPU 제어권을 넘겨주어도 그 프로그램은 monitor mode로 Running 상태임

*Thread

  • Thread란 CPU를 구성하는 단위(== lightweight process)
  • Thread의 구성 : thread 간 독립적으로 가지고 있는 것
    • program counter
    • register set
    • stack space
  • Thread가 동료 thread와 공유하는 부분(=task)
    • code section
    • data section
    • OS resources
    • 메모리 공간
  • 전통적인 개념의 process인 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다.
  • 다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked (waiting) 상태인 동안에도
    동일한 태스크 내의 다른 스레드가 실행(running)되어 빠른 처리가 가능하다.
  • 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.
  • 스레드를 사용하면 병렬성을 높일 수 있다.
  • ex) 만약웹페이지 여러개와 한글 프로그램 실행 시, 각각 별도의 프로세스의 단일 스레드로 처리하면
    프로세스마다 각각 메모리를 차지하기에 메모리 낭비를 초래할 수 있다.

- 다중 Thread의 장점

  • 빠른 응답성
    ex) 이미지가 포함된 웹 페이지 불러올 시
    • 하나의 Thread만으로 처리하면 프로세스가 blocked되어 이미지 처리가 완료될 때까지 사용자가 기다려야함
    • 다중 Thread로 처리 시, 한 Thread가 이미지 처리할 동안, Html파일을 우선 받아와서 사용자에게 먼저 보여줌
  • 자원의 공유성
    Thread들은 서로 code, data, 프로세스 메모리 공간을 공유하기에 자원을 효율적으로 사용할 수 있다.
  • 경제성(속도)
    • 프로세스를 추가하거나 CPU 교환(문맥교환)하는 것보다 thread를 추가/Switching하는 것이 속도가 더 빠르다.
    • Solaris 운영체제의 경우 위 두 경우 overhead가 각각 30배, 5배 속도 차이 발생
  • CPU가 여러개 있는 아키텍처의 경우
    프로세스가 하나라도 그 내부에 여러 쓰레드들이 있을 경우, 각각 다른 CPU를 통해 처리 가능 -> 더 빠른 결과물

*Thread의 구현

- Kernel Threads

  • 쓰레드가 여러개 있다는 사실을 운영체제 커널이 알고 있음
  • 한 쓰레드에서 다른 쓰레드로 CPU가 넘어가는 것도 커널이 CPU 스케줄링하듯이 넘겨준다
  • 운영체제 예) Windows 95/98/NT, Solaris, Digital UNIX, Mach

- UserThreads

  • 라이브러리를 통해 지원됨
  • 프로세스 안에 쓰레드가 여러개 있다는 걸 운영체제가 모름
  • 유저 프로그램 스스로 쓰레드들을 관리
  • 운영체제 예) POSIX Pthreads, Mach C-threads, Solaris threads
Comments