프로세스 개념
초기의 컴퓨터 시스템은 한 번에 하나의 프로그램만을 수행하도록 허용하였다. 반면에 오늘날 우리가 사용하는 컴퓨터 시스템은 메모리에 다수의 프로그램들이 적재되어 병행 수행되는 것을 허용한다. 이런 발전으로인해 프로세스의 개념이 생기게 되었다. 이쯤에서 프로세스의 정의를 짚고 넘어가자.
프로세스 : 수행중인 프로그램
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램이다. 프로세스는 현대의 시분할 시스템에서 작업의 단위이므로, 작업(task, job)이라는 용어와 거의 같은 의미로 쓰인다.
메모리 내의 프로세스
프로세스는 다음을 포함한다(즉, 메모리에 로드 될 수 있는 프로세스는 다음과 같은 구조를 가질 수 있다.)
- 프로그램 카운터 : 다음에 실행될 명령어의 주소를 가지고 있다.
- 현재 활동 : 프로세스 레지스터의 내용
- 스택 : 일반적으로 함수의 매개변수, 복귀 주소, 지역 변수와 같은 임시적인 자료
- 데이터 섹션 : 전역 변수들을 포함
- 힙 : 프로세스 실행중에 동적으로 할당되는 메모리
< 메모리 상의 프로세스 : 프로세스가 포함하는것 >
프로세스 상태
프로세스는 또한 실행되면서 그 상태가 변하기도 한다. 다음은 프로세스가 가질수 있는 상태의 목록이다.
- 신설(new) : 프로세스 생성
- 수행(running) : 명령어가 실행 중 이다.
- 대기(waiting) : 프로세스가 이벤트 발생을 기다리고 있다.
- 준비(ready) : 프로세스가 자신에게 프로세서(CPU)가 할당되기를 기다리고 있다.
- 종료(terminated) : 프로세스가 실행을 완료했다.
< 프로세스 상태도 >
PCB(프로세스 제어 블록)
각 프로세스는 운영체제 내에서 프로세스 제어 블록에 의해서 표현된다.
< 프로세스 제어 블록(PCB) >
- 프로세스 상태
- 프로그램 카운터
- CPU 레지스터들 : CPU 레지스터는 컴퓨터의구조에 따라 다양한 개수와 유형을 가진다. 레지스터에는 누산기, 색인 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드 정보가 포함된다. 프로그램 카운터와 함께 이 상태 정보는 나중에 프로세스가 계속 올바르게 수행되도록 하기 위해서, 인터럽트 발생 시 저장되어야 한다.
- CPU 스케줄링 정보
- 메모리 관리 정보
- 회계 정보 : 이 정보는 CPU가 사용된 양과 사용된 실시간, 시간 제한, 계정 번호, 프로세스 번호 등을 포함한다.
- 입/출력 상태 정보 : 이 프로세스에 할당된 입/출력 장치들과 열린 파일의 리스트 등을 포함한다.
자 그럼 PCB가 왜 나왔는지, 왜 필요한지 생각해보자. 우리는 시분할 기법을 사용함으로서 멀티 태스킹을 할 수 있다. 즉, 우리가 음악을 들으면서 문서작업을 동시에 할 수 있는 것이 바로 멀티 태스킹이라고 생각하면 된다. 하지만 사용자가 보기에는 모든 작업이 동시에 이루어지는 것 같지만 실제로는 CPU가 밀리세컨드 단위로 작업을 돌아가면서 수행하기 때문에 우리가 그렇게 느끼는 것이다. 이처럼 CPU가 작업을 돌아가면서 할 때 음악 프로세스에서 문서 프로세스로의 내용 전환(context switch)이 일어난다. 내용 전환 시에 필요한 것이 바로 프로세스의 상태들이다. 즉 위에서 언급했던 음악 프로세스의 내용들을 문서 프로세스의 내용으로 바꿔야 CPU가 문서 작업을 할 수 있는 것이다. 만약 이런 상태들이 저장되지 않는다면 음악을 어디까지 들었는지 문서를 얼마나 작성했는지와 같은 정보들을 전혀 모르게 되는 것과 비슷하다고 생각하면 이해가 쉬울지도 모르겠다.
< CPU의 내용 전환(context switch) >
요약하자면 프로세스 제어 블록은 단순히 프로세스마다 변하는 모든 정보에 대한 저장소의 역할을 한다.
프로세스 스케줄링
다중 프로그래밍의 목적은 CPU의 사용률을 최대화 하는 것이다. 여러 개의 프로그램(프로세스)을 메모리에 올려 하나의 프로그램이 입출력 작업을 수행 중인 경우(CPU의 연산이 필요하지 않는경우를 뜻한다) CPU가 다른 프로세스를 수행함으로써 CPU가 항상 어떤 프로세스든지 실행중이게 한다는 방법이다. 이것이 가능하기 위해선 앞에서 말했던 시분할이 이루어져야 한다. 시분할은 내용 전환을 하면서 현재 수행할 프로세스를 바꾸는 것이라고 했는데, 내용 전환을 하기 위해 다음에 어떤 프로세스를 수행할 것인지를 설정하고 관리하는 것이 바로 프로세스 스케줄링(CPU 스케줄링)이라고 할 수 있을 것이다.
프로세스 스케줄링 : 다중 프로그래밍을 가능하게 하는 운영체제의 동작 기법. 운영체제는 프로세스들에게 CPU등의 자원 배정을 적절히 함으로써 시스템의 성능(사용률 등)을 개선할 수 있다.
스케줄링 큐
프로세스들은 여러 큐들을 이동하며 스케줄링 된다.
- 작업 큐 : 시스템 내에 있는 모든 프로세스 집합
- 준비 큐 : 주 메모리에 상주하면서 실행될 준비를 하고 있는 프로세스 집합
- 장치 큐 : 입출력 장치를 기다리고 있는 프로세스 집합
< 프로세스 스케줄링을 표현하는 큐잉 도표 >
위 그림처럼 프로세스들은 여러 큐들 이동하면서 스케줄러가 정한 순서에 맞춰서 작업을 수행한다. 그럼 이제 프로세스 스케줄링을 하는 스케줄러의 종류에 대해서 이야기 해보자.
스케줄러
- 장기 스케줄러 ( Long-term scheduler) : 디스크로부터 주 메모리 상의 준비 큐로 옮겨질 프로세스들을 선택한다.
- 단기 스케줄러 (Short-term scheduler) : 준비 큐에 있는 어떤 프로세스가 다음 차례에 수행될지 선택하여 CPU를 할당한다.
풀어서 말하면, 장기 스케줄러는 하드 -> 주 메모리
단기 스케줄러는 주 메모리 -> CPU 이렇게 프로세스를 이동시킨다는 것이다.
우리가 말하는 다중 프로그래밍의 정도(몇 개의 혹은 어떤 프로세스가 주 메모리에 상주할 것인가)를 제어하는 것이라고 보면 된다. 하드에서 메인 메모리로 로드하는 것은 꽤 느린 편이다. 때문에 장기 스케줄러는 신중히 프로세스를 메인 메모리로 로드해야 한다. 그래서 장기 스케줄러는 입/출력을 많이하는 프로세스(입출력 결속 프로세스)와 CPU연산을 많이 필요로하는 프로세스(CPU결속 프로세스) 두 가지를 적절히 선택하여 메인 메모리로 로드하는 것이 중요하다.
- 중기 스케줄러 (medium-term scheduler) : 스와핑을 한다. ( 사용하지 않는 프로세스들을 제거하여 다중 프로그래밍 정도를 줄이고, 이 프로세스는 후에 다시 메모리로 올라와 수행을 계속할 수 있다. )
중기 스케줄러는 유닉스와 윈도우XP와 같은 시분할 시스템에서 주로 사용되며, 이 시스템에서 장기 스케줄러는 사용되지 않는다. 이 외에도 중기 스케줄러에 대한 많은 설명이 있지만 이 정도로 설명을 마친다.
< 큐잉 도표에 중기 스케줄링을 추가 >
'OS' 카테고리의 다른 글
3-1. 프로세스 : 프로세스의 연산 (1) | 2013.01.16 |
---|---|
2-3. 운영체제 구조 (0) | 2013.01.03 |
2-1. 운영 체제 구조 : 운영체제 서비스, UI (0) | 2012.12.30 |
1. Introduction (0) | 2012.12.30 |