<TLB(Translation Lookaside Buffer)>

TLB는 고속 캐시의 일종 (Associative Memory)이며, (KEY)값으로 찾고자 하는 워드를 동시에 접근하는 연관 메모리로서 검색이 빠른 반면 비싼 하드웨어이다.

최근에 빈번하게 검색된 엔트리들을 TLB에 넣되, 페이지 번호(p)를 키 값으로 동시 검색하므로 TLB에 저장되는 각 엔트리는 페이지 번호도 함께 표시되어 있어야 한다.

 



 

가상 주소의 p를 키 값으로 먼저 TLB부터 검색하며, 이때 페이지 번호를 p로 가지고 있는 엔트리가 있을 경우 그 엔트리에 적혀 있는 프레임 번호를 가지고 실주소에 이른다. TLB의 검색에서 모든 엔트리에 표시된 화살표는 동시에 검색한다. (메모리상의 페이지 테이블과의 차이 -> 빠름)

TLB에서 p를 가지는 엔트리의 검색에 실패하면 메모리에 있는 페이지 테이블로부터 사상이 진행되어 실주소를 얻게되고, 이 엔트리는 TLB에 추가시킨다.

 


TLB에서의 검색 성공 확률을 적중률(hit ratio)이라 한다.

소량의 크기라도 90% 이상은 나올 수 있다는 실험 결과가 있다.

ex) TLB 검색과 메모리 접근에 각각 20100 나노 초(Nanosecond)가 걸리고, 적중률을 90%라 했을 때, 실주소로 메모리를 접근하는데 걸리는 시간 (실접근 시간(Effective Access Time))

0.9 × 120(TLB 접근 + 실주소 접근) + 0.1 × 220(TLB 접근 + 사상 테이블 접근 + 실주소 접근) =130 나노 초가 되므로 TLB를 사용하지 않을 경우의 200 나노 초보다 빠르다는 것을 알 수 있다.

 



Copyright2014 By 휴먼사이언스

 

LIST

'OS > Theory' 카테고리의 다른 글

2단계 페이징 사상, 역 페이지 테이블 사상  (0) 2016.04.19
페이지의 보호와 공유  (0) 2016.04.19
페이징(Paging)  (0) 2016.04.17
가상 메모리(Virtual Memory)  (0) 2016.04.17
메모리 관리  (0) 2016.04.16

<페이징(Paging)>

모든 프로세스들이 같은 크기의 조각들로 나뉘어야 하는데, 이때 한 조각을 페이지라 부른다. 메모리 역시 프레임이라 불리는 페이지와 같은 크기로 나누어져 있으며 일련의 번호가 매겨져 있다.

한 프로세스의 전체 페이지들은 디스크에 저장되고, 이 중 몇 개가 메모리에 비연속적으로 다른 프로세스들의 페이지들과 섞여 적재되는데, 프로세스의 실행이 진행되는 과정에 따라 메모리를 오가며 교체되는 단위가 페이지이며, 이것은 곧 사상의 단위가 된다.

운영체제는 가상주소를 실주소로 변환하기 위해 프로세스당 하나의 페이지 테이블을 만들어야 하는데 이것을 페이지 사상 테이블이라 부르며, 테이블 크기는 해당 프로세스의 페이지 개수에 비례한다.

n개의 페이지를 가지는 프로세스의 페이지 테으블은 n개의 엔트리로 구성되고, 엔트리 하나의 크기는 보통 4byte이다.


엔트리에 들어있는 정보중에 중요한 것은 페이지가 메모리에 적재되어 있는가를 나타내는 존재 비트(메모리에 적재:1, 아닐경우:0)를 갖는다.

 



 

실행시 참조되는 가상주소는 페이지 번호(p)와 페이지 내에서의 위치(d)로 표시된다.

실행 중인 프로세스의 페이지 테이블 시작주소는 페이지 테이블 기준 레지스터에 들어있다. 먼저, 기준 레시즈터의 값에 p를 더해 페이지 테이블에서 페이지 p의 사상 정보를 갖고 있는 엔트리를 찾은 후, 존재비트를 확인하게 될 것이다.

존재비트가 1일 경우, p가 적재되어 있는 프레임 번호 f를 알 수 있으므로, 이 번호 값에 페이지 크기를 곱하면 메모리에서 이 프레임의 시작주소를 얻게 되고 여기에 d를 더하면 프레임 내에서 접근해야 할 워드의 주소(실주소)로 접근하게 된다.

존재비트가 0일 경우, 페이지가 메모리에 없음을 의미하고 먼저 디스크 주소로부터 이 페이지를 메모리에 적재할 것이다.




Copyright2014 By 휴먼사이언스

 

LIST

'OS > Theory' 카테고리의 다른 글

페이지의 보호와 공유  (0) 2016.04.19
TLB(Translation Lookaside Buffer)  (2) 2016.04.18
가상 메모리(Virtual Memory)  (0) 2016.04.17
메모리 관리  (0) 2016.04.16
교착상태 해결방법  (0) 2016.04.15

<가상 메모리(Virtual Memory)>

운영체제는 주어진 메모리의 크기 아래서 프로그램을 작은 조각으로 나누어 그 중에 일부분만을 메모리에 적재하되, 그것도 적재가 가능한 곳으로 비연속적으로 넣어줌으로써, 사용자는 메모리에 대한 고민으로부터 벗어 날 수 있다. 사실은 제한적인 크기지만 엄청나게 큰 메모리가 있는 것처럼 여겨지기 때문에 가상 메모리라고 부른다.


모든 프로그램은 작은 조각들로 나눠지게 되는데, 조각들의 크기를 모두 같도록 하면 한 조각을 페이지라고 부르고, 서로 다르게 하면 조각들 각각을 세그먼트라고 부른다.

페이지 or 세그먼트는 메모리와 디스크 사이에서 한 번에 전송되는 단위가 되는데 이 단위를 블록이라 부른다.


실행중인 프로그램에서 참조하는 주소가 실제 메모리에 있는 주소와 달라서, 메모리상의 주소로 변환이 필요할 때 하는 것이 사상이다.

프로그램에서 CPU가 참조하는 주소를 가상주소라고 하며, Address Translation을 통해 실제로 참조되는 메모리상의 주소를 실주소 or 물리적 주소라 한다.


왜 주소를 이렇게 다르게 하는 이유는 뭘까?

1. 주소 지정이 컴파일 시 발생

