프로세스
<aside>
💡 NOTE
CPU 수행 상태를 나타내는 하드웨어 문맥
- 현재 변수의 값이 얼마이며, 어떤 상태까지 진행중인가에 대해 상태를 저장하는 것 = 문맥
- 멀티 테스킹, 멀티 프로세스 등을 통해 현재 상태가 어떤상태인지 알아야 진행 가능
프로세스가 시작해서 종료할 때까지 CPU에서 명령을 한꺼번에 수행하면 좋겠지만, 여러 프로세스가 함께 수행되는 시분할 환경에서는 CPU를 자주 빼앗기고 획득하게 된다. 따라서 CPU를 다시 획득해 명령의 수행을 재개하는 시점이 되면, 이전 CPU 보유 시기에 어느 부분까지 명령을 수행했는지 정확한 상태를 재현할 필요가 있다. 이때 정확한 재현을 위해 필요한 정보가 바로 프로세스의 문맥이다.
즉, 프로세스의 문맥은 그 프로세스의 주소 공간 (코드, 데이터, 스택 상태)를 비롯해 레지스터에 저장된 값, 시스템 콜을 통해 커널에서 수행한 일의 상태, 그 프로세스에 관해 커널이 관리하고 있는 각종 정보 등을 포함하게 된다.
- 프로세스의 저장 공간(주소 공간)
- code
- data
- stack : 공유 자원(누가 호출했는지에따라 프로세스 별로 관리)
- 프로세스 관련 커널 자료 구조 (커널 상의 문맥)
- PCB
- Kernel Stack : 시스템 콜을 하면 PC가 커널의 code를 가리키며 수행되는데, 호출 정보를 커널 스택에 프로세스 별로 스택을 두어서 저장한다.
</aside>
프로세스 상태
<aside>
✍️ NOTE

CPU가 1개라고 가정
- Running : CPU를 잡고 instruction 수행중인 상태
- Ready : CPU를 기다리는 상태(memory 등 다른 조건 모두 만족한 상태)
- Blocked(wait, sleep) : CPU를 줘도 instruction을 수행할 수 없는 상태 (요청한 event가 만족되면 ready)
- Process 자신이 요청한 event가 즉시 만족되지 않아 기다리는 상태
- ex) disk에서 file을 읽어야하는 상태 등
- Suspend : 스케줄링을 위해 사용하는 영역( 외부에서 resume해줘야 active )
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다.
- new : 프로세스가 생성중인 상태
- terminated : 수행이 끝난 상태
ex)
- 프로세스가 생성되면 new 상태에서 ready 상태가 된다.
- ready 상태에서 CPU를 얻으면 running 상태가 된다.
- CPU 얻은 상태에서 종료될때까지
- running → terminated
- 본인의 역할을 다하면 종료됨
- running → waiting
- I/O 같은 오래 걸리는 작업을 하면, CPU를 가지고 있어 봐야 명령을 수행할 수 없으므로 waiting 상태가 된다.
- running → ready
- 할당된 CPU 사용 시간이 끝나면 ready 상태가 된다.
</aside>
PCB
<aside>
✍️
NOTE

- 운영체제가 각 프로세스를 관리하기 위해 프로세스당 유지하는 정보
- 구성
- OS가 관리상 사용정보
- Process state(상태), Process ID(id)
- sheduling info, priority
- CPU 수행 관련 하드웨어 값
- Program counter(메모리의 어떤 부분을 가리키고 있는지), registers
- 메모리
- 파일 관련
</aside>
문맥 교환(Context Switching)
<aside>
✍️ NOTE

-
CPU의 프로세스를 넘겨주는 과정
-
CPU를 뺏겼을때 뺏긴 시점에 맞춰서 진행하도록 만들어줘야한다.
-
따라서 메모리의 위치정보 및 값을 해당 process의 PCB에 save해 놓는다.
-
시스템 콜이나 인터럽트 발생시 반드시 context switch가 발생하는 것인가? (X)

-
1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 되지만 문맥교환을 하는 2)의 경우 그 부담이 훨씬 크다(cache memory flush) 오버헤드
</aside>
1번 경우는 프로세스가 실행 상태일 때 시스템 콜이나 인터럽트가 발생하여 CPU의 제어권이 운영 체제로 넘어와 원래 실행 중이던 프로세스의 업무가 잠시 멈추고 운영체제 커널의 코드가 실행된 경우다.
이 경우에도 CPU의 실행 위치 등 프로세스의 문맥 중 일부를 PCB에 저장한다. 하지만, 하나의 프로세스의 실행 모드가 사용자 모드에서 커널 모드로 바뀌는 것이고 CPU를 점유하는 프로세스가 다른 사용자 프로세스로 변경되는 것이 아니므로 문맥 교환이 아니다.
2번 경우는 타이머 인터럽트가 발생하거나 프로세스가 입출력 요청 시스템 콜을 하여 봉쇄 상태(Blocked)에 들어간 경우다. 이 때는 다른 사용자 프로세스에게 CPU의 제어권을 전달하므로 문맥 교환이 발생한다.

unix에서 시스템 콜 종류
프로세스를 스케줄링하기 위한 큐