<aside> 💡 NOTE
누가 먼저 읽었는지에 따라 데이터가 다르게 될 수 있다.
둘다 한 자원에 접근하면 → 경쟁 상태가 된다.
이를 조율 해줄 필요가 있다.
특히 멀티 프로세스나 공유 메모리 자원을 통해 관리할 경우 문제가 생길 수 있다.
또한 시스템 콜을 할 때 커널의 메모리를 공유하므로 경쟁 상태가 될 수 있다.
인터럽트에서도 커널의 메모리가 공유된다.
하나의 카운터를 올릴때 1. 로딩, 2. 상승, 3. 저장을 진행하는 과정에서 인터럽트가 발생한 것(이때 1 증가한 것만 적용이 된다.)
시스템 콜과 할당시간이 있는 경우, 카운트가 분리된 경우 P(b)가 적용되지 않음
→ 커널 모드에 있을때에는 할당시간이 끝나도 시간이 종료하지 않는 방법을 택한다.
cpu가 여러개일때, 접근한 것에대해 lock을 걸어 처리한다.
</aside>
<aside> ✍️ NOTE
임계 구역을 통해 프로세스의 순서를 정하고, critical section을 순서대로 처리할 수 있도록 만든다.
임계 영역이란 한 순간 반드시 프로세스 하나만 진입해야 하는데, 프로그램에서 임계 자원을 이용하는 부분으로 공유 자원의 독점을 보장하는 코드 영역을 의미한다. 임계 구역은 지정된 시간이 지난 후 종료된다.
</aside>
9강
<aside> 💡 NOTE
</aside>
<aside> ✍️ NOTE
과잉 양보
do {
while(turn != 0);
turn = 1; // critical section
} while(1);
// critical section에 아무도 없어도 못들어 간다.
flag를 통해 상대방의 flag 상태를 확인하며 들어간다.
do {
flag[i] = true;
while(flag[i]);
flag[i] = false;
} while(1);
// 둘다 flag만 든 상태에서 끊임 없이 양보해주는 상황이 발생
피터슨의 알고리즘
do {
flag[i] = true;
turn = j;
while(flag[j] && turn == j);
flag[i] = false;
} while(1);
// 둘 다 들어가지 못하면서, 상대방을 확인하는 구조로 구성
// Busy Waiting 발생 -> spin lock : while문을 돌고 있지만
// 상대값이 바뀔때까지 계속 while문을 돈다.
하드웨어적으로 atomic하게 수행할 수 있도록 지원하는 경우 간단하게 해결할 수 있다.
test_and_set이 하나의 락으로 작동하기만 하면되는것
Synchronization variable:
boolean lock = false;
Process
do {
while(Test_and_Set(lock));
lock= false;
}
하지만 프로그래머가 이렇게 만드는 것은 오래걸리고 고려할것이 많기 때문에 방법을 만들어둠
</aside>
10강