본문 바로가기
CS/computer science

[기술면접] CS 문답 | 멀티프로세스 상세

by 째깍단 2023. 8. 23.

💡 Multi process환경에서 process간에 데이터를 어떻게 주고받는지 설명하시오

 

프로세스는 독립적인 주소 공간을 가지고 있어서 다른 프로세스와 데이터를 주고 받을 수 없다.

멀티 프로세스 환경에서는 이런 문제를 해결하기 위해  IPC(Inter Process Communication)을 제공한다.

 

IPC는 프로세스 간 통신이 가능하게 해주며 크게는 공유 메모리와 메시지 전달 방식으로 나뉘고

메시지 전달 방식은 파이프, 소켓, 메시지 큐 등이 있다.

 

공유 메모리(Shared Memory)

 

공유 메모리 방식은 프로세스들이 주소 공간의 일부를 공유하고 공유된 메모리 영역에 read write하면서 통신하는 방식이다.

메모리는 스택-힙-데이터-코드

공유 메모리를 할당 받으면 스택-힙-데이터-공유메모리-코드 = 메모리 공간에 공유 메모리 공간이 추가됨

 

 

공유메모리 방식의 장단점

  • 👍 IPC 속도가 빠르다
    프로세스 내의 메모리 공간에 공유 메모리 공간이 할당되어 접근이 수월하고 빠름
    공유 메모리 영역이 구축된 후에는 모든 접근이 일반적인 메모리 접근으로 취급,
    커널의 도움없이도 각 프로세스들이 해당 메모리 영역에 빠르게 접근할 수 있다
  • 👎 동기화문제 : 동시에 같은 메모리 접근시 일관성 문제가 생긴다
    서로 다른 프로세스가 동시에 같은 메모리 위치에 접근하면 일관성 문제가 생김
    이 문제에 대해서는 커널이 책임지지 않기 때문에 각 프로세스들이 공유 메모리 접근에 대한 동기화 문제를 책임져야 함

 

공유메모리 형성 과정 : 

1. 프로세스가 공유 메모리 할당을 커널에 요청

2. 커널이 해당 프로세스에 메모리 공간을 할당

 

 

 

 

메시지 전달(Message Passing)

메시지 전달은 공유 메모리와 다르게 무조건 system call(커널)로 데이터를 전달한다

send(message)와 receive(message)라는 두 가지 연산을 제공받는다

 

데이터를 전달함에 있어 중간에 커널이 중개 역할을 하는 것이다.

 

메세지전달의 장단점

  • 👍 동시 접근에 대한 충돌을 회피할 필요가 없어 적은양의 데이터를 교환하는 데 유용하다

  • 👍 구현하기가 비교적 쉽다

  • 👎 커널을 무조건 거쳐야하므로 공유 메모리 보다 속도가 느리다

 

 

메시지 전달 과정 :

  1. 프로세스 A가 프로세스 B에게 보낼 데이터를 커널에 보낸다.
  2. 커널은 프로세스 A한테 온 메시지를 받고 프로세스 B한테 보내준다.

 

대표적으로 pipe, socket, message queue 등이 메시지 전달 방식으로 구현된다.

 

https://hyuuny.tistory.com/153

https://dar0m.tistory.com/233

https://velog.io/@ohju96/Multi-Process-환경에서-Process간-데이터-주고-받는-방법

 

 

 

 

💡 Multi process/thread 환경에서 동기화 문제를 어떻게 해결하나요?

 

프로세스는 메모리에 적재된 프로그램

스레드는 프로세스의 안에서의 실행 흐름

 

서로 다른 스레드가 프로세스의 메모리를 공유하기 때문에 동시에 자원에 접근하는 상황(race condition)이 생기게 되는데 이런 경쟁 상황으로 인해 발생하는 문제가 동기화 문제

 

간단하게 동기화 문제를 해결하기 위한 방법은 스레드들간의 공유자원에 접근하는 것은 한번에 한 스레드만 가능하게 하면 된다.

한번에 한 스레드만 공유자원에 액세스하도록 만들어주면 동기화 문제가 해결된다.

= Mutex(뮤텍스), Semaphore(세마포어) 방법을 사용하여 해결할 수 있습니다

 

뮤텍스는 한 개의 스레드만 공유 자원에 접근할 수 있게 해서 경쟁 상황을 방지하는 것으로

공유 자원을 점유하는 thread가 lock을 걸면, 다른 thread는 unlock 상태가 될 때까지 해당 자원에 접근할 수 없는 기법입니다.

 

세마포어는 지정한 수(S) 만큼의 쓰레드만 공유 자원에 접근할 수 있도록 제어하는 동기화 기법입니다.

정수형 변수 S(세마포) ****값을 가용한 자원의 수로 초기화하고,

자원에 접근할 때는 S-- 연산을 수행하여 세마포 값을 감소, 자원을 방출할 때는 S++ 연산을 수행해 세마포 값을 증가시킵니다.

이 때 세마포 값이 0이 되면 모든 자원이 사용 중임을 의미하고, 이후 자원을 사용하려는 프로세스는 세마포 값이 0보다 커질 때까지 block 됩니다.

 

 

https://velog.io/@ohju96/Multi-Process-Multi-Thread-동기화-해결

https://iksflow.tistory.com/135

 

 

 

 

💡 교착상태(Deadlock)에 대해서 간단히 설명해 주세요.

 

두 개 이상의 스레드가 각기 다른 스레드가 점유하고 있는 자원을 서로 기다리는 경우 무한 대기 상황에 빠지는 것을 말합니다.

 

Q. deadlock은 언제 발생하게 하나요?

 deadlock은 상호 배제(mutual exclusion), 점유 대기(hold-and-wait), 비선점(no preemption), 순환 대기(circular wait)의 4가지 조건이 동시에 성립할 때 발생할 수 있습니다.

상호 배제는 동시에 한 스레드만 자원을 점유할 수 있는 상황,

점유 대기는 스레드가 자원을 보유한 상태에서 다른 thread가 보유한 자원을 추가적으로 기다리는 상황,

비선점은 다른 스레드가 사용 중인 자원을 강제로 선점할 수 없는 상황,

순환 대기는 대기 중인 스레드들이 순환 형태로 자원을 대기하는 상황을 말합니다

 

 

해결방법은?

예방, 회피, 검출, 회복의 네가지 방법으로 해결할 수 있습니다.

교착 상태 예방 : 교착 상태를 유발하는 네가지 조건을 무력화

교착 상태 회피 : 교착 상태가 발생하지 않는 수준으로 자원을 할당

교착 상태 검출 : 자원 할당 그래프를 사용하여 교착 상태를 발견

교착 상태 회복 : 교착 상태를 검출한 후 해결

 

  • 자원 접근 순서를 일관되게 하거나 타임아웃(timeout)을 설정하는 등의 해결 방법

 

https://marmelo12.tistory.com/362