운영체제

프로세스 동기화

여러개의 프로세스가 공유 데이터에 접근할때 데이터 불일치가 발생할 수 있어
데이터의 일관성을 유지하기 위한 프로세스간 순서를 지정하는 로직이 필요하겠다.
➡️ count 값을 조정하는 생산자/소비자 문제를 보면

item next_producted;
while(true){
    /* next_producted에 item 생산*/
    while (count == BUFFER_SIZE)
    /* 아무일도 안함 */

    buffer[in] = next_producted;
    in = (in+1) % BUFFER_SIZE;
    count++
}

ㄴ 공유 메모리를 사용한 생산자 프로세스 (생산될 때 마다 count 증가)

item next_consumed;
while(true){
    while(count == 0)
    /* 아무일도 안함 */
    next_consumed=buffer[out];
    out = (out+1) % BUFFER_SIZE;
    count--;
    /* next_consumed 에 있는 item소비 */
}

ㄴ 공유 메모리를 사용한 소비자 프로세스 (소비될 때 마다 count 감소)

결괏 값이 5가 되어야할텐데 결과 불일치가 일어났다. 왜? count변수에 대한 접근이 둘다 동시에 가능할때 누가 언제 먼저 수행했냐에 따라 결과가 달라질 수 있다. (이러한 상황을 경쟁조건 이라고 함) ➡️ 하나의 변수만 count변수를 건드릴 수 있도록 해야겠다.

임계 구역 (critical-section)
각 프로세스에는 임계구역이라 하는 코드 세그먼트가 존재한다. 프로세스가 액세스하고 업데이트하는 데이터, 적어도 다른 하나의 프로세스와 공유된다.
하나의 프로세스가 임계구역에서 실행중일 때, 다른 프로세스들은 임계구역에 접근할 수 없다.
전입구역/퇴출구역/나머지 구역으로 구성

임계 구역 문제 해결을 위한 요구조건
🔹 상호배제(Mutual Exclusion)
: 어떤 프로세스가 임계구역에서 수행중일때 다른 어떤 프로세스도 임계구역에 접근할 수 없다.
🔹 진행(Progress)
: 임계구역에 프로세스가 없고, 임계구역에 들어가고자 하는 프로세스들이 있을때 이 프로세스들은 나머지 구역에서 실행중이지 않은 프로세스들이어야 한다.이 선택은 무한정 연기될 수 없다.
🔹 제한이 있는 대기시간(Bounded Waiting)
: 프로세스가 자신의 임계 구역에 진입하고자 요청을 한 후부터 이 요청이 허용될 때까지 다른 프로세스들이 자신들의 임계 구역에 진입할 수 있는 횟수가 제한되어야한다.

[🎵해결방법] 피터슨의 해결안
두 개의 프로세스가 두 개의 데이터 항목을 공유하게 하도록 하여 해결
int turn : 임계구역으로 진입할 순번을 표시 ex)0이면 P0, 1이면 P1차례
bool flag[2] : 프로세스가 임계구역으로 들어갈 준비가 됐는지 ex) flag[i]=true 이면 Pi가 임계구역으로 들어갈 준비가 됐어


ㄴ Pi의 구조
flag[i] = TRUE;
➡️ Pi가 나 임계구역 쓰고싶으니까 들어갈 준비되었다고 알려
turn = j;
➡️ i가 쓰기전에 혹시 기다리고 있던애(Pj)가 있을까봐 turn을 j로 돌려줘
만약 flag[j]==true 였다면 j도 쓸라고 대기타고 있던거. 그런 경우 아래 while문에서 i는 j가 다 쓸 때 까지 대기하는거고, 그게 아니라면 while문 수행하지 않겠지
while (flag[j] && turn == j);
➡️ 여기서 flag와 turn 변수를 이용해서 동시 접근을 막는거야. while문 조건이 true라는건 j가 준비됐고, 임계구역 쓸 차례라는거니까 j가 쓸때까지 i는 여기서 기다려(사실상 i도 CPU를 사용중이기 때문에 이걸 busy waiting 이라고한다)
critical section
➡️ while문 탈출 후 Pi는 임계구역 사용
flag[i] = FALSE;
➡️ Pi가 임계구역 다쓰면 이제 다썼다고 flag변수를 false로 설정
그렇다면 Pj입장에서 while(flag[i] && turn == i) 에서 기다리고 있었을텐데 flag[i]=FALSE 되면서 j는 while문 탈출해서 임계구역 사용



https://bit.ly/3FVdhDa
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

profile
Devops, AWS에 관심있어요.

0개의 댓글