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의 프로세스들도 자식 프로세스..
CPU라는 하드웨어 자원을 여러 프로세스들이 효율적으로 사용하기 위해, 스케줄링 과정이 필요하다. 다음에 실행할 프로세스를 선택하는 알고리즘을 통해 스케줄링을 하게 된다. 상황에 따라 효율적인 CPU 스케줄링이 오히려 성능 감소를 야기 할 수 도 있다. Scheduling Critria CPU 스케줄링의 효율성을 판단하는 기준은 다음과 같다. CPU Utilizaiton Throughput Turnarround Time Wating Time Response Time Preemptive VS Non-Preemptive 다양한 CPU 스케줄링을 알기에 앞서 선점(Preemptive), 비선점(Non-Preemptive) 방식에 대한 이해가 필요하다. Preemptive 선점은 말그대로 특정 프로세스가 CPU..