Fundamental Notes/Operating Systems

Process

콩콩댕 2009. 1. 7. 20:06
반응형

Process

1.
프로세스의 정의

실행중인 프로그램
주기억장치에 저장된 프로그램
PCB(Process Control Block) 결합된 형태의 코드
//PCB 프로세스가 작업도중 필요한 정보나 스케쥴에 필요한 여러 가지 정보를 기억 하고 있는 구조체
작업 스케쥴러(Job Scheduler) 의해서 생성되어 주기억 장치에 진입함

2. 프로세스와 프로그램의 차이점

프로그램은 수동적 개체(passive entity)이고 프로세스는 능동적 개체 (active entity)이며 반적으로 프로세스는 프로그램보다 작은 단위로 되어있다.

3. 프로세스의 계층

사용자 프로세스 : 사용자 코드를 수행하는 프로세스
운영체제 프로세스 : 사용자가 입력한 명령어를 해석하는 프로세스나 입출력 프로세스 또는 사용자 프로세스를 생성하는 등의 시스템 운영에 필요한 코드를 수행하는 프로세스

/*
(Shell) : 사용자의 명령어를 번역하여 실행을 지시하고 결과를 사용자에게 돌려주는 역할을 하는 부분으로 커널과 사용자 사이의 인터페이스 역할을 하는 부분이다. 도스에서 command.com 쉘의 기능을 하며 유닉스에서는 여러 종류의 쉘이 존재한다. 이러한 쉘은 주기억장치에 상주하지 않고 사용자가 요구할 메모리로 적재되어 실행이 된다.

커널(Kernel) : 자원을 관리하는 모듈의 집합으로 운영체제 기능의 핵심적인 부분을 모아 놓은 부분이다. 메모리 관리 스케쥴링 인터럽트 처리등의 기능을 담당하며 사용자는 직접 커널의 기능을 제어할 없으며 단지 쉘에 의해 의뢰할 뿐이다. 커널은 항상 필요로 하는 부분이므로 메모리에 적재되어 있다.

*/

4. 부모 프로세스와 자식 프로세스

프로세스는 사용자가 실행을 지시하거나 다른 프로세스의 호출에 의해서 실행 되는데 다른 프로세스의 호출에 의해 실행 되는 경우 호출한 프로세스를 부모 프로세스 호출된 프로세스를 자식 프로세스라고 한다.

부모 프로세스 (Parent Process)

자식 프로세스 (Child Process)

자식의 자원 공유를 제한할 수 있다.
동작 종료시 운영체제에게 자원의 사용 종료를 알린다
.
자식 프로세스가 종료되더라도 종료되지 않는다.

부모의 자원을 공유하여 사용할 수 있다.
동작 종료시 자원을 부모 프로세스에게 반납한다
.
부모 프로세스 종료시 자동으로 종료된다.


5. 프로세스의 상태 변환

프로세스는 실행도중 상태를 변화하면서 실행 종료를 하게 된다.
: 프로세스의 상태 변화 용어

변경 전

변경 후


비고

준비(Ready)

실행(Run)

Dispatch

CPU Scheduler

실행(Run)

준비(Ready)

Timer Run Out

Interrupt 방식

실행(Run)

대기(Wait)

Block

스스로 CPU사용 양보

대기(Wait)

준비(Ready)

Wake Up

문맥교환이 일어나지 않는다.

제출(Submit)

보류(Hold)

SPOOLer

프로세스의 상태 전이에 포함되지 않는다.

보류(Hold)

준비(Ready)

Job Scheduler

실행(Run)

종료(End)

End


음영처리된 부분은 문맥교환을 일으키는 상태 변화이다.


: 프로세스의 상태

제출(Submit)

사용자가 프로그램의 실행을 요구한 상태

보류(Hold)

프로그램 실행을 위해 SPOOL공간으로 이동한 상태

준비(Ready)

Job Scheduler에 의해 프로세스로 생성되어 주기억 장치로 이동한 상태

실행(Run)

CPU를 할당받아 실행중인 상태

대기(Wait)

I/O 종료 신호를 기다리는 상태

종료(End)

프로세스가 실행의 끝낸 상태


6. 문맥교환(context switching)

CPU 사용하는 프로세스가 다른 프로세스로 새롭게 배당되는 교환과정을 문맥교환이라고 하며 문맥교환 시간은 짧을수록 CPU 효율이 좋아지므로 스레드 개념을 사용하여 문맥교환 시간을 줄이기도 한다.

. 문맥교환의 처리 과정

프로세스의 실행
운영체제 호출
프로세스의 상태 PCB 저장
스케쥴링
새로 선택된 프로세스의 상태 PCB 저장
새로운 프로세스의 실행

/*

스레드(Thread) 프로세스는 실행환경부분과 제어 부분의 부분으로 나눌 있는데 스레드란 프로세스의 제어 부분만을 말한다. 스레드는 실행에 필요한 최소한의 정보만 가지고 자신에 속해 있는 프로세스의 기억 장치나 파일과 같은 실행 환경을 다른 스레드와 공유하여 프로세스의 생성과 문맥교환 등의 오버헤드를 줄여서 운영체제의 성능을 개선할 있게 된다.

*/

. 스레드의 장점

병행성 증진
기억 장소의 낭비가 줄어든다
프로세스의 생성이나 문맥 교환 등의 오버헤드를 줄여 성능이 개선된다.

참고) 프로세스의 종류

경량(light process)
여러개의 스레드가 같은 stack 자원 공유
중량(medium process)
여러개 스레드가 각각의 stack 자원을 갖음
중량(heavy process)
1
개의 스레드

7. 프로세스 제어 블록(PCB :process control block)

. 정의 특징

프로세스가 변경되는 내용을 운영체제가 관리하기 위하여 사용하는 자료구조
PCB 프로세서 생성시에 만들어지며 주기억 장소에 유지되고 프로세서가 실행을 종료하면 해당 PCB 함께 회수된다.

.

프로세스 식별번호(process identifier)
프로세스의 상태
프로세스 우선순위
하드웨어 상태(각종 레지스터의 정보)
CPU 사용 시간, 대기 시간
기억 장소 관리 정보 : 경계 레지스터나 페이지 테이블등에 관한 정보
입출력 상태 : 배당된 입출력장치들과 대기중인 입출력 조작들의 정보
프로세스에 활당된 자원에 대한 포인터
부모/자식 프로세스 번호

