프로그램의 실행

- 프로그램은 파일시스템에 실행파일 형태로 저장되어 있음
- 메모리에 올라가면 프로세스가 됨
- 가상메모리
- 각 프로그램만의 독자적인 주소가 존재 (logical memory)
- 당장 필요한 부분은 메모리(physical memory)에 로드되고, 그렇지 않은 부분은 swap area에 내려가 있음
code
(실제 cpu가 수행할 기계어가 모여있음)
data
(전역 변수 등)
stack
으로 구성됨
- 가상메모리와 메모리의 주소는 다르기 때문에 address traslation을 거쳐야 함
- 커널 또한 하나의 프로그램이기 때문에 code, data, stack으로 구성되어 있음
커널 주소 공간의 내용

-
code
- 자원을 효율적으로 관리하기 위한 코드가 커널 내부에 존재
- 사용자에게 편리한 인터페이스 제공
- 시스템콜, 인터럽트 처리 코드
-
data
- OS는 HW를 관리하기 위한 자료구조를 갖추고 있을 뿐만 아니라 모든 프로세스(SW)들을 관리하기 위한 자료구조도 갖추고 있음 = PCB
- ex. process가 10개 구동 중이라면 ? PCB 또한 10개 구동 중
-
stack
- 커널의 스택은 타 실행 프로그램들의 스택과 달리 OS스택은 누구의 서비스를 수행하기 위해 OS 코드가 현재 실행되는가에 따라 각 프로세스마다 별도로 실행
사용자 프로그램이 사용하는 함수
- 함수
- 사용자 정의 함수
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수
- 자신의 프로그램의 실행 파일에 포함되어 있음
- 커널 함수
- OS 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
프로그램의 실행
프로그램이 종료될때까지의 일련의 과정

그림과 같이 프로그램 실행 도중에,
- cpu 제어권이 계속 바뀔 수 있다
- 내가 정의된 함수나 라이브러리는 유저모드에서 실행된다
- 시스템콜 등을 부르게 되면 커널모드에서 실행된다
프로세스
프로세스의 상태

running
- CPU를 잡고 instruction을 수행 중인 상태
ready
- CPU를 기다리는 상태(메모리 등 다른 조건은 모두 만족한 상태)
Blocked (wait, sleep)
- CPU를 주어도 당장 instruction을 수행할 수 없는 상태
- 프로세스 사진이 요청한 event(ex. 키보드 입력 등)가 즉시 만족되지 않아 이를 기다리는 상태이거나 디스크에서 file을 읽어와야하는 경우에 해당 됨
Suspended (stopped)
- 외부적인 이유로 프로세스의 수행이 정지된 상태
- 프로세스는 통째로 디스크에 swap out 된다
- 외부적인 이유
- 메모리에 너무 많은 프로세스가 올라와서 OS가 해당 프로세스를 메모리로부터 뺏음
- 사용자가 프로그램을 일시 정지 시킨 경우 (break key)
💬 참고
Blocked
: 자신이 요청한 event가 만족되면 다시 ready
Suspended
: 외부에서 resume을 주어야만 active하게 됨

결국 각 프로세스는 여러 큐를 통해 자신의 상태가 분류되며 이는 OS의 PCB를 통해 관리를 하게된다 ❗️
PCB (Process Control Block)
- OS가 각 process를 관리하기 위해 프로세스 당 유지하는 정보
- 다음의 구성 요소를 가짐 (구조체로 유지)

- OS가 관리상 사용하는 정보
- process state, process ID
- scheduling information, priority
- CPU 수행 관련 하드웨어 값
- Program counter, registers
- 메모리 관련
- 파일 관련
Context Switch (문맥교환)

- CPU를 한 프로세스에서 '다른' 프로세스로 넘겨주는 과정
- CPU가 다른 프로세스에게 넘어갈 때 OS는 다음을 수행 함
- CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장
- CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴
🚨 시스템 콜이나 인터럽트가 발생했다고 해서 반드시 context switch가 일어나는 것은 아니다

위 사진에서 (1)은 context switching이 아니다. 물론 (1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 저장해야하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 크다 (ex. cache memory flush)
*(1)의 interrupt는 A 프로그램이 아닌 타 프로그램이 IO작업 완료 후 발생시킨 인터럽트 일 수 있음
프로세스를 스케줄링하기 위한 큐
- job queue
- ready queue
- 현재 메모리 내에 있으면서 CPU를 잡아서 실행되기를 기다리는 프로세스의 집합
- device queue
- I/O device의 처리를 기다리는 프로세스의 집합
프로세스들은 각 큐들을 오가며 수행된다
스케줄러 (Scheduler)
OS에서 스케줄링을 하는 코드를 스케줄러라고 부름
Long-term scheduler
(메모리 스케줄러)
- 메모리에 프로그램이 admitted 될 수 있도록 하는 것
- degree of multiprogramming 를 제어
- time sharing system에는 OS는 보통 장기 스케줄러가 없음
Short-term scheduler
(CPU 스케줄러)
- 매우 자주 호출 됨
- timer interrput 발생 시 마다 호출
- 프로세스에 CPU를 주는 문제
medium-term scheduler
(swapper)
- 보통 장기 스케줄러가 없기 때문에 실행시킨 프로그램은 보통 모두 메모리에 로드 됨
- 그러나, 모두 로드되면 메모리 경합이 매우 심하여 성능이 안좋아지기 때문에 일부 프로그램은 메모리에서 쫒아내는 게 더 효율적일 수 있음. 그 역할을 하는 것이 중기 스케줄러임
- 여유 공간 마련을 위해 프로세스를 통째로 메모리에서 디스크로 쫒아냄
- 프로세스에게서 memory를 뺏는 문제
- degree of multiprogramming를 제어