이화여대 반효경 교수님의 운영체제 강의를 수강한 후 내용을 정리
프로세스의 개념
- 프로세스는 프로그램이 실행중에 있음을 의미함
- 프로세스의 문맥(context)
- CPU 수행 상태를 나타내는 하드웨어 문맥(Program Counter, 각종 register)
- 프로세스의 주소 공간(code,data,stack)
- 프로세스 관련 커널 자료 구조(PCB, Kernel stack)
프로세스 상태
- Running : CPU를 잡고 instruction을 수행중인 상태
- Ready : CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족한 상태에서)
- Blocked(wait, sleep) : CPU를 할당받아도 명령어를 수행할 수 없는 상태(예: 디스크에서 file을 읽어와야되는 경우)
- Suspended (stopped) : 외부적인 이유로 프로세스의 수행이 정지된 상태 프로세스는 통째로 디스크에 swap out됨,
(예): 메모리에 너무많은 프로세스가 올라와있어서 Swapper로 인해 메모리를 뺏겼을때, 사용자가 프로그램을 일시 정지시킨 경우(break key)
- New : 프로세스가 생성 중인 상태
- Terminated : 수행이 끝난 상태
Blocked : 자신이 요청한 event가 만족되면 ready
Suspended : 외부에서 resume해줘야 Active
Process Control Block(PCB)
- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- 다음 구성 요소를 가짐(구조체로 유지됨)
- 프로세스 식별자 : PID
- 프로세스 상태 : CPU 할당 가능 여부
- 프로그램 카운터 : 다음에 수행할 명령의 위치
- 레지스터 저장 영역 : 레지스터 관련 정보
- 프로세서 스케줄링 정보 : 우선순위, 스케줄 큐에 대한 포인터, 다른 스케줄 매개변수 포함
- 계정 정보 : CPU 사용시간, 계정 번호 등등
- 입출력 상태 관련 정보 : 프로세스에 할당된 입출력 장치들과 열린 파일 목록 등등
Context Switch(문맥 교환)
- CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행함
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
(1)의 경우도 CPU 수행 정보 등 context의 일부를 PCB에 저장해야되지만, 문맥 교환이 일어나는 (2)의 경우 그 부담이 훨씬 큼
프로세스를 스케줄링하기 위한 큐
- Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합
- Ready queue : 현재 메모리 내에 있으면서 CPU를 할당받아 실행되기를 기다리는 ready상태인 프로세스의 집합
- Device(IO) queues : I/O device의 처리를 기다리는 프로세스의 집합
- 프로세스들은 각 큐들을 오가며 수행됨
스케줄러 (Scheduler)
*degree of Multiprogramming 제어의 중요성 - 메모리에 프로세스가 너무 많아도 너무 적어도 성능이 안좋아짐 따라서
시스템의 성능을 위해 조절하는게 중요함
- Long-term scheduler(장기 스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정 --> 어떤 프로세스한테 메모리를 줄까?
- 프로세스에 memory(등의 자원)을 주는 문제
- degree of Multiprogramming(메모리에 몇 개의 프로세스가 올라와 있는가) 을 제어
- time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
- Short-term scheduler(단기 스케줄러 or CPU scheduler)
- 어떤 프로세스를 다음번에 running시킬지 결정
- 프로세스에 CPU를 주는 문제
- 충분히 빨라야 함 (millisecond 단위)
- Medium-term scheduler(중기 스케줄러 or Swapper)
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫓아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of Multiprogramming을 제어
Thread
-
스레드(lightweight process)는 프로세스 안에서 실행되는 여러 흐름 단위를 의미함
-
기본적으로 프로세스는 최소 1개이 스레드를 가지고 있음 즉 하나의 프로세스가 생성될 때, 기본적으로 하나의 스레드도 같이 생성됨
-
스레드는 프로세스의 주소공간에서 Stack 영역만 따로 할당 받고 나머지(code, data, heap) 영역은 공유 공유하는 부분을 다른말로 task라고도함
즉, 프로세스는 자신만의 고유 공간과 자원을 할당받아 사용하는데 반해, 스레드는 다른 스레드와 공간, 자원을 공유하면서 사용하는 차이가 존재함
-
스레드의 장점
- 다중 스레드로 구성된 테스크 구조에서는 하나의 서버 스레드가 blocked(wait) 상태인 동안에도 동일한 테스크 내의 다른 스레드가 실행되어 빠른처리 가능
- 예를들면, 웹 브라우저에서 네이버에 들어갔을떄, 네트워크를 통해서 웹페이지를 읽어옴(IO작업) 이때 웹브라우저는 blocked상태가됨, 이렇게되면 사용자는 웹페이지 IO작업이 끝날떄 까지 아무것도 보지못함 근데 만약 웹브라우저를 여러 개의 스레드를 사용해서 만들어놓게되면 하나의 스레드가 IO작업을 하는 도중에 웹브라우저를 blocked상태로 만들지 않고 이미 읽어온 텍스트라도 화면에 띄워주게 되면 사용자의 불편함이 덜해지게됨 --> 사용자에게 빠른 응답성 제공
- 동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리률과 성능 향상(웹 브라우저를 여러 개 띄운다고 여러 개의 프로세스가 주소 공간을 차지하지 않음)
- 스레드사용 -> 병렬성 업
-
스레드의 종류
- Kernel 스레드 : 운영체제 커널의 지원을 받는 스레드, 운영체제 커널이 스레드의 존재를 앎
- user 스레드 : 라이브러리를 통해서 지원되는 스레드, 커널이 스레드의 존재를 모름
- real time 스레드 : 리얼타임 기능을 제공하는 스레드
Reference
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09