해당 게시글은 kocw에서 제공하는 금오공과대학교 최태영 교수님의 무료 강의를 공부하고 정리하기 위해서 만들어졌습니다.
프로세스
- 메인 프레임에서 작업을 만들어서 관리자에게 던져주고 이러한 작업이 쌓여있는 프로그램을 “Job”이라고 한다.
- 일반 사용자가 컴퓨터를 통해 프로그램을 만들고 프로그램을 수행하는 것을 “User Program” 또는 “Task”라고 부른다.
- 이러한 개념들을 통합해서 “Process”라고 한다.
- 경우에 따라서 Job, Task라고 부르기도 한다.
- 프로그램
- 하드디스크나 2차 저장장치에 실행시킬 수 있는 형태로 저장되어 있는 Passive한(수동적인) 객체이다.
- 프로세스
- 메모리에 올라와 있고, cpu를 얻기만 하면 Active하게(능동적인) 일을 하는 주체가 프로세스이다.
- 프로그램에 해당되는 아이콘을 더블클릭하거나, CLI에서 프로그램 이름을 타이핑 함으로써 프로세스가 생성된다.
- 하나의 프로그램에서 프로세스는 여러 개가 존재할 수 있다.
프로세스 구조
- 프로세스는 여러 개의 덩어리로 이루어져있다.
- Text section: 실행코드
- Program Counter: 현재 실행 중인 코드 포인터
- Process Register: 수행 단계에서 필요하거나 수행 결과를 저장하기 위한 레지스터
- Stack: 현재 컴퓨터들은 모두 함수를 호출하도록 되어있기 때문에 필요
- Data section: 전역 변수가 존재하는 영역
- Heap: 동적으로 메모리를 할당
- 프로세스를 메모리 영역에서 표현하면
- 0번째 주소 부터 차례대로
- text
- data
- heap
- 동적 영역
- stack
- 형태로 구성되며, 이 때 메모리 주소가 0을 가리키는 이유는 가상 메모리 주소를 사용하기 때문이다.
- 실제 메모리 영역에서 0번째 주소부터 어느 영역까지는 커널이 차지하고 있다.
- 프로세슨는 실제 메모리 영역에서 빈 공간 어느 위치에 존재하게 되는데,
- 가상 메모리를 사용하여 0번째 주소를 사용하는 이유는 protection 관점에서 침입을 막기 위해서이다.
- 또한 실제로 프로세스에게 할당되는 메모리는 굉장히 큰데, 실제로 동적 영역을 제외한 나머지 영역은 굉장히 적다.
- 즉, 동적 영역이 대부분의 메모리를 사용한다는 뜻
프로세스 상태
- 프로세스 상태는 운영체제마다 상태가 달라지지만 최소 5가지 정도의 상태가 있다.
- new
- 아직 프로세스라고 부르지 못하는 단계
- 사용자가 프로세스 실행을 요청했지만 아직 메모리에 올라가지 못한 단계
- 프로세스의 실행코드가 카피가 덜 됐을 때
- 메모리가 부족해서 프로세스를 못 올렸을 때
- cpu가 너무 바빠서 아직 프로세스를 수행할 여유가 없을 때
- ready
- new 상태에서 admit이 되면 running 상태로 변경
- 메모리 영역에 프로세스가 완전히 올라와 있는 상태
- 아직 cpu는 얻지 못한 상태
- running
- cpu를 얻게 되면 running 상태로 변경
- scheduler가 해당 프로세스를 cpu에 할당 했을 때 변경된다.
- preemption(interrupt)을 당하면 다시 ready로 변경된다.
- waiting
- I/O나 sleep을 해야 하는 경우 cpu를 반납하고 waiting 상태로 변경된다.
- I/O나 sleep이 끝날 경우 다시 ready 상태로 돌아간다.
- terminated
- 완전히 메모리에서 제거 되기 전까지 terminated 상태가 된다.
- 커널에서 제공하는 자료구조를 정리하고 해당 프로세스가 열어놓은 파일들을 닫는 과정을 수행한다.
- 이러한 상태로 구분하는 경우는 각 상태에 맞는 이벤트가 발생했을 때 쉽게 대처하기 위함이다.
- 예를 들어, cpu가 비게 되면 ready 상태에 있는 프로세스 하나를 꺼내서 cpu에 넣어야 한다.
- 여러가지 이벤트에서 해당 상태의 구분은 도움이 된다.
Process Control Block(PCB)
- 각 프로세스의 상태를 가지고 있는 자료구조이다.
- task control block이라고 부르기도 한다.
- 커널 안에 PCB라는 자료구조를 확보하여 존재하게 된다.
- PCB가 가지고 있는 정보는 다음과 같다.
- PID: 프로세스 아이디
- PC: 현재 실행중인 위치 정보
- Register: 내용을 저장할 레지스터
- Context switching을 하기 위해 가장 많이 쓰인다.
- 프로세스0이 수행중에 인터럽트가 발생하면, 현재 상태가 PCB에 저장되고 인터럽트 핸들러를 수행한다.
- 그러고 나서 cpu가 프로세스0을 다시 재개할지, 블락 시킬지 결정한다.
- 블락이 되면 그 다음 프로세스인 프로세스1을 꺼내서 실행하는데, PCB에서 프로세스1의 내용을 꺼내고 레지스터에 올려둔다.
- 이렇게 함으로써 마치 프로세스0에서 프로세스1로 넘어간것 처럼 컨텍스트 스위치가 된다.
- 이런 용도로 쓰기 위해 PCB가 존재하게 된다.
- Context switching을 통해 멀티프로그래밍이 가능해졌다.