1) 프로세스란?
- 실행 중인 프로그램
- 작업의 단위
2) 프로세스의 현재 활동 상태
- 프로그램 카운터 값
- 프로세서 레지스터의 내용
3) 프로세스의 메모리 배치

- 텍스트 섹션
: 실행 코드
: 크기가 고정되어 잇어 프로그램 실행 시간 동안 크기가 변하지 않음
- 데이터 섹션
: 전역 변수
: 크기가 고정되어 잇어 프로그램 실행 시간 동안 크기가 변하지 않음
- 힙 섹션
: 프로그램 실행 중에 동적으로 할당되는 메모리
: 메모리가 동적으로 할당 됨에 따라 힙이 커지고 메모리가 시스템에 반환되면 축소됨
- 스택 섹션
: 함수를 호출할 때 임시 데이터 저장장소
: 함수가 호출될 때마다 함수 매개변수, 지역변수 및 복귀 주소를 포함하는 활성화 레코드가 스택에 푸시 되고 함서에서 제어가 돌아오면 활성화 레코드가 스택에서 팝됨
※ 스택 및 힙 섹션이 서로의 방향으로 커지더라도 운영체제는 서로 겹치지 않도록 해야함
4) 프로그램과 프로세스 비교
- 프로그램
: 프로그램 자체는 프로세스가 아님
: 수동적인 존재 (ex: 명령어 리스트를 내용으로 가진 디스크에 저장된 파일 = 실행파일)
- 프로세스
: 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가짐
: 능동적인 존재
- 실행 파일이 메모리에 적재될 때 프로그램은 프로세스가 됨!
5) 멀티 프로세스
- 프로세스들이 동일한 프로그램에 연관될 수 있지만, 두 개를 별도의 실행 순서로 간주
- 프로세스가 실행하는 과정에서 많은 프로세스를 생성
- 프로세스 자체가 다른 개체를 위한 실행환경으로 동작 할 수 있음

1) 프로세스는 실행되면서 상태가 변함
2) 상태
- new (생성)
: 프로세스가 생성 중
- running (실행)
: 명령어들이 실행
- waiting (대기)
: 프로세스가 어던 이벤트가 일어나기를 기다림 (ex: 입출력 완료 또는 신호의 수신 등)
- ready (준비)
: 프로세스가 처리기에 할당되기를 기다림
- terminated (종료)
: 프로세스의 실행 종료
3) 운영체제에 따라 상태의 이름은 다르지만 상태들은 다 존재하고 더 구체적 일 수도 있음
4) 한 처리기 코어에서는 오직 하나의 프로세스만이 실행되고 많은 프로세스가 준비완료 및 대기 상태에 있을 수 있음!
1) 프로세스 제어 블록 (process control block, PCB) 이란?
- 특정 프로세스와 연관된 여러 정보를 수록하고 여러가지 정보를 가지고 있음
- 프로세스를 시작시키거나 다시 시작시키는 데 필요한 모든 데이터를 위한 저장소의 역할
2) 프로세스 제어 블록 구성

- 프로세스 상태
: new(생성), ready(준비), running(실행), waiting(대기), halted(중지) 상태 등
- 프로그램 카운터
: 프로세스가 다음에 실행할 명령어의 주소를 가르킴
- CPU 레지스터들
: CPU 레지스터는 컴퓨터의 구조에 따라 다양한 수와 유형을 가짐
: 누산기, 인덱스 레지스터, 스택 레지스터, 범용 레지스터들과 상태 코드 정보가 포함
: 프로그램 카운터와 함께 이 상태 정보는 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 실행되도록 하기 위해서 인터럽트 발생 시 저장되어야 함
- CPU-스케줄링 정보
: 프로세스 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수를 포함
- 메모리 관리 정보
: 운영체제에 의해 사용되는 메모리 시스템에 따라 기준 레지스터와 한계 레지스터의 값 포함
: 운영체제가 사용하는 메모리 시스템에 따라 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보 포함
- 회계 정보
: CPU의 사용 시간과 사용된 실시간, 시간 제한, 계정 번호, 작업 또는 프로세스 번호 등이 포함
- 입출력 상태 정보
: 프로세스에 할당된 입출력 장치들과 열린 파일 목록 등을 포함
1) 단일 제어 스레드
- 프로세스가 한 번에 한 가지 일만 실행하도록 허용
2) 현대 운영 체제는 한 프로세스가 다수의 실행 스레드를 가짐
- 프로세스가 한 번에 하나 이상의 일을 수행하도록 허용
- 다중 처리기 시스템에서 여러 스레드가 병렬로 실행
3) 스레드를 지원하는 시스템에서 PCB는 각 스레드에 고나한 정보를 포함하도록 확장됨
1) 프로세스 스케줄러가 달성 해야 할 목적
- 다중 프로그래밍
: CPU 이용을 최대화하기 위하여 항상 어떤 프로세스가 실행되도록 해야함
- 시분할
: 각 프로그램이 실행되는 동안 사용자가 상호 작용할 수 있도록 프로세스들 사이에서 CPU 코어를 빈번하게 교체하는 것
2) 프로세스 스케줄러
- 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택
3) 다중 프로그래밍 정도
- 현재 메모리에 있는 프로세스 수
4) I/O 바운드 프로세스
- 계산에 소비하는 것보다 I/O에 더 많은 시간을 소비하는 프로세스
5) CPU 바운드 프로세스
- 계산에 더 많은 시간을 사용하여 I/O 요청을 자주 생성하지 않는 프로세스
1) 준비 큐