프로그램이 실행될 때 참조하는 주소가 컴파일 될 때 지정된다는 것이다. 참조하는 주소가 실 주소이므로, 프로그램은 항상 메모리의 지정된 곳으로만 적재


2. 재배치 시

메모리에서의 위치를 적재될 때마다 바꿀 수 있어서 융통성과 함께 메모리의 효율적이 이용이 가능하지만, 프로그램이 전부가 통째로 연속적인 메모리에 적재 되어야 함을 전제를 가진다.

실행 시에 참조되는 주소는 프로그램 내에서 어느 정도의 위치에 있는지를 나타내는 상대주소일 것이며, 실 주소는 메모리에 적재될 때의 시작 주소 값(재배치 레지스터에 있음)에 상대주소 값을 더해주면 된다.


<주소 바인딩(Address binding)>

논리적 주소(logical address)를 실행되기 위해서는 물리적 주소로 사상하는 것

주소 바인딩 종류는 컴파일 시간(compile time) 바인딩, 적재 시간(load time) 바인딩(by Relocation), 실행 시간(execution time) 바인딩이 있다.


[논리적 주소와 물리적 주소]

중앙처리장치가 생성하는 주소를 논리적 주소라 하며, 기억장치가 취급하는 주소를 물리적 주소라 한다.

기억 장치 관리기(MMU : Memory Management Unit) : 재배치(relocation) 레지스터는 세그먼트의 시작주소를 가지고 있으며, 논리적 주소가 들어올 때마다 모든 주소에 재배치 레지스터가 가지고 있는 값을 더해서 물리적 주소를 만든다.

 



 

Copyright2014 By 휴먼사이언스

LIST

메모리를 어떻게 구성할 것이냐의 문제는 어떻게 관리할 것이냐의 문제와 밀접하게 연관이 있다.

메모리 구성과 관련하여 정해져야 할 것들 살펴보자.


1. 다중 프로그래밍의 정도(Multiprogramming Degree)

하나의 사용자 프로그램만이 메모리에 있을 수 있도록 할 것인가? 여러 개의 프로그램이 같이 있도록 할 것인가?


2. 각 프로세스에게 얼마큼의 메모리를 줄 것인가?


3. 메모리 분할을 미리 해 두고 고정적(Fixed or Static)으로 운영할 것인가? 미리 정해두지 않고 프로세스의 크기나 개수에 따라 변동(Variable or Dynamic)시켜 나갈 것인가?


4. 메모리를 할당할 때 연속적으로 할 것인가? 비연속적으로 할 것인가?




<메모리 구성에 따라 효율적인 관리 기법>


1. 적재 기법(Fetch Strategy)

언제 프로세스를 메모리에 적재할 것인가를 다루는 기법

- 요구(Demand) 적재 : 적재의 요구가 있을 때 적재

- 예상(Anticipatory) 적재 : 적재의 요구가 있을 것으로 예상하고 미리 적재

2. 배치 기법(Placement Strategy)

프로세스들을 메모리 공간의 어디에 적재할 것인가를 다루는 것. 고정분할, 가변 분할

3. 교체 기법(Replacement Strategy)

메모리 공간이 부족할 경우 새로 적재돼야 할 프로세스를 위해 이미 메모리에 있는 프로세스 중 어떤 것을 골라 디스크로 내보내고 그 공간을 확보할 것인가에 요구되는 기법

4. 할당 기법(Allocation Strategy) : 프로세스에게 메모리 공간을 얼마 정도로 줄 것인가를 결정하는 것



<단일 프로그래밍>

한번에 하나의 프로세스만이 메모리에 적재되고 실행이 종료되면, 다음 프로세스가 적재되는 시스템


[문제점]

적재할 프로그램의 크기가 메모리보다 클 경우 오버레이(Overlay)를 사용한다.

오버레이란? 프로그램의 일부분만을 먼저 적재하여 실행시킨 다음 나머지 부분들을 다시 적재하여 실행.

프로그램 실행 중 커널 영역을 침범하지 못하도록 하는 보호 기법이 필요 -> 경계 레지스터에 커널과 프로그램의 경계 주소 값을 넣어두고 프로그램이 실행되면서 참조하는 메모리 주소 값이 경계 값을 침범할 경우 트랩으로 싱행을 중지

남는 자원의 낭비가 심해서 시스템 성능 떨어 트린다.




<다중 프로그래밍>

1. 고정 분할에서의 다중 프로그래밍

메모리를 여러 개의 분할로 나누어 놓고, 각 분할에는 하나의 프로세스만을 수용하도록 함으로써 다중 프로그래밍을 구현하는 방식

[장점]

관리가 쉽고 편리함

오버헤드가 작음

[단점]

분할의 크기가 모두 같으면 다양한 상황에 유연하게(Flexible) 대처하지 못함

분할의 크기가 유연함은 복잡도를 동반함

분할된 메모리보다 프로그램이 클 경우 오버레이 방법으로 해결함


 

2. 가변 분할에서의 다중 프로그래밍

분할의 시기와 개수 그리고 크기가 사전에 정해진 바 없이, 프로세스를 수용할 때 그 크기만큼 메모리 공간을 할당해 줌. 가변 분할의 관리를 위해 메모리에서 사용 중인 공간과 빈 공간들에 대한 정보가 필요하며, 테이블이나 리스트와 같은 자료구조로 표현된다.

단편화는 방지할 수 있지만 관리가 복잡해짐으로 해서 생기는 오버헤드는 감수해야 한다.

 

) 사용자 공간이 100Mbyte인 메모리

 

1. 초기상태

 

2. A, B, C 적재 후

 

3. CA의 반납 후



4. DE의 적재 후

 

5. B 반납 후

 

반납되는 빈 공간들은 user에서 빠져 free로 추가되고, 프로세스의 적재를 위해서는 free를 탐색하여 요구되는 크기를 수용할 수 있는 노드를 찾아 그 크기만큼을 할당해준다.

free를 탐색해 적재가 가능한 빈 공간을 찾을 때 어떤 노드를 선택할 것인가가의 기법을 알아보자.


1. 최초적합

free 리스트의 첫 노드부터 시작하여, 제일 먼저 발견되는, 요구되는 크기보다 더 큰 빈 공간을 가지는 노드에서 할당해 주고 탐색한다.

free 리스트에 대한 탐색을 중간에서 끝낼 수 있고, 남은 크기가 어중간해서 사용 못하는 노드가 생길 수 있다.


2. 최적적합(Best-fit)

