condition Synchronization 만약 쓰레드 A가 쓰레드 B, C의 작업이 다 끝나고 수행되어야 하는, 의존성이 존재하는 쓰레드라고 했을 때 B와 C의 작업이 끝날때 까지 A를 대기시키고, B와 C의 작업이 끝났다는 조건이 충족되면 A가 실행되어야 할 것이다. [Thread-1] int main(int argc, char *argv[]) { pthread_t c; printf("parent: begin\n"); pthread_create(&c, NULL, child, NULL); while (done == 0) { } printf("parent: end\n"); return 0; } [Thread-2] void * child (void *arg) { printf("child\n"); don..
Semaphore 공유된 자원의 데이터 혹은 임계영역(Critical Section) 등에 여러 Process 혹은 Thread가 접근하는 것을 막아줌 (동기화 대상이 하나 이상) semaphore는 특정 임계 구역에 접근할 수 있는 프로세스의 수를 나타내는 변수이다. - mutex와 달리 대기할 프로세스를 레디 큐에 넣는 것이 아니라 block시켜서 스케쥴러의 대상에서 빠지게 만든다. busy wating할 필요가 없어서 cpu 사용효율을 높일 수 있다. 이러한 프로세스의 상태 변경을 sleep - awake 라고 부른다 - semaphore 변수가 0과 1만 사용되면 mutex와 같은 방식의 동기화를 수행한다. 이를 binary semaphore라고 한다. - 0과 1이 아닌 다른 범위의 정수를 se..
경쟁 상태(Race Condition) 다수의 프로세스나 스레드가 공유 자원을 동시에 읽거나 쓰려고 하는 상태를 의미한다. 최종 수행 결과는 프로세스들의 수행 순서에 따라 달라진다. 싱글프로세서에서 race condition 싱글 프로세서에서 stack1에 쓰레드1, stack2에 쓰레드2가 진행된다고 했을 때 아래 그림의 전역변수 counter에 접근한다고 한다면 counter는 2가 되어야 할 것이다. 아키텍쳐마다 다르지만 counter++명령이 밑의 3개의 작업으로 이루어진다고 했을 때 쓰레드 A에서 전역변수 counter를 로드한 시점에 스케쥴러에 의해 쓰레드 B가 실행되고 counter++작업을 마쳤다. 다시 쓰레드 A로 돌아가서 작업을 할때는 이미 load된 counter값인 0에 1을 더하고..
멀티 프로세서의 발전 - 처리기가 늘어남에 따라 어떤 프로세스에 어떤 처리기를 할당할지 복잡해짐 주요 이슈 cache affinity (친화력) - 특정 프로세서에서 실행된 프로세스는 가능하다면 계속 동일한 프로세서에 할당함 Concurrency (병행성) 여러 프로세서에 프로세스를 할당하기 위해 레디큐(싱글 큐라고 가정)에 동시 접근하여 프로세스를 불러올 때 생기는 문제를 해결 Shared data를 이용할 때 생기는 문제 -> race condition 공유자원에 대해서 한번에 한번씩 접근하게 하는 기법 -> mutual exclusion (ex: 동기화, 데드락) SQMS(single-queue multiprocessor scheduling) 각 cpu가 단순히 전역적인 싱글큐에서 프로세스를 선택하..
long term schesuling - job scheduler - 프로세스가 시스템에 들어갈지 말지 결정 medium term scheduler - swaper - disk에 존재하는 어떤 프로세스를 메인 메모리에 올릴 것인지 결정 short term scheduler - cpu scheduler - 어떤 프로세스가 cpu를 사용하여 실행될 것인지 결정 i/o scheduling - 어떤 프로세스가 i/o request에 대해 pending 될 것인지 결정 short term scheduler 단계에서 실행되는 스케쥴링이 흔히 말하는 CPU Scheduling이다. 밑의 내용은 CPU Scheduling을 설명한 것이다. CPU Scheduling에는 어떻게 프로세스 스위치 하냐에 따라 다양한 방식이..
1. 새로운 메모리 공간 할당 2. 1의 공간에 프로세스 로딩 및 콜 스택 생성 3. 해당 PCB 초기화 4. 준비큐에 프로세스 넣기(실행 가능) 다른 프로세스를 생성하는 프로세스를 부모 프로세스(Parent Process)라 하고, 다른 프로세스에 의해 생성된 프로세스를 자식 프로세스(Child Process)라 한다. 프로세스의 부모-자식 관계들은 트리의 형태로 나타나게 된다. 대부분의 운영체제에서는 프로세스들을 구별하기 위해 각 프로세스들에게 유일성을 가진 정수 PID(Process Identifier)를 부여한다. 일반적으로, 프로세스는 CPU time, 메모리, 파일, 입출력 장치 등의 자원이 필요하다. 따라서 어떤 프로세스가 다른 프로세스를 하나 생성하면, 생성된 프로세스는 운영체제로부터 직접..
Process Model Two state model 시분할 시스템에서, 프로세스는 주어진 time slice 동안 processor를 점유하여 running 상태로 변하고 할당이 끝나면 다시 not running 상태로 바뀝니다. 이렇게 프로세스의 상태를 두가지로 나누어 설명하는 것을 Two-State Process Model 이라고 부릅니다. dispacher는 scheduler 역할로 각 프로세스의 time slice에 맞게 프로세스 스위치를 해줍니다. 위 그림을 보면, ready queue에서 우선순위가 높은 프로세스를 dispatcher가 프로세서에 넘기는 것을 볼 수 있습니다. 하지만 two state process model은 A라는 프로세스가 실행 도중에 I/O request가 발생해서 n..
Stack Memory - user level process 프로그램이 디스크에서 메모리에 올라와 실행가능해지면 프로세스 그러기 위해선 stack 필요 실행 순서를 정하기 위해서 excution sequence 여러 프로세스가 메모리 상에 존재하려면 프로세스마다 CPU에 데이터를 보내줄 주소가 필요한데 CPU는 매번 작업하는 프로세스를 바꾸므로 바꾸기 전 사용했던 주소들과 레지스터 상태들을 저장할 필요가 있다. 그걸 메모리 한 곳에 존재하는 stack이란 공간에 저장하게 된다. 레지스터에 저장하기엔 공간이 부족하다. (프로세스의 리턴 address가 무한히 늘어날 수 있음, 각종 프로세스의 레지스터 상태값) 위 예시를 보면 stack에 존재하는 정보들 중 하나인 return address 관점에서 sta..