8. 프로세스 관련 Scheduler

. 프로세스의 분류

Job scheduler (Long Term Scheduler)
프로세스를 생성하고 제거하는 동작을 하는 스케쥴러이다. 스케쥴러는 보류 상태 있는 작업들을 준비(Ready) 상태로 전이 시키며 프로세스의 제어 코드와 PCB 결지어 주기억장치로 이동시킨다.
Process Scheduler
= Dispatcher(=CPU scheduler, Short Term Scheduler)
준비 상태에 있는 여러개의 프로세스들 중에서 어떤 프로세스에게 CPU 배당할 것인 가를 결정하는 스케쥴러이다. 준비(Ready) - 실행(Run)
Mid-level scheduler(Mid Term Scheduler)
실행 중인 프로세스를 블록화(=중지)하거나 또는 다시 활성화시키는 기법을 사용하여 시스템에 대한 부하의 양을 조절하는 기능을 담당한다. 실행상태에서 보조기억으로 이동한다. Swapping 기법을 사용하여 부하의 양을 조절하며 실제로 구현하지 않은 스템이 많다.

. CPU 스케쥴러

공정성을 가져야 한다.
효율성을 가져야 한다.
빠른 응답시간을 제공해야 한다.
균형 있는 자원의 사용이 가능하도록 해야 한다.
핵심자원을 차지하는 프로세스들에게 우선권을 주어야 한다.
오버헤드를 최소화해야 한다.
무한정 대기를 피해야 한다.
대기 시간이 작업에게 우선순위를 높여주는 방식인 Aging기법을 이용한다.
우선순위가 주어진 경우 높은 우선순위를 가진 프로세스를 먼저 실행해야 한다.

9. 선점(preemptive)스케쥴링과 비선점(nonpreemptive)스케쥴링

. 선점 스케쥴링
특정 프로세스가 중앙처리장치를 효율적으로 사용할 없는 시점에 이를 때마다 앙처리장치의 사용권이 다른 프로세스로 옮겨지는 방식으로 높은 우선순위의 프로세 스들이 급하게 실행해야 경우에 유용하다.

대화식 시분할 시스템에서 빠른 응답시간을 유지하는 데에 필요하다.
경비가 많이 들고 오버헤드까지 초래한다.
효과적인 선점을 하려면 준비 상태의 프로세스가 많아야한다.
우선순위를 고려해야 한다.
문맥교환의 횟수가 비선점 방식에 비해서 많다.

. 비선점 스케쥴링
어떤 자원이 어떤 프로세스에 할당이 되면 실행을 종료할 때까지 프로세스가 중앙처 리장치의 사용권을 독점하여 사용하는 것으로 짧은 작업들을 기다리게 되는 경우가 지만 모든 프로세스 관리에 공정하다.

응답시간의 예측이 쉽다.
문맥교환의 횟수가 적다.
일괄처리 방식에 적합한 방식이다.
참조) 우선순위(Priority)
정적 우선순위(static priority): 프로세스 실행중 우선순위가 변하지 않는 것으로 구현이 용이하고 동적 우선순위에 비해 오버헤드가 적다.
동적 우선순위(dynamic priority): 처음에 정해진 우선순위를 상황에 맞게 계속조정하여 사용하므로 구현이 복잡하고 정적 우선순위에 비해 오버헤드가 크다.

10. 프로세서 스케쥴링의 종류

선점
Preemption

RR
Round
Robin

① FIFO스케쥴링과 같이도착 순으로 디스패치되는 방식
타임 슬라이스(time slice) 혹은 시간 할당량(time quantum)에 의해 시간 제한을 받음

시간할당량이 클 경우 : FIFO스케쥴링 방법과 차이가 없게 됨

시간할당량이 적은 경우 : 문맥교환 오버헤드가 상대적으로 커지게 되어 시스템은 대부분의 시간을 문맥교환(context switching)에 소비하게 됨

대화식으로 사용하는 시분할 시스템에 적합

④ FIFO
를 선점 스케쥴링으로 변형시킨 방법

SRT
Shortest
Remaing
Time

① SJF스케쥴링기법을 선점 기법으로 변형시킨 방법
시분할 시스템에 유용하다
.
작업이 끝나기까지 남아 있는 실행시간의 추정치가 가장 작은 프로세스를 먼저 실행함

④ SJF
스케쥴링기법보다 오버헤드가 큼

Multilevel
Feedback
Queue

짧은 작업에 우선권
입출력 위주의 작업들에게 우선권

큐에서 FIFO 형태로 이동

(
마지막 단계의 큐에서는 프로세스가 종료될 때까지 RR방식으로 순환
)
낮은 단계로 내려갈수록 프로세스의 시간 할당량이 커짐

 

비선점

Non -

preemption

FIFO
First In
First Out

준비 큐(ready queue)에서 도착한 순서에 따라 디스패치 됨
응답시간 차가 적기 때문에 예측이 쉬움

대화식 시스템에는 적합하지 않음

SJF
Shortest
Job First

작업이 끝나기까지의 실행시간의 추정치가 가장 적은 작업을 먼저 실행 함 (짧은 작업들에 우선적으로 서비스)
평균 대기시간을 최소화 시킬수 있음

우선순위
Priority

각 프로세스에게 우선순위를 부여하여 우선순위가 높은 순서대로 처리함
우선순위가 같을 때는 FIFO또는 SJF을 도입하여 실행 함

기한부
Deadline
Scheduling

작업들을 마감시간까지 완성하도록 계획한 스케쥴링

HRN
Highest
Response
Ratio
Next

① SJF스케쥴링기법의 약점인 긴 작업과 짧은 작업간의 지나친 불평등들을 어느 정도 보완한 방법
각 작업의 우선순위는 그 작업이 서비스를 받을 시간뿐 아니라 그 작업이 서비스를 기다린 시간 두 가지의 함수로 결정됨

응답률 = (대기한 시간 서비스 받을 시간)/ 서비스 받을 시간

프로세스

1. 병행(concurrent)프로세스

시스템 내에 다수의 프로세스들이 동시에 실행되는 것으로 프로세스들이 시스템 내에 동시에 존재하나 어느 순간에 단지 프로세스만 CPU에서 실행된다.

. 병행성의 종류

