동기화의 문제에 대해 알아본다.
컴퓨터 안에서 연산이 이뤄지면서 데이터에 접근하는게 어떻게 이뤄지는지/ 동기화가 왜 문제인지 말해보자.
컴퓨터에서 연산을 할 때는 데이터를 읽어와서, 연산을 하고, 그 결과를 어딘가에 저장하도록 되어있다.
여기서 문제가 생기는데 왜??
한군데에서 메모리에서 데이터를 읽어가는게 아니고, 여러군데에서 읽어갈 때 문제가 생긴다!
예를 들어
문제의 원흉은 운영체제 때문이라고 할 수 있다!!!!
user mode에서 본인의 프로그램을 실행할 때는 본인의 주소공간에 있는 데이터에 접근할테니까 race condition이 문제가 될게 없다. 그런데 시스템콜을 해서 커널의 코드를 실행하게 되면 커널의 데이터를 건드리게 되는데 , 그건 공유 데이터니까 문제가 생긴다.
만약, 커널의 데이터를 건드리는 도 . 중. 에 cpu를 빼앗기게 되면 race condition이 생길 수 있게 된다. 라는 뜻이다.
이미, 읽어드린 레지스터(a는 1을 못 증가시킴) 값에서 1을 증가시키고(b), 분명히 변수를 두번 증가시킨 것 같지만!!! 다시 cpu를 받았을 때 a에서 증가시킨다. 그니까 결론은 a에서만 증가시킨 것만 반영이 되어있다.
이미 커널에선 레지스터에서 값을 불러들였기 때문에 interrupt handler가 감소시킨 count 값은 반영이 안되고, count = 0 에서 +1을 한게된다.
해결할 때 cpu a에서 인터럽트를 막았다고 cpu b에서 인터럽트를 못하는게 아니다., (이게 어디쪽 설명인지 기억안남 ㅎㅎ; )
이제 process synchronization에 대해 알아보자~~~
공유데이터를 건드리는 코드를 critical-section이라고 한다.
설령 cpu를 빼앗기더라도, 다른 친구가 critical section은 수행하지 못하게