프로세스의 자원 공유
여러 프로세스들은 운영체제에 의해 별도의 메모리 공간에 할당되기 때문에 다른 프로세스의 변수나 자료구조에 접근, 공유할 수 없다. 하지만
엄밀히 말하면, 가능하다.
우리는 평소 여러 프로그램들을 실행하면서 프로그램 간 정보를 주고받는 것을 볼 수 있었다.
이렇게 프로세스간 자원을 공유하는 방식은 크게 운영체제가 지원하는 방식과 네트워크를 사용하는 방식이 있다.
1. 운영체제가 지원하는 방식
1-1. Shared Memory ( 공유 메모리)

- 공유메모리가 데이터 자체를 보유하며, 프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다.
- 프로세스가 커널에게 공유메모리 요청을 하면 커널은 메모리에 공유메모리 공간을 할당한다.
- 대량의 정보를 다수의 프로세스에게 배포가 가능하다.
1-2. PIPE (파이프)

- 통신을 위한 메모리 공간(버퍼)을 생성하여 프로세스가 데이터를 주고 받게끔 한다.
- 두개의 프로세스를 연결하며, 하나의 프로세는 쓰기만 하고 다른 프로세스는 데이터를 읽기만 하며 통신한다.
- 즉, 단방향 통신, 반이중(Half-Duplex)통신이다.
- 두개의 프로세스 간 읽기/쓰기를 모두 지원하려면 파이프를 두개 만들어야 가능하다.
- 파이프에 용량 제한이 있기 때문에 이용에 제약이 있다.
1-3. Message Queue (메세지 큐)

- 고정 크기의 메시지를 연결 리스트를 통해 통신하는 방식
- 메세지 단위의 통신이며, 메세지 큐 ID를 통해 통신을 한다. 여러개의 프로세스가 동시에 데이터를 다룰 수 있다.
2. 네트워크를 사용하는 방식
2-1. Socket (소켓)

- 네트워크 통신을 통해 데이터를 전송한다.
- 데이터 교환을 위해 양쪽 PC에서 각각 임임의 포트를 정하고 해당 포트 간의 통신을 하는 방식이다.
- 이때 각 PC의 포트를 담당하는 소켓은 각각 하나의 프로세스이다.
- 원격에서 프로세스 간 데이터를 공유할때 주로 사용한다.
- 전이중(Full-Deplex) 통신이 가능하다.
2-2. RPC (Remote Procedure Call)

- 원격지의 프로세스에 접근하여 프로시저 또는 함수를 호출하여 사용한다.
- 원래 프로세스는 자신의 주소공간 안에 존재하는 함수만 호출하여 실행 가능하다. 하지만, RPC를 이용하면 다른 주소공간에서 동작하는 프로세스의 함수를 실행할 수 있게 된다.
- 예를들어 컴퓨터 A에서 '주문하기' 기능을 실행하려는데 이 기능은 컴퓨터 B에 존재한다. 이때 컴퓨터 A는 RPC를 사용해서 컴퓨터 B에 있는 '주문하기' 기능을 실행하고 그에 대한 결과를 받게 된다.
- 이처럼 RPC를 이용하면 다른 프로세스를 활용하여 데이터, 정보를 획득할 수 있다.
그러나 프로세스간 통신 기법은 단순히 CPU 레지스터 교체뿐만이 아니라 공유하는 자원이 없기 때문에 RAM과 캐시 메모리까지 초기화되기 때문에 자원 부담이 크다는 단점이 있다. 따라서 다중 작업이 필요한경우 다중 프로세싱도 가능하지만 다중 스레딩을 이용하는 것이 훨씬 효율적이다.
스레드의 자원 공유
스레드는 프로세스가 운영체제로부터 받은 자원을 이용하는 실행의 단위이다.
프로세스 안에 세부적인 여러개의 스레드가 존재하며 동시에 작업을 한다고 생각하면 된다.
이때 프로세스와의 큰 차이점은 한 프로세스 안에서의 스레드끼리는 자원을 공유할 수 있다.

정확하게는 프로세스의 4가지 영역(Code, Data, Heap, Stack) 영역 중에서, Stack을 제외한 영역의 자원을 공유한다.
왜냐면 각 스레드는 독립적인 별도의 Stack을 가지고 있기 때문이다.

이렇게 자원을 공유하면서 프로그램을 실행하면, CPU 자원의 생성과 관리의 중복성을 최소화하고 효율적으로 수행할 수 있다. 또한 Contect Switching시, 프로세스와 달리 램과 캐시 메모리를 초기화할 필요가 없기 때문에 더욱 빠르다. 따라서 시스템의 처리량이 향상되고 자원 소모가 줄어들어 결과적으로 프로그램 응답 시간이 단축된다.
But 멀티 쓰레딩의 문제점도 존재한다.
멀티 프로세스는 공유하는 자원이 없어서 동일한 자원에 동시에 접근하는 일이 없었지만,
멀티 스레딩은 자원을 공유하기 때문에 다른 스레드가 사용중인 변수나 자료에 접근할때 잘못된 값을 읽어오거나 수정하는 상황이 발생할 수 있다.
그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요하다.
동기화 방법으로는 뮤텍스와 세마포어를 이용한다. 이에 대해서는 다음 포스팅에서 자세하게 다루도록 하자.
References
https://real-dongsoo7.tistory.com/131
RPC(Remote Procedure call)에 대해 알아보자!
RPC란 무엇일까? RPC(Remote Procedure call)이란, 별도의 원격 제어를 위한 코딩 없이 다른 주소 공간에서 리모트의 함수나 프로시저를 실행 할 수 있게 해주는 프로세스간 통신입니다. 즉, 위치에 상관
real-dongsoo7.tistory.com
IPC(Inter-Process Communication)란?
프로세스(Process)의 개요 👀 프로세스(Process)는 프로그램이 구동될 때 주 메모리에 적재되며, 메모리 상에서 실행되는 작업의 단위를 말한다. 즉, 컴퓨터가 연속적으로 실행하고 있는 컴퓨터 프
y-oni.tistory.com
https://change-words.tistory.com/entry/RPC
RPC(Remote Procedure Call) 통신이란?
RPC란? RPC(Remote Procedure Call, 원격 프로시저 호출)는 다른 네트워크에 위치한 컴퓨터에서 실행되는 프로시저나 함수를 로컬 컴퓨터에서 실행하는 것처럼 사용할 수 있게 하는 통신 방식입니다. 쉽
change-words.tistory.com
https://velog.io/@wonseok97/스레드의-동기화-문제와-해결법
스레드의 동기화 문제와 해결법
동기화 문제는 멀티 스레드가 프로세스 내의 같은 자원을 공유함으로써 발생하게 됩니다. 따라서 이러한 문제를 방지하기 위해 스레드들에게 하나의 자원에 대한 처리 권한을 주거나 순서를 조
velog.io
'운영체제' 카테고리의 다른 글
| 자바의 T 메모리 구조에 대해 알아보자. (0) | 2024.10.24 |
|---|---|
| 프로그램들은 어떻게 동시에(?) 실행될까? (0) | 2024.03.04 |
| Process의 구조는 어떻게 되어있을까 (0) | 2024.02.23 |
| Process와 Thread란 무엇일까? (0) | 2024.01.31 |