단일 프로세스내에서의 병행성 : 우선순위 그래프나 Fork Join구조, 병행문
프로세스들간의 병행성(비동기적) : 완전히 독립하여 수행되거나 다른 프로세스들과 가끔 협력 하는 기능

. 병행 프로세스의 종류

독립적 프로세스(independent process)
어떤 프로세스가 시스템에서 실행중인 다른 프로세스에게 영향의 주거나 다른 프로세스로부터 영향을 받지 않을 때의 프로세스
특징)

·         프로세스의 상태는 다른 프로세스에 의해서 공유되지 않는다.

·         프로세스의 실행은 결정적이다. , 실행결과는 입력에 의해서만 결정

·         실행은 재생가능한 것으로 실행결과는 같은 입력에 대해서는 항상 동일하다.

·         실행은 나쁜 영향을 발생하지 않고 중단되고 재시작될 있다.

협력 프로세스(cooperating process)
어떤 프로세스가 시스템에서 실행중인 다른 프로세스에 영향을 받거나 때의 프로세스
특징)

·         프로세스의 상태는 다른 프로세스들과 공유된다.

·         프로세스의 실행은 비결정적이다. , 실행결과는 상대적 실행 순서에 의존하고 미리 예측될 없다.

·         실행은 재생 불가능하다. , 실행결과는 같은 입력에 대해 항상 같지 않다.

. 병행문(concurrent statement)

Dijkstra[1965] parbegin/parend문에서 있으며

parbegin
S
;
S
;
Sn ;
parend;

같이 표시한다.
S
, S, ... Sn 각각 단일문이고 병행으로 수행된다.

병행 문의 예제) x := (-b (b**2-4*a*c)**.5)/(2*a)
Parbegin
temp1 := -b;
temp2 := b**2;
temp3 := 4*a;
temp4 := 2*a;
Parend

. 임계영역(critical section) 문제

임계영역이란 프로세스가 사용하면서 수정 가능한 자원을 나타내며 하나의 프로세스가 임계구역에서 수행중일 다른 어떠한 프로세스도 임계영역에서 수행 없다. 실생활에서 예를 들자면 화장실이나 공중 전화를 예로 있다.
이러한 임계영역 보호를 위하여 프로세스는 임계영역에 들어갈 있는지 미리 요청하여야 하는 모니터 구조를 사용한다.

진입영역(Entry Section)

임계영역 사용을 요구하는 부분

임계영역(Critical Section)

수정 가능 자원을 이용하는 코드 부분

출구영역(Exit Section)

임계영역 사용을 끝낸 후 처리 부분

잔류영역(Remainder Section)

나머지 코드부분

임계영역은 3가지의 조건

·         상호배제 : 하나의 프로세스가 임계구역에서 수행중일 다른 어떤 프로세스도 임계영역에서 수행될 없다.

·         진행(Progress) : 하나의 프로세스가 임계영역 사용을 끝내면 다른 프로세스가 선택되어 임계영역을 사용한다.

·         제한된 대기 : 프로세스가 임계구역에 대한 요청 일정한 기간 내에 요청이 받아들여져야 한다. 이를 위해 하나의 프로세스가 임계구역을 수행할 있는 횟수에 제한을 있다.

. 상호배제의 해결

소프트웨어적인 방법

·         2개의 프로세스를 상호배제 하기 위한 방법 : Peterson

·         N개의 프로세스를 상호배제 하기 위한 방법
- Dijkstra
- Kunth
- Eisenberg & Macguire
- Lamport -
제과점 알고리즘 : 분산환경을 위해 개발되었음

하드웨어적인 방법

·         Test And Set : 원자적(atomic) 명령

·         Burns

. 세마포

공유변수 : S
P(s) 연산 : 조건을 검사하여 프로세스의 임계영역으로의 진입을 검토하여 불가능한 경우의 프로세스를 대기 행렬(Queue) 넣는다.
V(s) 연산 : 임계영역에 실행중이던 프로세스가 종료시 대기 행렬(Queue) 대기 중인 프로세스가 있으면 임계영역에서 실행할 있도록 한다.
대기 행렬 Queue : 임계영역의 사용을 위하여 대기하는

repeat
wait(mutex); P(s)
critical section(
임계구역)
signal(mutex); V(s)
remainder section(
잔류구역
)
until false;

P(s)
s = s-1;
if s < 0
then begin
wait(s)
end;
else
임계영역

V(s)
s = s 1;
if s <= 0
then begin
signal(s)
end;

. 프로세스간의 통신

공유기억장치기법

·         통신을 하는 프로세스들간에 변수를 공유하여 사용하도록 하는 방식이다.

·         운영체제는 기억장소만 제공하며, 응용프로그래머가 동기화 등의 책임을 진다.

·         공유기억장치 기법의 사용예는 세마포어의 S변수에서 있다.

메시지 시스템기법

·         프로세스들 간에 send, receive등을 이용하여 메시지를 교환할 있도록 하는 방식이다.

·         운영체제 자체가 전달의 책임까지 진다.

·         분산시스템에서 이용하기 좋은 방식이다.

·         직접 프로세스간에 전송하는 기법과 우편함을 통한 간접 기법이 있다.

 

3. 교착상태(Deadlock) ( = 무한대기)

다중 프로그래밍 환경에서 개의 프로세스가 서로 다른 프로세스가 가지고 있는 자원을 기다리고 있으며 자신이 차지하고 있는 자원을 내놓지 않는 현상으로 프로세스에게는 영원히 처리기를 없게 된다.

. 교착상태 필수조건

상호배제(mutual exclusion) : 어느 자원에 대해 프로세스가 이미 사용중이면 다른 프로세스는 기다려야 하는
점유와 대기(wait for) : 하나 이상의 자원을 할당받은 채로 나머지 자원을 할당 받기 위해 다른 프로세스의 자원이 해제되기를 기다리는 프로세스가 존재하는 경우
비중단(no Preemption) : 자원을 할당받은 프로세스로부터 자원을 강제로 빼앗지 못하는
환형대기(circular wait) : 자원 할당 그래프 상에서 프로세스의 환형 사슬이 존재하는

. 자원할당 그래프
G = {E, V} E
간선의 집합을 V 프로세스의 집합을 말한다.
P={P1, P2, P3,...,Pn} :
프로세스의 집합
R={R1, R2, R3,...,Rm} :
자원의 집합

기호