free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 작은 노드를 찾아 할당해 주는 방법이다.

가장 들어맞는 노드를 찾음으로써 큰 빈 공간을 가지는 노드들을 그대로 유지시킬 수 있고, 배치 후, 남는 크기가 매우 작을 것이고 이런 빈 공간들은 이 후의 적재에 거의 활용되지 못하는 단점을 가짐(Hole 발생)


3. 최악접합(Worst-fit)

free 리스트를 끝까지 탐색하여 요구되는 크기보다 더 크되, 그 차이가 제일 많이 나는 노드를 찾아 할당해 주는 방법이다.




<병합 기법>

작은 빈 공간을 합쳐 더 큰 빈공간을 만드는 작업구되는데, 언제 어떻게 합칠지에 따라 두가지로 나뉜다.

1. 인접한(Adjacent) 빈 공간의 병합(Coalescing)

- 빈 공간으로 반납될 때 인접한 빈 공간이 있다면 이들을 합쳐 좀 더 큰 빈 공간을 만들어 주는 방식

- 프로세스가 메모리를 반납할 때마다 실행되고, 인접한 공간이 비어 있지 않다면 병합하지 않음


2. 빈 공간 전부의 통합(Compaction)

사용 중인 공간들을 메모리의 한쪽 편으로 밀착시켜 옮기고, 흩어져 있던 빈 공간들을 전부 합쳐 하나의 큰 빈 공간으로 만드는 방법이다.

병합과는 달리 사용 중인 공간의 위치 이동이 발생하며 이것은 메모리에 있는 모든 프로세스들의 주소 재배치를 의미하므로 상당한 시간을 요구된다.

통합이 진행되는 동안은 모든 프로세스들의 실행이 중지



 

<버디(Buddy) 메모리 관리>

메모리의 관리 역시 고정 분할과 가변 분할을 타협한 절충안이다. 가변 분할과 마찬가지로 최초에 큰 빈 공간 하나로 시작한다.

프로세스의 적재 요구가 있을 때 메모리는 요구한 크기보다 크되, 차이가 가장 작게 나는 2의 승수(Power) 크기로 분할되어 할당되며, 이때 같은 크기로 분할된 인접 공간을 버디()라고 한다.

ex) 사용자 공간이 1MByte라고 할 때,


                              a                 b              c                d                e                f


a. 초기상태이다.

b. 프로세스 A100K를 수용하기 위해 2의 승수값이면서 가장 차이가 적게 나는 128K의 분할을 만든 후 수용한 결과이다. A가 수용된 공간의 버디는 같은 크기의 바로 아래 128K의 공간이다. A가 수용되고 남은 28K의 공간과 같은 것이 내부 단편화이다.

c. B, C ,D가 차례대로 적재된 후의 결과이다.

D가 수용되어 256K 공간과 같은 크기면서 인접한 것으로는 B가 수용되어 있는 공간과 아래의 빈 공간이 있지만, D의 버디는 아래쪽 빈 공간이다.(나눠진 것)

d. B의 반납은 버디가 사용 중이므로 병합이 일어나지 않는다.

e. A의 메모리 반납 후, 128K가 되며 다시 E를 적재하고, C를 반납한 결과이다.

f. E의 메모리 반납 후, 512K가 된다(버디이기 때문에)



Copyright2014 By 휴먼사이언스

LIST

<예방 기법>

1. 자원의 배타적 사용 조건을 배제

모든 자원을 공유 가능 자원으로 하여 교착 상태의 발생을 차단하겠다는 의도이다. 불행하게도 시스템이 보유한 자원 중에는 배타적으로 사용할 수 밖에 없는 자원들도 존재 (ex. 프린터나 테이프 장치)

결론적으로, 이 조건을 배제하여 교착 상태를 예방하기는 불가능하다.


2. 자원의 부분 할당을 배제

프로세스들은 각자 자신이 필요한 모든 자원을 미리 할당 받아 실행을 시작하도록 하는 방법이다. 일부 자원만 확보되면 시작할 수 있음에도 불구하고 모든 것을 할당 받을 때까지 기다려야 하고, 할당이 가능했던 일부 자원들은 사용되지 못해 낭비되는 현상 발생한다. (심각한 자원의 낭비가 초래되는 방법이 됨)


3. 자원의 선점 불가능을 배제

모든 자원이 선점 가능하도록 할 경우 교착 상태는 발생하지 않을 것이라는 점을 고려한 해결책이다.

일부 자원을 가지고 실행하던 프로세스가 현재 할당이 불가능한 자원을 요청할 경우 자신이 보유하고 있던 자원을 내 놓게 함으로써 비선점 조건을 없앤다는 것이다.

실행 도중 보유한 자원을 내어놓게 되는 프로세스는 비정상적인 종료와 함께 심할 경우 처음부터 다시 시작해야 하는 불이익을 받게 되는 것이며, 반납되어진 자원들을 사용하여 지금까지 해 왔던 일들이 모두 무효가 된다.

결과적으로 그 동안 가동되었던 모든 자원들은 사실상 낭비된 결과가 되는 것


4. 자원의 환형 대기 상황을 배제

모든 화살표가 한 방향으로만 생성되도록 하여 사이클이 발생될 소지를 없애 교착 상태를 없앤 방법이다. 자원의 낭비와 프로세스의 무한 연기 존재.


<회피 기법>

