프로세스 동기화

서로 다른 프로세스가 공유 자원에 접근하면 여러 문제가 생길 수 있다.

먼저 프로세스 간의 통신 방법에 대해 알아보고 여러 문제란 무엇인지, 동기화는 무엇이고, 어떻게 동기화 하는지 알아보자.

 

프로세스 간 통신

 

IPC, Inter Process Communication

프로세스와 프로세스가 데이터를 주고받을 수 있는 통신 방법

 

종류

 

  • 공유 메모리나 공유 파일을 이용한 통신
  • 파이프를 이용한 통신
  • 소켓을 이용한 통신

 

공유 데이터와 파이프를 이용한 통신은 단방향 통신이기 때문에

데이터는 보내는 작업과 받는 작업을 하는 공유 메모리 2개 혹은 2개의 파이프가 필요하다.

반면에, 소켓은 양방향 통신을 지원한다.

 

공유 메모리를 사용하는 통신의 가장 큰 문제는 상대방이 언제 데이터를 보내는지 알 수 없다는 점이다.

따라서 공유 메모리에 계속해서 접근하여 확인할 수밖에 없다. 이를 바쁜 대기(busy waiting)이라 한다.

컴퓨팅 자원을 계속해서 사용하기 때문에 매우 비효율적이다.

 

파일을 이용한 통신

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

int main() {
	int fd;
    char buf[5];
    
    fd = open("test.txt", O_RDWR);
    
    write(fd, "test", 5);
    read(fd, buf, 5);
    
    close(fd);
    exit(0);
}

위 코드를 실행하는 프로세스가 입출력 관리 프로세스에 test.txt 파일 읽기, 쓰기, 닫기를 요구한다.

운영체제의 관점에서 보면 두 프로세스 간의 통신이라고 할 수 있다.

 

파이프를 이용한 통신

위 그림은 두 프로세스가 파이프를 이용해 통신하는 과정을 나타내고 있다.

그림에 나타나 있듯이, 주로 fork()로 만들어진 부모와 자식 프로세스 통신에 사용되며 형제 프로세스 간의 통신에도 사용된다.

 

소켓을 이용한 통신

 

소켓은 프로세스 간의 통신을 지원하지만, 시스템자원을 많이 사용하기 때문에 한 컴퓨터 내부에서 사용되지는 않는다.

주로 인터 네트워크로 연결된 컴퓨터 간의 프로세스 통신에 사용된다.

 

소켓을 이해하기 위해 간단하게 네트워킹 과정을 말하자면,

통신하기 위해서 상대방의 IP로 데이터를 전송한다.

목적지의 디바이스에 다양한 프로세스가 존재하기 때문에, 이를 특정하기 위해서 포트번호를 같이 전송한다.

이 때, 여러 클라이언트와 통신할 수 있도록 소켓을 열어, 클라이언트와 서버의 멀티 소켓에 하나씩 연결된다.

 

공유자원과 임계구역

 

공유자원은 여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일 등을 말한다.

공유자원은 이용되는 순서에 따라 결과가 달라질 수 있다.

예를 들어, 전역 변수로 예금 10만원이 있고 두 프로세스가 예금에 5만원과 10만원을 입금하는 상황을 가정하자.

첫 프로세스가 예금을 확인하고 타임아웃되어 다음 프로세스로 넘어갔다면,

두 프로세스 모두 예금에 있는 10만원을 조회한다.

문제는 두 프로세스가 각각 동작하여 두 번째 프로세스가 10만원을 입금하여 20만원을 처리하였지만,

다시 첫 프로세스가 10만원에 5만원을 더한 15만원으로 갱신하면 우리가 기대하는 25만원이 아니게 된다.

 

이런 상황을 2개 이상의 프로세스가 공유 자원에 접근했다하여 경쟁 조건(race condition)이라 한다.

공유 자원 접근 순서에 따라 결과가 달리지는 영역을 임계구역(critical section) 으로 설정하여 다루게된다.

추가로, 동기화란 병행 컴퓨팅(Concurrency) 환경에서 여러 프로세스 또는 스레드 간의 작업을 조정하여 일관된 동작을 보장하는 것이다.

이는 공유된 자원에 대한 접근을 조절하고, 경쟁 조건과 같은 문제를 방지하기 위해 사용된다.

 

임계 구역을 해결하는 여러 방법은 다음의 3가지 조건을 만족해야 유의미하다.

  • 상호 배제: 한 프로세스가 임계구역에 들어가면 다른 프로세스는 임계구역에 들어갈 수 없다.
  • 한정 대기: 어떤 프로세스도 임계구역에 진입하지 못하여 무한 대기하지 않아야 한다.
  • 진행의 융통성: 한 프로세스가 다른 프로세스의 진행을 방해해서는 안 된다.

 

임계구역 해결

 

가장 단순한 방법은 잠금을 사용하는 것이다.

그러나, 각 자원에 대해 공유 변수 lock(잠금)을 사용하는 방법도 여러 문제가 생길 수 있다.

첫 째로, 한 프로세스가 공유 자원에 접근할 수 있음을 확인한 채 타임아웃되면 상호 배제의 조건을 만족하지 못한다.

둘 째로, 우선적으로 잠그고 접근을 확인하도록 수정하면 위 문제가 해결될 수 있지만, 접근하는 프로세스들이 잠그기만 하고 타임아웃되는 문제가 생길 수 있다.

마지막으로, 접근하고자 하는 모든 프로세스들이 번갈아 쓰도록 하는 방법은 다른 문제는 해결했지만 사용하지 않을 프로세스를 위해서 계속 잠금을 풀어야하는, 진행의 융통성 문제를 가져온다.

 

또 다른 해결 방법으로 피터슨 알고리즘과 데커 알고리즘이 있지만

바쁜 대기의 문제와 여러 프로세스가 접근할 때의 복잡성으로 사용되지 않는다.

 

세마포어

 

세마포어는 프로세스나 스레드 간에 공유된 자원에 대한 접근을 제어하기 위한 동기화 기법이다.

 

일반적으로 정수형 변수로 구현되며, 이 변수는 두 가지 연산을 지원한다. (wait와 signal 혹은 P와 V)

wait 연산은 세마포어의 값을 1 감소시키고, 값이 0보다 작으면 호출자를 대기 상태로 전환한다.

signal 연산은 세마포어의 값을 1 증가시키고, 대기 중인 다른 프로세스나 스레드를 깨운다.

 

세마포어는 다양한 동기화 문제를 해결하는 데 사용된다.

예를 들어, 생산자-소비자 문제, 리더-라이터 문제 등에 활용될 수 있다.

 

 

참고

쉽게 배우는 운영체제 2판 - 한빛아카데미

https://w3.cs.jmu.edu/kirkpams/OpenCSF/Books/csf/html/Pipes.html

https://www.baeldung.com/cs/os-busy-waiting

https://medium.com/swlh/getting-started-with-unix-domain-sockets-4472c0db4eb1

'컴퓨터과학' 카테고리의 다른 글

[전공 복습] 1-1. 운영체제  (1) 2024.03.13
[컴퓨터 네트워크] ICMP  (0) 2024.03.12
파이썬 정리 (2)  (1) 2024.01.07
파이썬 정리 (1)  (0) 2024.01.07
[소마] 블록체인 멘토링  (0) 2024.01.07