파일 시스템 내에 실행파일 A -> 실행하면 메모리 상에 올라가서 "프로세스" 가 됨.
이 과정 중간에 Virtual memory 단계를 거치게 됨.
프로그램 만의 독자적인 주소 공간(address space) 생겨나는데 그걸 virtual memory 라고 함.
Virtual Memory: 프로그램이 사용하는 주소 공간을 물리적 메모리와 분리하여 관리하는 시스템. 이로 인해 프로그램은 자신만의 연속적인 주소 공간을 가짐.
각각의 프로그램들은 0x0부터 시작하는 자기만의 메모리 주소공간이 있다.
당장 필요한 부분은 물리적인 메모리 상에 올라가게 되고, 그렇지 않은 부분은 swap area에 올라가게 된다.
물리적인 메모리 상에 가상 메모리를 올리기 위해선, 주소 변환 과정이 필요하다.
주소 변환 과정은 운영체제와 하드웨어(MMU, Memory Management Unit)의 협력을 통해 이루어짐.
virtual memory의 address space는
code - data(데이터 저장 영역) - stack(로컬 변수, 함수 호출과 리턴에 대한 정보)
으로 구성이 된다!
data와 stack 사이에 heap 영역이 존재하며, 동적 메모리 할당을 관리함.
PCB : 프로세스를 다루기 위해 존재.사용자 정의 함수, 라이브러리 함수는 프로세스의 address space 상에 존재.
커널 함수는 커널 영역의 address space 상에 존재.
커널 함수(시스템콜)를 사용하기 위해선 CPU 제어권을 운영체제로 넘겨야해서 인터럽트를 발생하여야한다.
시스템콜을 부르는 것은 오버헤드가 큰 일이다.(유저모드 -> 커널모드 -> 유저모드)
"Process is a program in execution"
운영체제는 프로세스의 context를 중요히 여김.
프로세스는 상태가 변경되면서 수행된다.
운영체제는 PCB를 통해 프로세스가 어떤 상태인지를 일일히 확인.
자료구조 큐를 활용해 줄을 세워놓고 프로세스 처리를 진행함.
디스크에서 어떤 파일을 읽어오는 경우, 디스크 I/O 큐에 줄세우고 프로세스를 Blocked 상태에 두게 된다.
문맥교환이 일어날때는 CPU를 뺏기는 프로세스의 문맥을 저장하고, 얻는 프로세스의 문맥을 복원하는 과정이 필요하다. 그 내용들이 운영체제가 보관하는 PCB에 담긴다!

(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save(CPU 레지스터 값 등)해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼 모든 context 관련 정보를 저장해야함.
A -> B 로 스위칭 될때, 캐시 메모리 flush하는 작업이 오버헤드가 크다.
Job Queue
: 현재 시스템 내에 있는 모든 프로세스 집합
Ready queue
: 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
Device queues
: I/O device 처리를 기다리는 프로세스의 집합
프로세스들은 각 큐들을 오가며 수행된다.
운영체제 함수 또는 스케줄링을 하는 코드의 일부분.
장기 스케줄러: 어떤 프로세스를 ready queue로 보낼지 결정
단기 스케줄러: 다음에 실행할 프로세스를 결정
중기 스케줄러: 메모리에서 프로세스를 내보내거나 다시 불러오는 역할
일반적으로는 장기스케줄러가 없어서 프로세스가 생성되면 곧바로 레디로 넘어간다.
장기 스케줄러가 있는 시스템의 경우, 처음 프로세스가 생성될 때 new -> ready 로 넘어간다. 그 때 new가 완료된 프로세스를 admitted해주는 것이 장기 스케줄러.
처음 프로세스가 시작 될 때 큐에 들어오도록 허락해주는 역할을 하는 게 장기 스케줄러.
장기스케줄러는 메모리 자원에 대한 관리.
중기 스케줄러가 들어오면서 추가적인 프로세스 상태가 생김.
-> Suspended(stopped)
: 외부적인 이유로 프로세스의 수행이 정지된 상태
프로세스는 통째로 디스크에 swap out 된다.
(예) 사용자가 프로그램을 일시 정지 시킨 경우(Ctrl + z)
시스템이 여러 이유로 프로세스를 잠시 중단시킴 (메모리에 너무 많은 프로세스가 올라와 있을 때)
-> 메모리를 다 뺏기고 디스크로 쫓겨남.
