프로세스란?
실행 중인 프로그램이다.
메모리와 관련된 프로세스
프로그램을 실행하게 되면 메모리에 프로세스만의 주소 공간이 생기게 된다.
- code, data, stack가 생긴다.
CPU의 수행 상태 나타내는 하드웨어 Context
메모리에 프로세스가 올라오게되면 자신의 code가 돌아가게 된다, 이때 현재 자신의 코드가 돌아가는 위치(명령어)를 알아야하기 때문에 PC(Program counter)와 각종 Register를 통해 현재의 위치를 알 수 있다.
커널에서의 프로세스
운영체제가 프로세스를 관리하게된다. 여러 프로세스가 번갈아가며 돌아가게 된다면 변경하기 전에 이전 정보를 저장해야한다. 따라서 커널은 프로세스 관련하여 자료구조를 가지고 있어야 한다. 이를 PCB(Process Control Block)이라 한다.
또한 운영체제의 함수를 실행해야할 때도 있다 (Ex. interrupt service routine) 이때 누가 해당 함수를 실행했는지를 알아야 하므로 커널의 Stack에도 Kernel Stack을 놔둔다.
Kernel Stack : 프로세스 별로 커널 스택을 둔다.
PCB : 프로세스 별로 data 영역에 존재
프로세스 상태
여러 프로그램을 동작시키기 위해서 time sharing을 하게 된다. 이를 위해서는 여러 프로그램이 동작 가능한 것부터 해야한다. 따라서 프로세스는 여러 상태를 가지고 있다.
상태의 종류
- Running : CPU를 잡고 instruction을 수행중인 상태
- Ready : 메모리등 다른 모든 조건을 만족하고 CPU를 기다리는 상태
- Blocked (wait, sleep)
- CPU를 주어도 당장 명령어를 수행할 수 없는 상태
- Process 자신이 요처한 event가 즉시 만족되지 않아 기다리는 상태 (디스크에서 File 읽어 온다.)
- New : 프로세스가 생성중인 상태, (메모리에 올린다.)
- Terminated : 실행이 끝난 상태, 정리하는 상태
어떻게 여러 프로세스가 위 상태도 같이 동작하는 걸까?
Queue의 존재
- Kernel의 Data영역에 queue구조를 정의하여 사용한다.
- 사실 큐에 순차적으로 들오는 경우는 Round robin 스케쥴링 방식이다.
- 대부분의 경우 우선순위가 있다.
- Job queue : 현재 시스템 내에 있는 모든 프로세스의 집합 다른 큐에 있는 프로세스도 여기에 포함되어있다.
- Ready queue: 프로세스가 실행 가능한 상태가 되었을때 해당 큐에 들어와 자신의 차례를 기다린다.
- Device queue: 각 I/O device마다 queue가 존재하고 해당 I/O device에 접근하기 위해 queue에 들어온다.
- Resource queue: 공유 자원들을 접근할때 또한 필요하다.
어떻게 동작하는 것까지 확인했습니다. 운영체제가 프로세스를 관리하기 위해 PCB로 정보를 관리한다 했는데 어떤 정보를 가지고 있을까?
PCB( Process Control Block )
구조체로 유지된다. 각 queue에 연결되어있는 데이터가 PCB이다.
OS가 관리상 사용하는 정보
- Process State: 프로세스 상태를 저장
- Process ID(Number) : 프로세스 자체 ID
- Scheduling Information, Priority : 프로세스가 들어와서 처리하는 방식과 우선순위
CPU 수행 관련 하드웨어 값
- Program counter : 실행하는 명령어의 위치 값
- Register : 레지스터에 있던 값들
메모리 관련
- Code, data, stack의 위치 정보
파일 관련
- Open file descriptors
문맥 교환 ( Context Switch )
CPU에서 실행중인 프로세스를 다른 프로세스로 넘겨주는 과정을 Context Switch라고 한다.
CPU가 다른 프로세스로 넘어가기 위해 현재 프로세스의 상태를 그 프로세스의 PCB에 위에 필요한 값을 토대로 저장을 한다.
Context Switch 조건
context switch는 결국 프로세스가 다른 프로세스로 넘겨줄때 생기므로 System call이나 Interrupt가 발생했다고 해서 일어나는 것이 아니다.
단 systme call이나 interrupt를 통해 kernel 모드로 갈때 Context의 일부를 PCB에 저장해야 한다. 하지만 프로세스가 변경될때 만큼 비용이 크지 않다.(overhead가 적다)
(Context Switch의 경우 cache memory flush 해야한다.)
스케쥴러 ( Scheduler )
어떤 프로세스를 다음번에 실행할지 결정
Short-term scheduler ( 단기 스케쥴러 or CPU scheduler )
- millisecond단위 ( 빨라야한다.)
- 프로세스에 CPU를 주는 문제
- 어떤 프로세스를 다음번에 Running시킬지 결정
Long-term scheduler ( 장기 스케쥴러 or Job scheduler )
Job queue가 모든 프로세스의 집합인 것과 같이 Job scheduler또한 모든 프로세스들을 관리해 준다 생각하면 된다.
- 시작 프로그램들 중 어떤 것들을 ready queue로 보낼지 결정
- 선택적 메모리 할당 : 스케쥴러가 자신이 원하는 프로세서한테만 메모리를 준다.
- Degree of Multiprogramming을 제어
- multiprogramming : 메모리에 여러 프로그램이 올라간 것을 나타낸다.
- 즉, 메모리에 올라가 있는 프로세서의 수를 제어
- Time Sharing system에서는 보통 Long-term scheduler가 없다.
이렇게 동작하게 하는 이유는 뭘까?결국 프로그램이 많이 올라가 있으면 실행되어야 하는 프로그램이 제시간에 못 돌아가게 되는 경우가 생기므로 성능이 안좋아지고, 너무 적게되면 효율적이지 않으므로 성능이 안좋다
Medium-Term Scheduler ( 중기 스케쥴러 or Swapper )
결국 프로세스의 수를 제어해야 하는데 Job scheduler가 없고 이와 비슷한 것이 Medium-Term Scheduler이다약간 다른 것있다면 Job scheduler는 메모리에 올리는 프로세스를 제어하는 것에 반해 Swapper은 프로세스를 통째로 메모리에서 디스크로 쫓아내는 것이다.
- 프로세스에서 메모리르 뺏는다
- Degree of Multiprogramming을 제어
이렇게 되면 PCB에서 이 상태를 표시하기 위한 새로운 상태가 필요하고 이를 Suspended 상태라 한다.
Suspended 상태
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out된다.
다시 running상태로 변경하기 위해서는 외부에서 resume 해 주어야 한다.
또한 Suspended 상태에서 프로세스가 인터럽트를 처리하기위해 Blocked 상태로 변경 되더라도, 인터럽트가 처리될 수는 있지만 Syspended ready 상태가 되고 실제로 메모리에서 ready가 되지는 않는다.
참고
사용자 프로세스가 실행되면 user mode로 실행을 하게된다.
이때 System call, interrupt를 받게 되면 kernel mode( monitor mode )로 변경하여 인터럽트를 처리하게 되는데
이를 Kernel mode에서 실행 중이라 하고, 운영체제가 실행중이라 하지 않는다.
'운영체제' 카테고리의 다른 글
운영체제 - 프로세스 생성 (0) | 2023.03.02 |
---|---|
운영체제 - Thread (0) | 2022.08.06 |
운영체제 - I/O 구조 (0) | 2022.08.03 |
운영체제 - 저장소 (0) | 2022.08.03 |
운영체제 - 인터럽트 (0) | 2022.08.03 |