Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- nomaltic place
- 네트워크
- 노말틱
- Bandit
- shell
- Web shell
- MariaDB
- 리눅스 기초
- Bitnami
- mysql
- virtualbox
- 칼리 리눅스
- VDI
- 기초
- nomaltic
- kali linux
- 보안
- 리눅스
- Linux
- Vitual Disk Image
- 칼리
- kali
- Normaltic
- Error
- Virtual Box
Archives
- Today
- Total
게으른 개발자
6강-4. Process Synchronization 4 본문
주황색이 데이터가 들어있는 버퍼
mutual exclusion : 상호 배제
- Shared data
- lock을 걸고, 풀고 해서 접근을 해야 한다.
- Synchromization variable
- binary semaphore
- ex) mutex = 1 ---> lock을 거는 semaphore 변수
- integer semaphore
- ex) empty = n, full = 0
- binary semaphore
p : 자원을 획득, v : 자원 반납
- write : 동시에 하면 안 됨.
- 아무도 없을 때만 배타적으로 해야 함.
- read : 동시에 해도 됨.
- 공유 데이터를 접근할 때는 lock을 걸어서 다른 프로세스의 접근을 막고 작업을 한 뒤에 lock을 풀어야 한다.
읽을 때도 lock을 걸어야 함. writer 가 접근할 수 있기 때문이다.
readcount : 공유 변수
- readcount는 공유변수이기 때문에 그냥 증가시키면 문제 발생. 여러 명의 reader가 접근할 수 있기 때문.
- 따라서 readcount에 대해서 lock을 걸 필요가 있다.
- P(mutex) : readcount(공유변수)에 대한 lock을 걸기 위한 semaphore 변수이다.
- 따라서 readcount에 대해서 lock을 걸 필요가 있다.
- 읽기 위해서 lock을 건 상태에서, read 프로세스도 도착하고 writer 프로세스도 도착한 상태일 경우?
- 먼저 도착한 순서대로 처리한다고 가정
- 읽고 있는 도중에 1. writer 도착 2. reader 도착
- 일단 writer는 앞에서 누가 read 작업을 하고 있으므로 대기해야 함.
- reader는 대기 없이 바로 read 가능(같이 읽기 가능)
- writer는 마지막으로 빠져나가는 reader가 lock을 풀어줄 때까지 대기해야 함.
- reader가 계속 투입된다면 writer는 계속 대기해야 한다. ===> starvation
- 그러면 어떻게 starvation을 피해야 할까?
- 큐에 우선순위를 둬서 writer가 일정 수준을 기다리지 않게 한다.
- 이때 reader를 잠깐 대기하도록 시키고, writer를 처리한다.
- 큐에 우선순위를 둬서 writer가 일정 수준을 기다리지 않게 한다.
- 밥을 먹기 위해서는 젓가락 2개를 잡아야 함.
- P(chopstick [i]) : 왼쪽 젓가락
- P(chopstick[(i+1)%5] : 오른쪽 젓가락
- 각각의 젓가락은 1로 초기화 : 동시에 2명이 잡을 수 없도록
- 모든 철학자들이 배가 고파서 동시에 젓가락을 잡을 때, 왼쪽 젓가락을 잡게 되는데 이때 아무도 오른쪽 젓가락을 잡지 못해서 deadlock이 발생한다.
- solution
- 철학자가 밥을 먹을 때만 식탁에 앉도록 함
- 모두 젓가락을 집을 수 있을 때 만, 젓가락을 집을 수 있게 함.
- 비대칭
위의 코드는 모니터 코드를 세마포어 코드로 바꿔놓은 것이다. 그래서 세마포어 철학에 맞지 않다고 보일 수 있다.
세마포어가 끝나면 모니터를 배울 것이다.
- 세마포어와 모니터는 프로세스 Synchronization 문제를 프로그래머 입장에서 쉽게 제공을 하기 위한 것이다.
- 세마포어를 사용해도 불편한 점이 있다.
- 프로그래머가 실수를 하면 큰 문제가 생김
- 모니터를 제공해서 프로그래머를 좀 더 편하게 해 줌.
- 식사하는 철학자 문제는 모니터 코드가 더 이해가 쉽다.
- 모니터와 세마포어는 코드가 굉장히 비슷하다.
- 프로그래머가 실수를 하면 큰 문제가 생김
- semaphore self [5] = 0; : 각각의 5명의 철학자가 젓가락 2개를 잡을 수 있어서, 젓가락 잡는 권한을 줄 것인지 말 것인지를 나타내는 세마포어 변수 0 : 권한 없음, 1 : 권한 있음
본인만 상태를 바꿀 수 있게 아니라 옆에 있는 철학자도 상태를 변경할 수 있다.
여러 철학자가 동시에 state라는 공유 변수에 대한 동시 접근을 막기 위해서 lock을 나타내는 mutex를 하나 두고 있다.
v연산은 0이었던 값을 1로 바꾸는 연산이다.
여기서는 젓가락을 얻을 수 있는 권한을 v연산을 통해서 얻게 된다.
- 만약에 test 함수에서 왼쪽, 오른쪽 철학자 중에 밥을 먹고 있었다면?
- 젓가락 잡을 수 있는 권한을 얻지 못하고 test 함수가 끝난다.
- p 연산을 하더라도, 젓가락 잡을 권한이 0이기 때문에 젓가락을 못 얻는다. 기다려야 한다.
- 그러면 self [i]를 누가 1로 만드는가?
- 인접한 철학자가 밥을 다 먹고 내려놓았을 때, 내가 젓가락을 잡을 수 있는 권한이 생길 수 있다.
- 세마포어는 원래 자원의 개수를 세는 것
- 초기값이 얼마냐를 두고 일을 하게 된다.
- 근데 위에 코드는 세마포어의 철학에 맞지 않아서
- 모니터는 프로그래밍 언어 차원에서 synchronization 문제를 해결하는 high level synchronization construct이다.
- 객체 지향 프로그래밍
- 객체를 중심으로 operation이 정의가 됨.
- 공유데이터를 접근하기 위해서는 내부 프로시저를 통해서만 접근할 수 있다.
- 모니터는 원천적으로 내부에 있는 프로시저는 동시에 여러 개가 실행이 안되도록 통제를 한다.
- 이렇게 되면 lock을 걸 필요가 없다. => 세마포어와 다른 점.
- 자원을 세는 건 세마포어처럼 모니터에도 필요하다.
- condition variable
- wait : 프로세스 대기
- signal : 프로세스 resume
- condition variable
- 세마포어에서는 공유 버퍼를 접근하기 위해서 lock을 걸고 풀고 했어야 했다.
- 모니터에서는 lock을 걸고 풀 필요가 없다.
- 모니터 안에서는 하나의 프로세스만 활성화된다.
- 공유 버퍼가 안에 정의되어 있기 때문이다.
- 그래서 생산하거나 소비하는 작업을 하기 위해서는 모니터 내부 코드를 실행해야 함.
- 생산자, 소비자든 하나의 프로세스만 모니터 안에서 활성화됨.
- 굳이 lock을 안 걸어도 됨.
- empty.wait() : 비어있는 버퍼가 없다면 blocked 상태로 기다리게 한다.
- full.signal() : 내용이 들어있는 버퍼가 없어서 잠들어 있는 소비자 프로세스가 있다면 깨워준다.
- full.wait() : 내용이 들어있는 버퍼가 없다면 기다려야 한다.
- empty.signal() : 비어있는 버퍼를 기다리는 생산자가 잠들어 있다면 깨워준다.
'cs > 운영체제' 카테고리의 다른 글
7강-1. Deadlock 1 (1) | 2023.11.06 |
---|---|
6강-5. Process Synchronization 5 (0) | 2023.11.06 |
6강-3. Process Synchronization 3 (0) | 2023.11.05 |
6강-2. Process Synchronization 2 (0) | 2023.11.05 |
6강-1. Process Synchronization 1 (0) | 2023.11.04 |