-
[OS] 프로세스 관리, 프로세스 문맥(context)OS 2021. 7. 20. 23:41
프로세스 관리, 프로세스 문맥(context)
프로세스의 개념
프로그램? 프로세스? 스레드? 프로그래밍을 공부하다보면 자주 들어보는 말이다. 프로세스는 무엇인가?
Process is a Programin execution
실행중인 프로그램 을 프로세스라 한다.
프로세스의 문맥(context)
프로세스 context는 프로세스가 현재 어떤 상태에서 수행되고 있는지 정확히 규명하기 위해 필요한 정보를 말한다.
현대의 운영체제는 여러 프로세스가 함께 수행되는 시분할 시스템 환경입니다. 시분할 시스템 환경에서는 타이머 인터럽트에 의해 짧은 시간동안 CPU를 점유하고 다른 프로세스에게 넘겨주고 다시 차례가 되면 CPU를 점유하여 명령을 수행합니다. 다시 명령을 수행하기 위해서 이전에 어디까지 명령을 수행했는지 정확한 수행 시점과 상태를 재현할 수 있는 정보가 필요했습니다. 그 필요한 정보가 바로 프로세스 문맥(process context)입니다.
프로세스 문맥은 크게 3가지로 하드웨어 문맥, 프로세스의 주소공간, 커널상의 문맥으로 나눌수가 있습니다.
하드웨어 문맥 CPU 수행 상태를 나타내는 것으로 PC(Program Counter) 와 각종 레지스터에 저장하고 있는 값들을 말합니다.
프로세스의 주소공간은 코드, 데이터, 스택 으로 구성된 프로세스만의 독자적인 주소 공간을 말합니다.
커널상의 문맥은 프로세스를 관리를 위한 자료구조인 PCB(Process Control Block)와 Kernel stack(커널내의 주소)을 말합니다.
PCB(Process Control Block) 프로세스 제어블록이란?
운영체제가 시스템 내의 프로세스들을 관리하기 위해 프로세스마다 유지하는 정보들을 담는 커널 내의 자료구조를 말한다.프로세스의 상태
시분할 시스템 환경에서 프로세스의 상태는 실행(running), 준비(ready), 봉쇄(blocked, wait, sleep)의 세 가지로 구분할 수 있습니다.
실행(Running)은 프로세스가 CPU를 잡고 기계어 명령을 수행중인 상태입니다.
준비(Ready)는 CPU만 보유하면 당장 명령을 수행 할 수 있도록 (메모리 등 다른 조건을 모두 만족) CPU를 기다리는 상태입니다.
봉쇄(blocked, wait, sleep)는 CPU를 할당받더라도 당장 명령을 실행할 수 없는 상태입니다. I/O 등의 event를 (스스로) 기다려야 하거나 디스크에서 file을 읽어와야 하는 경우가 봉쇄상태입니다.
위에서 말한 3가지 프로세스 상태 외에도 다음과 같은 프로세스 상태가 존재합니다.
시작 상태는 프로세스가 시작되어 그 프로세스를 위한 각종 자료구조는 생성되었지만 아직 메모리 획득을 승인받지 못한 상태입니다.
완료 상태는 프로세스가 종료되었으나 운영체제가 그 프로세스와 관련된 자료구조를 완전히 정리하지 못한 상태입니다.
Suspended (stoped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out 된다
- ex) 사용자 프로그램을 일시 정지시킨 경우 (break key) 시스템이 여러 이유로 프로세스를 잠시 중단시킴(메모리에 너무 많은 프로세스가 올라와 있을 때)
Blocked: 자신이 요청한 event가 만족되면 Ready
Suspended: 외부에서 resume해 주어야 Active문맥 교환 (Context Switch)
시분할 시스템에서 프로세스의 CPU 점유가 끝이나면 다른 프로세스로 CPU를 넘겨주게 된다. 이때 문맥 교환이 발생합니다.
문맥교환(Context Switch)은 한 프로세스에서 다른 프로세스로 CPU의 제어권을 넘겨주는 과정을 말한다.
문맥교환이 아닌 것과 혼동하지 말자. 문맥교환은 프로세스A에서 프로세스B로 넘어가는것이다.
System call이나 interrupt 발생시 반드시 context switch가 일어나는 것은 아니다.
1. 문맥교환 X 사용자 프로세스 A -> interrupt or system call -> 커널모드 -> 문맥 교환 없이 user 모드 복귀 -> 사용자 프로세스 A
2. 문맥교환 O 사용자 프로세스 A -> interrupt or I/O 요청 system call -> 커널모드(ISR or system call) -> 문맥 교환 발생 -> 사용자 프로세스 B
(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 크다. (eg. cache memory flush)문맥교환이 발생하며CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행한다.
1. CPU를 내어주는 프로세스의 문맥(context)를 그 프로세스의 PCB에 저장
2. CPU를 새롭게 얻는 프로세스의 문맥(context)을 PCB로부터 읽어 실제 하드웨어로 복원
프로세스 스케줄러 (Scheduler)
프로세스를 스케줄링하기 위한 큐
운영체제는 하드웨어와 소프트웨어 자원을 줄세우기 위해 여러 Queue를 두어 사용한다. 프로세스들은 각 Queue들을 오가며 수행된다.
Job queue
- 현재 시스템 내에 있는 모든 프로세스의 집합
Ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queues
- I/O device의 처리를 기다리는 프로세스의 집합
스케줄러(Scheduler)
스케줄러란 어떤 프로세스에게 자원을 할당할지를 결정하는 운영체제 커널의 코드를 지칭한다.
Long-term scheduler(장기 스케줄러 or job scheduler)
- 시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정
- 프로세스에 memory(및 각종 자원)을 주는 문제
- degree of Multiprogramming을 제어
- time sharing system에는 보통 장기 스케줄러가 없음(무조건 ready)
- 프로세스 상태도에서 admitted 해주는게 장기스케줄러의 역할
- 현대의 운영체제(시분할 시스템)는 하드웨어의 발전으로 장기 스케줄러 사용하지 않음
Short-term scheduler(단기 스케줄러 or CPU scheduler)
- ready queue에 있는 프로세스들 중 다음번에 running 시킬 프로세스를 결정
- 프로세스에 CPU를 할당하는 역할
- 매우 빈번하게 호출되므로 빨라야 한다 (millisecond 단위)
Medium-Term Scheduler(중기 스케줄러 or Swapper)
현대의 운영체제(시분할 시스템)에서 장기 스케줄러 사용이 낮아지면서 중기 스케줄러를 사용
- 많은 프로세스에게 메모리를 할당해 시스템의 성능이 저하되는 일을 조절한다
- 프로세스에게서 메모리를 빼앗음
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크의 swap 영역으로 저장함 (swap out)
- 봉쇄(block) 상태에 있는 프로세스가 0순위로 swap out
- 그래도 부족하면 타이머 인터럽트로 ready queue로 이동하는 프로세스를 추가적으로 swap out
- degree of Multiprogramming을 제어
프로세스 생성
시스템이 부팅된 후 최초의 프로세스는 운영체제가 직접 생성하지만 그다음부터는 이미 존재하는 프로세스가 다른 프로세스를 복제 생성하게 된다. 이때 프로세스를 생성한 프로세스를 부모 프로세스(parent process) 라고 하고 새롭게 생성된 프로세스를 자식 프로세스(children process) 라고 한다.
- 부모 프로세스(parent process) 가 자식 프로세스(children process) 생성
- 프로세스의 트리(계층 구조) 형성
- 프로세스는 자원을 필요로함
- 운영체제로부터 받는다
- 부모와 공유한다
- 자원의 공유
- 부모와 자식이 모든 자원을 공유하는 모델
- 일부를 공유하는 모델
- 전혀 공유하지 않는 모델
- 자원의 공유
- 수행 (Execution)
- 부모와 자식은 공존하며 수행되는 모델
- 자식이 종료(terminate)될 때까지 부모가 기다리는(wait) 모델
- 주소 공간 (Address space)
- 자식은 부모의 공간을 복사함 (binary and OS data)
- 유닉스의 예
- fork() 시스템 콜이 새로운 프로세스를 생성
- 부모를 그대로 복사 (OS data except PID + binary)
- 주소 공간 할당
- fork 다음에 이어지는 exec() 시스템 콜을 통해 새로운 프로그램을 메모리에 올림
- fork() 시스템 콜이 새로운 프로세스를 생성
- 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌(exit)
- 자식이 부모에게 output data를 보냄 (via wait)
- 프로세스의 각종 자원들이 운영체제에게 반납됨
- 부모 프로세스가 자식의 수행을 종료시킴 (abort)
- 자식이 할당 자원의 한계치를 넘어섬
- 자식에게 할당된 태스크가 더 이상 필요하지 않음
- 부모가 종료(exit)하는 경우
- 운영체제는 부모 프로세스가 종료하는 경우 자식 프로세스가 더 이상 수행되도록 두지 않는다(종료해버림)
- 프로세스의 계층 구조(트리)에 따라 단계적인 종료가 됨
프로세스 생성 절차
Fork() 시스템 콜
- 프로세스 ID를 제외한 모든 내용을 그대로 복제 생성한다.
- 부모와 자식 프로세스는 서로 다른 주소공간을 갖는다.(주소공간 내용은 동일)
exec() 시스템 콜
- 하나의 프로세스를 완전히 새로운 프로세스로 덮어쓰는 명령
wait() 시스템 콜
- 자식 프로세스가 종료되기를 기다리며 부모 프로세스가 봉쇄 상태에 머무르도록 할 때 사용된다.
exit() 시스템 콜
프로세스의 종료하는 명령이다. 종료 명령은 자발적 종료와 비자발적 종료로 구분 된다.
- 자발적 종료
- 마지막 statement 수행 후 exit() 시스템 콜
- 프로그램에 명시적으로 적어주지 않아도 main함수가 리턴되는 위치에 컴파일러가 넣어줌
- 비자발적 종료
- 자식 프로세스가 한계치를 넘어서는 자원 요청하는 경우
- 자식에게 할당된 작업이 더 이상 필요하지 않는 경우
- 부모 프로세스가 종료되는 경우
- 키보드로 kill, break 등을 친 경우
프로세스 간 협력
원칙적으로 프로세스는 각자 자신만의 독립적인 주소 공간을 가지기 때문에 다른 프로세스의 주소 공간을 참조하는 것은 허용되지 않는다. 그러나 경우에 따라서 프로세스들 간의 협력이 효율을 증가시키는 점에서 더 생산적일 수 있다. 따라서 운영체제는 프로세스들간의 협력을 위한 매커니즘을 제공한다.
- 독립적 프로세스(Independent process) 프로세스는 각자의 주소 공간을 가지고 수행되므로 원칙적으로 하나의 프로세스는 다른 프로세스의 수행에 영향을 미치지 못함
- 협력 프로세스(Cooperating process) 프로세스 협력 메커니즘을 통해 하나의 프로세스가 다른 프로세스의 수행에 영향을 미칠 수 있음
프로세스 간 협력 메커니즘 (IPC: Interprocess Communication)
IPC란 하나의 컴퓨터 안에서 실행 중인 서로 다른 프로세스 간에 발생하는 통신과 동기화를 이루기 위한 매커니즘을 말한다.
- 메시지를 전달하는 방법(Message passing)
- 프로세스 사이에 공유 변수(shared variable)를 일체 사용하지 않고 통신하는 시스템
- 커널을 통해 메시지를 주고 받음
- 커뮤니케이션 링크를 생성하고 send(), receive()
- 커뮤니케이션 링크 방법
- Direct Communication
- 통신하려는 프로세스의 이름을 명시적으로 표시
- Indirect Communication
- mailbox (또는 port)를 통해 메시지를 간접 전달
- Direct Communication
- 주소 공간을 공유하는 방법(Shared memory)
- 서로 다른 프로세스 간에 일부 주소 공간을 공유하게 하는 공유 메모리 매커니즘
- 같은 메모리 공간 사용으로 일관성 문제가 유발될 수 있음
Thread는 사실상 하나의 프로세스이므로 프로세스 간 협력으로 보기는 어렵지만 동일한 프로세스를 구성하는 Threads들 간에는 주소 공간을 공유하므로 협력이 가능
Post
References
- 운영체제와 정보기술의 원리
잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)
'OS' 카테고리의 다른 글
[OS] Race Condition 경쟁상태란? (0) 2021.08.15 [OS] 프로그램 VS 프로세스 VS 스레드 (0) 2021.07.21 [OS] 프로세스 메모리 구조 (코드, 데이터, 스텍, 힙) (2) 2021.07.19 [OS] 인터럽트(Interrupt) (0) 2021.07.18 [OS] 컴퓨터 시스템의 동작 원리 (2) 2021.07.17