프로세스

네모

자원

자원프로세스

할당

프로세스자원

요청

. 교착상태 발견기법

① 자원할당 그래프에서 환형 대기를 나타내는 사이클(cycle) 있으면 교착상태가 존재할 있다. (자원할당 그래프가 사이클을 포함하지 않으면 교착상태는 발생하지 않는다.)
② 사이클이 존재할 경우 사이클이 제거 있는지 검사한다.
(
프로세스가 요구하는 자원을 모두 할당받았을 경우 제거 가능)
③ 사이클이 제거 있을 경우는 교착상태가 아니며, 제거 없을 경우는 교착상태이다.

. 교착상태 예방 해결 방법

① 교착상태 예방(deadlock prevention) = 교착상태 필요조건의 부정

·         상호배제조건의 부정
자원을 공유할 있도록 한다. 자원을 공유할 없는 자원인 프린터등은 상호배제조건 부정을 없다.

·         점유 대기조건의 부정
프로세스가 수행을 하기에 필요한 모든 자원을 한꺼번에 요청하고 할당받는다.

·         비중단조건의 부정
원래 갖고 있던 자원을 일단 반납하고 필요하다면 다시 자원이나 다른 자원을 요구한다.

·         환형대기조건의 부정
자원 유형별로 고유번호를 부여하여 번호가 큰순으로 자원을 요구하도록 한다.

② 교착상태 회피(deadlock avoidance)
교착 상태가 발생할지 하지 않을지의 상태를 사전정보를 가지고 예측하여 안전하다고 판단될 경우 처리하는 방법이다. 경우 불안정하다고 판단이 되더라도 교착상태가 발생되지 않을 수도 있다.

·         안정상태(safe state): 전체자원의 상황이 작업을 완료할 있는 상태

·         불안전 상태 : 교착상태가 일어날 있는 상태.

③ 교착상태 발견(deadlock detection)
교착상태가 일어났는지를 자원할당 그래프를 이용하여 알아내는 과정이다.

④ 교착상태 복구(recovery from deadlock)
교착상태를 발견하고 교착상태에 있는 하나 이상의 프로세스들로부터 개의 자원 선점(resource preemption) 시키는 것에 의해 복구 하는 방법으로 조작자에게 교착상태가 발생했음을 알려주어서 직접 수작업으로 처리 하도록 하거나 시스템으로 하여금 교착상태를 자동적으로 복구하도록 하는 방법이 있다.

·  선점 방법
-
모든 교착상태 프로세스들을 종료하는 : 이것은 교착 상태 사이클을 분해시키지만 회복하는데 많은 비용이 소요된다.
-
프로세스를 하나씩 종료하는 : 교착상태 사이클이 제거될 때까지 하나씩 종료하는 방식으로 상당한 오버헤드를 요구한다.

·  선점 프로세스(=희생자) 선택 기준
회복시 필요한 비용이 가장 적은 것을 선점의 대상(=희상자)으로 선택한다.

·  복귀(rollback)
프로세스로부터 자원을 선점한다면, 프로세스를 어떤 상태로 놓을 것인지를 결정해야한다. 그러나 정상적인 수행을 계속할 없을 때에는 프로세스를 안전한 상태로 되돌려 놓고, 상태로부터 재시작해야 한다.(: 완전복귀)

·  기아상태(starvation)
비용 요소에 기초를 두는 시스템에서 희생자 선택은 주로 동일한 프로세스가 매번 선택 있는데 경우 특정 프로세스가 반복해서 희생자로 선택될 경우 프로세스는 지정된 작업을 오랫동안 완료하지 못하는 상황이 되며, 이러한 상황을 기아상태라 한다.

4. 대기의 종류

제한된 대기
- 일정한 시간 내에 프로세스가 작업을 실행할 있는 상태(dispatch) 되어야 한다는 조건이다.
바쁜 대기
- 임계영역에 진입할 있는지에 대한 조건을 계속 검사하면서 대기하는 상태를 말한다.
무한 대기
- 상대방 프로세스의 상태를 모르고 실행을 멈추고 계속하여 기다리고 있는 상태를 말한다.
점유 대기
- 실행하는데 필요한 자원을 일부만을 할당 받고 일부는 요청하고 있는 상태를 말한다.
환형 대기
- 자원할당그래프를 그려서 할당과 요청의 상태를 보았을 환형(cycle) 그림이 보이는 상태를 말한다.




<프로세스 전환>

수 많은 프로세스들이 한정된 수의 CPU를 동시에 이용하게 하기 위해,

프로세스 스케줄러는 가장 동작 시키기 좋은 최적의 프로세스에 실행 권한을 준다.

(잘난 놈 부터... 끌어들인다.)그리고 이전에 작동하고 있던 프로세스는 실행 중단시킨다.

이렇게 프로세스 전환을 수행하는 기능을 프로세스 디스패처(rocess Dispatcher) 라고 한다.

(용어....ㅡㅡ;; 싫다.)

<프로세스 스케줄러>

위에서 프로세스 스케줄러라는 단어를 언급 했었는데, 프로세스에게 실행 권한을 줄것인지

안 줄것인지 판단을 내리는 것이 프로세스 스케줄러이다. 이렇게 판단하고 나면

프로세스 디스패처에게 프로세스 전환을 요청한다.

-> 여기까진 간단히 이해가 된다. 이제 스케줄링의 방침이 있다.

좀전에도 언급했듯 프로세스 스케줄러는 

가장 동작 시키기 좋은 최적의 프로세스에 실행 권한을 준다.

프로세스 스케줄러는 응답성과 처리율(모순관계?ㅋ) 두마리의 토끼를 잡아야한다.

쉘프로그램 같은 대화형 프로세스에는 응답성이... 수치계산같은걸 하는 프로세스에는 처리율

보장 되어야한다. 또, 많은 프로세스가 동작하는 환경에서도 반드시 모든 프로세스에 실행 권한을 할당한다는 보장이 있어야한다.


<프로세스의 우선권 부여와 실행 보증>

프로세스 스케줄러는 사용자의 체감속도를 올리기 위해 대화형 프로세스에게 우선권을 주어 프로세스 동작시 우선적으로 동작시킨다.

하지만 커널은 프로세스의 종류를 구분하지 못하기 때문에 단위시간당 실행시간이 적은 프로세스를 대화형 프로세스로 간주하여 스케줄링한다.


