반응형
Notice
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

오식랜드

[운영체제] 임계구역 본문

dev-log/cs

[운영체제] 임계구역

개발하는 오식이 2023. 10. 1. 14:16
반응형

공유 자원

  • 여러 프로세스고 공동으로 이용하는 변수, 메모리, 파일 등
  • 공동으로 쓰기 때문에 누가 언제 데이터를 읽었는지 썻는지에 따라 결과가 바뀜

경쟁 조건

  • 공유 자원을 두고 2개 이상의 프로세스가 읽거나 쓰려고 하는 상황
  • 누가 먼저 무엇을 했는지에 따라 결과가 바뀜 ⇒ 레이스 컨디션 발생했다고 함
  • 예시공유자원 = 계좌의 돈
  • 레이스 컨디션 = 누가 먼저 실행이 완료되느냐에 따라 결과 바뀜
  • 하나의 계좌에서 한명은 출금을, 한명은 입금을 하는 상황

임계 구역

  • 레이스 컨디션이 발생하게 하는 프로그램 영역 (count++, count—)
  • 프로세스 동시 작업 하면 안됨
  • 하나의 프로레스 작업이 끝나야 다른 프로세스가 임계구역에 접근할 수 있음
  • 생산자-소비자 문제 : in, out이 동시에 일어나는 문제

임계구역 해결 조건

  1. 상호 배제
    • 절대 깨지면 안되는 조건
    • 임계구역에는 하나의 프로세스만 접근
    • 다른 프로세스는 기다려야 함
  2. 한정 대기
    • 그 어떤 프로세스도 무한 대기를 하면 안됨
    • 깨지면 안되는 조건
    • 하지만 가끔 발생함
  3. 진행의 융통성
    • 1, 2번에 비해 중요도는 낮음
    • 하나의 프로세스가 다른 프로세스의 진행을 방해하면 안된다

해결 방법

  1. lock 변수를 공유변수로 사용해 False일 때만 임계구역 접근 가능하도록
    • 상호배제 보장이 안됨
    • P1에서 작업 중에 타임아웃이 나서 lock을 true로 만들지 못하고 P2로 넘어가게 되면 P2는 lock이 false인줄 알고 (P1이 실행중인줄 모르고) 임계구역에 진입하게 됨
  2. 상호배제 보장하는 코드
    • P1 = lock1, P2 = lock2로 변수를 따로 사용 + 프로세스 시작하자마자 변수 true로 변경
    • 굉장히 보수적
    • 상호배제를 위반하지 않음
    • 교착상태가 발생함 → 무한 대기, 무한 루프 등
    • *교착상태 : 무한 대기 상태 중 특수한 상태
    • P1에서 lock1을 true로 하자마자 타임아웃이 나서 P2로 이동
    • P2에서 lock2을 true로 변경하자마자 타임아웃나서 P1으로 이동
    • P1의 lock1이 true라 임계구역 진입 못함
    • P2도 lock2가 true라 임계구역 진입 못함
  3. 상호배제와 한정대기를 충족하는 코드
    • lock 변수를 boolean이 아니라 정수로 사용
    • lock =1 일땐 P1, 2이면 P2
    • 융통성이 없고 시작할 프로세스를 직접 선택해줘야함
    • 무조건 차례대로 프로세스가 끝남 (P1먼저 시작하면 P1이 먼저 끝남)
  4. Test And Set
    • 하드웨어의 지원으로 해결
    • 검사와 지정 코드
    • while문과 lock변수 바꾸는코드를 한번에 실행
    • 명령 중간에 타임아웃이 일어나도 임계구역 보호 가능
    • while(testandset(&lock) == true

세마포어 연산

  • 필수 연산
    • Semaphore(n) : 자원을 담는 수
      • RS = n
    • P (wait) :자원 접근 시
      • 잠금을 수행하는 코드
      • RS가 0보다 크면 사용 가능 자원이 있다는 뜻
      • RS가 0 보다 크면 1 감소 (하나 사용)
      • RS가 0이면 사용 가능한 자원이 없다는 뜻
      • RS가 0이면 커질 때 까지 기다림
    • V (signal) : 자원 사용 끝
      • 잠금 해제와 동기화를 같이 수행
      • RS값을 1 증가
      • 임계구역에 진입해도 좋다는 wake_up() 신호 보냄
  • 타임아웃 없게 한 덩어리로 사용 ⇒ 원자적으로 사용
  • P() → 임계구역 접근 ⇒ V()로 끝남을 알림 (동기화 신호)
  • ex) 카페 화장실 갈 때 열쇠두는 곳 확인→ 없으면 다른사람이 사용중인 거라 생각하고 돌아올 때 까지 기다림
  • → 열쇠가 있으면 사용

모니터

  • 세마포어 알고리즘 사용
  • 공유 자원을 내부적으로 숨기고 접근 가능한 인터페이스만 제공
  • 자원을 보호하고 프로세스간 동기화르 ㄹ시킴
  • 작동 원리
    • 임계구역에 가고싶은 프로세스는 직접 세마포어를 사용하지 않고 모니터에 요청
    • 모니터는 요청받은 작업을 모니터 큐에 저장
    • 순서대로 처리한 후 모니터에 결과만 보여

파일 이용 통신

  • read(), write() 함수가 파일 기술자를 공유하여 통신
  • 프로세스간 동기화를 알아서 해야함 (운영체제 지원X)
  • PID가 0이면 child, 0보다 크면 parent
  • fork에 실패하면 PID가 0 → 오류 체크 필요
반응형

'dev-log > cs' 카테고리의 다른 글

[운영체제] 메모리  (0) 2023.10.01
[운영체제] 교착 상태  (0) 2023.10.01
[운영체제] 프로세스 간 통신  (0) 2023.09.27
[운영체제] 인터럽트 (interupt)  (0) 2023.09.27
[운영체제] 스케줄링 알고리즘  (0) 2023.09.27
Comments