프로세스는 시스템 내에서 독립적으로 실행되기도 하고 서로 통신을 하며 데이터를 주고받고 협업을 하기도 한다. IPC에는 같은 컴퓨터 내에 있는 프로세스뿐만 아니라 네트워크로 연결된 다른 컴퓨터에 있는 프로세스와의 통신도 포함된다.
메모리를 사용한 PIPE이며 구조체 기반으로 통신을 한다. 메시지 큐에 쓸 데이터에 번호를 붙임으로써 여러 개의 프로세스가 동시에 데이터를 쉽게 다룰 수 있다.
시스템 상의 공유 메모리를 통해 통신한다. 프로세스는 자신만의 메모리 영역을 갖고 있는데, 이 메모리 영역은 다른 프로세스가 접근해서 함부로 데이터를 읽고 쓸 수 없도록 커널에 의해 보호되는데 만약 다른 프로세스가 침범하려하면 커널은 침범 프로세스에 경고 시그널을 보낸다.
프로세스의 고유 메모리 영역은 반드시 보호되어야 하지만, 메모리 영역에 있는 데이터를 다른 프로세스도 사용할 수 있도록 해야하는 경우가 있을 것이다. 스레드 처럼 메모리 영역을 공유한다면 더 간단하게 데이터를 사용할 수 있게 된다.
공유 메모리는 프로세스 간 메모리 영역을 공유해서 사용할 수 있도록 허용한다. 프로세스가 공유 메모리 할당을 커널에 요청하면 해당 프로세스에 메모리 공간을 할당해 주고 이후 어떤 프로세스도 해당 메모리 영역에 접근이 가능하다. 중개자 없이 곧바로 메모리 접근이 가능하므로 IPC 중 가장 빠르다고 볼 수 있다.
세마포어는 프로세스 간 데이터를 동기화하고 보호하는데 그 목적을 둔다. 공유 메모리를 통해 특정 데이터를 공유하게 될 경우 여러 프로세스가 특정 데이터에 동시에 접근할 수 있게 된다. 여기서 세마포어는 한번에 하나의 프로세스만이 접근할 수 있도록 제어한다.
메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기 라고 표현하고 그렇지 않은 경우에 대해서 비동기 라고 표현한다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking되어 있다는 것을 의미한다. 비동기의 경우, blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.
동일한 자원을 동시에 접근(공유하는 변수, 동일한 파일 접근)하는 작업을 실행하는 코드 영역을 임계영역이라고 한다.
생산자-소비자 문제에서는 생산자의 프로세스와 소비자 프로세스가 서로 독립적으로 작업한다. 생산자는 물건을 계속 생산하여 버퍼에 넣고 소비자는 계속 버퍼에서 물건을 가져온다. 버퍼는 작업을 계속하기 위해 원형 버퍼를 사용하고 버퍼가 비었는지 가득 찼는지 확인하기 위해 count(현재 버퍼 안의 요소 개수)이라는 전역변수를 사용한다.
이 문제에서는 생산자 코드와 소비자 코드가 다음과 같이 동시에 실행되면 문제가 발생하게 된다. 왜냐하면 생산자와 소비자가 전역변수 count에 접근하는 타이밍을 서로 맞추지 않았기 때문이다.
- 생산자가 물건 하나를 버퍼 4에 저장, count를 4로 바꿔야하지만 아직 못바꿈
- 소비자가 물건 하나를 소비, count를 2로 바꿔야하지만 아직 바꾸지 못함
- 이 상태에서 생산자의 count++과 소비자의 count--이 거의 동시에 실행되면 문제가 발생함. 생산자와 소비자가 독립적이므로 상대방이 count를 바꾸려는 것을 모른 채 현재 상태인 count=3을 읽어 작업하게 됨.
- 미세한 시간 차를 두고 count++, count-- 또는 count--, count++ 순서로 실행하면 count의 값은 2나 4가 됨
상호배제(Mutal exclusion) : 프로세스 P1이 임계영역에서 실행중이라면 다른 프로세스는 임계영역에 들어갈 수 없다. 임계영역 내에는 한 번에 하나의 프로세스만 존재해야 한다.
진행(Progress) : 임계영역에서 실행중인 프로세스가 없고 별도의 동작이 없는 프로세스들만 임계영역 진입 후보로서 참여할 수 있다. 임계영역이 비어있다면 언제든 사용할 수 있어야 하며, 한 프로세스가 다른 프로세스의 진행을 방해해서는 안된다.
한정된 대기(Bounded waiting) : 프로세스 P1이 임계영역에 진입 신청후 받아들여질 때까지 다른 프로세스들이 임계영역에 진입하는 횟수는 제한이 있어야 한다. 즉, 특정 프로세스가 임계영역에 진입하지 못하면 안된다.
- Race condition : 여러 프로세스가 공유 자원에 동시에 접근할 시 실행 순서에 따라 결과가 달라질 수 있는 상황을 말한다.