프로세스는  nice 명령어( 간단하게 nice 라고 치고 -순위 치고 프로세스명 치면 된다.)를 이용하여 지정하는 고정 우선순위 이외에 동적 우선순위를 가진다.

CPU를 보다 많이 이용한 프로세스는 낮은동적우선순위를 가지고 대화형 프로세스 같은 경우에는  CPU를 그다지 많이 이용하지 않으므로 상대적으로 높은 우선순위를 가지게 된다.

커널은 선점방식에 의하여 프로세스 스케줄러가 실행 우선순위가 높다고 인식하면,

프로세스 디스패처를 호출하여 프로세스를 바꾼다.

(보통 지금 실행 대기 상태가 된 새 프로세스가 선택된다.)

프로세스 스케줄러는 프로세스 실행시마다 선점할 필요가 있는지를 판단한다.


로세스 스케줄러는 일부 프로세스가 장시간 실행 권한을 잡고 있어서 스케줄링 대상에서 누락되는 프로세스가 발생하지 않도록 모든 프로세스에 공평하게 실행 권한을 부여한다.

즉, 각 프로세스에 실행 할당 시간을 부여한다. 시간을 할당 받은 프로세스는 할당 시간이 다하면 다른 프로세스에 실행 권한을 넘겨 주어야하고, 다시 할당 시간이 할당 될때 까지 스케줄링의 대상이 되지 않는다. 새롭게 시간이 할당 될때는 커널상에 실행 할당 시간이 남아있는 실행 대기 프로세스가 한개도 없을 때이다.(예외로 대화형 프로세스에는 즉석에서 제한 시간을 주는 경우도 있다.)

실행 할당 시간의 길이는 고정 우선순위를 기본으로 계산 한다. 고정 우선순위가 높은 프로세스는

실행 시간이 조금 더 길게 할당 된다.

커널의 타이머는 실행중인 프로세스의 할당된 시간을 조금씩 줄여가고, 시간이 없어지면 프로세스 스케줄러에 재 스케줄링을 요청한다.


<스케줄링의 계기>

프로세스가 스스로 실행 권한을 양보하는 경우에는 바로 프로세스 스케줄러가 실행되어 프로세스가 전환 된다.

 but,  선점에 의한 경우(강제로 빼앗는 경우)에는 요청 즉시 프로세스 스케줄러가 동작하지 않는다. 리눅스커널이 수행해야 할 처리(시스템 콜, 인터럽트) 가 완료 될때까지 프로세스 스케줄러의 실행은 지연된다.


<실시간 프로세스>

눅스는 한정된 시간 내에 목적한 처리를 완료시킬 필요가 있는경우를 대비하여

실시간 프로세스 기능을 제공한다.

실시간 프로세스는일반 프로세스보다 높은 우선 순위를 가지며 우선적으로 스케줄링된다.

실시간 프로세스는 마음대로 우선순위를 내릴 수 없으며, 실행 할당 시간도 무제한이다.

실시간 프로세스가 프로세스 전환되는 경우는 실행 권한을 스스로 양보했을 때, 또는 보다 높은 실행 우선순위의 실시간 프로세스를 실행하기 위한 선점이 발생 했을 경우다.


멀티 프로세서 시스템(cpu가 여러개)에선?

특정 CPU 에서  한번 실행된 프로세스는 다음에도 같은 CPU 에서 실행 되어야 한다.

특정  CPU 에서 실행 되면  해당 프로세스가 이용한 물리 메모리의 내용이 캐시 기억 장치에 저장되기 때문이다.  프로세스 스케줄러는 각각의 CPU에 독립적으로 실행되고, 가장 적합한 프로세스를 선택한다. 그러나 CPU 간의 밸런스가 크게 무너지거나 프로세스가 특정 CPU 에만 얽매여 있다면 프로세스를 다른 CPU로 재 스케줄링한다.

이렇게  CPU 별로 준배된 프로세스 스케줄러가 각각의 CPU에 속하는 프로세스들을 관리하게 하면  성능이 향상 되는 것을 느낄 수 있다.


 

<프로세스 스케줄러의 구현>

눅스 커널2.6 에서는 프로세스 수에 종속되지 않고 프로세스 스케줄러의 실행 시간이 일정한 구조의 프로세스 스케줄러가 도입되어있다.

실행 가능한 프로세스는 실행큐에 등록되는데, 실행 큐는 실행할 프로세스의 우선 순위 별로 슬롯을 준비하고 있다.


실행큐에는 2가지 종류가 있다. active실행큐expired실행큐이다.

active실행큐는  실행할당 시가을 가지고 있는 프로세스를 등록한다.

expired실행큐는 실행가능하지만, 실행할당 시간을 다 써버린 프로세스를 등록한다.


active실행큐 상의 프로세스는 실행할당시간을 전부 소비해서 expired실행큐로 이동하거나

대기상태로 이동한다. 또한 active실행큐 상의 모든 프로세스가 없어지게되면, 프로세스 스케줄러가 active실행큐를 expired실행큐와 교환하여 처리한다.


티프로세서에서는 실행큐를 cpu별로 준비 해 놓는다.

특정 프로세스는 매회 특정 cpu 상에서 실행하게 되는 이때 캐시의 사용이유효하게 된다.

but, 실행큐 간의 부하상태가 한 쪽으로 치우치게 되었을 때는,

실행큐간의 대기 프로세스를 이동시켜 밸런스를 맞춘다.


행가능한프로세스가 하나도 존재하지 않을때 리눅스커널에서는 아무것도 실행하지 않는

idle프로세스를 실행한다. idle프로세스는 다른 프로세스가 나타나 선점 할 때까지 계속 실행된다.

cpu별로 하나씩 가지고 있으며, 실행큐에 등록되지 않는다.


cpu에서 실행 중인 프로세스를 현재작업프로세스(current process)라고 한다.

현재작업프로세스는  cpu 수 만큼 존재하며,

데이터 구조상에서 current 라는 포인터가 가리키고 있다.


로세스바인드 기능으로 프로세스의 이동을 명시적으로 금지할 수 있다. 이는 시스템 구축자가 미리 부하 밸런스를 예측하여 프로세스를 할당할 cpu를 결정하고 싶을때 사용할 수 있다.

한마디로, 부하밸런스 조절하는 기능이랄까?

