프로그램이 실행중인 상태.
디스크에 코드같은 정적 데이터를 가진 프로그램이 메모리에 올라가면 프로세스가 된다.
blocked
된 원인을 제거하면 준비 상태가 됨.PCB
정보를 제외한 모든 자원들은 반납된 상태.PCB
정보 수집을 완료하면 프로세스가 완전히 끝남.interrupt clock
하나의 프로세스가 프로세서를 독점하지 않도록 인터럽트 클록이라는 시간을 두어 그 시간동안만 프로세서를 점유하게 한다.
타임아웃이 되어도 프로세스가 종료되지 않으면 실행상태에서Ready
상태가 되고, 준비 큐의 첫 번째 프로세스가 실행된다.프로세스 스케줄러
PCB에 있는 우선순위를 이용하여 준비 큐의 프로세스의 순위를 변경한다.
사용자 프로그램이 운영체제에게 시스템 콜로 프로세스 생성을 요청해야함. 프로세스는 자원을 필요로 하는데 운영체제로부터 받거나 부모와 공유함. 부모의 주소 공간을 복사(fork
)해서 자식 프로세스를 생성함. 자식은 그 공간에 새로운 프로그램을 올림. 그러나 좀 더 효율적인 일부 운영체제에서는 COW(Copy-On-Write) 방식을 이용하는데 이 방식은 먼저 자식이 부모의 자원을 복사하지않고 같이 사용하다가 부모와 달라질때, 즉 wirte 될 때 부모의 자원을 복사함.
프로세스가 마지막 명령을 수행한 후 운영체제에게 알려줌.
부모 프로세스가 종료(kill)되면 그 아래 있는 모든 자식 프로세스도 종료된다.
프로세스는 보통 독립적이여서 서로의 수행에 영향을 미치지 못함. 그러나 예외적으로 협력이 필요할 때가 있는데 그럴 경우 협력 매커니즘(IPC, Interprocess Communication)이 있음.
프로세스가 운영체제에게 알려주기 위해 프로세스마다 갖고있는 정보.
즉, 커널이 PCB
를 갖고 있음.
외부에서 예상치 못한 이벤트가 발생함을 알리는 것.
프로그램이 실행되어 어디까지 실행되었는지 CPU 수행 상태를 나타내는 하드웨어 문맥.
이러한 모든 것들을 프로세스 문맥이라고 함. 이렇게 프로세스 문맥을 기록해놓는 이유는 CPU는 보통 time sharing으로 작업을 진행하기 때문에 시간이 지나 다음 작업으로 넘어갔어도 다시 돌아왔을 때 처음부터 시작하지 않고 프로세스 문맥을 참조해서 이전에 진행했던 부분 이후 부터 실행할 수 있기때문.
CPU를 한 프로세스에서 다른 프로세스로 넘겨주는 과정.
문맥 교환이 일어나면 오버헤드가 발생함.
CPU를 내어주는 프로세스의 상태를 그 프로세스 PCB에 저장.
CPU를 새롭게 얻는 프로세스가 이전에 어디까지 작업했는지 알기위해 PCB를 읽어옴.
그렇다고 system call이나 interrupt가 발생했다고 무조건 문맥 교환이 일어나는 것은 아님.
예를 들어, 프로세스 A가 CPU를 사용하다가 interrupt나 system call이 발생해 CPU가 잠시 커널 모드(운영체제가 사용하는것)으로 넘어 갔다 다시 프로세스 A로 CPU가 왔을 때는 결국 프로세스 A -> 프로세스 A로 CPU가 넘어온 것이기에 문맥 교환이 발생한 것이 아님.
만약 프로세스 A가 CPU를 사용하다가 timer interrupt(시간초과)나 I/O 요청(시간이 오래걸림.) system call로 인해 CPU가 프로세스 B로 넘어가면 이는 문맥 교환이 발생한 것임.
CPU의 실행 단위를 스레드라고 함. 자원은 공유하고 제어 부분만 각 스레드별로 가짐. 여러 스레드로 구성된 프로세스에서 하나의 스레드가 blocked(waiting) 상태인 동안에도 동일한 프로세스 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있음. 빠른 응답성, 자원 공유, 프로세스 하나를 만드는 것보다 스레드 하나를 만드는 것이 훨씬 간단함 등의 장점이 있음.
스레드는 프로세스마다 가지고 있는 PCB에서 CPU 관련 정보만 각 스레드마다 별도로 가지고 있음. 주소공간에서는 data와 code는 공유하고 stack 부분만 각 스레드마다 갖고 있음. 즉, 같은 프로세스의 스레드들은 동일한 주소 공간을 공유한다.
스레드마다 가지는 부분
스레드가 다른 스레드와 공유하는 부분
하나의 프로세스에 하나의 스레드만 사용하는 것보다 여러개의 스레드가 병렬로 처리하는 것이 훨씬 빠르다. 동일한 프로세스내에 스레드가 있기때문에 자원을 공유하여 스레드를 생성하는 것이 프로세스를 생성하는 것보다 빠르다. 당연히 스레드 간의 교환이나 종료도 훨씬 빠르다.
자원을 공유하기 때문에 문맥교환 발생 빈도가 줄어들고 그렇기때문에 커널의 개입을 피할 수 있다.
멀티 프로세싱과의 차이점
하나의 프로그램을 실행하기 위해 여러개의 실행 단위로 나뉘어져서 병렬로 처리한다는 점에서 멀티 프로세싱(CPU가 여러개) 방법과 비슷하지만, 멀티 프로세싱은 하나의 프로그램에 여러개의 프로세스를 병렬로 처리하는 방식이고, 멀티 스레드는 하나의 프로세스에 여러개의 스레드를 병렬로 처리하는 방식이다.
그렇기 때문에 멀티 스레드의 경우 자원을 공유하므로 훨씬 효과적으로 처리할 수 있다.
하나의 스레드에 문제가 생기면 그 프로세스 안에 있는 모든 스레드가 피해를 입는다.
같은 데이터를 공유하기 때문에 데이터 동기화에 신경을 써야한다.
프로세스와 많은 공통점이 있다. 한번에 한 스레드만 실행할 수 있고, 준비, 실행, 대기, 종료 상태가 있다.
프로세스를 생성하면 하나의 스레드도 함께 생성한다. 해당 프로세스가 스택과 레지스터를 제공하기 때문에 부모 프로세스와 공유할 자원을 초기화할 필요가 없다.
스레드 한 개가 대기 상태(blocked)로 변할 때 전체 프로세스를 대기 상태로 바꾸지 않는다. 대신 다른 스레드를 실행한다.
스레드 풀링
미리 생성한 스레드를 재사용하여 스레드 생성 시간을 줄여 시스템 부담을 줄여주는 방법.
프로세스처럼 스레드 또한 정보를 TCB에 저장한다. 물론 PCB에도 TCB에 대한 정보가 기록된다.