운영체제 정리-7 임계구역

beenyyy·2023년 5월 11일

<Motivation 동기부여>

• 일부 프로세스는 서로 상호 협력.
협력이 필요한 이유:
자원 공유, 하위 작업으로 나눠 병렬 실행, 모듈 방식으로 시스템 구축

공유 데이터에 동시 접근하면 데이터 불일치 발생.
데이터 일관성 유지를 위해 질서 있는 실행 보장 필요.

<예시-생산자/소비자 프로그램>

• int counter //버퍼 차있는 정도
• 경쟁 조건 발생

<Critical Section 임계구역>

• 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램 코드 영역
• entry section
• exit section
• remainder section
• 임계 구역을 최소화하는 게 좋음. 길면 병렬성⇩

<임계구역 문제 해결 조건>

  1. Mutual Exclusion(상호배제)
    • 한 프로세스가 임계 구역에 들어가면 다른 프로세스는 들어갈 수 없다.
  2. Progress(진행)
    • 임계구역이 비어있으면 언제든 사용 가능해야 함.
    • 한 프로세스가 다른 프로세스의 진행 방해하면 안됨.
  3. Bounded Waiting(제한된 대기)
    • request로부터 제한 시간 안에 반드시 임계구역에 들어갈 수 있어야 한다. 무한대기X

커널 안에서 공유되는 것들이 많으므로 중요.
pid 등.

<임계구역 처리>

  1. Preemptive 선점적
    • 커널 모드에서 실행할 때 프로세스의 선점을 허용

  2. Non-preemptive 비선점적
    • 커널 모드를 종료하거나 자발적으로 CPU를 양보할 때까지 실행. (강제로 switching X)
    • 본직적으로 커널 모드에서 경합 조건이 안 일어남.

<Paterson의 솔루션> -소프트웨어로만 구현하는 방법

• 2개의 프로세스만 있다고 가정(Pi,pj)
• 두 변수 공유

  • int turn //누가 들어갈 차례인지
  • bool flag[2] //flag[i]는 가 들어가고 싶다고 설정했다는 뜻

• Mutual exclusion

  • 하나의 flag[j] == false or turn ==i 일 때만 진입하므로 만족. turn은 변수 하나이므로.

• Progress

  • 아무도 없으면 들어가는 게 보장되므로 만족.

• Bounded-waiting

  • 자신의 일이 끝나고 나가면서 flag=0을 하므로 turn이 넘어감.

• 현대에서는 이 방법을 사용하지 X.

  • 하드웨어가 성능 최적화를 위해 종속성이 없는 인스트럭션들의 순서를 재정렬할 수 있으므로 순서만 바뀌어도 깨지는 현상이 나타남.
  • 소프트웨어로만 구현하지 않는 이유이다.

<Disable/Enable 인터럽트> -하드웨어 도움받는 방법

• entry section에서 인터럽트 비활성화, exit section에서 인터럽트 활성화
• 모든 인터럽트를 막아버리는 너무 강력한 방식이라 추천하지 않음.
• preemptive가 안됨. context-switching 안 일어남.

<동기화 하드웨어> -하드웨어 지원

• Hardware Instruction(하드웨어 명령)

<하드웨어 명령: text_and_set>

• 원자성 = non-interruptible (인터럽트 불가)
• test_and_set: 메모리 값이 1인지 0인지 확인하고 메모리 값을 1로 변경하는 작업

-모든 행위가 인스트럭션 하나에서 일어남


-완벽히 해결하지는 않음.
mutual, 두 번째 조건만 만족.
bounded wait는 불만족.
100명이 기다리면 100명 중 어느 것이 들어갈지 보장이 안 됨.

<Bounded waiting을 만족하는 해결방안>

profile
📚beenyyy의 개발공부

0개의 댓글