- 준비 상태가 되어 CPU 코어에서 실행되기를 기다리는 프로세스
- 연결 리스트로 저장
- 헤더에는 리스트의 첫 번째 PCB에 대한 포인터가 저장
- 각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함
2) 대기 큐

- 특정 이벤트 (ex: I/O 완료)가 발생하기를 기다리는 프로세스
3) 프로세스 스케줄링

- 새 프로세스는 준비 큐에 놓임 => 실행을 위해 선택되거나 디스패치 될 때까지 기다림
- 프로세스에 CPU 코아가 할당되고 실행 상태가 되면, 여러 이벤트 중 하나가 발생
: 프로세스가 I/O 요청을 실행한 다음 I/O 대기 큐에 놓일 수 있음
: 프로세스는 새 자식 프로세스를 만든 다음 자식의 종료를 기다리는 동안 대기 큐에 놓일 수 있음
: 인터럽트 또는 타임 슬라이스가 만료되어 프로세스가 코어에서 강제로 제거되어 준비 큐로 돌아갈 수 있음
- 대기 큐로 들어가는 이벤트들의 경우 프로세스는 결국 대기 상테에서 준비 상태로 전환된 다음 준비 큐로 다시 돌아가고 종료되기 전까지 이 주기를 반복
- 종료 시점에 모든 큐에서 제거되고 PCB 및 자원이 반환
1) CPU 스케줄러의 역할
- 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것
- 시스템 효율성 증가
2) 스왑
- CPU의 속도에 맞는 캐시 등의 메모리는 크기가 작기 때문에 자주 사용하지 않거나 현재 작업에 필요하지 않는 메모리를 선별하여 속도가 느린 메모리에서 빠른 메모리로 올려놓는 기능
3) 스와핑
- 메모리에서 제거한 프로세스의 내용 전부를 디스크의 스왑 영역에 저장한 뒤 후에 실행될 때 메모리로 불러와서 중단되었던 지점에서부터 실행을 재개하는 방식으로 프로세스의 수를 조절
- 스왑아웃(swap out)
: 현재 중단된 위치를 기억하면서 적재된 프로세스를 메모리 내에서 디스크로 가는 상태
- 스왑인(swap in)
: 디스크(하위 수준 메모리)에서 다시 메모리로 가는 상태
1) 프로세스를 중단 후 재개하기 위해 현재 실행 중인 프로세스의 현재 문맥을 저장할 필요가 있음
2) 문맥
- 프로세스의 PCB에 표현
- CPU 레지스터의 값, 프로세스 상태, 메모리 관리 정보 등을 포함
3) 커널 모드 또는 사용자 모드에서 CPU 코어의 현재 상태를 저장한 다음 상태를 복원하여 작업을 재개
4) 문맥 교환

- 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업
- 문맥 교환이 일어나면, 커널은 과거 프로세스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구
- 문맥 교환이 일어나는 동안은 시스템이 아무런 유용한 일을 못 하기 때문에 이 시간은 오버헤드 임
- 문맥 교환 시간은 하드웨어의 지원에 크게 달라짐