modesta.log
로그인
modesta.log
로그인
혼자 공부하는 컴퓨터 구조 + 운영체제 Section 12. 프로세스 동기화
jihyelee
·
2023년 8월 22일
팔로우
1
운영체제
컴퓨터구조
1
achitecture-os
목록 보기
12/15
강의 링크
동기화란
동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고받음
자원의 일관성을 보장해야 = 프로세스 동기화를 고려해야
실행의 문맥을 갖는 모든 대상은 동기화 대상이기 때문에 스레드도 동기화 대상
동기화
프로세스들의 수행 시기를 맞추는 것
실행 순서 제어
프로세스를 올바른 순서대로 실행
reader writer problem
writer: book.txt 파일에 값을 저장하는 프로세스
reader: book.txt 파일에 저장된 값을 읽어들이는 프로세스
reader 프로세스는 book.txt 안에 값이 존재한다는 특정 조건이 만족되어야만 실행 가능
상호 배제
동시에 접근해서는 안 되는 자원(=공유가 불가능한 자원)에 하나의 프로세스만 접근하게 함
bank account problem
현재 계좌에 잔액 10만원, 프로세스 A는 현재 잔액에 2만원 추가, 프로세스 B는 현재 잔액에 5만원 추가
한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 함 (동시에 '잔액'에 접근해서는 안 됨)
문맥 교환이 되어서도 기다려야 함
producer and consumer problem
물건을 계속해서 생산하는 생산자, 물건을 계속해서 소비하는 소비자, '총합' 변수 공유
공유 자원과 임계 구역
공유 자원
여러 프로세스 혹은 스레드가 공유하는 자원
e.g. 전역 변수, 파일, 입출력장치, 보조기억장치, ...
임계 구역
동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
e.g. 앞선 예시의 '총합' 변수, '잔액' 변수, ...
임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 함
임계 구역에 동시에 접근하려고 하면 문제 발생
자원의 일관성이 깨질 수 있음 = 레이스 컨디션 (race condition)
고급 언어를 저급 언어로 변경할 시 한 줄 코드가 여러 줄로 바뀔 수 있음
중간에서 문맥 교환이 발생하면 예상치 못한 결과 발생할 수 있음 (레이스 컨디션 발생 등)
운영체제가 임계구역 문제를 해결하는 세 가지 원칙
상호 배제를 위한 동기화를 위한 세 가지 원칙
상호 배제 (mutual exclusion)
한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없음
진행 (progress)
임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 함
유한 대기 (bounded waiting)
한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 함
임계 구역에 들어오기 위해 무한정 대기해서는 안 됨
동기화 기법
뮤텍스 락
상호 배제를 위한 동기화 도구(자물쇠 역할)
공유 자원이 하나인 경우를 상정
뮤텍스 락의 단순한 형태 = 전역 변수 하나, 함수 두 개
자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
임계 구역을 잠그는 역할: acquire 함수
프로세스가 임계 구역에 진입하기 전에 호출
임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 임계 구역을 반복적으로 확인
임계 구역이 열려 있다면 임계 구역을 잠금
임계 구역의 잠금을 해제하는 역할: release 함수
임계 구역에서의 작업이 끝나고 호출
현재 잠긴 임계 구역을 열기
e.g. acquire() -> 임계 구역 -> release()
바쁜 대기 (busy waiting)
무한히 계속 반복하면서 임계 구역을 확인하는 방법
세마포
상호 배제를 위한 동기화
좀 더 일반화된 방식의 동기화 도구
공유 자원이 여러 개 있는 경우에도 적용 가능
세마포의 종류 (이진 세마포, 카운팅 세마포) 중 카운팅 세마포를 다룸
임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기
임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입
세마포의 단순한 형태 = 전역 변수 하나, 함수 두 개
임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유자원의 개수)를 나타내는 전역 변수 S
임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수
임계 구역 앞에서 기다리는 프로세스에 이제 가도 좋다고 신호를 주는 signal 함수
wait 함수는 busy waiting (바쁜 대기)
해결 방법
사용할 수 있는 자원이 없을 경우 대기 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에 삽입)
사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)
실행 순서 동기화
세마포의 변수 S를 0으로 두고
먼저 실행할 프로세스 뒤에 signal 함수
다음에 실행할 프로세스 앞에 wait 함수
모니터
세마포의 경우 여러 실수의 가능성 존재
세마포를 누락한 경우
wait, signal 순서를 헷갈린 경우
wait와 signal을 중복해서 사용한 경우
사용자(개발자가)가 다루기에 편한 동기화 도구
상호 배제를 위한 동기화
인터페이스를 위한 큐 (그림 왼쪽)
공유 자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입
큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용
실행 순서 제어를 위한 동기화
조건 변수(condition variable) 이용
프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
조건변수.wait(): 대기 상태로 변경, 조건 변수에 대한 큐에 삽입
조건변수.signal(): wait()으로 대기 상태로 접어든 조건 변수를 실행 상태로 변경
모니터 안에는 하나의 프로세스만이 있을 수 있음
wait()을 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개
signal()을 호출한 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개
특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait을 통해 실행을 중단
특정 프로세스가 실행될 조건이 충적되었을 때에는 signal을 통해 실행을 재개
jihyelee
Graduate student at Seoul National University, majoring in Artificial Intelligence (NLP). Currently AI Researcher at LG CNS AI Lab
팔로우
이전 포스트
혼자 공부하는 컴퓨터 구조 + 운영체제 Section 11. CPU 스케줄링
다음 포스트
혼자 공부하는 컴퓨터 구조 + 운영체제 Section 13. 교착 상태
0개의 댓글
댓글 작성