Dijkstra의 은행가 알고리즘(Banker's Algorithm)이 대표적이다.


[안전 상태(Safe State)]

시스템에 있는 모든 프로세스가 유한 시간 내에 정상적으로 종료될 수 있는 상태를 말하며 그렇지 못할 경우를 불안전 상태라 한다.

안전 상태란 교착 상태가 발생할 수 없는 상태를 말하며, 불안전 상태라고 해서 교착 상태임을 의미하는 것은 아니지만 불안전상태는 교착 상태로 갈 가능성이 있으며 그럴 경우의 방지책이 없음을 뜻한다.

회피 기법은 시스템의 상태가 안전 상태로만 가도록 지속적으로 제어해 나가는 것이며, 각 프로세스의 자원에 대한 요청을 해당 자원이 사용 가능하다고 해서 할당하는 것이 아니라 할당의 결과 시스템이 계속 안전 상태가 되느냐에 의해 결정함을 뜻한다.

은행가 알고리즘이 제대로 작동하기 위해서는 시스템에 대한 몇 가지 가정이 요구 됨


시스템 내의 프로세스 수가 고정되어 있어야 한다.

자원의 수 역시 고정되어 있어야 한다.

각 프로세스가 요구할 자원의 최대 개수가 알려져야 한다.

각 프로세스는 할당 받은 자원을 사용 후 반드시 반납하여야 한다.

 

<Dijkstra의 은행가 알고리즘>

P2가 더 요구할 최대량이 2개이며 이것은 시스템이 현재 가지고 있는 여유량을 넘지 않는다. P2의 성공적인 종료를 유도하고, 반납되는 6개의 자원을 여유량으로 확보하면 P1P3의 어떤 요청도 할당 가능하기 때문이다.


 


 

현재의 여유량인 1개의 자원으로는 어떤 프로세스도 향후 자신의 최대 요구량에 이르지 못하는 상태가 되어 불안전 상태가 된다.




<탐지 기법>

교착 상태를 찾아 낸다는 말이고, 교착 상태의 탐지를 위해 현 시스템의 상황을 그래프로 많이 표현하는데, 이것을 자원 할당 그래프(Resource Allocation Graph, RAG)라 한다.

RAG에 대한 그래프 제거(Graph Reduction)법으로 교착 상태를 탐지한다.


[RAG 그래프 설명]

RAG는 방향성(Directed) 이분(Bipartite) 그래프이며 노드(Node)와 에지(Edge)들로 이루어 짐

노드들은 프로세스와 자원들을 표현하며 에지들은 프로세스와 자원들 간의 요청과 대기 상황을 나타냄

프로세스로부터 자원으로 향하는 에지는 보통 두 개의 의미를 가지는데 하나는 요청 중이라는 것과 또 하나는 대기 상태가 되었다는 것이다.

에지 하나가 경우에 따라 다르게 해석될 수 있다는 의미이고, 이럴 경우 RAG로 교착 상태를 탐지하는 작업이 훨씬 어려워지므로 요청 중이라는 상황이 생기지 않게 시스템이 바로 대처하면 에지들의 방향이 나타내는 상황이 할당 아니면 대기와 같이 두가지로 분명해져 탐지 작업이 용이하다.(즉시 할당 상태)


RAG에서 자원 노드는 그 자원의 형(Type)을 나타내고 그 안의 작은 동그라미가 자원의 개수를 나타 낸다. 한 자원 형에 여러 개의 자원이 있을 수 있다.


한 자원 형에는 자원의 개수를 나타내는 정수(ti)가 있으며, 임의의 노드 a로부터 다른 노드 b로 향하는 에지의 개수는 |(a,b)|로 표현한다.

즉시 할당 상태를 가정하면 자원으로 향하는 에지가 없는 프로세스란 활동이 가능한 프로세스이며 이를 unblocked process 또는 sink라 부른다


[순서]

1. RAG에서 싱크 프로세스들을 찾는다.

2. 싱크에게 할당된 자원들로부터 이 싱크 방향으로 표시된 모든 에지들을 제거한다. -> 싱크는 반납을 할 수 있으므로 "싱크가 갖고 있는 자원들을 모두 반납한다면 그 결과 RAG는 어떻게 될까?"를 적용 시키는 것이다.

3. 반납된 자원들로부터 대기하고 있던 프로세스들은 자원을 할당받을 수 있을 것이다. 싱크 역시 대열에 합류할 것이다.

[RAG의 그래프 제거 과정(교착 상태가 없는 예)]






 

R1형과 R2형은 각각 2개와 1개의 자원을 가지고 있고 현재 싱크는 P3밖에 없으므로 P3로 향하는 에지를 제거한다.


그 결과 반납되는 자원을 P2에게 할당해 준다면 P2가 싱크가 되어 다시 에지들이 제거될 수 있을 것이다.

 

최종적인 결과에서 보듯이 모든 에지가 제거 되므로 제거 전의 원래 RAG에 교착상태는 없다고 밟혀진다.

[RAG의 그래프 제거 과정(교착 상태가 있는 예)]





P2에서 R1로 향하는 에지가 2개가 있는데 이것은 R1형의 자원 2개가 한꺼번에 필요하다는 요청을 나타낸다.

P3으로부터 제거를 시작한 후 그 다음 상황에서 반납된 자원이 P2를 싱크로 만들어 주지 못함을 알 수 있다. 아직 한 개가 더 필요하고 이것은 P1이 가지고 있기 때문이다. 더 이상 에지를 제거해 줄 싱크가 없으며 따라서 애초의 RAG에 교착상태가 있다는 것을 탐지하게 된다.

[그래프 탐색 방법]

 

 

P2R1을 요청하게 되면 대기하게 될 것이며 이때 경로를 따라(점선) 탐색해보면 의 경우 바로 싱크인 P3을 만나게 되고 교착상태가 아님을 판단한다. 만약 의 경로로 먼저 탐색했다면 P2 자신을 되돌아오는 사이클리 있음을 알게 되는데 아직 의 경로 탐색이 남아있고 이 경로의 탐색 결과 싱크를 발견하게 되므로 역시 교착상태가 없음을 확인하게 되어 P2R1에 대한 요청은 단순히 대기 상태를 만들뿐이라는 사실을 알게된다.



<복구 기법>

교착 상태로부터 벗어나기 위한 방법이다. 교착 상태에 포함되어 있는 한 개 이상의 프로세스를 강제로 종료시켜 이들로부터 반납되는 자원들을 나머지 프로세스들에게 줌으로써 해결하거나, 아니면 교착 상태를 벗어나기 위해 필요한 추가의 자원을 어디서든 갖고와 할당해 줌으로써 해결한다.

프로세스 종료 방식과 자원의 선점에 의한 방식으로 나뉜다.


1. 프로세스의 종료 (Process Termination) 방식

교착 상태를 형성한 프로세스들 중 몇 개를 강제로 종료시켜 이들로부터 반납된 자원으로 복구한다.

어떤 프로세스들을 종료시킬 것인가가 문제인데, 강제로 종료된 프로세스들은 지금까지 해 왔던 일을 포기하게 되고 기회가 왔을 때 다시 자원들을 할당받아 일을 새로 시작해야 하는 희생이 요구되므로, 이러한 희생을 최소화할 수 있기 위해 종료 비용(TerminationCost)이라는 것을 따져 교착 상태로부터 복구될 때까지 종료 비용이 최소인 프로세스부터(Lowest-termination-cost Process First) 종료시킨다. 비교적 간단하나 프로세스 하나를 종료시킬 때마다 교착 상태가 제거되었는지 알아보아야 한다.

교착 상태에 있는 프로세스들의 집합에서 가능한 모든 부분집합을 만들어 이 집합들에 속하는 프로세스들을 종료시켰을 경우의 비용을 따져 역시 최소의 비용이 드는 부분집합에 속하는 프로세스들을 한꺼번에 종료시키는 방식을 취하기도 함


[종료 비용 산정 방법]

- 프로세스의 우선순위(Priority)나 종류, 실행된 시간의 크기, 남은 시간 등

- 우선순위가 낮은 것, 실시간이 아닌 것, 실행된 시간이 적은 것, 남은 시간이 큰 것에 해당될수록 종료 비용이 싸다고 보는 것

최소 비용의 프로세스들을 고를 수는 있으나 모든 부분 집합에 대해 비용을 계산하기가 복잡하고 힘들다.


2. 자원의 선점에 의한 방식

필요한 자원을 가지고 있는 프로세스로부터 강제로 뺏어 교착 상태에 있는 프로세스들에게 줌으로써 해결한다. 자원을 선점 당하는 프로세스는 교착 상태와는 전혀 상관이 없지만, 단지 해당 자원을 가지고 있다는 이유 때문에 선택될 수 있다는 것이다.

(물론 이 방식에서도 선점 시의 최소 비용은 따져야 함)

프로세스의 강제 종료는 그 동안의 일을 없던 것으로 하고 처음부터 다시 해야 하기 때문에 복구 비용을 키우는 주요인이 되며 시스템의 입장에서는 큰 낭비 요인이다.

강제 종료 시의 낭비를 줄이기 위한 방법으로 검사점 지정(Checkpointing) 과 재시작(Restart)을 들 수 있다.


1. 검사점(Checkpoint) : 프로세스들은 실행의 중간 중간에 그 시점까지의 실행 결과를 보존하고 표시를 해 두는 것

강제로 종료될 때는 아예 처음으로 돌아가는 것이 아니라 가장 최근의 검사점부터 차례로 하나씩 되돌리는 것

이 과정에서 교착 상태를 벗어날수 있다면 종료된 프로세스는 처음부터가 아니라 최종적으로 되돌려졌던 검사점에서 보존된 내용으로 재시작을 할 수 있어 잃게 되는 일의 양을 최소화할 수 있음



Copyright2014 By 휴먼사이언스

LIST

<인터럽트 금지를 사용한 기법>

단일처리 시스템의 경우는 병행 프로세스들이 실제로는 CPU를 번갈아 사용하는 것이므로 한 프로세스가 임계영역에서 실행 중일 때 CPU를 뺏기지 않도록 하면 간단하게 상호배제를 지켜줄 수 있을 것이다.

다시 말해, 시간 종료나 우선순위 등에 의해 CPU를 뺏길 수 있는 인터럽트를 임계영역의 실행을 완료할 때까지 발생하지 않도록 하면 된다.

임계영역의 처리 동안 모든 종류의 인터럽트를 금지시킴으로써 시스템의 효율적인 운영을 방해하기 쉽다.

 





<하드웨어 명령어를 사용한 기법>

기계명령어로 잘 알려져 있는 testandsetexchange명령어를 사용한다. 이해를 돕기 위해 함수 또는 프로시저의 형식으로 표현되어 있으나 실제로는 기계명령어로서 원자적으로 실행 도중 끊김 없이 완료되는 연산이다.

 





 

lock의 초깃값이 false이므로 최초 진입 프로세스가 testandset을 실행하게 되면 target 값이 false가 되어 rv로 넘겨져, while문은 false가 되고 결과적으로 임계영역의 진입이 가능하다.

임계영역을 실행중인 프로세스가 있다면 lock의 값이 true이므로 진입을 시도하는 다른 프로세스는 while문에서 막혀 상호배제를 보장하게 된다.



<세마포어(Semaphore)>

세마포어는 두 개의 특수한 명령들만 접근할 수 있게 허용되는 보호된 변수로서, 상호배제 명령을 구현 가능하다.

세마포어는 그 변수가 가질 수 있는 값의 범위에 따라 종류가 구분된다.

세마포어가 0 아니면 1의 이진 값만을 가진다면, 그 세마포어를 이진(Binary) 세마포어

세마포어의 값이 음이 아닌 모든 정수가 될 수 있으면, 계수(Counting) 혹은 정수(Integer) 세마포어

세마포어를 위한 특수한 명령들은 비분리(Indivisible) 명령들로서, 세마포어 값을 초기화하는 명령, P 명령, V 명령이 있다.

 

P 명령은 S 값이 0보다 크면 S 값을 1 감소시키는 작업을 하지만, 그렇지 않으면 S 값이 0보다 크게 되기를 기다리게 된다.(Suspend Process)

V 명령에서는 S0보다 크게 되기를 기다리는 프로세스 하나를 계속 진행하게 하고, 만약 그러한 프로세스가 존재하지 않는다면 단순히 S의 값을 1을 증가시키는 작업만 한다.

세마포어에 대한 명령들은 각각 분리되지 않고 수행될 수있도록 구현해야 하며, 같은 세마포어에 대해서 동시에 실행되지 못한다.


[세마포어를 이용한 상호배제]

 

세마포어 변수 S1로 초기화되어 있으므로 최초로 시도하는 프로세스는 S0으로 바꾸고 임계 영역에 진입하게 될 것이다. 이 후 진입을 시도하는 프로세스들은 대기 상태가 되며 S 값은 1씩 감소된다.

임계영역을 나오는 프로세스에 의해 S1 증가하고 이때 대기 상태의 프로세스들 중 하나가 실행 가능한 상태가 되어 임계영역의 진입이 가능해지는 것이다.

PV 명령의 정의에 따라 한 번에 하나의 프로세스만이 임계영역에 들어갈 수 있음을 알 수 있을 것이다.



Copyright2014 By 휴먼사이언스

 

LIST

'OS > Theory' 카테고리의 다른 글

메모리 관리  (0) 2016.04.16
교착상태 해결방법  (0) 2016.04.15
교착상태와 프로세스  (0) 2016.04.14
병행 프로세스 - 생산자/소비자 문제(Producer/consumer Problem)  (0) 2016.04.13
교착상태(DeadLock), 자원의 분류  (0) 2016.04.13

<교착상태와 프로세스>

실행 중인 프로세스가 자원에 대해 취할 수 있는 행동은 두 가지가 있다.

1. 필요한 자원에 대한 요청(Request)

이때 요청된 자원의 상태에 따라 다시 두 가지의 경우가 발생

요청된 자원이 사용 가능(Available)하다면 이 자원을 할당받아 사용하면 될 것

자원이 다른 프로세스에 의해 사용 중이라면 반납되어질 때까지 대기 상태로 기다려야 할 것

2. 사용이 끝난 자원의 반납

자원에 대한 요청과 반납은 실행 중인 프로세스가 시스템 서비스를 호출(System Call)함으로써 운영체제에 의해 이루어지며, 반납된 자원으로 그 자원 때문에 대기 중인 프로세스를 깨우는 것도 운영체제임



<교착 상태의 4가지 원인>

아래의 4가지 조건들이 모두 갖춰질 때 교착 상태가 발생(한 가지 조건이라도 생기지 않도록 한다면 교착상태는 발생하지 않음)

1. 자원의 배타적인 사용

교착 상태의 발생이 시스템이 보유한 한정적인 자원에 대한 프로세스들의 사용 경쟁 때문이라고 했을 때, 만약 자원이 한정적이라도 모두 공유가 가능한 자원이라면 교착 상태는 발생할 수 없다.

시스템이 보유한 자원 중 배타적 사용이 요구되는 자원 때문에 교착상태가 발생하는 원인이 된다.

상호배제 조건(Mutual Exclusion Condition)이라고도 함


2. 자원의 부분 할당 (Partial Allocation).

각각의 프로세스는 자신의 실행 전체 과정에서 필요한 자원을 필요할 때마다 일부분씩 확보, 실행해 나가다가 어느 시점에 할당이 불가능한 자원 때문에 이미 확보한 자원들을 소유한 채 대기 상태가 되어 버리는 과정을 겪으면서 교착 상태에 빠질 가능성을 높이는 것이다.

보유와 대기(Hold & Wait) 조건이라 부르기도 함


3. 자원의 선점 불가능성

선점이 불가능한 자원을 억지로 선점이 되도록 하면 어떨까?

선점의 권한이 주어진 프로세스들은 자원 때문에 대기할 필요가 없으므로 교착 상태라는 것은 없앨 수 있다. 하지만 자신의 자원을 선점 당한 프로세스들은 정상적인 실행을 포기해야 한다. 왜냐하면 선점을 당한다는 말은 그 자원을 가지고 해왔던 지금까지의 일을 잃게 된다는 것이기 때문이다.

비선점(No Preemption) 조건이라고도 함


4. 자원에 대한 환형 대기 (Circular-Wait)

프로세스들이 자신의 자원은 보유한 채로 서로 상대방의 자원을 요청하고 결과적으로 대기 상태가 되어버리는 일련의 과정에서 교착 상태가 발생 가능하다.

 





 

 

Copyright2014 By 휴먼사이언스

 

 

LIST

<생산자/소비자 문제(Producer/consumer Problem)>

생산자는 데이터를 만들어 버퍼에 저장하고(채워나가고), 소비자는 버퍼에 있는 데이터를 꺼내 소비하는(비우는) 프로세스

버퍼는 공유 자원이므로 버퍼에 대한 접근 즉, 저장하고 꺼내는 일들이 상호배제 되어야 함

버퍼가 비어 있을 때는 소비자가, 버퍼가 꽉 차있을 때는 (더 이상 저장할 공간이 없으므로) 생산자가 기다려야 하는 동기화도 자연스럽게 포함되어 있다. 버퍼의 크기는 저장 공간이 하나인것부터 무한개까지 설정 가능하다.

 



 

위 코드에서 in은 버퍼에서 채워 넣을 위치를 말하고, out은 꺼낼 위치를 나타내며, 초기 값은 각각 0이고, 버퍼가 차있거나 비어 있을 경우 중간의 while문을 맴돌게 된다.



n개의 공간을 가지는 유한 크기의 원형 버퍼를 가정한 알고리즘을 보자.

다음 그림에서 흰 블록은 비어있는 buffer를 나타내고, 검은색 블록은 내용이 들어있는 buffer를 나타낸다.



위의 원형 버퍼를 가지고 다음 코드를 해석해보자.

왼쪽은 생산자 코드이고, 오른쪽은 소비자 코드이다.

Occupied는 세마포어로 초깃값이 0이다. 이유는 맨 처음 원형 버퍼에는 단 한개의 값도 저장되어 있지 않기 때문이다.

Empty는 세마포어로 초깃값이 n이다. 이유는 맨 처음 원형 버퍼에는 n개의 빈칸이 있기 때문이다.


[생산자 코드]

P(Empty)에서 받은 Empty값이 0보다 큰 정수이면 하나를 뺀다. , 원형 버퍼 안에 빈 칸이 있으면 그 값에서 -1을 시킨다. (빈 칸이 하나 없어지는 셈이니...)

만약 비어있는 버퍼라면 j번째에 있는 버퍼 블록에 저장한다.(생성자)

그 후, 다음 저장할 인덱스로 자리를 이동시키기 위해 +1을 해준다. mod n을 해주는 이유는 n mod n = 0이기 때문인데, 원형 버퍼 인 것을 기억하자.

마지막으로 V(Occupied)는 대기중인 프로세스들이 존재하면 실행 상태로 만들고, 그렇지 않다면 +1을 해준다. +1을 해주는 이유는 생성자가 하나 저장했기 때문에 채워진 버퍼 블록(위 그림에서 검은색 블록)이 하나 증가함.


[소비자 코드]

P(Occupied)에서 받은 Occupied 값이 0보다 큰 정수이면 하나를 뺀다. , 원형 버퍼 안에 채워진 슬롯들이 있으면 그 값에서 -1을 시킨다. (채워진 슬롯을 하나 읽어오는 셈이니...)

만약 차있는 버퍼라면 i번째에 있는 버퍼 슬롯을 읽어온다.(소비자)

그 후, 다음 읽어갈 인덱스로 자리를 이동시키기 위해 +1을 해준다. mod n을 해주는 이유는 n mod n = 0이기 때문인데, 원형 버퍼 인 것을 기억하자.

마지막으로 V(Empty)는 대기중인 프로세스들이 존재하면 실행 상태로 만들고, 그렇지 않다면 +1을 해준다. +1을 해주는 이유는 소비자가 하나 읽었기 때문에 비워진 버퍼 블록(위 그림에서 흰색 블록)이 하나 증가함.


<모니터>

공유 데이터들과 이 들에 대한 임계영역들을 관리하는 소프트웨어 프로시저를 포함하는 병행성 구조(concurrency construct)로 자료 추상화(data abstraction)의 개념을 기초로 하고 있다.

모니터는 프로그래밍 언어 수준에서 제공되는 모듈로서 공유 데이터를 위한 변수들과 초기화 루틴, 임계영역을 코딩한 프로시저들로 이루어진 일종의 함(box)으로 이해. 모니터 내의 변수들은 프로시저들을 통해서만 접근이 가능하므로, 프로세스들은 모니터의 프로시저를 호출, 실행하여 모니터 안으로 진입한 후 원하는 공유 데이터에 대한 접근을 하게 된다. 중요한 점은 언제나 모니터의 진입을 한 프로세스로 제한함으로써 즉, 한 번에 하나 이하의 프로세스만이 모니터 내에 있게 함으로써 상호배제를 자연스럽게 실현한다는 것이다.


모니터에서는 조건변수(Condition Variable)를 선언하고, 조건의 대기를위해 wait(C), 대기에서 깨어나기 위해 signal(C)을 제공한다. 조건변수는 모니터에서만 선언하고 사용하는 것으로 wait()signal()에 의해서만 접근 된다. wait(c)는 이 연산을 호출한 프로세스를 조건 c의 큐에 대기시키고 다른 프로세스의 모니터 진입을 가능하게 한다. signal(c)wait(c)에 의해 대기되었던 프로세스를 재개시키고 자신은 신호자 대기 큐로 비켜준다. 만일 wait(c)로 대기 중인 프로세스가 많다면 그 중에 하나를 고를 것이고, 없다면 단순히 다음 문의 실행을 계속하면 된다.



 

 

위 코드를 분석해보자.

buffer[n]n개의 buffer를 갖는 배열을 만든다. (원형 버퍼)

nextin은 원형 버퍼에 다음 빈 슬롯에 추가하는 인덱스이다.

nextout은 원형 버퍼에 다음 저장된 슬롯에서 읽어오는 인덱스이다.

count는 저장되어 있는 슬롯의 개수이다.

cond notfull, notempty는 조건 변수로 각각 슬롯이 full이 아닌 상태와 슬롯이 empty가 아닌 상태를 말한다.

void append(char x)에서

if (count == n) 만약 저장되어 있는 슬롯의 개수가 n이면, 꽉찬 상태이면...

cwait(notfull); 슬롯이 full이 아닌 상태가 될 때까지 기다린다. 그래야 빈 슬롯에 저장할 수 있으니까...

buffer[nextint] = x; 그렇지 않다면 다음 비어있는 슬롯(인덱스)x값을 저장해라.

nextin = (nextin + 1) % n; 그다음 인덱스값을 다음으로 옮겨준다. %n을 하는 이유는 원형 버퍼를 기억하자!

count++; 값이 하나 저장되었으므로, count값이 하나 증가

csignal(notempty); 대기되었던 프로세스를 재개시키고 자신은 신호자 대기큐로 비켜준다.

void take(char x)에서

if(count == 0) 만약 저장되어 있는 슬롯의 개수가 0이면, 빈 상태이면...

cwait(notempty); 슬롯이 empty가 아닌 상태가 될 때까지 기다린다. 그래야 저장되어 있는 슬롯으로부터 읽어 올 수 있으니까...

x = buffer[nextout]; 그렇지 않다면 다음 슬롯을 읽어서 x에 저장한다.

nextout = (nextout + 1) % n; 다음 인덱스 값으로 옮겨준다.

count--; 값을 하나 읽어 왔으므로, count값이 하나 감소

csignal(notfull);

 



 

Copyright2014 By 휴먼사이언스

LIST

<교착상태(DeadLock)>

자원이 한정적인 상황에서 두 개 이상의 프로세스가 각자 먼저 확보한 자원을 가진 채 상대방의 자원을 필요로 할 경우, 외부로부터의 조치가 없는 한 이들은 아무 일도 못하고 계속 기다려야 할 것이다. 이러한 상황을 컴퓨터 시스템에서는 교착 상태(Deadlock)라고 한다.

다시말해, 둘 이상의 프로세스가 각자가 가지고 있던 자원을 보유한 채로 외부적 조치가 없는 한 영원히 그 상태에서 기다리고 있는 상황

 

[교착 상태의 근본 원인]

- 시스템이 가지고 있는 한정적인 자원보다 사용하고자 하는 프로세스들의 요청이 더 많기 때문

 

[교착 상태의 문제점]

- 해당 프로세스들이 더 이상 실행되지 못하여 사용자들에게 응답해 주지 못한다는 점

- 보유된 자원들이 교착 상태에서 벗어나기 전까지는 전혀 활용되지 못한다는 점=>결국 시스템의 성능 저하로 나타날 수밖에 없음

 


<자원이란?>

교착 상태를 일으키는 원인이 자원(Resource).

운영체제의 중요한 임무 중의 하나가 자원의 관리.

- 하드웨어 자원 : 하드디스크, 테이프 드라이브, 메모리 등

- 소프트웨어 자원 : 데이터나 메시지 등

 


[선점 가능성에 따른 분류]

- 선점 가능(Preemptible) 자원 : CPU나 메모리와 같은 자원처럼 한 프로세스에 의해 사용 도중 선점(Preemption)되어 다른 프로세스에게 할당(Allocation)해 주었다가 이 후 다시 원래의 프로세스에게 돌려주어도 되는 자원

- 선점 불가능한(Nonpreemptible) 자원 : 선점이 될 경우 자원을 뺏긴 프로세스는 정상적인 진행을 포기해야 하는 불이익을 받게 되는 경우의 자원

 


[자원이 사용되어지는 방식에 따른 분류]

한 프로세스에게 할당된 자원을 동시에 다른 프로세스가 할당받아 같이 사용할 수 있는지의 여부에 따라 공유 가능(Sharable) 자원과 배타적 사용(Exclusive Use) 자원으로 분류

- 배타적 사용 자원 : CPU, 메모리, 테이프, 버퍼(Buffer), 키보드와 모니터 등

- 공유 가능 자원 : 공유 가능한 프로그램(시스템 프로그램이나 유틸리티 프로그램 등)과 공유 데이터 등


 

[자원의 속성에 따른 분류]

먼저 할당된 자원이 사용 후 반납(Release)되었을 때 자원 자체는 계속 존재하여 또 다른 프로세스에게 할당이 가능하다면 그 자원은 순차적 재사용 가능(Serially Reusable) 자원 - 시스템에서 프로세스들이 아무리 사용해도 없어지지 않고 영구히 존재하는 자원으로 CPU, 메모리, 테이프, 하드디스크, 버퍼,프로그램 등

사용 후 사라지는 자원은 소모성(Consumable) 자원 - 일시적으로 생성되었다가 사용된 후 없어지는 시그널(Signal)이나 메시지 등




Copyright2014 By 휴먼사이언스

LIST

<병행(Concurrent)이란?>

같이 존재하고 있다는 뜻이며, 메모리에 다수의 프로세스가 같이 존재한다는 것을 의미한다.

한 개의 CPU가 있는 단일처리 시스템에서는 병행 프로세스 중 한 개만이 실제로 실행되지만 CPU의 처리 시간을 효과적으로 나눔으로써 겉으로는 병행 프로세스들이 동시에 처리되는 것이다.

병형과 병렬(Parallel)은 다르다. 병렬은 다중처리 시스템의 경우 여러 개의 프로세스가 동시에 실행하는 것을 말한다.


병행 프로세스들이 서로 간에 비동기적(Asynchronous)이라는 말은 다른 프로세스들이 어떤 상태에 있는지, 어떤 자원을 가지고 있는지, 어디까지 실행됐는지 등에 대해 모른 체 실행되고 있음을 의미한다.


공유된 자원이나 데이터에 대해 병행 프로세스들이 따라야 하는 룰이란 한 번에 한 프로세스만이 접근하도록 하고, 해당 자원에 대해 의도했던 실행을 완료하도록 보장 한다는 것을 의미한다.



ex1) 메모리에 있는 변수 count는 현재 값이 10이며, 프로세스 A는 이 값을 하나 증가시키는 일을, 프로세스 B는 하나 감소시키는 일을 한다고 하자.두 프로세스가 한 번씩 실행되었을 때의 결과 값은 누가 먼저 실행되든 여전히 10이어야 할 것이다.


