-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #11 from Ajeong-Im/main
[2주차]_12장_프로세스 동기화_임아정.md
- Loading branch information
Showing
1 changed file
with
147 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,147 @@ | ||
# 발표 자료 | ||
|
||
## 혼자 공부하는 컴퓨터구조 + 운영체제 12강 | ||
|
||
### 프로세스 동기화란? | ||
|
||
``` | ||
💡 프로세스들 사이의 수행 시기를 맞추는 것 | ||
``` | ||
|
||
1. 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기 | ||
2. 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기 | ||
|
||
--- | ||
|
||
### 1. 실행 순서 제어를 위한 동기화 | ||
|
||
``` | ||
💡 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것 | ||
``` | ||
<img width="926" alt="12강1" src="https://github.com/Ajeong-Im/computer-architecture-and-operating-system/assets/86238348/778c38b1-fe9b-47df-bf45-109809d08d95"> | ||
|
||
|
||
### 2. 상호 배제를 위한 동기화 | ||
|
||
``` | ||
💡 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘 | ||
``` | ||
|
||
프로세스 A | ||
|
||
1. 계좌의 잔액을 읽어 들인다 | ||
2. 읽어 들인 잔액에 2만 원을 더한다 | ||
3. 더한 값을 저장한다 | ||
|
||
프로세스 B | ||
|
||
1. 계좌의 잔액을 읽어 들인다 | ||
2. 읽어 들인 잔액에 5만 원을 더한다 | ||
3. 더한 값을 저장한다 | ||
|
||
<img width="1048" alt="12강2" src="https://github.com/Ajeong-Im/computer-architecture-and-operating-system/assets/86238348/b8014dad-5cfa-44b1-a712-e704a8edd96c"> | ||
|
||
<img width="1048" alt="12강3" src="https://github.com/Ajeong-Im/computer-architecture-and-operating-system/assets/86238348/6ad3185a-1d1d-4b51-8e5d-9cc960beae05"> | ||
|
||
|
||
--- | ||
|
||
### 공유 자원과 임계 구역 | ||
|
||
**공유 자원이란?** | ||
|
||
``` | ||
💡 동시에 실행되는 프로세스들이 작업을 하는 공동의 자원 | ||
``` | ||
|
||
eg) 전역 변수, 파일, 입출력장치, 보조 기억 장치 등 | ||
|
||
**임계 구역이란?** | ||
|
||
``` | ||
💡 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 | ||
``` | ||
|
||
eg) 앞서 보여준 계좌 잔액 문제에서의 ‘잔액’ 변수 | ||
<img width="1048" alt="12강4" src="https://github.com/Ajeong-Im/computer-architecture-and-operating-system/assets/86238348/145df673-6018-4e67-a638-c05cf91be6e1"> | ||
|
||
|
||
**레이스 컨디션**: 잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우 | ||
|
||
### 상호 배제를 위한 동기화 원칙 | ||
|
||
1. 상호 배제: 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없음 | ||
2. 진행: 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 진입이 가능해야 함 | ||
3. 유한 대기: 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 함 | ||
|
||
--- | ||
|
||
### 프로세스 동기화의 진행 과정 | ||
|
||
**뮤텍스 락이란?** | ||
|
||
``` | ||
💡 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하도록 만드는 상호 배제를 위한 동기화 도구 | ||
``` | ||
|
||
1. 전역 변수 lock | ||
|
||
자물쇠 역할, 잠금 여부 확인 | ||
|
||
1. acquire 함수 | ||
|
||
프로세스가 임계 구역에 진입하기 전 호출하는 함수 | ||
|
||
- 임계 구역이 잠겨 있다면 열릴 때까지 (lock이 false가 될 때까지) 반복적으로 확인 | ||
- 임계 구역이 열려 있다면 잠금 (lock을 true로 변경) | ||
|
||
1. release 함수 | ||
|
||
임계 구역에서의 작업이 끝난 뒤 호출하는 함수 | ||
|
||
- 현재 잠겨 있는 임계 구역을 열어 줌 (lock을 false로 변경) | ||
|
||
**세마포란?** | ||
|
||
``` | ||
💡 뮤텍스 락보다 조금 더 일반화된 방식의 동기화 도구, 공유 자원이 여러 개 있는 상황에서도 적용 가능 | ||
``` | ||
|
||
1. 전역 변수 S | ||
|
||
사용 가능한 공유 자원의 개수 | ||
|
||
1. wait 함수 | ||
|
||
임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수 | ||
|
||
1. signal 함수 | ||
|
||
임계 구역 앞에서 대기하는 프로세스에 진입 가능 신호를 보내주는 함수 | ||
|
||
```jsx | ||
wait() { | ||
S--; | ||
if ( S < 0 ) { | ||
add this process to Queue; // ⓵ | ||
sleep(); // ⓶ | ||
} | ||
} | ||
``` | ||
|
||
```jsx | ||
signal() { | ||
S++; | ||
if ( S <= 0 ) { | ||
remove a process p from Queue // ⓵ | ||
wakeup(p) // ⓶ | ||
} | ||
} | ||
``` | ||
|
||
**모니터란?** | ||
|
||
``` | ||
💡 하나의 데이터마다 하나의 모니터를 결합할 수 있으며, 결합된 객체가 동시에 두 개 이상의 스레드에 의해 접근할 수 없도록 막는 잠금 기능을 제공하는 동기화 도구로, 조건 변수를 사용함 | ||
``` | ||
<img width="798" alt="12강5" src="https://github.com/Ajeong-Im/computer-architecture-and-operating-system/assets/86238348/5b01ea26-af86-4d47-ad6e-931e93e24523"> |