본문 바로가기

프로그래밍/운영체제

[운영체제] Process Synchronization

 

컴퓨터 시스템에서 데이터가 접근되는 패턴을 알아보자

 

데이터가 저장된 위치가 있을 것이고 

그걸 읽어와서 연산을 하고 다시 데이터를 저장하는 패턴을 거친다.

 

근데 이 방법은 누가 먼저 데이터를 읽어오느냐에 따라서 결과가 달라질 수 있다.

이걸 해결하는 Synchronization 방법을 알아보도록 하자

 

Storage 박스를 여러곳에서 쓰게되면?

++ 가 먼저 수행되고 -- 가 다시 가져가서 수행이되면

++ 연산이 적용되지 않고 --만 저장되는 Synchronization 문제가 생긴다.

 

하나의 데이터를 동시에 접근 하려고 할때 Race Condition 이라고 한다.

CPU 가 여러개인 멀티프로세서 시스템 상황에서 발생할수있는 문제

 

 

예제로 봐보자면,  이미지와 같다.

P a 가 Count 를 사용해서 1을 추가했다가 Pb에 CPU 가 선점 되고 COunt 를 1 추가하게 되면

Pb 에서 추가한게 올라가지 않는 문제가 생긴다.

 

이걸 해결하는방법으로는 프로세스가 (k) 커널모드에 있을때는 CPU 를 뺏기지 않도록 한다.

u (유저모드)에 있을때만 뺏을수있게한다.

CPU 가 여러개 있는 상황

인터럽트를 막는 방법으로 해결할수없다.

 

데이터를 접근할때 lock 을 걸어야한다.

작업이 끝나야 unlock 을 한다.

 

 

여럿이서 동시에 접근을 하려고 할때 발생하는 데이터 불일치 문제

일관성을 유지하기 위해서는 공유데이터를 접근하는 프로세스간에 순서를 정해야한다.

 

 

임계구역, 공유 데이터를 접근하는 코드를 뜻함

이 프로세스가 크리티컬 세션 구역 에 있으면, 즉 공유데이터를 접근하는 코드를 실행 중이면,

CPU 를 뺏겨서 다른 프로세스가 사용중이더라도 크리티컬 세션을 사용하지 못하게된다.

P2 는 실행하지 못하고 기다리게 된다.

 

 

 

소프트웨어적으로 락을 걸었다 푸는법 1

임계영역을 사용하는 부분이 단일 인스트럭션으로 끝난다면? 아무 문제가 없을텐데

저 while~ turn 부분이 단일 인스트럭션이 아니기 때문에 도중에 CPU 를 뺏길수 있어서 문제가 생기는것

 

알고리즘1 에서는 turn 이라는 변수를 사용한다.

임계영역에 들어갈 차례가 누군지 알려주는 변수명

 

내 턴이 아닌경우엔 계속 기다리게 된다.

내 턴이 되었을때 임계영역에 들어가게 된다.

나올때는 상대방 턴으로 바꿔주게 된다.

 

이 코드는 Mutual Exclusion 은 충족한다.

하지만 Progress 는 충족하지 못한다. 아무도 임계영역을 안쓰고 있는데도 들어가지 못하는 문제가 발생.

 

2번째로 나온 알고리즘

flag라는 변수를 사용한다.

Process 2개가 각각 flag를 가지고 있다.

본인이 임계영역에 들어가고 싶다는 의사를 표현

 

이 알고리즘의 문제는 2 프로세스가 서로 flag = true 인 경우

서로 조건문에 의해 아무도 들어가지 못하는 경우가 생김

 

위 2알고리즘을 개선해서 나온 알고리즘

turn 과 flag 가 둘다 사용된다.

 

flag 를 들어서 쓰고 싶다는 의사표현을 하고, 

상대방 턴인지, 상대방도 쓰고 싶어하는지를 체크한다.

 

하드웨어적으로 더 간결하게 만들 수 있다.