1-1. 프로세스 간 통신의 개념
프로세스 간 통신의 종류
- 공유 메모리나 공유 파일을 이용한 통신
- 일정한 메모리 영역이나 파일을 공유하고 이를 통해 데이터를 주고받음
- 가장 원시적
- 파이프를 이용한 통신
- 파이프는 프로세스 간 통신을 위해 OS가 제공하는 통신 기법
- fork()로 만들어진 부모-자식 간에 사용됨
- 소켓을 이용한 통신
- 소켓은 네트워크로 연결된 컴퓨터에서 데이터를 주고받기 위한 통신 기법
- 초기화할 내용도 많고 시스템 자원도 많이 사용하므로 같은 컴퓨터에서 소켓 통신을 하는 것은 비효율적
1-2. 프로세스 간 통신의 종류
파일을 이용한 통신
- 파일 열기
- open(”com.txt”, O_RDWR): com.txt 파일을 읽기, 쓰기가 가능한 상태로 준비, open 함수는 파일에 접근할 수 있는 권한인 파일 기술자 fd를 사용자에게 반환
- 파일 쓰기
- write(fd, “Test”, 5): fd(com.txt)에 Test 문자를 쓰라는 의미
- read(fd, buf, 5): fd에서 5 Bytes를 읽어 변수 buf에 저장
- 파일 닫기
- close(fd): fd가 가리키는 파일(com.txt)을 닫음
파이프를 이용한 통신
- open()으로 기술자를 얻고 close()로 마무리
- 파이프로 양방향 통신을 하려면 파이프 2개 사용
- 파이프에 쓰기를 하면 데이터가 전송, 읽기를 하면 데이터 받음
이름 없는 파이프: 일반적인 파이프
이름 있는 파이프: FIFO라 불리는 특수파일을 이용, 서로 관련 없는 프로세스 간 통신에 이용
소켓을 이용한 통신
- 여러 컴퓨터에 있는 프로세스끼리 통신하는 방법
- 프로세스가 소켓에 쓰기 연산을 하면 데이터 전송, 읽기 연산을 하면 데이터 받음
2-1. 공유 자원에 대한 접근
공유 자원
- 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등
- 공동으로 이용되므로 누가 언제 데이터를 쓰거나 읽냐에 따라 결과가 변함
경쟁 조건
- 2개 이상의 프로세스가 공유 자원을 병행적으로 읽거나 쓰는 상황
- 경쟁조건이 발생하면 공유 자원 접근 순서에 따라 실행 결과가 달라짐
2-2. 임계 구역
임계구역(Critical Section)
- 공유 자원 접근 순서에 따라 실행 결과가 달라지는 프로그램 영역
- 임계 구역에서는 프로세스를 동시에 작업하면 안 됨
2-3. 생산자 - 소비자 문제
코드 및 실행 순서에 따른 결과
- 생산자는 수를 증가시키며 물건을 채우고 소비자는 생산자를 쫓아가며 물건 소비
- 생산자 코드와 소비자 코드가 동시에 실행되면 문제 발생
2-4. 임계구역 문제 해결 조건
상호배제
한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역 진입 못함
한정 대기
어떤 프로세스도 무한 대기하지 않아야 함
진행의 융통성
한 프로세스가 다른 프로세스의 진행을 방해해서는 안됨
3-1. 임계구역 해결
#include <stdio.h>
typedef enum {false, true} boolean;
extern boolean lock = false;
extern int balance;
main() {
while(lock == true)
lock = true;
balance = balacne + 10; /* 임계구역 */
lock = false;
}
해결 1. 전역 변수로 잠금을 구현
공유 변수 lock 이용
전역 변수로 잠금을 구현했을 때 문제
- P1이 while(lock == true); 실행
- P2가 while(lock == true); 실행
- P1이 lock=true; 실행하여 임계구역에 잠금을 걸고 진입
- P2가 lock=true; 실행하여 임계구역에 잠금을 걸고 진입
- 결국, 둘 다 임계구역에 진입
해결 2. 상호 배제 조건을 충족하는 코드
상호 배제 조건을 충족하는 코드의 문제
- P1이 lock1=true; 실행 후 타임아웃, 문맥교환 발생, P2가 실행 상태로 바뀜
- P2도 lock2=true; 실행 후 타임아웃, 문맥교환 발생, P1이 실행 상태로 바뀜
- P1은 lock2 == true이므로 무한 루프에 빠짐
- P2도 lock1 == true이므로 무한 루프에 빠짐
상호 배제와 한정 대기 조건을 충족하는 코드
= 진행의 융통성 문제 발생(한 프로세스가 다른 프로세스의 진행을 방해)
임계구역 문제의 하드웨어적 해결 방법
- 검사와 지정(test and set) 코드로 하드웨어의 지원을 받아 while(lock == true);문과 lock=true;문을 한 번에 실행
- 검사와 지정 코드를 이용하면 명령어 실행 중간에 타임아웃이 걸려 임계구역을 보호하지 못하는 문제가 발생하지 않음
3-2. 피터슨 알고리즘
- 임계구역 문제 해결의 3조건을 모두 만족
- 2개의 프로세스만 사용 가능하다는 한계
3-3. 데커 알고리즘
데커 알고리즘의 동작
- P1은 우선 잠금을 건다 lock1 = true;
- P2가 잠금이 걸렸는지 확인 while(lock2 == true)
- P2도 잠금을 걸었다면 누가 먼저인지 확인 if (turn==2)
- P1의 차례라면(turn == 1) 임계구역으로 진입, P2의 차례라면(turn == 2) 4번으로 이동
- P1의 lock을 풀고(lock1 = false) P2가 작업을 마칠 때까지 기다림 while (turn == 2)
- P2가 작업을 마치면 잠금을 걸고(lock1 = true) 임계구역으로 진입
3-4. 세마포어
Semaphore(n); // -> RS = n;
P(); // -> if RS > 0 then RS = RS -1; else block();
/*
임계구역
*/
V(); // -> RS = RS + 1; wake_up();
- 프로세스가 임계구역에 진입하기 전에 스위치를 사용 중으로 둠
- 후에 도착하는 프로세스는 앞의 프로세스가 작업이 끝날 때까지 기다림
- 작업을 마치면 세마포어가 다음 프로세스에 임계구역을 사용하라는 동기화 신호를 보냄
세마포어 내부 코드
- Semaphore(n): 전역변수 RS를 n으로 초기화, n은 현재 사용 가능한 자원의 수
- P(): 잠금을 수행, RS가 0보다 크면 1만큼 감소시키고 임계구역 진입, 0이거나 더 작으면 0보다 커질 때까지 기다림
- V(): 잠금해제, 동기화를 같이 수행, RS를 1 증가시키고 세마포어에서 기다리는 프로세스에게 임계구역에 진입하라는 wake_up 신호를 보냄
세마포어 사용 잘못된 예
- 프로세스가 세마포어를 사용하지 않고 임계구역에 바로 들어간 경우, 임계구역을 보호할 수 없음
- P()를 V() 대신 두 번 사용하여 wake_up 신호가 발생하지 않은 경우, 무한 대기에 빠짐
- P()와 V()를 반대로 사용해 상호 배제가 보장되지 않은 경우, 임계구역을 보호할 수 없음
3-5. 모니터
공유 자원을 내부적으로 숨기고 공유 자원에 접근하기 위한 인터페이스만 제공해 자원을 보호하고 프로세스 간의 동기화를 시킴
모니터의 작동 원리
- 임계구역으로 지정된 변수나 자원에 접근하려는 프로세스는 직접 P()나 V()를 사용하지 않고 모니터에게 요청
- 모니터는 요청받은 작업을 모니터 큐에 저장 후 순서대로 처리하고 결과만 해당 프로세스에 알려줌
mon.wait(): 모니터 큐 안에서 기다림
mon.signal(): 다음 프로세스를 wake_up 시킴
'Computer Science > 운영체제' 카테고리의 다른 글
4. CPU 스케줄링 (0) | 2023.10.16 |
---|---|
3. 프로세스와 스레드 (0) | 2023.10.16 |
2. 컴퓨터 구조와 성능 향상 (0) | 2023.10.16 |
1. 운영체제 개요 (0) | 2023.10.16 |