강의

프로세스

: 실행중인 프로그램

프로세스의 문맥

1. CPU 수행 상태를 나타내는 하드웨어 문맥

  • 프로그램 카운터가 어딜 가리키는지, 레지스터가 어떤 값을 가지고 있었는지

2. 메모리와 관련된 프로세스의 주소 공간

  • 코드, 데이터, 스택

3. 프로세스 관련 커널 자료구조

  • 프로세스가 시작될 때마다 운영체제는 PCB라는 자료구조를 가짐.
  • 프로세스가 시스템 콜 일으키면 커널이 코드를 실행.

=> 프로세스가 번갈아 실행(시분할)되기 때문에 어디까지 작업했는지 기억하기 위해선 프로세스의 문맥을 알아야함.

프로세스의 상태 (CPU 관점)

프로세스 상태도

  1. Running: CPU를 잡고 명령어 수행중
  2. Ready: 다른 조건 다 만족하고 CPU 대기하는 중 (필요한 자원이 메모리에 올라와있고)
  3. Blocked(wait, sleep): CPU가 있어도 당장 명령어 수행 불가한 상태 / IO 등 오래 걸리는 작업 중일 때
  4. New: 프로세스가 생성중
  5. Terminated: 수행 끝
  6. Suspended: 중기 스케줄러에게 메모리를 뺏긴 상태. 프로세스가 통째로 디스크에 swap out된 상태 또는 사용자가 프로그램을 정지한 경우

=> 주로 ready-running에서 CPU가 쉐어링. 러닝에서 할당 시간 만료되면 타이머 인터럽트 발생.

PCB

  • 운영체제가 각 프로세스를 관리하기위해 프로세스당 유지하는 정보.
  • 프로세스 상태, PID, 우선순위, 스케줄링 정보, 코드/데이터/스택의 메모리 내 위치 정보 등

Context Switch

  • CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정. PCB에 프로세스 문맥 정보를 넣어 문맥을 저장해둔다.
  • 시스템 콜이나 인터럽트 발생시 반드시 일어나진 않고 타이머 인터럽트나 IO 요청 시스템 콜이 일어난 이후 다른 프로세스를 실행하러 갈 때 문맥교환이 일어남.

프로세스 스케줄링 큐

프로세스 스케줄링 큐

  • CPU 작업하다가 시간 지나면 다시 레디큐 가서 서야함
  • fork a child(자식 프로세스 생성)하면 자식을 실행해두고 자기는 다시 레디큐에 선다

스케줄러

  • 장기 스케줄러: 프로세스에 메모리를 주는 문제 결정. 메모리에 올라야 레디 큐에 올라갈 수 있음. 메모리에 프로그램이 너무 많아도 적어도 문제임. 너무 적으면 CPU가 놀 수도 있음. 얼마나 멀티 프로그래밍(degree of Multiprogramming)을 할지 정함
  • 중기 스케줄러(=swapper): 메모리에 프로세스가 너무 많이 올라가 있으면 메모리를 뺏고 통째로 디스크로 쫓아냄

쓰레드

쓰레드

  • 프로세스 내부의 CPU 수행 단위. 각 쓰레드마다 현재 어떤 부분을 실행하고 있었는지 PCB 안에 각각 적어둔다.
  • 프로세스에서 코드 섹션, 데이터 섹션(메모리 주소공간), OS 자원 등은 공유하고 CPU 수행 상태는 별도로 가진다. 이때 공유하는 부분은 task라고 한다. (= 1 process 1 task)

쓰레드가 공통으로 가지는 것들

  • 프로그램 카운터, 레지스터, 스택 공간을 별도로 가짐

쓰레드를 사용하면 좋은 점

나뉜 쓰레드

  1. 응답성: 1 process 안에 여러 쓰레드가 있으면 쓰레드 하나가 blocked여도 다른 스레드가 running이 가능. (e.g.네트워크로 웹 페이지 읽어오는 동안(io 작업) 내 웹 브라우저는 blocked. 웹 브라우저를 여러 쓰레드로 불러오게하면 한 쓰레드가 웹 읽어오는 동안 다른 쓰레드가 html 파일에서 읽어온 조금의 텍스트라도 보여줄 수 있음.)
  • 비동기식 IO처럼
  1. 자원 공유: 한 프로세스에 있는 쓰레드간 자원을 공유함으로써 절약 가능
  2. 경제성: 프로세스를 스위치할때보다 쓰레드를 스위칭할 때 오버헤드가 덜함
  3. 멀티프로세서 구조의 효용성: 프로세서는 하나일때 쓰레드가 병렬로 일 가능 (e.g. 거대한 병렬 계산할 때 등)

커널 쓰레드와 사용자 쓰레드

  • 커널 쓰레드: 쓰레드가 여러개라는 걸 os가 알고 있음. 커널의 지원 받을 수 있음
  • 유저 쓰레드: 라이브러리를 통해 지원됨. 프로세스에 쓰레드가 여러개라는걸 os는 모름. 라이브러리 차원에서 관리함.

느낀점

이번 장을 통해 컴퓨터가 어떻게 한번에 많은 일을 하는가 알게 되었다. CPU 스케줄러에 종류가 있는지 몰랐는데 각각의 역할에 대해 알게 되었다.

되돌아보기 문제

  1. PCB의 구성요소 3개를 말하시오.
  2. 인터럽트가 발생할 때마다 문맥 교환이 일어난다 (O,X)?
  3. 왜 현대의 시분할 시스템엔 보통 장기 스케줄러가 없을까?