Processes and Threads

preemptive scheduling: HW에 의해 cpu를 뺏기는 scheduling이다.
non-preemptive scheduling: SW에 의해 interrupt가 발생한다. I/O가 오래 걸릴 것 같으면 voluntarily yield한다.

새로운 process가 생기면 os가 그 process의 content를 build한다.
Unix는 부팅 시 0번 프로세스만 생성하고 그 이후는 fork한다.
프로세스 생성할 때는 실행 파일이 os에 전달되고 os가 그 exe를 메모리의 code segment에 로드함으로써 생성한다.
fork가 불리면 그 부른 parent를 stop시키고 context(프로세스가 갖고 있는 자원)를 복사해서 pid만 바꾸고 나머지는 똑같은 child process를 만든다.
fork 뒤에는 exec이라는 system call이 필요하고 exec이 끝나면 exit을 불러서 parent를 깨운다.
Zombie state: exit하고 exit state를 남기고 parent가 그 state를 보기 기다리는 상태이다.

CPU      --->       MMU(Memory Management Unit)       --->       physical memory
      (logical addr.)                                                     (physical addr.)

각 process는 독자적인 address space를 갖는다.
각각 0 ~ 2^(32) -1의 address를 갖지만 각 프로세스의 100번지는 서로 다를 것이다.
proc 0과 proc 1이 소통을 하기 위해서는 file을 사용한다.

-----------------------------------------------------------------------------
server에서 request를 날릴 때 request queue가 있어서 일정 주기마다 request queue에 처리할 것이 있으면 처리한다.

iterative server: 서버가 직접 처리한다. 단순하다.
concurrent server: 처리할 worker process를 fork한다. 그동안 server process는 다른 request를 빼와서 또 fork함으로써 response time이 줄어든다.
Thread도 ready, running, wait state가 있다.
Thread는 stack으로 구현된다. thread = instruction seg = seg of func = stack
multi-threading하면 하나의 process가 여러 stack을 갖게 된다.
user mode일 때는 user stack을 쓰고 kernel mode일 때는 kernel stack을 쓴다.

User-level thread: interrupt를 thread 단위로 forward 시켜주지 못하기 때문에 preemptive scheduling을 할 수 없지만 장점으로는 OS를 고치지 않고도 multi-threading을 할 수 있다. 수행 중 input이 없어 reactive하지 않은 scientific programming에 유용하게 쓰일 수 있다.
Kernel-level thread: thread 생성과 종료를 os가 한다.interrupt forwarding은 가능하지만 extra overhead가 발생한다.
Combined thread: 대부분 user-level thread로 구현이 되지만 interrupt가 왔을 땐 thread로 forwarding함으로써 preemptive가 가능해진다.



댓글

이 블로그의 인기 게시물

논문 정리 - MapReduce: Simplified Data Processing on Large Clusters

논문 정리 - The Google File System

kazoo: Using zookeeper api with python