Deadlock 모든 프로세스가 대기하는 상태, Waiting Thread가 상태를 다시 바꿀 수 없는 상태 데드락은 반드시 아래 4가지 조건을 모두 만족해야한다. 하나라도 만족하지 않으면 발생하지 않는다. Mutual Exclusion Hold and Wait No Preemption Circular wait Deadlock Prevention 네가지 조건 중 하나를 막는 방법으로 단점이 너무 많다. 모드 리소스가 공유가 불가능하게 한다. Thread가 어떤 요청을 받으면 가지고 있던 리소스를 전부 버리고 다른 요청을 처리한다. 선점형으로 만든다. -> 다른 프로세스가 리소스를 가지고 있다면 리소스를 뺐는 방법 리소스 선점을 순서를 선형으로 부여하자. Deadlock Avoidance Request를 ..
동기화 문제 Bouded Buffer Problem (= Producer Consumer Problem) 버퍼가 비어있을 때 소비자가 기다려야하고, 버퍼가 가득 찼을 때 생산자가 기다려야한다. 이러한 문제를 해결하기 위해 Semaphore full, empty를 사용하여 비어있지 않은 버퍼의 개수와 비어있는 버퍼의 개수를 파악하고 각 상황에 맞게 생산자와 소비자가 접근할 수 있다. 이때 추가적으로 Critical Section에 대한 권한을 주기 위해 Mutex를 사용한다. 아래 예시를 보면 생성자는 empty가 1이상 있을 때 wait에서 빠져나와 Mutex를 통해 진입하여 작업을 실행한다. 반대로 소비자는 버퍼에 1개 이상 값이 들어있을 때 접근할 수 있다. Readers Writers Problem..
프로세스 동기화 여러 개의 프로세스가 데이터를 공유할 때 무결성을 유지해야한다. 예를 들어 P1과 P2가 공유 데이터를 사용할 때 아래와 같은 명령을 번씩 실행한다면, +1 -1이기 때문에 count의 값은 변화가 없어야한다. 하지만 count의 초기값이 0이라고 가정했을 때, P1과 P2가 count가 0일 때 동시에 접근한다면? 3번 라인이 실행될 때 count는 1이 됐다가 P2에 의해 -1이 될 수 있다. 1번씩 실행됐음에도 실행 결과가 바뀌었다. 동기화란 멀티 프로세싱에서 이와 같은 문제를 해결하기 위해 동시에 여러 프로세스가 접근해야하는 공유 데이터를 동시가 아닌 순차적으로 접근하도록 만드는 방법이다. Race Condition 여러 개의 프로세스에서 동시에 같은 데이터에 접근하려고 하는 상황..
Scheduling Ready 상태에 있는 프로세스들 중 언제, 어떤 프로세스에게 CPU를 할당시킬 것인지 정하는 것 Scheduling을 통해 여러 프로세스를 왔다갔다하며 CPU를 최대로 활용할 수 있다. scheduling은 Kernel Thread에서 실행된다. Preemptive vs Non-Preemptive (선점형, 비 선점형 ) Preemptive: 스케줄러에 의해 실행 중인 프로세스의 CPU 할당을 헤제할 수 있다. Non Preemptive: 프로세스가 작업을 마치고 릴리스될 때까지 CPU 할당을 유지한다. CPU 스케줄링 결정 Running -> waiting (I/O 발생) runnging -> ready (다른 프로세스 할당) waiting -> ready (I/O가 끝남) ter..
멀티 스레딩 코드와 데이터 영역을 공유하기 때문에 shared memory가 따로 필요하지않고 생성 리소스도 훨씬 작고, context switching 비용도 적게든다. 전체적으로 리소스 효율이 좋고 확장성도 좋다. 또한 프로세스에 대한 요청을 처리할 때 스레드를 생성해서 non-blocking으로 빠르게 처리할 수 있다. 멀티 코어 프로그래밍 이전에 공부했던 멀티 프로그래밍은 여러 개의 프로그램이 동시에 돌아가는 것 처럼 보이는 방법이었다. 하지만 멀티 코어 프로그래밍은 코어가 여러 개이기 때문에 실제로 동시에 프로그램을 실행할 수 있다. 이러한 방법을 병렬 실행 Parallel execution이라고 한다. 동시 실행을 할 경우의 문제. 어떤 작업을 병렬로 작업할 수 있는가? 작업을 동시에 처리해야..
프로세스의 생성 UNIX 기반 OS에서는 fork() system call을 호출해서 프로세스를 생성한다. fork()는 자식 프로세스를 생성하는 system call이기 때문에 부모 프로세스의 주소 공간을 복사한다. fork()한 이후 부모 프로세스를 진행할 수도 있고, 자식 프로세스가 종료되는 것을 wait()할 수도 있다. wait()를 호출하면 자식 프로세스가 종료될 때까지 블록 상태로 기다렸다가 종료되면 블록이 풀린다. 프로세스 생성 횟수 fork()를 n 번 했을 때 생성된 프로세스도 다음 fork() 내용을 수행하기 때문에 총 실행되는 프로세스의 수는 2^n이 된다. IPC 동시에 여러 프로세스가 실행될 때 프로세스는 독립적으로 실행될 수도 있고, 서로 협력하여 실행할 수도 있다. Indep..