#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
int in = 0; // 생산자가 데이터를 넣는 위치를 가리키는 인덱스
int out = 0; // 소비자가 데이터를 빼는 위치를 가리키는 인덱스
int count = 0; // 현재 버퍼에 있는 데이터 개수
bool full = false;
bool empty = true;
// 생산자 함수
void producer() {
while (true) {
// 생산할 데이터를 생성
int data = produce_data();
// 버퍼가 가득 찰 때까지 기다림
while (full) {
// 버퍼가 가득 찼으므로 생산자는 대기
}
// 생산자가 버퍼에 데이터를 넣음
buffer[in] = data;
in = (in + 1) % BUFFER_SIZE;
count++;
// 버퍼가 비어있지 않음을 표시
empty = false;
// 버퍼가 가득 찼음을 표시
if (count == BUFFER_SIZE) {
full = true;
}
}
}
// 소비자 함수
void consumer() {
while (true) {
// 버퍼가 비어있을 때까지 기다림
while (empty) {
// 버퍼가 비어있으므로 소비자는 대기
}
// 소비자가 버퍼에서 데이터를 빼옴
int data = buffer[out];
out = (out + 1) % BUFFER_SIZE;
count--;
// 버퍼가 가득 차있지 않음을 표시
full = false;
// 버퍼가 비어있음을 표시
if (count == 0) {
empty = true;
}
// 데이터를 소비
consume_data(data);
}
}
Q.소비자는 버퍼의 데이터를 앞에서부터 차례대로 읽는 건가? 그래서 위 코드에서 생산자와 소비자의 읽고 쓰는 버퍼의 위치가 (idx + 1) % BUFFER_SIZE로 구현되는 건가?
Reader
이 코드는 다른 reader들이 writer보다 늦게 도착했더라도 따로 막지 않아서 reader가 이미 lock을 걸어 놓은 상태에서 writer는 다른 reader이 빠져나와서 lock을 풀어줄 때까지 기다리도록 구현되어 있음 ⇒ starvation 발생 가능
해결방법은? reader가 무한정 들어오는 것을 막는 우선순위 Q나 Timer 등을 둘 수 있음
여러 프로세스들이 공유 자원을 사용하려고 할 때 생기는 문제에 대한 비유
모든 철학자가 동시에 왼쪽 젓가락을 집고, 이후 오른쪽 젓가락을 집으려 하면 모두 젓가락을 집을 수 없음
어떤 철학자도 식사를 시작하지 못 하는 deadlock 발생
각 프로세스의 상태를 나타내는 state 변수
각 프로세스가 식사를 할 수 있는지 나타내는 self 변수
각 프로세스 간 임계영역 진입을 위한 mutex 변수
pickup, test, putdown 순서로 진행
젓가락을 집는 pickup 호출 후 자신의 상태를 hungry로 변경
양 옆 모두 밥을 먹지 않고, 내가 배고픈 상태인 조건을 만족하면 상태를 eating으로 변경
test 함수에서는 내가 먹을 수 있는 상태가 되면 self 변수 값을 1로 만들어 주는 V 연산을 함.
만약 if문의 조건을 만족하지 못 해서 V연산을 하지 못 했다면 P(self[i]) 연산에서 내가 진입할 수 있는 조건을 만족하지 못 하므로 계속 대기상태에 있음
인접한 철학자가 식사를 다 하고 젓가락을 내려 놓는 것을 통해 다른 철학자가 밥을 먹을 수 있다고 self 연산을 바꿔 줄 것 ⇒ putdown에서 양 옆 철학자에 대한 test 코드를 실행함
Q.어떤 프로세스의 state의 변경은 다른 프로세스도 할 수 있으므로 공유변수여서 mutex가 필요하다고 강의에서 설명하는데 짧게 언급해서 무슨 말인지 잘 모르겠다.
정보가 풍부해서 많은 도움이 되었습니다.