Critical Section

윤동규·2023년 4월 7일
0

critical section
=> running ready cpu를 뺏김,

  1. s = s + 1 => 3개의 연산으로 분리
  2. 레지스터값에다가 shared데이터로 읽어와라
  3. 1을 더해라
  1. progress문제
    => turn이 0일경우만 들어가고 turn이 1일경우 빠져나온다
    상대편을 확인해야하는데 상대편이 repeat에서 죽어버리면..?
  1. mutual exclusion문제
    => 상대편의 깃발을 보고 기다렸다가 0일경우 들어간다
    중간에 preemption이 생겨 p1이 착각을 해 들어가버린다. p0도 들어가버린다
  1. 먼저 선언하고 들어간다
    => 중간에 flag[0]에서 멈췄을 경우 flag[1]
    들어갈거라고 선언했는데 멈췄다 p1은 깃발만 보고 무작정 wait p0도 선언한거 보고 무작정 wait

Dekkers Algorithm

혼용을 하여 해결함

  1. 의사를 밝힘 => falg 0일경우 들어가겠다
  2. 턴을 확인 상대편일경우 깃발을 내리고 wait!
  3. 그리고 들어감

문제해결
1. progress 조건 => 돌다가 repeat에서 죽어버렸을 경우
상대편이 깃발 안들고 있으니깐 안에 들어갈수 있다
2. 둘다 깃발을 들고 있어도 안에서 한번더 확인함으로서 문제 해결

Peterson's Algorithm

의사를 밝힌다
=> 양보를 해버린다
늦게 양보한애가 들어간다

다익스트라 알고리즘

  1. Idle => 프로세스가 임계지역 진입을 시도하고 있지 않을때
  2. want-in => 프로세스가 임계 지역 진입시도 1단계일때 (의사를 밝힘)
  3. in-CS => 프로세스의 임계지역 진입 시도 2단계 및 임계 지역내에 있을때

1단계 => 의사를 밝힘 턴이 내가 아니면 기다린다 (조건 : 현재 턴인 친구 idle이 끝날때까지 기다린다)
그리고 턴을 내걸로 뺏어온다

2단계 => j루프를 위한 카운팅 변수
n보다 작을때 까지 돈다 나일떄를 제외하고
in-CS라는 방안에 누군가 있으면 빠져나온다
j가 n보다 작을경우 처음으로 돌아감

하드웨어 솔루션

=> test set을 만들어줌
실행중 Preemption을 받지 않음!!

TestAndSet => 한번에 수행이 된다

  1. target을 받아서 값을 temp에다가 넣어준다 //이전값 기록
  2. 얘를 true로 만들어준후에 // true로 설정
  3. temp로 만들어준다

프로세스 3개일떄 위배됨

=> 1번 들어가고 false로 나가게 되면 한명은 계속 들어가지 못하게됨

waiting => 기다릴까?

buzy wating 문제

spinlick
=> 정수형 변수
p() v() 로만 접근가능
os support
preemption안도게 보장해줄게

\p연산 => 물건이 없다면 물건이 생기기를 기다린다 1이였다면 빠져나와서 물건을 가져간다
(물건을 ㄱ꺼내가는 과정)

v연산 => 물건을 반납하는 과정

들어가기기전에 p 나올때 ㅍ
물건이 있다 p연산 들어가면 가져가니깐 1이된다
active 물건이 생겼네? 하고

spinlock 예제

안에 들어가야하는데 pj는 돌고있으니깐 자원을 못받고 pi는 못들어가고

그래서 pi pj둘다 돌아야한다

buzy wating

semaphore

임의의 s 변수 하나에 ready queue 하나가 할당이 됨

  1. binary semaphore
    0 or 1

  2. counting semaphore

profile
풀스택 개발자입니다

0개의 댓글