A의 경우 먼저 메모리에서 count 값을 읽어 처리기 레지스터로 넣은 다음 1을 더하고 난 후, 처리기 레지스터에 들어 있는 결과 값 11을 메모리의 count 변수에 저장함으로써 실행을 완료한다.

여기서 중요한 점은 결과 값 11이 저장되기 전까지는 메모리의count 값이 10인 것을 명심하자.

B 역시 1을 뺀다는 것 외에는 A와 동일한 절차를 밟게 될 것이다.

정상적으로 실행됨을 가정하고 A가 먼저 실행되었을 경우 count11이 된 후 B에 의해 다시 10이 될 것이며, 반대로 B가 먼저 실행되었다면 9가 된 후 A에 의해 10이 될 것이므로 두 경우 모두 정확한 결과를 낳는다는 것을 알 수 있다.



ex2) 공유 변수 count에 대해 AB가 아무 제약 없이 실행되도록 했을 경우를 떠올려 보자.

먼저 Acount 값을 11로 증가시킨 후 저장하기 전에 CPU의 사용권이 B에게 넘겨진 후, Bcount에 대한 접근이 허용되면 B1을 빼기위해 먼저 메모리에 있는 count 값을 읽어오게 될 텐데 이때의 값은 여전히 10일 것이다.


