프로세스
- 실행 중인 프로그램
- 프로그램을 실행시키면, OS는 디스크에 있는 프로그램 파일을 찾아서 메모리에 적재(load)하고 프로세스를 만듬
3. 실행파일(컴파일하면 생기는 프로그램)의 구조
- 헤더(header): 파일 내 정보를 가짐(코드 섹션, 데이터 섹션 크기 등)
- 코드 섹션: 함수 내의 기계어 코드로 바뀌어서 저장
- 데이터 섹션: 전역 변수들을 저장
4. 프로세스 구성 요소
- 코드(code)
- 데이터(data): 전역 변수들을 저장
- 스택(stack): 지역 변수 및 함수의 매개변수를 저장
- 힙(heap): 동적 메모리 할당 영역
- CPU 레지스터(CPU마다 레지스터 명이 다를 수도 있음)
- PC: 프로그램 다음에 실행할 명령어 주소 값을 가짐
- CS(Code Segment): 프로그램을 실행하면, 운영체제가 메모리에 프로세스를 생성하는데, CS는 메모리에 있는 코드의 시작 주소를 가리킴
- DS(Data Segment): 데이터 시작 주소 값을 가리킴
- SS(Stack Segment): Stack의 시작 주소 값을 가지고 있음(프로세스의 맨 끝 주소를 가짐. e.g. 만약 프로세스의 크기가 5000이면 SS는 5000번지를 가리킴)
5. PCB(프로세스 제어 블록, Process Control Block)
- 프로그램을 실행하여 프로세스가 만들어질 때, 운영체제가 프로세스를 관리하기 위해 만드는 데이터 구조 → PCB는 운영체제 내부에 생성된다. 즉, 운영체제가 올려져 있는 메모리 영역에 PCB가 생성된다.
- 프로세스가 생성될 때마다 PCB를 생성함!!
- 프로세스가 종료되면 PCB를 제거함!
- PCB 내용
- 프로세스 번호(PID)
- 프로세스 상태(State)
- CPU 레지스터
- CPU 스케줄 정보: 우선순위, 스케줄 큐의 포인터 등
- 기억장치 관리 정보: 기준 레지스터, 제한 레지스터, 기억장치 시스템의 페이지 테이블, 세그먼트 테이블의 정보 —> 메모리 어느 위치에 저장이 되어 있는지
- 계정 정보: CPU가 사용된 양, 계정 번호, 프로세스 번호
- 입출력 상태 정보: 입출력 요구들, 입출력 장치, 개방된 파일의 목록(현재 오픈하고 있는 파일 등. 링크드 리스트로 관리)
PCB 내용
6. 다중 프로그래밍(Multi Programming)
- 여러 작업(프로세스)들을 메모리에 유지시켜서 CPU가 계속 작업(프로세스)을 실행할 수 있게 하는 기법
- 장점: CPU 사용률을 높일 수 있다.
- 작업이 입출력 때문에 대기하게 될 때, 운영체제가 CPU를 유휴 상태로 두지 않고 다른 작업을 실행함
- 입출력은 대개 긴 시간이 소요되는데, 그동안 CPU를 사용할 수 있음
- 단일 작업 기법에서는 CPU와 입출력 장치를 동시에 사용할 수 없다.
- 입출력을 하는 동안 기다리고 CPU가 유휴상태가 됨
7. 시분할(Time Sharing), 멀티태스킹(Multi Tasking)
- 각 프로세스에게 CPU를 시간적으로 분할해 조금씩 사용할 수 있게 한 시스템
- 다중 사용자(multi user) 시스템의 경우, 한 사용자에게서 다음 사용자로 빠르게 교환되기 때문에, 각 사용자는 자신만이 컴퓨터를 소유한 것처럼 느끼지만 실제로는 다수의 사용자가 하나의 컴퓨터를 공유함
8. 프로세스 상태(Process State)
- 프로세스는 상태(State)가 변한다
- 생성(new): 프로세스가 생성되는 중
- 실행(running): 프로세스의 명령어들이 실행되고 있다.
- 대기(waiting): 프로세스가 어떤 사건(입출력 종료와 같은)이 일어나기를 기다림.
- 준비(ready): 프로세스가 CPU를 할당받기를 기다린다(프로세스가 메모리에 적재)
- 종료(terminated): 프로세스의 실행이 종료된다.
- 어느 한 순간에는 한 CPU에 오직 하나의 프로세스만이 실행된다.
- 실행 상태의 프로세스는 오직 한 개
- 나머지 프로세스들은 대기, 준비 등의 상태에 있음
- admitted: admitted(승인)이 되어야지 ready 상태로 바뀜. 리눅스에서 파일에는 허가권(-rwxrwxrwx)가 있는데, 실행(x)가 (-)이면 실행 권한이 없으므로 admitted가 되지 않는다. admitted가 돼면 프로세스가 메모리에 생성되고 ready 상태가 된다.
- scheduler dispatch: 운영체제의 스케줄러 프로세스를 dispatch를 하면 ready → running 상태로 바뀐다. CPU는 한 번에 한 개의 프로세스만 실행할 수 있다. 운영체제의 스케줄러가 ready 상태인 프로세스들 중에서 dispatch한 하나의 프로세스만 running 상태이고 나머지는 ready 상태가 된다.
- IO or event wait: 실행중인(running) 프로세스가 입출력을 하게 되면, 입출력이 끝날 때까지 running → waiting 상태로 바뀌게 된다.
- IO or event completion: 입출력 이벤트 때문에 running → waiting 상태로 바뀐 프로세스는 입출력이 끝나게 되면 다시 waiting → ready 상태로 바뀌게 되고 나중에 스케줄러가 다시 dispatch를 하면 running으로 바뀌게 된다.
- interrupt: 인터럽트가 발생하면 운영체제에 있는 ISR(Interrupt Service Routine)이 실행돼서, 운영체제는 현재 running 인 프로세스를 무조건 ready로 바꾸게 되고, 해당 인터럽트 작업이 끝나면 ready 상태에 있는 프로세스 중 가장 우선순위가 높은 프로세스를 다시 dispatch해서 running 상태로 전환한다.
- exit: running 중인 프로세스가 주어진 작업을 완료하면 terminated 상태로 바뀐다. terminated 상태에서는 메모리에 적재돼 있는 프로세스를 삭제하고, 운영체제 안에 만들어진 PCB 데이터 구조를 삭제한다.
9. Context Switching
- CPU가 다른 프로세스로 넘어갈 때, 지금까지의 프로세스의 상태(CPU 레지스터의 내용)을 PCB에 저장(PCB에는 레지스터 값을 저장하는 공간이 있다)하고, 새 프로세스의 PCB에 저장되어 있는 정보를 다시 CPU 레지스터에 적재해야 한다. Context Switching → 프로세스 간 상태를 스위치
- Context Switching은 시스템의 오버헤드(부하): Context Swtiching을 하는 동안에는 실제 필요한 작업(프로세스 실행)을 하지 못한다. 그래서 Context Switching 시간을 줄이는 것이 좋다.
- Context Switching에 걸리는 시간은 하드웨어의 스펙에 따라 다르다.
- 메모리의 read/write 속도: PCB에 내용을 저장하기 때문에 메모리 속도가 read/write 속도가 얼마나 빠르냐에 따라서 Context Switching의 속도가 달라진다
- 레지스터의 개수: 레지스터 저장할 개수가 많으면 시간이 더 소요되므로 저장해야 할 레지스터 개수가 적을수록 좋다
- 특수 명령어의 지원: 모든 레지스터를 한 명령어로 보관하고 적재하는 명령어 → 이 명령어를 지원하면 Context Switching이 더 빨라진다
10. 프로세스 스케줄링(Scheduling)
- 다중 프로그래밍은 메모리에 여러 프로세스를 유지시키는 기법
- 시분할 시스템은 프로세스들 사이에서 시간적으로 분할해 CPU를 조금씩 사용할 수 있게 한 시스템
- 프로세스 스케줄링: 여러 프로세스들 중에서 어떤 것을 실행할 것인지를 결정.
11. 스케줄링 큐(queue)
- 운영체제는 스케줄링을 위해 PCB를 큐(Queue)로 관리한다.
- 준비 큐(Ready Queue)
- ready 상태의 프로세스들을 관리
- ready 상태의 PCB를 Linked List로 관리
- Ready Queue의 헤더는 첫 번째 PCB와 마지막 PCB를 가리키는 포인터를 가지고 있다.
- PCB는 다음 PCB를 가리키는 포인터를 가지고 있다.
- 입출력 장치 큐
- 각 입출력 장치는 자신의 장치 큐를 가진다
- 입출력 장치에서 대기하는 프로세스들을 관리
- 프로세스는 CPU를 할당 받아 실행하다가 입출력 요청을 하게 되면, 입출력 요청의 완료를 기다리게 된다. 이때, 입출력 장치에 다른 프로세스도 기다리고 있을 수 있으므로 이런 프로세스들을 연결하여 큐로 관리한다.
12. 프로세스의 큐 이동
- 새로 생성된 프로세스는 준비 큐에 위치된다.
- 프로세스에 CPU가 할당되면 실행된다.
- 프로세스의 실행 중에 위와 같이 큐를 이동할 수 있다.
- 입출력 요청(시스템 호출)이 발생하여 입출력 장치 큐에 위치한다. 입출력이 끝나면 ready 큐에 다시 위치한다.
- 시분할 시스템의 경우(타이머의 주기가 끝난 경우. 보통 10 ~ 100ms), 타이머 인터럽트가 발생하면 프로세스에 할당된 시간이 종료되어 실행 중인 프로세스가 준비 큐에 다시 위치한다.
- 자식 프로세스를 생성하며, 자식 프로세스가 종료하기를 기다리면서 부모 프로세스를 waiting 큐에 위치한다. 자식 프로세스가 종료하면 부모 프로세스를 ready 큐에 다시 위치시킨다.
- 인터럽트가 발생하면, 실행 중인 프로세스로부터 강제로 CPU 자원을 강탈하고, 다시 준비 큐에 위치시킨다. (1번 때문에 발생) → 프로세스 실행 중 입출력이 발생하면 입출력이 끝날 때까지 프로세스는 장치 큐에서 대기 중인데, 이 입출력이 끝나면 인터럽트가 발생(입출력 완료)한다. 인터럽트가 발생했으므로 실행 중이던 프로세스는 무조건 ready queue로 이동한다.
Uploaded by Notion2Tistory v1.1.0