오식랜드
[운영체제] 임계구역 본문
반응형
공유 자원
- 여러 프로세스고 공동으로 이용하는 변수, 메모리, 파일 등
- 공동으로 쓰기 때문에 누가 언제 데이터를 읽었는지 썻는지에 따라 결과가 바뀜
경쟁 조건
- 공유 자원을 두고 2개 이상의 프로세스가 읽거나 쓰려고 하는 상황
- 누가 먼저 무엇을 했는지에 따라 결과가 바뀜 ⇒ 레이스 컨디션 발생했다고 함
- 예시공유자원 = 계좌의 돈
- 레이스 컨디션 = 누가 먼저 실행이 완료되느냐에 따라 결과 바뀜
- 하나의 계좌에서 한명은 출금을, 한명은 입금을 하는 상황
임계 구역
- 레이스 컨디션이 발생하게 하는 프로그램 영역 (count++, count—)
- 프로세스 동시 작업 하면 안됨
- 하나의 프로레스 작업이 끝나야 다른 프로세스가 임계구역에 접근할 수 있음
- 생산자-소비자 문제 : in, out이 동시에 일어나는 문제
임계구역 해결 조건
- 상호 배제
- 절대 깨지면 안되는 조건
- 임계구역에는 하나의 프로세스만 접근
- 다른 프로세스는 기다려야 함
- 한정 대기
- 그 어떤 프로세스도 무한 대기를 하면 안됨
- 깨지면 안되는 조건
- 하지만 가끔 발생함
- 진행의 융통성
- 1, 2번에 비해 중요도는 낮음
- 하나의 프로세스가 다른 프로세스의 진행을 방해하면 안된다
해결 방법
- lock 변수를 공유변수로 사용해 False일 때만 임계구역 접근 가능하도록
- 상호배제 보장이 안됨
- P1에서 작업 중에 타임아웃이 나서 lock을 true로 만들지 못하고 P2로 넘어가게 되면 P2는 lock이 false인줄 알고 (P1이 실행중인줄 모르고) 임계구역에 진입하게 됨
- 상호배제 보장하는 코드
- P1 = lock1, P2 = lock2로 변수를 따로 사용 + 프로세스 시작하자마자 변수 true로 변경
- 굉장히 보수적
- 상호배제를 위반하지 않음
- 교착상태가 발생함 → 무한 대기, 무한 루프 등
- *교착상태 : 무한 대기 상태 중 특수한 상태
- P1에서 lock1을 true로 하자마자 타임아웃이 나서 P2로 이동
- P2에서 lock2을 true로 변경하자마자 타임아웃나서 P1으로 이동
- P1의 lock1이 true라 임계구역 진입 못함
- P2도 lock2가 true라 임계구역 진입 못함
- 상호배제와 한정대기를 충족하는 코드
- lock 변수를 boolean이 아니라 정수로 사용
- lock =1 일땐 P1, 2이면 P2
- 융통성이 없고 시작할 프로세스를 직접 선택해줘야함
- 무조건 차례대로 프로세스가 끝남 (P1먼저 시작하면 P1이 먼저 끝남)
- 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() 신호 보냄
- Semaphore(n) : 자원을 담는 수
- 타임아웃 없게 한 덩어리로 사용 ⇒ 원자적으로 사용
- 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