프로세스간 통신 방법?
- 파일, 파이프
- 쓰레드 : 한 프로세스 내에서 쓰레드로 통신(코드, 힙, 데이터 영역 공유, 스택 영역만 따로 갖고 있음.)
- 네트워크 : OS가 제공하는 소켓통신, 다른 컴퓨터의 함수를 호출하는 RPC(원격 프로세저 호출)
공유자원
- 프로세스간 통신할 때 공통으로 사용하는 자원
프로세스 동기화(Process Synchronization)란?
- 동기화 문제 : 여러 프로세스가 공유자원을 동시에 사용하기 때문에 동기화 문제가 발생함.
공유 데이터(shared data)에 두 개 이상의 프로세스가 동시에 접근하면 data inconsistency가 발생할 수 있음
data consistency(데이터의 일관성)을 유지하기 위한 메커니즘을 동기화라 함.
임계구역(Critical Section)
- 여러 프로세스가 동시에 사용하면 안되는 영역
경쟁조건(Race Condition)
- 공유자원을 서로 사용하기 위해 경쟁하는 것
상호배제(Mutual Exclusion)
특정 프로세스가 공유 자원을 사용 중일 때 다른 프로세스가 이 자원에 접근하지 못하도록 막는 것
임계구역 문제를 해결하기 위해서 필요
상호 배제의 요구사항
- Mutual Exclusion(상호배제) : 임계영역엔 동시에 하나의 프로세스만 접근한다.
- Progress(진행) : 여러 요청에도 하나의 프로세스의 접근만 허용한다.
- Bounded Wait(한정 대기) : 임계구역에 들어간 프로세스는 빠르게 나와야한다.
세마포어(Semaphore)
상호배제 메커니즘 중 하나.
ex. 프린터(공유자원)를 동시에 출력하는 것 → 컴퓨터끼리 경쟁조건이 됌. 같이 출력되면 문제가 됨
→ 이후에는 프린터를 쓰려면 열쇠를 가지고 프린터실에 들어가서 사용해야함. 다른 직원이 오면 열쇠를 반납하고 다시 받아서 써야함.
- 직원 A, B = 프로세스(대기큐에서 다음 차례를 기다림.
- 열쇠관리자 = 운영체제
- 열쇠 = 세마포어(정수형 변수)
- 공유자원 = 프린터
[세마포어 예시 코드]
- 물약 먹는 코드, 공격 받는 코드
- wait 함수(세마포어 획득)가 실행되면 signal 함수(세마포어 반납)가 실행될 때까지 기다림.
- 공유자원에 여러 프로세스가 동시에 접근하지 못하므로 동기화 문제가 발생하지 않음.
// 세마포어 선언, 열쇠가 1개인 세마포어(공유자원이 2개면 2로 설정)
int s= 1
// 물약을 먹는 코드
wait(s); //열쇠를 요청해서 열쇠를 받고 문을 잠금
int currentHealth = GetHealth();
health = currentHealth + 50; // 체력 50 증가
signal(s); // 방에서 나와 문지키는 직원에게 열쇠 반납
// 공격받는 코드
wait(s); //열쇠를 요청해서 열쇠를 받고 문을 잠금
int currentHealth = GetHealth();
health = currentHealth - 10; // 체력 50 증가
signal(s);
- 만약 아래와 같이 세마포어를 잘 못 사용한다면 문제가 발생함 → 해결 방법 ‘모니터’
#Case 1
wait(s);
//임계 구역
wait(s);
#Case 2
signal(s);
//임계 구역
signal(s);
#Case 3
signal(s);
//임계 구역
wait(s);
모니터(Monitor)
세마포어의 단점을 해결한 상호배제 메커니즘
따로 운영체제가 처리하는 것이 아니라 프로그래밍 언어에서 지원함
- 자바(Java), .NET, C#
- 자바 : synchronized
- 해당 키워드가 붙은 프로세스는 동시에 여러 프로세스에서 실행할 수 없음.
- 상호배제가 완벽하게 이루어 짐. 잘 만 사용하면..
[모니터 예시 코드]
public class Health
{
private int health = 100;
synchronized void increase(int amount)
{
health += amount;
}
synchronized void decrease(int amount)
{
health -= amount;
}
}
참고
'IT > OS' 카테고리의 다른 글
[Windows] Active Directory 관리센터 암호정책 그룹 적용/변경하기 (2) | 2022.02.11 |
---|---|
[Windows] 윈도우 원격 데스크톱 포트 변경 방법(How to Change the Listening Port for Remote Desktop) (1) | 2022.01.24 |
[OS] CPU 스케줄링, CPU 스케줄링 알고리즘(FIFO, SJF, RR, MLFQ) (0) | 2022.01.16 |
[OS] 좀비 프로세스(Zombie Process)란? 부모프로세스와 자식프로세스 (0) | 2022.01.15 |
[OS] 멀티프로그래밍과 멀티프로세싱(Feat. PCB, Context Switching) (0) | 2022.01.15 |
댓글