강의 링크 : www.youtube.com/watch?v=wdaf2gy83uU&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=12
다중 프로그래밍 시스템의 경우
- 여러 개의 프로세스들이 존재하고,
- 프로세스들은 서로 독립적으로 동작하며, (동시에 동작)
- 공유 자원 또는 데이터가 있을 때 문제가 발생할 수 있다
- 문제 예시
- A, B가 하나의 도화지 위에 그림을 동시에 그린다면 원하지 않는 결과물이 나올 수 있음
- 해결 방법
- A와 B가 대화를 나눈다. -> 여기서 대화라는 개념이 "동기화"가 되는 것
- 문제 예시
1. 동기화(Synchronization)
- 프로세스들이 서로 동작을 맞추는 것
- 프로세스들이 서로 정보를 공유하는 것
2. 프로세스의 특징
1) 비동기적 (Asynchronous)
- 프로세스들은 서로에 대해 모른다
2) 병행적 (Concurrent)
- 여러 개의 프로세스들이 동시에 시스템에 존재한다.
-> 병행 수행 중인 비동기적 프로세스들이 공유자원에 동시 접근할 때 문제가 발생할 수 있음.
3. 용어 정리
1) Shared data (공유 데이터)
Critical data라고도 부름
(공유할 때 건드리면 크게 문제가 되니 critical data라고도 부름)
- 여러 프로세스들이 공유하는 데이터
2) Critical section (임계 영역)
- 공유 데이터를 접근하는 코드 영역(code segment)
3) Mutual exclusion (상호배제)
- 둘 이상의 프로세스가 동시에 critical section에 진입하는 것을 막는 것
4. Critical Section 예시
- 공유 데이터 : sdata
- 프로세스 P1, 프로세스 P2에서 각각 sdata에 접근하는 코드 영역, 즉 CS는 주황색으로 칠해진 부분임
주황색에 적힌 식으로 코드를 짤 경우, C 혹은 C++과 같은 언어에서 컴파일러가 MI (Machine instruction, 기계어 명령)로 번역한다.
1) 기계어 명령(machine instruction)의 특성
기계어 명령 : 실제로 프로세서(CPU)가 실행하는 가장 작은 단위의 명령어
- Atomicity (원자성)
- 더 이상 쪼갤 수 없다. == 한 번 수행하면 중간에 멈출 수 없다.
- Indivisible (분리불가능)
- 더 이상 쪼갤 수 없다. == 한 번 수행하면 중간에 멈출 수 없다.
-> 즉, 한 기계어 명령의 실행 도중에 인터럽트 받지 않음
위의 그림을 MI단위로 나누어 그려보면 다음과 같다.
- 실행 순서에 따라 명령 수행 과정 (1), (2)가 존재할 수 있고, 각각의 결과가 다를 수 있다는 것을 알 수 있음
- -> 이를 "Race condition"이라고 함
5. Mutual Exclusion (상호배제)
- 누군가 CS(critical section)에 있으면, 다른 코드가 접근하지 못하도록 하는 것
6. Mutual exclusion primitives
mutual exclusion을 만들기 위한 가장 기본의 연산
(1) enterCS() primitive
CS 진입할 때 연산
- CS(critical section)에 진입하기 전에 검사한다
- 다른 프로세스가 critical section안에 있는지
- 마치, 화장실에 들어가기 전에 사람이 있는지 확인하는 것처럼
(2) exitCS() primitive
CS에서 나올 때의 연산
- CS를 벗어날 때의 후처리 과정
- CS를 벗어나고, 이를 시스템한테 알린다.
7. Requirements for ME primitives
Mutual exclusion primitives를 만들기 위해 필요한 조건
(1) Mutual exclusion(상호배제)
- Critical section(CS)에 프로세스가 있으면, 다른 프로세스의 진입을 금지
(2) Progress (진행)
- CS안에 있는 프로세스 외에는, 다른 프로세스가 CS에 진입하는 것을 방해하면 안됨
- 안에 아무것도 존재하지 않으면 들어갈 수 있어야함
(3) Bounded waiting (한정대기)
bounded : 제한된
- 프로세스의 CS진입은 유한시간 내에 허용되어야 함
8. Two Process Mutual Exclusion
ME Primitives 구현 예시들 (조건에 위배되는 예시 3가지)
(1) turn을 사용하는 방법
- 내 턴이면 들어갈 수 있음
- P0은 turn값이 1이라면 기다리다가, turn이 0인 경우 CS로 진입하고, CS를 빠져나오면서 turn을 1로 바꿔준다.
[위배 상황]
- 만약 turn의 값이 0인데, P0이 repeat을 돌다가 죽어버리면 ?
- CS에 아무 것도 존재하지 않지만, P1의 경우 turn이 0이므로 CS에 접근할 수 없다.
-> Progress 조건 위배 (CS가 비어있다면 들어갈 수 있어야함)
- 만약 P0이 CS에 진입하고 빠져나와서 turn이 1인 상태에서 P1이 repeat을 지나 CS에 접근하는 시간보다, P0이 다시 repeat을 지나 while문에 도달한 경우?
- CS가 비어있기 때문에 진입할 수 있어야하는데, turn이 1이기 때문에 진입 불가
-> Progress 조건 위배 (CS가 비어있다면 들어갈 수 있어야함)
(2) flag를 사용하는 방식1
상대의 flag를 확인하고, 상대가 CS영역에 진입하지 않은 것을 확인했을 때 (상대의 flag가 False일 때) -> 진입
- 상대의 flag를 확인한다.
- 만약 상대의 flag가 True라면
- 상대가 CS에 존재하는 것이므로 -> 대기
- 만약 상대 flag가 False라면
- 상대가 CS에 존재하지 않는 것이므로 -> 내가 들어감 & 내 flag는 True로 바꿈
[위배 상황]
- 만약 P0이 진행되다가 Preemption화살표가 그려진 부분에서 Preemption이 발생한다면?
- P1이 진행됨.
- flag[1] = True
- Preemption 부분으로 다시 넘어옴 (P0)
- Preemption된 곳이 flag[0] = True 직전이었으므로, flag[0] = True로 갱신해 줌
- flag[0] = True, flag[1] = True
- -> 두 개 모두 true가 되어 Mutual exclusion 조건을 위배하게 됨. (기존에 P1이 CS에 존재했는데, P0도 CS에 진입하게 되므로)
(3) flag를 사용하는 방식2
앞의 방식과 달리 내 flag를 먼저 바꾸고 -> 상대의 flag를 확인한 후 CS로 진입
[위배 상황]
- flag[0] = true로 갱신
- preemption 발생
- flag[1] = true로 갱신
- P0으로 넘어갈 경우, preemption이 발생한 지점이 상대의 flag를 확인하기 직전이므로 현재 상대의 flag가 true라서 무한 대기가 됨
- -> Bounded waiting 조건 위배
- CS에 진입한 프로세스 존재 X
- -> Progress 조건 위배
'CS > OS' 카테고리의 다른 글
6. 프로세스 동기화 & 상호배제 (3) - HW solution (0) | 2021.05.12 |
---|---|
6. 프로세스 동기화 & 상호배제 (2) - sw solutions (0) | 2021.05.12 |
5. 프로세스 스케줄링 (4) (0) | 2021.05.10 |
5. 프로세스 스케줄링 (3) (0) | 2021.05.10 |
5. 프로세스 스케줄링 (2) (0) | 2021.05.10 |