해당 게시글은 운영체제 스터디를 위해 반효경 교수님 운영체제 강의를 보고 기록한 게시물입니다. 틀린 정보가 있다면 언제든 지적해주세요🙏🏻
컴퓨터에서 연산을 할땐 데이터를 읽어와서 연산을 하고 어딘가에 저장함.
이 때 데이터를 여러 곳에서 읽어와서 계산을 하게 되는 문제가 생김.
하나의 고유데이터를 여러 개가 공유하는 경우 Race Condition의 가능성이 있음.
문제는 운영체제가 끼어드는 경우 발생할 수 있는데,
1. 커널 수행 중 인터럽트 발생시
2. 프로세스가 System call 하여 커널 모드로 수행 중인데 Context switch가 일어나는 경우
3. 멀티프로세서에서 Shared Memory 내의 커널 데이터
커널 수행 중 인터럽트 발생시
변수를 건들이기 전에 인터럽트를 disable 시키고 작업이 다 끝난후에 enable로 바꿔서 처리하도록 한다.
프로세스가 System call 하여 커널 모드로 수행 중인데 Context switch가 일어나는 경우
커널 모드에서 수행 중일때는 CPU를 빼앗지 않음. 커널 모드가 끝나고 유저 모드로 돌아갈때 CPU를 넘겨 주도록 한다.
멀티프로세서에서 Shared Memory 내의 커널 데이터
CPU가 여러개 있을 때 운영체제의 공유변수를 건드리는 경우엔 운영체제를 한번에 하나의 CPU만 쓸 수 있게 하면 해결. -> 하지만 이럴 땐 오버헤드가 뒤따른다.
그래서 이렇게 하지 않고 공유 데이터 각각을 막음.(lock)
-> 한 CPU에서 공유데이터에 접근 할때는 다른 CPU에게 Lock을 걸어서 카운트에 접근할 수 없게함.
공유데이터의 동시 접근은 데이터의 불일치 문제를 발생시킬 수 있다.
공유데이터를 접근하는 코드를 Critical Section이라고 함
Critical Section의 문제 해결법의 충족 조건
알고리즘 1.
Critical Section에 번갈아 들어감.
특정 프로세스만 더 여러번 크리티컬 섹션을 들어가야 한다면..? 과잉양보문제.
do {
while (turn != 0)
critical section
turn = 1;
remainder section
} while (1);
알고리즘2.
Critical Section에 들어가고 싶으면 깃발을 든다? 의사표현.
동시에 들어가는 문제는 해결이 되지만 모두 의사표현만 되고 진행이 되지 않는 상황 발생
do {
flag[i] = true;
while (flag[j]);
critical section
flag[i] = false;
remainder section
} while(1);
알고리즘3.
피터슨 알고리즘 Peterson’s algorithm
이것도 깃발을 사용한 알고리즘. 깃발을 드는 경우에 한해서 턴을 정함.
비효율적인 것이 문제가 됨.
-> Busy waiting(spin lock) - 계속 cpu와 메모리를 쓰면서 wait하는 상황 발생.
do {
flag[i]= true;
turm = j;
while(flag[j] && turn == j);
critical section
flag[i] = false;
remainder section
} while(1);
싱크로나이즈의 문제를 풀기 위해 semaphores와 monitor 방식을 사용한다.