💡 Process란?
- 실행 중인 프로그램(program in execution)을 뜻합니다.
- 즉, 실행파일 형태로 존재하던 program이 memory에 적재되어 CPU에 의해 실행(연산)되는 것을 process라고 합니다.
- Code 영역: 실행한 프로그램의 코드가 저장되는 메모리 영역
- Data 영역:프로그램의 전역변수와 static변수가 저장되는 메모리 영역
- Heap 영역: 프로그래머가 직접 공간을 할당/해제하는 메모리 영역
- Stack 영역: 함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 임시 메모리 영역
💡 Multi process란?
원칙적으로 process는 독립적인 주소 공간을 갖기 때문에, 다른 process의 주소 공간을 참조할 수 없습니다. 하지만 경우에 따라 운영체제는 process간의 자원 접근을 위한 매커니즘인 프로세스 간 통신 (IPC, Inter Process Communication)을 제공합니다.
프로세스간 통신(IPC) 방법으로는 파이프, 파일, 소켓, 공유메모리 등을 이용한 방법들이 있습니다.
우선 동기화 문제를 해결하기 위해 mutex, semaphore 기법 등을 사용할 수 있습니다.
1) Mutex: 1개의 thread만이 공유 자원에 접근할 수 있도록 하여, 경쟁 상황 (race condition)을 방지하는 기법
- 공유 자원을 점유하는 thread가 lock을 걸면, 다른 thread는 unlock 상태가 될 때까지 해당 자원에 접근할 수 없습니다.
2) Semaphore: S개의 thread만이 공유 자원에 접근할 수 있도록 제어하는 동기화 기법
- 정수형 변수 S(Semaphore) 값을 가용한 자원의 수로 초기화하고, 자원에 접근할 때는 S-- 연산을 수행하여 세마포 값을 감소시키고, 자원을 방출할 때는 S++ 연산을 수행하여 세마포 값을 증가시킵니다.
- 이 때, 세마포 값이 0이 되면, '모든 자원이 사용중'임을 의미하고, 이후 자원을 사용하려는 프로세스는 세마포 값이 0보다 커질 때까지 block 됩니다.
둘 이상의 thread가 각기 다른 thread가 점유하고 있는 자원을 서로 기다릴 때, 무한 대기에 빠지는 상황
교착상태가 발생하는 조건은,
deadlock 문제를 해결하는 4가지 방법