IPC와 Race Conditon 문제 해결

JACKJACK·2022년 10월 31일
1
post-thumbnail

📝IPC란?

프로세스는 독립적인 주소공간을 가지므로 다른 프로세스의 자원을 참조할 수 없다. 이 때 OS가 프로세스간의 자원 접근을 위해 IPC(Inter Process Communication)을 제공한다. 프로세스간의 통신(IPC)에는 공유메모리(shared memory)와 메시지 전달(message passing)의 두개의 모델이 있다.

  • 공유메모리는 프로세스들이 주소공간을 부분 공유한다. 프로세스가 커널에 공유메모리 할당을 요청하면 다른 프로세스에서 공유메모리에 할당된 데이터를 받아 사용할 수 있다. 대신 같은 메모리를 사용하기 때문에 동기화 문제가 생길 수 있다. 하지만 메모리 할당을 제외하고 kernel의 관여없이 통신할 수 있어 빠르다는 장점이 있어 사용한다.

  • 메세지 전달은 시스템 콜을 사용하며 커널을 통해 send M(message), recieve M의 두가지 연산을 수행한다. 프로세스가 커널에 메세지를 보내면 커널이 recieve 한 다음 다른 프로세스에 send를 수행한다. 메모리를 공유하는것보다는 느리지만 충돌이 일어나지 않는다는 장점이 있다. 하지만 커널을 반드시 거쳐야하기 때문에 공유메모리에 통신이 비해서는 느리다는 단점이 있다.




📝Race Conditon이란?

멀티 프로세스와 멀티 스레드 환경에서 동기화 문제로 생기는 경쟁상태를 Race Condition이라 한다.

동기화 문제로 race condition(경쟁상태)가 생길 경우 해결을 위한 대표적인 두가지 기법이 이는데 바로 mutex, semaphore 기법이다.

  • mutex는 한개의 스레드만 공유자원을 접근할 수 있으며 사용하는 자원에 lock을 걸고 수행이 끝나 unlock이 될 때 다른 스레드가 공유자원을 점유할 수 있다.
  • smaphore는 S개(여러개)의 스레드가 공유자원을 접근할 수 있으며 접근할때마다 변수 S--, 수행이 완료될 때마다 S++를 수행해 S가 0이 될 경우 스레드의 접근을 막는다.

💀DeadLock의 등장

그럼에도 불구하고 생기는 동기화 문제를 DeadLock이라 지칭한다. 여러개의 스레드가 서로 점유하는 지원들을 기다려 무한 대기 상태가 될 때 이를 DeadLock이라고 하며, 순서대로 상호배제, 점유대기, 비선점, 순환대기에 과정 따라 DeadLock이 발생한다.

  1. 상호배제: 자원을 하나의 스레드만 점유할수 있는 상황
  2. 점유대기: 스레드가 자원을 보유하고 다른 자원을 사용해야 기존 스레드가 수행되는 상황
  3. 비선점 : 다른 스레드가 사용중인 자원은 점유할수 없는 상황
  4. 순환대기: 대기중인 스레드들이 순환 형태를 이루며 서로 자원을 무한으로 기다리는 상황

🔑DeadLock의 문제해결법

  1. 무시: DeadLock을 무시하는 방법으로 가장 많이 사용된다.
  2. 예방: 앞서말한 DeadLock의 과정을 예방하는 방법으로 자원의 효율성이 떨어진다.
  3. 회피: 스레드의 자원 요청에 대한 정보를 기록해 순환대기를 없앤다.
  4. 탐지,회복: 시스템을 검사해 DeadLock을 탐지하고 회복하는 방법으로 자원의 효율성이 떨어진다.




💡결론

- 프로세스간의 통신을 IPC라고 하며, IPC에는 공유메모리와 메세지 전달 모델 두가지가 있다.

- 멀티 프로세스와 멀티 스레드에서는 자원을 공유할 때 동기화 문제(Race Condition)를 고려해야한다.

profile
러닝커브를 빠르게 높이자🎢

0개의 댓글