일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 스트림
- 스프링
- 쿠버네티스
- MSA
- gradle
- redis
- spring
- IntellJ
- GC
- K8s
- Stream
- Real MySQL
- Java
- 백준
- thread
- 토비의 스프링
- mysql
- 자바 ORM 표준 JPA 프로그래밍
- 자바
- list
- 이스티오
- JPA
- jvm
- 보조스트림
- Kotlin
- OS
- SpringBoot
- Stack
- 토비의 스프링 정리
- Collection
- Today
- Total
인생을 코딩하다.
[OS] 프로세스 간 통신(Inter-Process Communication,IPC) 본문
독립적인 프로세스는 데이터를 공유할 일도 없고, 메시지를 주고 받을 일도 없기 때문에 문제가 발생하지 않는다.
그냥 따로 메모리 영역을 가지고 있고, 자기 일을 자기가 알아서 한다.
이럴 경우에는 CPU 스케쥴링을 잘해주면 영향을 안 미치고 자기들끼리 잘 공존한다.
하지만 문제는 협력적인 프로세스일때 문제가 발생한다.
우선 프로세스 간의 협력이 필요한 이유는
- 정보 공유 (Information sharing) : 여러 사용자가 동일한 정보를 필요로 할 수 있다.
- 계산 가속화 (Computation speedup) : 특정 작업(task)를 빠르게 실행하기 위해, 해당 작업을 부분 작업(서브 태스크)으로 나눠서 병렬로 실행하게 할 수 있다.
- 모듈성 (Modularity) : 특정한 시스템 기능을 별도의 프로세스(스레드)로 구분하여 모듈식 형태로 시스템을 구성할 수 있다.
- 편의성 (Convenience) : 여러 사용자들이 동시에 많은 작업을 수행할 수 있다.
4가지로 볼 수 있다.
하지만 부모 프로세스와 자식 프로세스간에 메시지를 주고받을 때 서로 공유하는 상황이기 때문에 문제가 발생한다.
즉, 프로세스들간의 데이터를 공유하고 메시지를 주고 받을 때 문제가 생기고, "이것을 어떻게 해결할 것인가?"에 관한 것이 IPC라고 할 수 있다.
프로세스 간 통신(Inter-Process Communication, IPC)란?
- 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
- 각 프로세스는 자신의 독립적인 메모리 공간을 가지고 보호하기 때문에 별도의 매커니즘이 필요하다.
IPC Model 세 가지가 있다.
1. shared memory
2. message passing
3. Semaphore
1. shared memory(공유 메모리) : 공유 메모리를 이용해서 데이터를 주고 받는 방법.
- 특징 : IPC를 위해 공유 메모리 영역을 구축하고, 공유 영역을 통해 자원이나 데이터를 주고받는다.
- 장점 : 커널 의존성이 낮기 때문에 속도가 빠르다. 유저 레벨에서 IPC가 가능하기 때문에, 통신이 자유롭다.
- 단점 : 자원과 데이터를 공유하기 때문에 동기화 이슈가 발생한다. 유요한 데이터를 잘 전달하기 위해서는 동기화 기술 필요
공유 메모리 세그먼트
- 공유 메모리는 프로세스의 힙과 스택 사이에 존재한다.
- 공유 메모리를 생성하는 프로세스의 메모리 공간에 위치
- 다른 프로세스는 자신의 주소에 연결
프로세스들 사이의 공유 메모리 사용 조건
- 메모리 보호 제약을 해제
- 동일한 위치를 동시에 쓰지 않도록 보장(동기회)
- 공유 메모리를 버퍼로 활용하여 정보를 생성하고 소비, 동기화가 필수
공유 메모리 생성
동일한 키를 알고 있는 프로세스들끼리 공유 메모리를 생성
2. message passing(메시지 전달) : 메시지를 주고 받는 방법
- 특징 : IPC를 위해 커널을 통해 메시지를 전달하는 방식으로 자원이나 데이터를 주고받는다. 구현이 간단하고 적은 양의 데이터 전달에 적합
- 장점 : 별도로 다른 것을 구축할 필요 없이 커널을 이용하기 때문에 구현이 비교적 쉽다.
- 단점 : 커널을 이용하기 때문에, 시스템 콜(System call)이 필요하며 이로 인해 오버헤드가 발생한다. 매번 커널을 통하여 정보/메세지를 전달하기 위해 두 번 복사(매번 시스템 호출 사용)
- 종류 : 파이프, 시그널, 메시지 큐, 소켓 등
message passing은 프로세스가 자원을 직접 공유하지 않고 통신하고 운영체제가 통신과 동기화의 메커니즘을 제공한다.
커널이 데이터 주고 받는 것을 관리할 수 있기 때문에 데이터를 주고 받는 상황을 컨트롤 할 수 있다.
그래서 별도의 동기화 메커니즘 없이도 두 프로세스가 정확한 위치에서 준 데이터를 받아갈 수 있도록 컨트롤 할 수 있다.
기본적인 두가지 연산
- send(message), receive(message), channel(채널)이라고 볼 수 있다.
- 메시지의 크기는 고정될 수도 가변적일 수도 있다.
커널이 send와 recive를 제공한다. 이 때 단점 두 가지는
- 커널을 제공하기 때문에 커널을 거치기 떄문에 데이터 복사가 일어나서 느려지는 것과
- send라는 것을 사용하기 때문에 메모리를 무한정 줄 수 없고 channel(채널)의 크기 만큼만 줄 수 있다.
send/receive 연산을 수행하는 방법
- 직접 / 간접 통신
- 동기식 / 비동기식 통신
- 자동 / 명시적 버퍼링
메시지 전달 모델
파이프 (Pipe)
- 특징 : 하나의 프로세스가 파이프를 통해 다른 프로세스로 메시지를 직접 전달하는 방식
- 파이프는 두 개의 프로세스를 연결하게 되고, 하나의 프로세스는 데이터를 쓰기만, 다른 하나는 데이터를 읽기만 할 수 있다. 한쪽 방향으로만 통신이 가능한 파이프의 특징 때문에 Half-Duplex(반이중) 통신이라고 부르기도 한다.
- Half-duplex(반이중) 방식이기 때문에, 데이터는 한쪽 방향으로만 이동한다. 양방향 통신을 하기 위해서는 두 개의 파이프가 필요하다.
- 파이프에 용량 제한이 있기 때문에 이용에 제약이 있다.
시그널 (Signal)
- 특징 : 프로세스 ID를 통해 특정 프로세스에게 메시지를 전달하는 방식
- 시그널 ID에 따라 어떤 이벤트인지 알 수 있다.
메시지 큐 (Message Queue)
- 특징 : 고정 크기의 메시지를 연결 리스트를 통해 통신하는 방식
- 메시지 단위의 통신이며, 메시지 큐 ID를 통해 통신을 한다. 여러개 의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
소켓 (Socket)
- 특징 : 네트워크 상에서 프로세스 간에 통신하는 방식
- Local 뿐만 아니라, Remote 통신이 가능하다.
3. Semaphore(세마포어) :
프로세스 간 메시지를 전송하거나, 공유메모리를 통해 특정 데이터를 공유하게 되는 경우 문제가 발생할 수 있다
프로세스간 메시지 전송을 하거나, 혹은 Shared Memory를 통해서 특정 데이타를 공유하게 될 경우 발생하는 문제가
공유된 자원에 여러개의 프로세스가 동시에 접근하면 안되며, 단지 한번에 하나의 프로세스만 접근 가능하도록 만들어줘야 할 것이며, 이 때 사용되는 것이 Semaphore이다.
즉, 공유된 자원에 여러 개의 프로세스가 동시에 접근하면서 문제가 발생하는 것으로써 공유된 자원 속 하나의 데이터는 한 번에 하나의 프로세스만 접근할 수 있도록 제한해 두어야 하는데, 이를 위하여 고안된 것이 바로 Semaphore 세마포어다. 상호배제 원리를 보장하는 알고리즘이다.
- 공유 리소스에 접근할 수 있는 최대 허용치 만큼 동시 사용자 접근을 할 수 있게 하는 기술
- 동기화 대상이 여러 개일 경우 사용
세마포어를 통한 리소스 공유
1. 리소스 공유 메커니즘
- N개의 태스크와 M개의 리소스 공유 시, 세마포어(계수형) 초기 값을 N개로 설정
2. 리소스 공유 절차
- 태스크가 세마포어를 획득해도 뮤텍스를 획득해야 리소스 접근 가능
3. 세마포어를 이용한 태스크간 동기화 방법
- 태스크 간 동기화는 여러 태스크가 공유 자원에 접근할 경우 동일한 값을 얻을 수 있도록 조정(Sync)
- 계수형 세마포어의 경우 태스크A 전처리 결과에 따라 계수 증가, 태스크는 누적된 계수만큼 처리
참고 문헌 :
https://rebas.kr/854 [PROJECT REBAS]
www.youtube.com/watch?v=BW3Cr0-MFxE
'OS' 카테고리의 다른 글
[OS] 커널 수준의 쓰레드 vs 사용자 수준의 쓰레드 (0) | 2021.04.07 |
---|---|
[OS]인터럽트(interrupt) (0) | 2021.04.06 |
[OS]context switching (0) | 2021.02.06 |
OS 정리 (0) | 2020.09.12 |