컴퓨터 시스템에서 데이터가 접근되는 패턴을 알아보자
데이터가 저장된 위치가 있을 것이고
그걸 읽어와서 연산을 하고 다시 데이터를 저장하는 패턴을 거친다.
근데 이 방법은 누가 먼저 데이터를 읽어오느냐에 따라서 결과가 달라질 수 있다.
이걸 해결하는 Synchronization 방법을 알아보도록 하자
Storage 박스를 여러곳에서 쓰게되면?
++ 가 먼저 수행되고 -- 가 다시 가져가서 수행이되면
++ 연산이 적용되지 않고 --만 저장되는 Synchronization 문제가 생긴다.
하나의 데이터를 동시에 접근 하려고 할때 Race Condition 이라고 한다.
CPU 가 여러개인 멀티프로세서 시스템 상황에서 발생할수있는 문제
예제로 봐보자면, 이미지와 같다.
P a 가 Count 를 사용해서 1을 추가했다가 Pb에 CPU 가 선점 되고 COunt 를 1 추가하게 되면
Pb 에서 추가한게 올라가지 않는 문제가 생긴다.
이걸 해결하는방법으로는 프로세스가 (k) 커널모드에 있을때는 CPU 를 뺏기지 않도록 한다.
u (유저모드)에 있을때만 뺏을수있게한다.
CPU 가 여러개 있는 상황
인터럽트를 막는 방법으로 해결할수없다.
데이터를 접근할때 lock 을 걸어야한다.
작업이 끝나야 unlock 을 한다.
여럿이서 동시에 접근을 하려고 할때 발생하는 데이터 불일치 문제
일관성을 유지하기 위해서는 공유데이터를 접근하는 프로세스간에 순서를 정해야한다.
임계구역, 공유 데이터를 접근하는 코드를 뜻함
이 프로세스가 크리티컬 세션 구역 에 있으면, 즉 공유데이터를 접근하는 코드를 실행 중이면,
CPU 를 뺏겨서 다른 프로세스가 사용중이더라도 크리티컬 세션을 사용하지 못하게된다.
P2 는 실행하지 못하고 기다리게 된다.
임계영역을 사용하는 부분이 단일 인스트럭션으로 끝난다면? 아무 문제가 없을텐데
저 while~ turn 부분이 단일 인스트럭션이 아니기 때문에 도중에 CPU 를 뺏길수 있어서 문제가 생기는것
알고리즘1 에서는 turn 이라는 변수를 사용한다.
임계영역에 들어갈 차례가 누군지 알려주는 변수명
내 턴이 아닌경우엔 계속 기다리게 된다.
내 턴이 되었을때 임계영역에 들어가게 된다.
나올때는 상대방 턴으로 바꿔주게 된다.
이 코드는 Mutual Exclusion 은 충족한다.
하지만 Progress 는 충족하지 못한다. 아무도 임계영역을 안쓰고 있는데도 들어가지 못하는 문제가 발생.
flag라는 변수를 사용한다.
Process 2개가 각각 flag를 가지고 있다.
본인이 임계영역에 들어가고 싶다는 의사를 표현
이 알고리즘의 문제는 2 프로세스가 서로 flag = true 인 경우
서로 조건문에 의해 아무도 들어가지 못하는 경우가 생김
turn 과 flag 가 둘다 사용된다.
flag 를 들어서 쓰고 싶다는 의사표현을 하고,
상대방 턴인지, 상대방도 쓰고 싶어하는지를 체크한다.
하드웨어적으로 더 간결하게 만들 수 있다.
'프로그래밍 > 운영체제' 카테고리의 다른 글
[운영체제] Process Synchronization3 (0) | 2020.06.17 |
---|---|
[운영체제] Process Synchronization 2 (0) | 2020.06.16 |
[운영체제] CPU Scheduling 2 (0) | 2020.06.15 |
[운영체제] CPU Scheduling (0) | 2020.06.15 |
[운영체제] Process Management (0) | 2020.06.14 |