(task_struct구조체 내의 sched_setaffinity시스템콜이용......ㅡㅡ;;ㅋ)


 

<이벤트 대기>

눅스 커널에서 작동하는 프로세스의 상태는 2가지 이다.

실행가능상태 이거나 대기상태.

대기상태프로세스는 이벤트가 접수된 상태이고, 어떠한 조건이 충족될 때 까지 그 이상의 처리를 계속할 수 없다. 또한 스케줄링도 되지 않는다.

대기상태프로세스는 다시 2가지 종류가 있다.

시그널(신호)를 받는 대기상태와 받지 않는 대기상태이다.

전자는 시그널을 받아, 대기상태가 해제되고 실행대기 상태로 들어가는 것이고

후자는 시그널을 받아도,시그널을 보류한 상태로 대기상태를 지속하는 것이다.

 

기대상이 될 수 있는 커널오브젝트들(파일 등) 은 각각 대기 큐를 가지고 있다.

대기상태의 프로세스는 직접 task_struct 구조로 대기큐에 등록되는 것이 아니라 다른 데이터구조를 개입시켜 간접적으로 등록된다.

하나의 프로세스는 복수의 대기큐에 등록할 수 있으며, 복수의 대기큐중 어느 것인가 이벤트가 일어나면 실행 가능하다.

 

로세스들은 대기상태에서 바로 실행권한을 얻어 실행상태가 되는 것이 아니라,

반드시 실행대기 상태를 경유하여 실행큐 상에서 실행 권한이 할당되도록 되어있다.

 

모프로세스가 자식프로세스를 생성 하였을 경우

자식프로세스는 부모프로세스과 같은 우선순위를 가지지만 실행큐에 먼저 삽입되므로 조금은 먼저 동작된다.

또한 부모프로세스는 자식프로세스 생성시 자신의 실행 할당시간의 반을 자식프로세스에게 양보 함으로서, 다른 프로세스에게 주는 영향을 최소화 시킨다.

 

--> 이벤트 발생시 처리 방법

1) 프로세스를 대기 큐에 등록

이벤트 발생!

2) 목적한 이벤트가 성립하는지 조사

3) 성립하지 않으면, 프로세스 스케줄러를 호출

4) 프로세스가 실행되면 프로세스를 대기큐로 부터 벗어나게 함.


Ch 4. 프로세스(Processes)

 

프 로세스라는 용어는 Multics 시스템을 설계한 사람들이 처음으로 사용하였는데 운영체제가 프로그램에게 생명을 불어넣어 활동적인 상태로 만들었을 때 이 개체를 말한다. 즉, CPU가 바로 처리할 수 있도록 처리할 명령의 주소를 갖는 프로그램 카운터, 그리고 기타의 레지스터들을 할당받고 실행에 필요한 자원이 무엇인지 등에 관한 정보가 제공된 상태의 프로그램이다.

 

4.1 프로세스 개념

시스템에서 진행중인 모든 프로그램을 의미하며, 작업과 프로세스는 거의 유사하다 하겠다.

 

4.1.1 프로세스

현재 실행중이거나 곧 실행이 가능한 PCB를 가진 프로그램, 목적 또는 결과에 따라 발생되는 사건들의 과정, 지정된 결과를 얻기위한 일련의 계통적 동작, 프로세스가 할당하는 개체로서 디스패치가 가능한 단위로 정의 되어진다.

 

4.1.2 프로세스 상태

 

그림4.1 프로세스 상태도

 

위 의 그림4.1처럼 프로세스는 실행되면서 자신의 상태가 변하며, 5가지 상태를 갖는다. 첫 번째의 생성, 보류(New & Pending)는 프로세스가 생성되는 상태 그리고, 작업이 제출되어 디스크에 수록되어 있는 상태를 말한다. 두 번째의 준비(Ready)는 프로세스가 프로세서에게 할당되기를 기다리는 상태이다. 이때 CPU 스케줄링 정책에 따라 프로세스에 CPU를 할당하는 일을 Dispatch라 부른다. 세 번째 수행(Running)은 프로세스가 CPU를 차지하고 있는 상태이며, 이 때 스케줄링 방식에 따라 다른 프로세스에게 선점(Preemptive) 또는 비선점(Nonpreemptive)될 수 있다. 네 번째는 대기(Waiting)인데, 이것은 어떤 사건(입출력 종료와 같은)이 일어나기를 기다릴 때이며, Blocked라 부른다. 다섯 번째로는 종료 또는 완료(Terminated)이며, 프로세스가 CPU를 할당받아 지정된 시가내에 완전히 수행을 종료한 상태이다. 이외에 프로세스가 일어나지 말아야 할 사건을 기다리는 교착상태라는 것도 있다.

 

 

그림4.2 주기억장치 안의 프로세스의 상태

 

4.1.3 프로세스 제어 블록(Process Control Block)

PCB란 무엇일까? PCB는 프로세스에 대한 모든 정보를 담고 있는 자료구조 테이블로 운영체제에게 프로세스에 대한 정보를 제공해 준다. PCB는 태스크 제어 블록(task control block), 프로세스 기술자(process descriptor)라고도 하며 프로세스 생성 시에 만들어지고 프로세스가 완료되면 삭제된다. 즉 프로세스는 프로그램 자체와 PCB로 이루어져 있다고 볼 수 있다. 그림 4.3 프로세스 제어 블록을 보면 잘 알 수 있을 것이다.

 

 

그림4.3 프로세스 제어 블록(Process Control Block)

 

프로세스 제어 블록은 다음과 같은 사항을 갖고 있어야 한다.

- 프로세스 상태 : 프로세스의 현재 상태이며 생성(보류), 준비, 실행, 대기, 완료 상태를 갖고있다.

- 프로세스 번호 : 프로세스에 부여된 고유한 정수 번호이다.

- 프로세스 카운터 : 프로세스가 다음에 실행할 명령어의 주소를 보관하고 있다.

- CPU 레지스터들 : 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터, 상태 코드등을 인터럽트 발생시 저장하고 있어야한다.

- CPU 스케줄 정보 : 프로세스 우선순위, 스케줄 큐의 포인터와 다른 스케줄 매개변수를 갖고 있어야 한다.

- 기억장치 관리 정보 : 베이스 레지스터, 제한 레지스터의 값, 운영체제의 페이지 테이블, 세그멘트 테이블을 갖고 있다.

