########### 시험 ############
6월 15일 12시
###########################
# 교착 상태 원리 P284
# 자원 종류
1) 재사용 가능 자원 (reusable)
- 프로세스의 사용에 의해 없어지지 않는 자원
- 프로세스가 사용한 후 다른 프로세스가 다시 사용할 수 있도록 반납함
- 처리기, 입출력 채널, 주/보조 메모리, 장치, 파일이나 데이터베이스나 세미포어와 같은 자료 구조
# 디스크(D) 와 테이프(T)를 이용한 백업
=> 재사용 가능한 자원을 위해 경쟁하는 두 프로세스
=> 수행 단계 : p0, p1, q0, q1, p2, q2
# 메모리 할당 (가용 메모리 크기 = 200Kbytes)
=> 한 프로세스만 동작하면 문제없이 수행됨
=> p1이 첫 번째 요청 성공하고 p2도 첫 번째 요청을 성공한 이후, 두 번째 요청이 발생하면 두 프로세스 모두 블록됨
=> 요청될 메모리의 양을 모르면 교착 상태 해결하기 어려움
2) 소모성 자원 (consumable)
- 생성되었다가 사용된 이후 소멸됨
- 개수의 제한이 없음
- 인터럽트, 시그널, 메시지, I/O 버퍼에 존재하는 정보
# 통신
=> 각 프로세스는 상대 프로세스로부터 메시지 수신을 기다림
=> 메시지 수신 이후 상대 프로세스에게 새로운 메시지 전달함
=> receive 함수가 블록킹 타입이면 교착 상태 발생
# 자원 할당 그래프 p287
- 프로세스와 자원 할당 관계 표현
- 유향 그래프 (directed graph)
- 사각형 : 자원
- 원 : 프로세스
- 점 : 자원의 인스턴스, 가용 개수
(a) 프로세스가 자원 요청, 아직 할당 되지 않음
(b) 프로세스가 자원의 생산자
(c) 교착상태
(d) 교착상태 아님, 자원의 인스턴스 여러 개
# 교착상태에 대한 자원 할당 그래프
# 교착 상태 4가지 조건 : 필요충분 조건 p 289
1) 상호배제(mutual exclusion) : 한 순간에 한 프로세스만이 자원을 사용할 수 있음. 한 프로세스에 의해 점유된 자원을 다른 프로세스들이 접근할 수 없음 => 수행 결과 일관성과 데이터베이스의 무결장 보장을 위해 필요
2) 점유대기(holad and wait) : 이미 자원을 보유한 프로세스가 다른 자원을 요청하며 기다리고 있음
3) 비선점(no preemption) : 프로세스에 의해 점유된 자원을 다른 프로세스가 강제적으로 빼앗을 수 없음
- 프로세스가 새로운 자원 요청에 실패하면 기존의 자원들을 반납 한 후 다시 요청 or 운영체제가 강제적으로 자원을 반납시킴 환형 대기
4) 환형대기(circular wait) : 프로세스들 간에 닫힌 연결 존재함. 자원 할당 그래프에서 환형이 만들어짐.
- 자원 할당 순서(자원 유형) 정의
=> 1) ~ 3) 복잡한 상호작용의 해결할 수 없는 환형 대기 상태가 발생하게 됨
=> 교착상태란 해결할 수 없는 환형 대기 상태임
- 치명적인 영역(fatal region)은 상호배제, 점유대기, 비선점 조건이 시스템에서 지켜지기 때문.
- 피할 수 없는 영역에 진입한다는 것은 환형대기 조건이 발생한다는 것
- 1), 2), 3) : 교착상태 가능
- 1), 2), 3), 4) : 교착상태 발생
# 교착 상태 해결하기 위한 접근 방법
1) 교착 상태 예방 (prevent)
- 운영체제를 설계할 때 교착상태가 발생할 가능성을 없애는 것
- 교착 상태가 발생하기 위한 4가지 필요충분 조건 중 하나를 설계 단계에서 배제하는 기법 상호배제
- 간접적인 방법 : 조건 1~3 중에 하나를 허용하지 않는 것
- 직접적인 방법 : 환형대기를 허용하지 않는 것
- 교착상태가 발생하지 않도록 하기 위해 자원 접근에 대한 제한과 프로세스의 수행에 제한을 둠
1-1) 상호배제
- 공유 자원의 일관성을 유지하기 위해 반드시 필요하므로 자원 접근에서 상호배제가 필요하면 운영체제가 지원함
- 다수의 프로세스들이 쓰기 권한을 얻으려고 할 때 교착상태가 발생할 수 있음
1-2) 점유대기
- 프로세스는 자신이 사용할 모든 자원을 한순간에 요청함, 모든 자원을 할당받을 수 있으면 계속 수행함
- 하나의 자원이라도 할당받을 수 없으면, 어떠한 자원도 할당받지 않은 채 대기함
* 비효율성 발생
1. 모든 자원을 할당받기 위해 오랜 기간 기다릴 수 있음
- 프로세스가 일부 자원만 할당받고 수행을 시작할 수 있으며 다른 자원은 수행 중에 할당받아도 됨 => 프로세스는 모든 자원의 할당이 가능해질 때까지 대기해야 함
2. 한꺼번에 할당받은 자원 중 일부는 실제 수행이 끝날 때쯤에 사용될 수 있음 => 프로세스의 시작 시점과 실제 사용 시점 사이에서 실제로 이용되지 않으면서 점유되어 있었음. 다른 프로세스들은 그 자원을 사용할 수 없음
3. 프로세스가 미래에 사용될 모든 자원을 미리 알기 어려움
1-3) 비선점
1. 자원을 점유한 프로세스가 다른 자원을 요청했을 때 할당받을 수 없다면, 자신이 점유한 자원을 반납함 -> 이후 프로세스는 원래 자원과 새로 원하는 자원을 함계 요청함
2. 한 프로세스에서 다른 프로세스가 점유한 자원을 원하면, 운영체제는 다른 프로세스가 점유한 자원을 강제적으로 반납시키고 그것을 원하는 프로세스에게 할당할 수 있음 => 프로세스들이 서로 다른 우선순위를 갖고 있을 때 교착상태를 예방할 수 있음
1-4) 환형대기
- 자원들의 할당 순서를 정하면 없앨 수 있음
- 프로세스가 자원 R을 할당받았다면, 이후 이 프로세스는 자원 R 다음 순서를 갖는 자원들을 요청할 수 있는 것
2) 교착 상태 회피 (avoid) p291
- 현재 자원 할당의 상태에 따라 안전하게 자원 할당을 결정하는 것
- 교착 상태 발생 조건 중 1~3 은 허용
- 자원 할당 순서를 미리 정하지 않음
- 자원을 할당할 때 교착 상태가 발생 가능한 상황으로 진행하지 않도록 고려
- 예방에 비해 많은 병행성 제공 (자원 사용의 효율성이 높음)
- 프로세스가 자원을 요청하고 그 자원이 사용 가능할 떄 그대로 할당해주지 않음
- 할당 전에 이 할당이 교착상태를 발생시킬 가능성이 있는지 동적으로 조사함
- 교착상태를 발생시킬 가능성이 있다면 자원을 할당하지 않음
- 현재 자원의 가용 개수와 프로세스의 자원 요구량을 미리 알고 있어야 가능함
2-1) 프로세스가 시작하려 할 때 요구하는 자원 할당이 교착상태 발생의 가능성이 있으면, 프로세스를 시작시키지 않음
2-2) 수행 중인 프로세스가 요구하는 추가적인 자원 할당이 교착상태 발생의 가능성이 있으면, 자원을 할당하지 않음
# 프로세스 시작 거부
- n개의 프로세스, m개의 다른 유형에 자원이 있다고 가정
- 행렬 C와 A는 프로세스가 요구하고 있는 자원과 현재 프로세스가 점유하고 있는 자원의 개수
- 각 행은 각 프로세스에 대응됨
- 운영체제는 프로세스 수행 전에 이 정보들을 미리 알고 있어야 함
1. 모든 자원은 가용하거나 할당되어 있음
2. 프로세스는 자원의 전체 개수보다 더 많은 개수의 자원을 요구할 수 없음
3. 프로세스는 자신이 요구한 자원보다 더 많은 개수의 자원을 할당할 수 없음
- 모든 프로세스들이 요구한 자원의 개수가 전체 자원 개수보다 적으면 교착상태가 발생하지 않음
- 새로운 프로세스와 기존의 프로세스들이 요구하는 자원의 개수가 그 자원의 전체 개수보다 적을 경우에 수행을 허용함
- 최악의 경우, 모든 프로세스들이 동시에 최대 자원을 요구하여 사용함을 가정 => 효율적이지 않음
# 자원 할당 거부
- 은행원 알고리즘
- 시스템에 고정된 수의 프로세스와 자원이 존재한다고 가정
- 상태 : 프로세스들이 자원을 요구하고 할당받은 관계로 정의
- 시스템의 상태 : 2개의 벡터와 행렬, 즉 자원, 가용이라는 벡터(R,V)와 요구와 할당이라는 행렬(C,A)로 표현됨
- 안전한 상태 : 교착상태가 발생하지 않도록 프로세스에게 자원을 할당할 수 있는 진행 경로가 존재함 (모든 프로세스가 자신의 자원 요구량을 모두 만족하여 수행을 마칠 수 있음)
- 세 개의 자원 (R1, R2, R3)과 네 개의 프로세스(P1, P2, P3, P4)가 동작하는 시스템의 상태를 표현
- (a) : 시스템의 초기 상태. R1, R2, R3의 전체 개수는 9, 3, 6
프로세스들이 이 자원을 할당 받아 사용, 가용한 자원 개수 0, 1, 1
가용 자원의 개수가 현재 프로세스가 요구하고 있는 자원의 개수 (전체 요구 개수 - 할당 개수)보다 크면 그 프로 세스는 수행을 완료할 수 있음
P1은 2, 2, 2 개 더 요구함 => 0, 1, 1 이므로 P1은 수행 완료 할 수 없음
P2는 0, 0, 1 개 더 요구함 => 남은 가용 자원으로 서비스 가능함. P2는 수행 완료할 수 있음 -> 완료 후 반납
==> 가용 자원이 6, 2, 3이 됨
- (b) : 가용 자원을 P1에게 할당해 주면 P1도 수행 완료할 수 있음
- (c) : 완료 후 반납. 가용 자원을 P3에게 할당해서 수행 완료
- (d) : 완료 후 반납
===> (a)는 완전한 상태 => 교착상태 발생 안함. 자원 할당 거부 방법
- 불안전한 상태 : 그러한 진행 경로가 없는 상태
- (b) : (a) 에서 P1이 자원 R1과 R3를 하나씩 더 할당 받았다고 가정 => 불안전한 상태. 어떠한 프로세스라도 자신의 자원 요구를 모두 만족할 수 없으며 수행 완료하지 못하는 상태 됨. 반드시 교착상태가 발생하는 것은 아님
==> 자원 할당 거부 방법은 이러한 전이를 허용하지 않음
- (b)의 상태에서 P1이 자신의 중간 수행 단계를 마치고 R1과 R3를 반납하면, 시스템은 다시 안전한 상태로 전이함
==> 교착상태 회피는, 교착상태의 발생을 예측하고 회피하는 것이 아니라, 교착상태의 가능성을 예측하고 피하는 것
# 교착상태 회피 방법에 대한 가상 코드
- state : 시스템의 상태. 자료 구조
- (b)의 request [*] : 프로세스 i에 의해 요청된 자원. 우선 현재 요청이 프로세스가 처음 약속했던 요구보다 크지 않은지 검증. -> 통과하면 가용 자원이 요청을 만족할 수 있을 만큼 충분한지 조사 -> 그렇지 않으면 요청한 프로세스는 블록됨, 충분하면 이 요청의 서비스가 안전한 상태를 계속 유지하는지 확인함 (요구하는 자원을 프로세스에게 할당했을 떄 상태를 newstate, safe 함수로 안전한 상태인지 확인함)
# 교착 상태 회피 장점
- 교착상태 예방에 비해 자원 할당이 더 자유로움 => 시스템에서 자원 효율 높아짐
- 교착상태 발견에 비해 자원을 선점하고 프로세스 수행의 롤백이 필요 없음
# 교착 상태 회피 단점
- 각 프로세스들이 사용할 최대 자원 요구량을 미리 운영체제에 알려줘야 함
- 프로세스들은 서로 독립적이어야 함. 프로세스들 중에 한 프로세스는 다르 프로세스에 비해 먼저 수행되어야 한다는 것과 수행 순서 종속 관계가 없어야 함
- 자원 개수가 고정되어 있어야 함
- 자원을 선점한 채 종료하는 프로세스는 없어야 함
3) 교착 상태 발견 (detect)
- 교착 상태가 발생하면 그것을 발견하고 회복하는 것
- 주기적으로 가끔 수행될 수 있고, 자원 할당이 요구될 때마다 매번 수행되면 교착상태를 빠른 시점에 발견함
- 시스템의 상태가 점진적으로 변하므로 알고리즘도 간단해짐
- 처리 비용 커짐
- 교착상태 발견 주기가 짧으면 발견 가능. 발견 기법 간다. 부하큼
- 길면 부하 적음. 발견 늦어짐. 발견 기법 복잡
- 낙관적임
# 교착 상태 발견 알고리즘
- 완료될 프로세스들의 모든 가능한 진행을 고려하여 교착상태를 발견함
- 할당 행렬과 가용 벡터 사용
- 요청 행렬 (request matrix Q) 사용
- Qij 는 프로세스 i에 의해 요청된 자원 j의 개수를 의미함
- 교착상태가 아닌 프로세스들을 찾아 표시(mark)함
1. 할당 행렬 A에서 행의 값이 모두 0인 프로세스를 우선 표시한다. (할당 받은 자원 없음. P4 표시함)
2. 임시 벡터 W 를 만든다. 현재 사용 가능한 자원의 개수(결국 가용 벡터 V 의 값)를 벡터 W 의 초기값으로 설정한다.
W= (0 0 0 0 1)
3. 표시되지 않은 프로세스들 중에서 수행 완료 가능한 것이 있으면 (요청 행렬 Q 에서 특정 행의 값이 모두 W보다 작은 행에 대응되는 프로세스) 이 프로세스를 표시한다.
<P3> W= W+ (0 0 0 1 0) = (0 0 0 1 1)
만일 완료 가능한 프로세스가 없으면 알고리즘을 종료한다.
4. 단계 3의 조건을 만족하는 행을 Q에서 찾으면, 할당 행렬 A에서 그 행에 대응되 는 값을 임시 벡터 W에 더한다.
그리고 3 단계를 다시 수행한다.
- 알고리즘이 종료된 이후에도 표시되지 않은 프로세스(완료되지 못함)가 존재하면, 교착상태 발생
- 우선 현재 가용 자원으로 수행이 완료될 수 있는 프로세스 찾음
- 프로세스가 완료된 이후 반납할 자원을 가용 자원에 추가함
- 가용 자원으로 수행이 완료될 수 있는 프로세스를 찾음
- 교착상태의 여부만 파악, 이후에 더 진행되면 교착상태가 생길지 여부는 파악 못함
# 교착상태 회복 알고리즘 (recovery)
1. 교착상태에 포함되어 있는 모든 프로세스 중지시킴.
2. 교착상태에 포함되어 있는 각 프로세스의 수행을 롤백시킴. 특정 체크포인트 시점까지 되돌린 후 다시 수행시킴. 다시 수행시켰을 때 다시 교착상태에 빠질 수 있음.
3. 교착상태가 없어질 때까지 교착상태에 포함되어 있는 프로세스들 하나씩 종료시킴. 비용이 가장 적은 것을 종료. 하나씩 종료시킨 후 교착상태 발견 알고리즘 다시 수행시키면 교착상태가 존재하는지 여부 알 수 있음
4. 교착상태가 없어질 때까지 교착상태에 포함되어 있는 자원을 하나씩 선점시킴. 자원 선택은 비용 가적 적은 것 선택함. 하나씩 선점한 후 교착상태 발견 알고리즘 수행시켜 교착상태가 존재하는지 파악. 자원을 선점 당한 프로세스는 자원을 할당 받기 전 시점으로 롤백하고 그 시점부터 다시 수행함
=> 번호가 커질수록 복잡
# (종료 or 선점) 프로세스 선택 기준
- 지금까지 사용한 처리기 시간이 적은 프로세스부터
- 지금까지 생산한 출력량이 적은 프로세스부터
- 이후 남은 수행시간이 가장 긴 프로세스부터
- 할당받은 자원이 가장 적은 프로세스부터
- 우선 순위가 낮은 프로세스부터
# 시스템 자원 구분
- 스왑 공간 : 보조 기억장치 상의 메모리 블록. 프로세스들을 스와핑하는데 사용
- 프로세스 자원 : 테이프 드라이브나 파일 같은 할당 가능한 장치 자원
- 주 메모리 : 페이지나 세그먼트 등의 단위로 프로세스들에게 할당되는 자원
- 내부 자원 : 입출력 채널 같은 자원
=> 할당 순서 : 스왑 공간 -> 프로세스 자원 -> 주 메모리 -> 내부 자원
# 자원 클래스에서 교착상태 해결 전략
- 스왑 공간 : 교착상태 예방 전략 사용. 필요한 모든 자원을 한꺼번에 요청하게 하여 점유대기 조건 없앰. 스왑 공간을 할당하려는 프로세스가 미리 필요한 공간의 크기를 알 수 있으므로 구현 가능. 스왑 공간에서는 교착상태 예방뿐만 아니라 교착상태 회피도 사용 가능
- 프로세스 자원 : 교착상태 회피 사용. 프로세스가 이 클래스에 속한 자원의 예상사용 시간을 미리 예측할 수 있으며, 이 시간을 운영체제에게 알릴 수 있으므로 구현 가능. 자원 할당 순서를 미리 예측하고, 이 시간을 운영체제에서 알릴 수 있으므로 구현 가능. 자원 할당 순서를 미리 결정하는 교착상태 예방 방법도 사용 가능.
- 주 메모리 : 선점을 허용하는 교착상태 예방 방법 사용. 프로세스가 블록되면 그 프로세스의 수행 이미지는 보조 기억 장치로 스왑되고, 프로세스가 사용하던 메모리 공간을 반납.
- 내부 자원 : 자원 할당 순서를 미리 결정하는 교착상태 예방 방법 사용.
# 식사하는 철학자 문제 (Dining Philosophers Problem)
- 공유자원을 통한 협동의 대표적인 문제이며, 이러한 협동 문제는 실제 병행 쓰레드 기반 응용에서 자주 발생
- 양 옆 포크를 사용하려 함
1) 임계영역이 지켜져야 함. 두 명의 철학자가 동시에 같은 포크를 사용할 수 없음
2) 교착상태나 기아에 빠져서는 안됨
# 세마포어를 이용한 해결방법
- 우선 왼쪽에 있는 포크를 먼저 집고, 그 이후에 오른쪽에 있는 포크 집음
- 식사 마친 후에 두 개의 포크를 식탁에 다시 내려놓음
- 교착 상태 발생할 수 있음
- 동시에 왼쪽 포크를 잡았다고 가정 => 오른쪽 포크를 집으려 하면 없음 , 아무도 식사 못함
# 한번에 최대 4명까지 식탁에 앉도록 제한
# 모니터를 이용한 해결방법
- 모니터는 2개의 프로시저로 구성됨
- 교착상태 발생하지 않음
- 모니터에는 하나의 프로세스만이 진입할 수 있으며, 왼쪽 포크를 집은 철학자가 있으면 다른 철학자가 간섭하기 전에 오른쪽 포크도 집을 수 있음.
- ForkReady
: 5개의 각 조건변수는 각 fork에 대응
: 철학자들이 fork가 사용 가능할 때까지 대기할 때 이용
- fork
: 벡터. 포크가 사용 가능한지 여부를 알리기 위해 이용(참이면 사용 가능)
- get_forks proc
: 철학자가 2개의 fork를 요청할 때 사용되며, 2개중 1개라도 허용되지 않으면 연관된 조건변수에서 wait
: 다른 프로세스들이 모니터로 진입할 수 있게 해 줌
- release_forks proc
: 철학자가 2개의 포크를 반납할 때 사용
: 대기하고 있는 프로세스가 있으면 깨워주는 역할
- 철학자가 모니터에 진입했다면, 그 철학자는 왼쪽 fork를 잡은 다음에 오른쪽 fork를 잡게 되며, 그 사이에 오른쪽에 앉은 철학자가 간섭하지 않음을 보장받게 됨
# Unix의 병행성 기법
- 동기화와 프로세스 간 통신을 위한 다영한 기법 제공 (파이프, 메시지, 공유 메모리, 세마포어, 시그널)
- 파이프, 메시지, 공유 메모리는 프로세스 간에 데이터 전달을 위해 사용
- 세마포어, 시그널은 다른 프로세스의 행위를 유발하기 위해 사용
1) 파이프
- 코루틴(parbegin. 동시에 도는 것)에 영향을 받아 환형 버퍼 구조를 갖으며 생산자-소비자 모델을 갑는 두 개의 프로세스 간에 통신 기능을 제공함.
- 선입선출(FIFO) 큐 사용. 한 프로세스 데이터를 꺼내고(읽고) 다른 프로세스는 데이터를 넣게(쓰게) 됨
- 파이프는 생성될 때 고정된 크기를 가짐.
- 데이터를 쓰려는 프로세스는 충분한 공간이 없으면 블록됨
- 데이터를 읽으려는 프로세스는 충분한 데이터가 없으면 블록됨
- 파이프에 대한 상호 배제를 소밪ㅇ해줌. 한 시점에 한 프로세스만이 파이프를 사용
- 이름을 갖는 파이프 : 어떠한 프로세스들 간에도 공유 가능
- 이름을 갖지 않는 파이프 : 서로 관련된 프로세스들 간에만 공유 가능
2) 메시지
- 프로세스들이 서로 통신할 때 사용하는 객체, 바이트들의 블록으로 정의됨
- Unix는 메시지 전달을 위해 msgnd와 msgrcv라는 시스템 호출 제공
- 메시지를 사용하려는 프로세스들은 메시지 큐를 생성
- 메시지 송신자는 메시지의 유형을 설정할 수 있음
- 메시지 수신자는 메시지 유형에 따라 다른 서비스를 제공할 수 있음 (FIFO 순서로 메시지들을 수신할 수 있으며, 우선순위에 따라 수신 할 수도 있음)
- 가득 찬 큐로 메시지 전달을 시도하는 프로세스는 블록됨
- 비어있는 큐에서 메시지 수신을 시도하는 프로세스도 블록됨
- 특정 유형의 메시지를 수신하려는 프로세스는 그 유형의 메시지가 메시지 큐에 없는 경우 블록되지 않음
# 공유 메모리
- 여러 프로세스들에 의해 공유되는 가상 메모리 상에 공통 메모리 객체
- Unix에서 제공하는 프로세스 간 통신 기법 중에서 가장 빠른 기법
- 프로세스 다른 메모리를 접근하는 것과 같은 방식으로 공유 메모리를 접근함
- 공유 메모리는 읽기만 가능, 읽기 쓰기 모두 가능 등 다양한 접근 제어가 가능
- 접근 제어는 프로세스마다 다르게 설정할 수 있음
- 공유 메모리에 대한 상호 배제는 운영체제에서 제공되지 않음
- 개발자가 상호 배제를 구현해야 함
# 세마포어
- 여러 개의 연산이 동시에 수행될 수 있으며, 증감되는 값 1보다 클 수 있도록 일반화함
- 커널은 세마포어에 대한 요청이 원자적으로 수행됨을 보장함
- 모든 요청이 완료되기 전까지 다른 프로세스의 세마포어에 대한 접근이 허용되지 않음
* 세마포어의 구성요소
- 세마포어의 현재 값
- 세마포어에 마지막 연산을 수행했던 프로세스 ID
- 세마포어의 값이 현재 값보다 더 큰 값이 되기를 기다리며 대기하는 프로세스들 개수
- 세마포어의 값이 0이 되기를 기다리며 대기하는 프로세스들 개수
- semctl : 집합 내부의 모든 세마포어 값들을 한꺼번에 설정할 수 있ㅇ음
- sem_op : 세마포어 연산들의 집합을 인자로 사용. 각 연산은 세마포어 집합의 각 세마포어에서 수행될 연산을 정의함
- 커널은 sem_op 요청을 받으면 인자로 전달됨 세마포어 연산들을 하나씩 서비스함.
- sem_op 가 양수이면, 커널은 이 값을 세마포어가 유지하는 값에 더함. 세마포어의 값이 증가하기를 기다리며 대기하던 모든 프로세스들을 깨움
- sem_op 가 0이면, 커널은 우선 세마포어가 유지하는 값을 확인함. 만일 세마포어가 유지하는 값이 0이면 요청한 프로세스는 계속 수행됨. 반면에 0이 아니라면 커널은 요청한 프로세스를 블록시킴. 프로세스는 값이 0이 되기를 기다리며 대기하게 됨
- sem_op 가 음수이고 절대값이 세마포어가 유지하는 값보다 작거나 같으면, 커널은 이 값을 세마포어가 유지하는 값에 더함. 만일 더한 결과 세마포어의 값이 0이 되면, 세마포어의 값이 0이 되길 기다리며 대기하던 프로세스들을 깨움
- semp_op 가 음수이고 절대값이 세마포어가 유지하던 값보다 크면, 커널은 요청한 프로세스를 블록시킴. 프로세스는 세마포어의 값이 증가하기를 기다리며 대기하게 됨
# 시그널
- 비동기적인 사건의 발생을 프로세스에게 알리는 소프트웨어적인 방법
- 하드웨어와 비슷하지만 우선순위 제공되지 않음
- 모든 시그널은 동등하게 취급, 동시에 발생한 여러 시그널의 처리 순서는 프로세스에 따라 다름
- 프로세스들은 서로 시그널 보낼 수 있음.
- 커널도 내부적으로 시그널 보냄
- 전달된 시그널은 프로세스 자료 구조(PCB 또는 프로세스 테이블)의 시그널 관련 필드에 표시됨
- 시그널 관련 필드는 일반적으로 비트로 구현됨
- 같은 시그널이 여러 번 전달되었을 때에는 큐잉되지 않음
- 프로세스는 블록 상태에서 수행 상태로 전이될 때 또는 커널 수준에서 사용자 수준으로 전이될 때 시그널 관련 필드를 조사함.
- 시그널 관련 필드에 전달된 시그널이 표시되어 있으면 프로세스는 그 시그널에 대한 서비스를 수행함
- Unix에서 시그널에 대한 서비스에는 프로세스 종료와 같은 기본 행동, 시그널 핸들러 호출, 시그널 무시 등이 있음
'전공 공부 > 운영체제' 카테고리의 다른 글
운영체제 12주차 강의 (0) | 2021.05.18 |
---|---|
운영체제 11주차 강의 (0) | 2021.05.11 |
운영체제 9주차 강의 (0) | 2021.04.27 |
운영체제 7주차 강의 (0) | 2021.04.13 |
운영체제 5주차 강의 (0) | 2021.04.04 |