프로세스, 스레드는 어떻게 통신할까 그리고 어떤 문제가 발생할 수 있을까? (OS-3)
in Development
멀티 프로세스, 멀티 스레드는 어떻게 통신할까? 그리고 어떤 문제들이 발생할 수 있을까?
멀티 프로세스는 각자 어떻게 통신할까? -> IPC
- 프로세스는 독립적인 주소공간을 갖기 때문에 서로 메모리를 공유하지 않음
- 운영체제는 프로세스 간 자원 접근을 위해 IPC(Inter Process Communication) 제공
⭐️⭐️⭐️IPC
- 공유 메모리 방식
- 주소공간 일부를 공유
- 모든 참여하는 프로세스에게 보이며, 하나의 프로세스가 공유 메모리에 쓴 데이터는 다른 프로세스에서 그대로 읽을 수 있음
- 커널이 맨 처음 한번만 할당해주고 그 이후로는 관여안해서 속도가 빠름
- 동시에 같은 메모리 위치에 접근하게 되면 일관성 문제가 발생할 수 있음 -> 세마포어, 뮤텍스같은 동기화 도구를 사용하여 조절
- 메세지 전달 방식
- 커널이(system call - send, receive 연산) 관리하기 때문에 느리지만 안정성이 높음
- 충돌을 회피할 필요가 없기 때문에 적은 양의 데이터를 교환하는 데 유용
- 구현하기 쉬움
- 대표적인 예 : pipe, socket, message queue
멀티 스레드는 어떻게 통신할까?
- 메모리 공간을 공유하므로 멀티 프로세스보다 매우 빠르게 통신
- Heap 공간을 공유로 통신
- 동시성 문제에 취약
멀티 프로세스/스레드는 어떤 문제가 발생할 수 있을까?
- 동기화 문제
- 서로 다른 스레드가 동일한 자원에 동시에 접근하여 발생
- 이를 해결하기 위해 세마포어와 뮤텍스 방법이 사용됨
- entry section -> critical section -> exit section 순으로 실행
❗️뮤텍스(≅이진 세마포어)
- mutual exclusion
- 공유자원에 접근할 수 있는 프로세스/스레드 개수 1개
- critical section에 들어갈 때 mutex lock을 획득하고 exit 영역으로 갈때 mutex lock을 반환함
- mutex lock은 entry section에서 받고(=entry sections에서 잠가버리고) 받으면 바로 critical section실행
- busy waiting 문제 발생
- 프로세스/스레드가 mutex lock을 받으려고 시도 -> 근데 이미 다른애가 쓰고 있어서 못받음
- 기다려야 함 -> 프로세스/스레드가 mutex 상태가 어떤지 계속 대기하는 방식(계속 cpu 연산을 함) -> 불필요한 cpu 연산이 실행됨
❗️세마포어
- 공유자원에 접근할 수 있는 프로세스/스레드 개수 2개 이상
- 세마포 변수 S 만큼 동시 접근 가능
- S>0이면 critical section에 들어가고 S를 하나 줄인다.
- S==0이면 다른 프로세스/스레드는 critical section에 들어갈 수 없다.(==busy waiting)
- exit section에 들어가면 다시 S를 하나 늘린다.
- DeadLock
- 둘 이상의 프로세스/스레드가 서로 점유하고 있는 자원을 서로 기다리는데, 무한 대기에 빠지는 상황
- 다음 4가지 조건을 동시에 다 만족해야 발생함
- 상호 배제(mutual exclusion) : 한번에 하나의 프로세스/스레드만 자원을 사용할 수 있는 상황
- 점유 대기(hold and wait) : 이미 자원을 할당 받았음에도, 다른 프로세스/스레드가 보유한 자원을 추가 요청하며 대기하는 상황
- 비선점(no preemption) : 다른 프로세스/스레드가 점유하고 있는 자원을 뺏을 수 없는 상황
- 순환 대기(circular wait) : 프로세스(스레드)A는 B가 갖고있는 자원이 필요하고 B는 C꺼가 필요하고 C는 A꺼가 필요한 상황
- 예시
- 해결 방법
- 무시 : 애초에 데드락이 발생할 상황이 적다는 가정하에 데드락 발생해도 무시해버림, 현대에서 많이 사용(현대 시스템에서 데드락 잘안일어나서)
- 예방 : 앞선 4가지 조건 중 하나가 성립하지 않게 함, 보통 순환 대기 조건을 막는 방법이 현실적임, 효율성 별로/비용 큼
- 회피 : 은행원 알고리즘, 자원할당 그래프 알고리즘을 이용해 자원을 할당함
- 탐지-회복 : 시스템 검사를 통해 탐지하고 회복함, 효율성 별로/비용 큼
## 용어 정리
- 원자 연산 : 연산이 시작되면 중단되거나 다른 연산과 중첩되지 않고 완료되는 연산
- 임계 영역 : 둘 이상의 프로세스/스레드가 동시에 동일한 자원에 접근하도록 하는 프로그램 코드 부분, 원자적으로 실행되어야 함
🤔 다음 시간에는 메모리 관리 기법에 대해 자세히 알아보자!