프로세스 동기화가 적절히 설계되지 않아, 식사하는 철학자 문제처럼 모든 프로세스가 더 이상 작업을 진행할 수 없는 deadlock(교착상태)에 빠질 수 있다. 단순한 프로그램이 아닌, 운영체제에서 교착상태가 발생하는 것은 다소 치명적이다. 교착상태 필요 조건 Mutual Exclusion : 한 프로세스가 자원을 사용 중이라면, 다른 프로세스는 사용할 수 없다. Hold and Wait : 한 프로세스가 특정 자원을 가진 상태에서 대기에 빠진다. No Preemption : 한 프로세스가 진행 중이라면, 다른 프로세스가 끼어들 수 없다. Circular Wait : 프로세스가 자원 획득을 위해 원형 방향을 이룬다. (식사하는 철학자) 교착 상태는 위의 4가지 조건이 있을 경우, 발생할 가능성이 커지게 된..
Producer - Consumer Problem 특정 프로세스는 데이터를 생산하고, 특정 프로세스는 생산된 데이터를 통해 처리하는 작업과 같이 생성자-소비자가 있는 프로그램에서 발생할 수 있는 문제이다. 만약 생산되지 않은 경우에 데이터를 사용하는 소비자가 데이터를 가져가게 된다면 원치 않는 데이터 (쓰레기 값)을 가져가게 될 가능성이 크다. 따라서 각각의 프로세스(쓰레드)로 부터 생성자 - 소비자가 존재한다면 생성, 소비 순으로 진행될 수 있도록 동기화가 필요하다. import java.util.concurrent.Semaphore; class Buffer { int[] buf; int size; int count; int in; int out; Semaphore mutex, full, empty; ..
프로세스 간의 정보를 주고 받거나, 하나의 공유된 영역을 사용할 경우에는 주의가 필요하다. 예를 들어 프로세스 A는 1번지 메모리 공간에 10이라는 값을 읽어 오고자하였으나, 프로세스 B가 프로세스 A가 읽는 직전에 20이라는 값으로 변경해 버리면 원하지 않는 값이 반환되는 결과가 발생한다. 이렇게 상호적으로 영향을 미치는 프로세스들을 Cooperating Process라고 한다. 이와 반대인 경우 Independent Process라고 한다. 각 프로세스로 인해 공유 데이터의 일관성을 보장하지 못하는 것을 막기 위해 동기화(Synchronization)가 필요하다. 앞서 말한 간단한 예시에서 원치 않는 값을 반환받지 않으려면, 프로세스 A → 프로세스 B의 순서를 보장할 경우 이와 같은 문제를 해결할 ..
프로세스 이전 글에서도 알 수 있듯이 프로세스는 현재 메모리에 적대되어 실행 중인 프로그램을 말한다. 운영체제에 따라 프로세스를 job, task 등으로 부르기도 한다. 프로세스 계층 구조 리눅스는 저장장치로 부터 메모리로 최초 적재 시에는 PID (Process ID : 프로세스를 구분할 수 있는 고유 식별 번호)가 0인 root process가 생성된다. root process는 init process를 생성한다. root process는 최초 생성 후에, 프로세스들을 스케줄링 할 때 swapper의 역활을 한다. init process의 경우 생성된 후, 사용자가 운영체제를 사용할 수 있는 환경을 구성한다. 예제의 프로세스 계층 구조는 depth가 3이지만 depth 2의 프로세스들도 자식 프로세스..