buffer: 임시 저장 공간, buffer 조작은 포인터 이동(빈 버퍼 혹은 찬 버퍼 가리킴) 여러 생산자가 동시에 빈 버퍼에 접근, 혹은 여러 소비자가 동시에 공유 데이터에 접근 시 문제 발생 -> lock/unlock 버퍼가 모두 찼을때 생산자가 오거나 버퍼가 모두 비어있을때 소비자가 왔을때 문제 발생 -> counting writer 접근 시, 다른 writer와 모든 reader 접근 불가 reader 접근 시, 모든 writer 접근 불가 읽는 작업도 배타적으로하면 매우 비효율적 여러 reader가 동시에 도착하면 공유변수 readcount이 중복계산될 수 있으므로 lock/unlock 최초 reader는 DB에 writer 접근 못하게 막고, 최후 reader는 DB에 writer 접근 허용..
Semaphores 프로그래머가 이렇게 lock/unlock 관련한 코드를 고민하기 어려우므로 앞의 방식들을 추상화한다 Semaphore S integer variable (자원의 수) (이전의 알고리즘들은 S=1인 경우라고 생각할 수 있다) 아래 두가지 atomic 연산에 의해서만 접근 가능 critical section을 수행중인 다른 프로세스를 CPU ready queue가 아닌 semaphore에 대한 wait queue에서 대기 이 연산에서 S 변수는 S가 양수면 기다리는 프로세스가 없다는 것, 음수면 기다리고 있다는 의미 (위에서와 다름) critical section의 길이가 긴 경우 block/wakeup이 좋음 critical section의 길이가 매우 짧은 경우 block/wakeup..
데이터 공유 상황에서 누가 언제 어떤 데이터를 읽고 연산했는지에 따라 원하지 않는 결과가 나올 수 있기 때문에 그에 맞는 처리 필요 커널모드에서 1까지 수행하다가 인터럽트가 걸린다면 count가 감소한 작업은 인터럽트 처리 이후, 이전에 불러온 count값을 연산한 값으로 덮어씌워지므로 증가한 결과값만 남게 된다 해결: 중요한 변수를 다루는 동안에는 인터럽트가 걸려도 그 작업을 마칠때까지 인터럽트 처리 보류 real time 시스템의 엄밀한 상황이 아닌 time sharing 시스템이므로 이렇게 쉽게 해결하고 가는 것이 좋다 효율: CPU lock/unlock Test_and_set() 출처: https://core.ewha.ac.kr/publicview/C0101020140401134252676046?..