- 계정 정보 : CPU가 사용된 시간량, 시간의 범위, 계정번호, 작업 또는 프로세스 번호 등을 포함한다.

- 입출력 상태 정보 : 입출력 요구들, 입출력 장치들과 개방된 파일 목록 등을 포함한다.

- 그 외 부모, 자식 프로세스 번호 등을 갖고 있어야 한다.

 

4.2 프로세스 스케줄링

두 개 이상의 프로그램을 제한된 자원을 사용하여 동시에 처리하기 위해서는 어느 작업을 먼저 처리할 것인가를 결정해야 한다. 이런 결정을 수행하는 운영체제의 일부분을 스케줄러라 한다.

 

4.2.1 스케줄링 큐

스케줄러는 여러 개의 작을 공평하고 일관되게 관리하기 위해 큐(Queue)라고 하는 자료구조를 사용한다. 이들 큐는 연결 리스트(linked list)로 구현하는데, 특정 입출력 장치를 대기하는 큐를 장치 큐라 한다. 그림4.4에서 시스템은 작업 큐와 준비큐, 그리고 입출력 큐를 가지고 있다. 작업이 시스템 내에 제출되면 작업 큐에 입력되고 이 큐에서 수행할 작업을 선택하여 프로세스화한 다음 준비 큐에 포함시켜 CPU를 할당받기 위해 기다리게 한다. 준비 큐에 들어있는 프로세스들 중 하나의 프로세스가 선택되면 CPU를 할당받아 실행되는데 실행 도중에 다음과 같은 사건들 중의 하나가 발생한다.

- 프로세스는 입출력 요청을 발생하며 입출력 큐에 위치한다.

- 프로세스는 새로운 프로세스를 생성(fork)하며 이 프로세스의 종료를 기다린다.

- 프로세스는 인터럽트에 의하여 강제로 중앙처리장치에서 제거되어 준비 큐에 다시 위치할 수 있다.

 

 

그림4.4 프로세스 스케줄링을 표현하는 큐잉-도표

 

4.2.2 스케줄러

프로세스는 실행되는 동안에 다양한 스케줄링 큐들 사이를 이주하게 된다. 운영체제는 어떤 방식으로든 이들 큐에서 프로세스들을 선택해야 한다. 각 큐 안에서 적당한 것을 선택하는 일을 수행하는 스케줄러는 다음과 같다.

- 장기 스케줄러(Long term scheduler) : job 스케줄러, 디스크 공간에 제출된 작업들 중에서 가장 적절한 작업을 선택하여 주기억장치로 적재시킨다.

- 단기(short term) 스케줄러 : CPU 스케줄러, 실행 준비가 된 프로세스들 중에서 한 프로세스를 선택하여 CPU를 할당한다.

- 중기 (mid term) 스케줄러 : 새로운 프로세스를 계속 주기억장치에 넣지 않고 시스템 내의 프로세스 수에 따라서 디스크로부터 교체 입출력되는 프로세스를 조정한다.

 

최근의 운영체제는 장기 스케줄러의 기능이 없거나 아주 한정된 기능만을 수행하고, 중기 스케줄러가 단기 스케줄러의 보조 역할을 담당하고 있다. 중기 스케줄러는 기억장치에서 중앙처리장치를 적극적으로 경쟁하는 프로세스들의 수를 줄여서 다중 프로그래밍의 수를 완화하는 것이 바람직할 때가 가끔 있다는 데서 유래한다. 차후에 다시 프로세스를 기억장치로 불러와서 실행을 재개한다. 이러한 기법을 스웹핑(swapping)이라 부른다.

 

그림4.5 큐잉 도표에 중기 스케줄링을 추가

 

4.2.3 문맥 교환(Context Switch)

현재 수행중인 프로세스에 할당된 CPU를 다른 프로세스로 전환하여 할당하는 일은 이전의 프로세스 상태를 보관하고 새로운 프로세스의 보관된 상태를 적재하는 과정이 필요하다. 이 작업을 문맥교환이라 한다.

예를 들어 프로세스 P0, P1이 있다고 하자. 먼저 실행중인 P0에 인터럽트나 시스템 호출발생 하면, P0의 PCB를 저장한 후 운영체제로 제어를 넘긴다. 운영체제는 인터럽트를 처리하고, 다른 프로세스 P1이 CPU를 할당받는다. 이때 P1에 대한 PCB가 생성된다. 다음으로 P1 실행 도중 인터럽트나 시스템 호출이 발생하면, P1의 PCB는 저장되고 이전에 저장해 두었던 P0의 PCB를 적재한다. 그리고, P0의 수행을 재개한다.

문맥교환에는 현재의 프로세스에 대한 PCB의 내용을 보관하고 새로운 프로세스의 PCB를 생성하는 과정이 필요하므로 상당량의 부하가 존재하는데, 이를 해결하기 위해 스레드라고 하는 특별한 프로세스 구성 기법이 이용된다.

 

4.3 프로세스 수행(Operation on Processes)

프로세스는 운영체제 프로세스와 사용자 프로세스로 분류된다. 모든 프로세스들은 CPU를 분할하여 사용함으로써 병행 수행될 수 있다. 프로세스 관리를 위해 운영체제는 아래와 같은 기능을 갖어야 한다.

- 사용자 및 시스템 프로세스 생성

- 사용자 및 시스템 프로세스 종료

- 프로세스 중단

- 프로세스의 우선순위 변경

- 프로세스 대기

- 프로세스 깨움

- 프로세스 디스패치

- 다른 프로세스와의 통신(IPC : Inter Process Communication)

- 프로세스 동기화를 위한 기법 제공

- 교착 상태 방지를 위한 기법 제공

 

4.3.1 프로세스 생성(Process Creation)

작업 큐에서 하나의 작업을 주기억장치 안으로 적재할 때 프로세스는 생성된다. 운영체제가 프로세스를 생성하기 위해 다음과 같은 일을 한다.

- 프로세스의 이름 결정 : 프로세스 생성 시 각기 고유의 PCB를 가진다.

- 프로세스 준비 큐 리스트에 삽입한다.

- 프로세스에 초기 우선순위 부여한다.(나중에 CPU 스케줄링에 사용한다.)

- 그 프로세스에 대한 PCB의 생성한다.