B에 의해 9가 저장된 후 다시 A가 실행되면 이전에 CPU를 뺏긴 시점부터 시작할 것이고 결과적으로 처리기 레지스터에 있는 값 11을 저장하게 되어 count의 최종 값은 11이 될 것이며, 반대로 AB의 순서를 바꾸면 9가 저장될 것이다.


다중처리 시스템의 경우에는 두 프로세스가 동시에 실행될 수 있으므로 둘 다 10을 읽고 각자의 실행 결과를 저장하게 될 것이고, 결국 count의 최종 값은 조금이라도 늦게 저장하는 프로세스의 결과 값과 같이 11또는 9가 될 것이다.


, 한 프로세스의 공유 변수 count에 대한 조작 도중 다른 프로세스에게도 count에 대한 조작이 허용되면 부정확한 결과 값을 초래하게 된다.

다시 말해, 단일처리 시스템의 경우 정확한 결과 값을 위해서는 Acount에 대한 조작 도중 CPUB로 넘겨지더라도 Bcount에 대한 조작은 허용되어서는 안 된다는 점이다.



<상호배제>

프로세스들이 공유 데이터에 대해 서로 접근을 시도하는 상황을 경쟁 상태(Race Condition)라 한다.

경쟁관계에 있는 프로세스들로 인해 상호배제, 교착 상태(Deadlock), 기아(Starvation)와 같은 문제 발생한다.

