[OS] 임계구역
< 임계구역 해결 조건을 고려한 코드 설계 >
1. 전역 변수로 잠금을 구현한 코드
공유 변수 lock=false 상태로 해놓고, lock=true일때 임계구역 사용하기
전역 변수로 잠금을 구현한 코드의 문제
=> 동시진입 상황, 공유변수가 하나면 안돼
=> 상호배제보장 안됨, 임계 구역은 프로세스 하나씩만 접근해야 한다.
2. 상호 배제 조건을 충족하는 코드
공유변수 2개로 lock 걸기.
상호 배제 조건을 충족하는 코드의 문제
=> 타임아웃으로 문맥 교환이 발생한다
=> 교착 상태로 무한 대기 문제가 생긴다
=> p1은 p2가 끝나길, p2는 p0가 끝나길 기다린다.
3. 상호 배제와 한정 대기 조건을 충족하는 코드
프로세스 번호를 가진 공유변수 하나를 준다.
But, 진행의 융통성 조건은 충족하지 않는다.
4. 임계구역 문제의 하드웨어적인 해결 방법
검사와 지정(test-and-set) 코드로 하드웨어의 지원을 받아
while(lock==true);문과 lock=true;문을 한꺼번에 실행해
cpu와 interrupt를 사용하지 않고 빠르게 실행한다.
검사와 지정 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려
임계구역을 보호하지 못하는 문제가 발생하지 않는다.
=> 따라서 임계구역을 보호한다.
< 피터슨 알고리즘 >
임계구역 소프트웨어적 해결방법
데커알고리즘과 같은 동작을 한다.
임계구역 문제 해결의 상호배제, 한정대기, 진행의 융통성 조건을 모두 만족한다.
- while문 조건 한번에 동작하는지 check
- 바쁜대기
- cpu 사용
< 데커 알고리즘 >
임계구역의 소프트웨어적 해결방법
- while문 조건 한번에 동작하는지 check
- 바쁜대기
- cpu 사용
데커 알고리즘의 동작
1. 프로세스 p1은 우선 잠금을 건다.
2. 프로세스 p2의 잠금이 걸렸는지 확인한다.
3. 만약 프로세스 p2도 잠금을 걸었다면 누가 먼저인지 확인한다.
사용중이라면 양보, 아니라면 내가 사용한다.
프로세스 p1의 차례라면 임계구역으로 진입
프로세스 p2의 차례라면 이동
4. 프로세스 p1은 잠금을 풀고, 프로세스 p2가 작업을 마칠 때까지 기다린다.
프로세스 p2가 작업을 마치면 잠금을 걸고 임계구역으로 진입한다.
< 세마포어 (semaphore) >
임계구역에 진입하기 전에 스위치를 사용 중으로 놓고 P() 임계구역으로 들어간다.
이후에 도착하는 프로세스는 앞의 프로세스가 작업을 마칠 때까지 기다린다.
프로세스가 작업을 마치면 다음 프로세스에 임계구역을 사용하라는 V() 동기화 신호를 보낸다.
P(wait) 연산 : 자원을 접근할 때
V(signal) 연산 : 자원 사용이 끝났을 때
세마포어에 대한 연산은 원자적으로 처리되어야 한다.
응용 레벨과 커널 레벨에서 구현이 가능하다.
< 세마포어 내부 코드 >
Semaphore(n) : 전역 변수 RS를 n으로 초기화, RS에는 현재 사용 가능한 자원의 수(n) 저장
P() : 잠금을 수행하는 코드로 RS가 0보다 크면 (사용 가능한 자원이 있으면) 1만큼 감소시키고 임계구역에 진입한다.
RS가 0보다 작으면 (사용 가능한 자원이 없으면) 0보다 커질 때까지 기다린다.
V() : 잠금 해제와 동기화를 같이 수행하는 코드로, RS 값을 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입해도 좋다는 wake_up 신호를 보낸다.
< 세마포어의 잘못된 사용 예 >
1. 프로세스가 세마포어 사용하지 않고 임계구역에 바로 들어간 경우로, 임계구역을 보호할 수 없음
2. P()를 두 번 사용하여 wake_up 신호가 발생하지 않은 경우로, 프로세스 간 동기화가 이루어지지 않아 세마포어 큐에서 대기하던 프로세스들이 무한 대기에 빠짐
3. P()와 V()를 반대로 사용해 상호 배제가 보장되지 않은 경우로, 임계구역을 보호할 수 없음
< 모니터 (monitor) >
high level 언어에서 임계구역이 보장되도록 만든다.
방화벽처럼 공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한
인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킨다.
모니터의 작동 원리
임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에 작업을 요청한다.
모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려준다.
< 파일 >
순차 파일 (sequential file)
아무리 큰 파일이라도 파일 내의 데이터는 개념적으로 한 줄로 저장됨
파일 기술자 (file descriptor)
open() 함수로 파일을 열면 파일 기술자 fd를 얻음
파일 기술자는 파일 접근 권한 외에 현재 파일의 어느 위치를 읽고 있는지에 대한 정보도 보관
파일에서 파일 기술자는 단 하나이다.
처음 파일이 열리면 파일 기술자는 맨 앞에 위치한다.
파일을 읽거나 쓰면 파일 기술자는 계속 전진한다.
파일을 이용한 통신
read()와 write() 함수가 파일 기술자를 공유하며 통신
두 프로세스 간 동기화를 운영체제가 지원해 주지 않으므로 프로세스가 알아서 해야 함
파이프를 이용한 통신
파이프는 파일 기술자를 2개의 원소를 가진 배열로 정의.
원소 하나는 읽기용, 하나는 쓰기용으로 사용
'CS > OS' 카테고리의 다른 글
[OS] 프로세스 동기화 (0) | 2024.04.30 |
---|---|
[OS] 프로세스와 스레드 (1) | 2024.04.09 |