- PCB들의 연결을 한다.(PCB들은 서로 링크되어 같은 상태의 프로세스 리스트를 이루고 있다. 자료구조로 큐, 트리, 스택 등을 사용한다.)

- 프로세스에 초기 자원 할당한다.

 

프로세스를 실행하는 도중에 프로세스 생성 시스템 호출(fork())를 통해 여러 개의 새로운 프로세스를 생성할 수 있다. 이때, 프로세스를 생성하는 프로세스를 부모 프로세스라 하고, 생성된 프로세스를 자식 프로세스라 부른다. 생성된 자식 프로세스는 자원(중앙처리장치 시간, 메모리, 입출력장치)을 운영체제로부터 직접 받거나 부모 프로세스로부터 자원을 상속받을 수 도 있다. 부모 프로세스로부터 자원을 상속받는 것이 오버헤드를 줄일 수 있다. 부모 프로세스는 자식과 함께 계속 실행되고, 모든 자식 프로세스가 끝날 때까지 기다린다.

 

4.3.2 프로세스 종료(Process Termination)

프로세스 종료란 시스템으로부터 프로세스를 제거한다는 뜻이며, 이때 프로세스에 속해 있던 모든 자원은 회수되고, PCB또한 제거된다. 종료하는 방법은 두 가지가 있는데, 마지막 문장을 실행하고 종료하는 것과 강제로 exit()라는 시스템호출을 통해 프로세스를 제거하는 방법이다. 강제 종료는 주로 부모가 자식이 할당된 자원을 초과하여 사용할 때, 할당된 태스크(task)가 더 이상 필요 없을 때 자식을 종료시킨다.

 

4.3.3 프로세스 중단(Process Halt)

시스템이 위급한 상황이 발생했거나 기억장치에 너무 많은 프로세스가 올라와 시스템의 성능이 저하되었을 때 현재의 상태에서 하던 일을 멈추고 중단되어 실행이 연기될 수 있도록 한다.

 

4.3.4 프로세스 재시작(Process Restart)

중단될 때 발생했던 요인이 없어지면 중단되었던 프로세스를 중단했던 시점에서 다시 실행한다.

 

4.3.5 우선순위 변경(Priority Change)

CPU 스케줄링 과정에서 필요에 따라 어떤 프로세스의 PCB 안에 있는 우선순위를 변경해 준다.

 

4.4 상호 협조 프로세스들(Cooperating Processes)

운영체제 내에서 수행되는 프로세스는 상호 독립적인 프로세스와 상호 협조적인 프로세스로 나뉜다. 독립적인 프로세스는 프로세스 상호 간에 서로 영향을 주지 않고 실행되며, 상태는 공유되지 않고, 실행은 결정적이며 복제 가능하다. 그리고, 시스템에 나쁜 영향을 안주고 재시작 할 수 있다.

시스템의 제한된 자원을 상호 공유해야 하는 프로세스들 사이에서는 계획되고 통제된 상호 작용을 해야하는 경우가 방생하며, 이러한 프로세스를 상호 협조 프로세스라 한다. 특성은 다음과 같다.

- 프로세스의 상태는 다른 프로세스들과 공유한다.

- 프로세스의 실행은 비결정적이다. 우선순위에 따라 좌우된다.

- 프로세스의 실행은 통제 불가능하다. 독립적인 프로세스와 반대로 입력에 대한 결과가 항상 같지 않기 때문이다.

 

4.5 스레드(Threads)

위의 문맥교환에서 스레드라고 하는 특별한 프로세스 구성 기법이 사용한다고 했었다. 스레드는 하나의 프로세스를 실행에 필요한 최소한의 제어 정보만을 가진 여러 개의 실행 단위로 분할한 것이다.

 

4.5.1 스레드 구조(Thread Structure)

경량 프로세스(LWP) 라고도 불리는 스레드는 중앙처리장치 사용의 기본 단위이며, 프로그램 계수기, 레지스터들, 그리고 스택 공간으로 구성된다. 각 스레드간에 코드, 주소 공간과 운영체제 자원들(개방 파일들, 신호등의 태스크들)을 서로 공유한다. 일반적인 프로세스, 중량 프로세스는 하나의 스레드를 가진 태스크이다. 스레드는 태스크간 공유를 많이 하면 할수록 동료 스레드들 사이에서 중앙처리장치 교체 및 스레드 생성을 더욱 경제적으로 해준다. 또한 병행성을 증진시킨다. 즉 문맥 교환시에 생기는 오버헤드를 줄여 시스템의 성능을 개선할 수 있다. 자세히 들어가면, 문맥 교환시에 스레드 교환은 커널에 인터럽트를 발생시키는 운영체제의 호출이 필요 없다는 것이다.

스레드는 준비, 블록, 수행, 종료등의 여러 상태들 중 하나의 상태로 있게 된다. 프로세스와 마찬가지로 스레드들도 중앙처리장치를 공유하며, 한 순간에 오직 하나의 스레드만이 수행된다. 프로세스와 스레드에서 유지하는 정보를 비교하면 아래 표1과 같다.

프로세스

스레드

주소공간

전역변수

개방된 파일들

자식 프로세스

타이머

각종 신호

계정 정보

프로그램 카운터

스택

레지스터의 집합

자식 스레드

스레드 상태

 

 

표1 프로세스와 스레드에서 유지하는 정보 비교

 

 

그림4.6 태스크내의 다중 스레드

 

4.6 프로세스간 통신(Interprocess Communication)

이 절은 제 6 장 프로세스 동기화에서 언급하도록 한다.

 

※ 참고사항

fork()란?

- fork()는 새로운 자식 프로세tm를 생성한다. 즉, 한 프로세스가 fork()를 수행하면 두 개의 프로세스가 준비 상태로 된다.

- 부모 프로세스의 문맥을 작식 프로세스에게 복사한다.

․fork()는 자식의 프로세스 id를 부모에게 반환한다.

․fork()는 자식에게 0을 반환한다.

- 주소 공간이 공유되는 부분이 없다. 즉, 두 프로세스는 파이프나 공유파일로 통신한다.

'Fundamental Notes > Operating Systems' 카테고리의 다른 글

Process Synchronization  (0) 2009.01.07
CPU Scheduling  (0) 2009.01.07
Thread  (0) 2009.01.07
Operating System Structure  (0) 2009.01.07
Introduce Operating System  (0) 2009.01.07