, 상호배제란 한 번에 하나의 프로세스만이 임계영역에 들어가야함을 의미한다.

한 프로세스만 임계구역에 진입하고, 다수의 프로세스들이 하나의 공유 자원을 상호 배타적으로 사용할 수 있게 하면서 동시에는 수행할 수 없도록 한다.



 

다음 그림에서 트랙잭션 실행 순서에 따라 account 값은 10,000, 20,000, 0 원일 수 있다.

공유 변수(account)를 접근하고 있는 하나의 프로세스 이외에는 다른 모든 프로세스들이 공유 변수를 접근하지 못하게 제어하는 기법을 상호 배제라 한다.

 



 

<임계영역(Critical Section)>

두 개 이상의 프로세스가 동시에 사용할 수 없는 자원(임계자원(Critical Resource))에 대해 접근하고 실행하는 프로그램내의 코드 부분이다.

프로세스가 공유자료를 변경하는 영역이고,

하나의 프로세스만 공유 데이터에 접근하고 나머지 프로세스들은 공유 데이터에 접근할 필요가 있더라도 기다려야 한다.

임계구역은 가능한 한 빨리 수행되어야만 하며, 프로세스가 임계구역에 들어간 후 프로세스가 블럭 상태로 되어서는 안 된다.


[임계 영역 진입 순서]

임계영역에 들어가고자 하는 프로세스는 먼저 임계영역 내 다른 프로세스가 있는지를 확인

확인한 후 있다면 기다리고, 없다면 들어가면서 자신이 나올 때까지다른 프로세스가 들어오지 못하도록 한다.

임계영역을 벗어날 때는 자신이 나오는 사실을 알려 다른 프로세스가 들어올 수 있도록 한다.



Copyright2014 By 휴먼사이언스

 

LIST

+ Recent posts