이전의 OS는 편의성을 제공해주기 위한 것이었다. 어떤 H/W든 application이 실행되도록 하기만 했으며 하나의 application이 동작하는 동안 다른 application은 동작할 수 없었다.
👉🏻 따라서 CPU, memory 등 자원을 활용하지 못했다.
: 동시에 여러가지 일을 수행하는 것으로 여러 일을 memory에 올려놓고 resource를 필요한 부분에 효율적으로 배분한다.
Issue
Solution
process : 진행중인 프로그램, OS에서 관리하는 작업의 단위
SSD에 있는 그냥 기계어를 번역한 것 뿐인 program이 memory에 올라가야 CPU와 통신을 할 수 있는데 memory에서 코드 실행을 위한 변수 등이 들어가는 작업공간까지 할당 받았을 때 모두 할당이 된 것을 process라고 부른다.
CPU와 통신하면 process를 읽어서 수행한 후 결과를 memory에 쓴다.
multitasking : memory에 process가 여러 개 있는 것
virtual memory management : memory의 용량이 제한적이기 때문에 process 그대로 disk에 저장
application은 OS에 요청만 가능하다 - device를 건들지 못하게 👉🏻 I/O request
만약 하는 일이 끝났다면 interrupt한다.
data를 업데이트 하는 방법
ex) C프로그램 실행 방법
명령 실행 → 명령 번역 → disk에 어디에 있는지 찾음 (OS의 file system management, disk scheduling) → disk에 있는 명령어 메모리에 복사 (OS의 memory management) → memory 공간까지 확보해서 process 만듦 (OS의 process management) → monitor에 print
: 하고 있는 일을 멈추고 다른 일 할때 생기는 것
: 한 process가 I/O device를 쓸 때에는 CPU는 다른 일을 하기 위해 CPU에게 operation이 끝났다고 말하는 것
👉🏻 device controller와 CPU 사이의 communication
interrupt가 발생하면 모든 일이 중단된다.
interrupt되면 실행되는 파일은 모두 memory에 올라가고 kernel mode에 있는 interrupt vector로 옮겨가 interrupt service routine을 실행한다.
👉🏻 n번 interrupt면 interrupt vector의 n번째 시작주소에서 실행
프로그램이 CPU를 사용하기 위해서는 process라는 이름으로 main memory에 상주한다.
: 다양한 프로그램이 main memory에 올라가 있으면 multitasking이 가능하다.
scheduling
→ 언제 누가, 어떤 process에 CPU를 할당할 것인가CPU job Scheduling
multitasking으로 인한 문제점
OS previleged instruction
: OS만 할 수 있게 하는 것, 언제 할 수 있냐는 mode로 정한다.
ex) OS가 disk에 값을 쓴다고 했을 때 사용자가 값을 쓰지 못하게 하는 것
👉🏻 CPU 안 register 안에 mode bit가 0이면 kernel mode, 1이면 user mode
📌 kernel mode면 전체 메모리에 접근이 가능하다. user mode면 kernel memory에 접근이 불가능하다.
ex) I/O device에서 파일을 읽을 때 OS에게 요청해 interrupt를 걸어서 요청한다
: interrupt이기에 interrupt vector로 가서 system call에 대한 interrupt service routin을 수행한다.
→ OS에 요청해 system call이 호출되면 mode bit가 0으로 바뀌고 OS가 해당하는 일에 대해 해준다
system call을 호출하면 process는 CPU를 사용하지 않고 기다리고 CPU는 system call에 해당하는 코드에 사용된다.
ex) 파일 복사법
SSD 안에 있는 파일 데이터를 memory에 읽어온 후 SSD의 다른 위치에 다시 쓴다.
👉🏻 disk에 써야하기 때문에 OS에서 해야 한다 (system call)
system call도 다른 system call을 호출한다.
: system call을 제공하는 것으로 프로그래머가 사용하는 함수이다.
system call을 쓰지 않고 library api 쓰는 이유
👉🏻 printf()라는 api call을 사용하면 write()는 system call을 호출해 실행하면 interrupt 걸림
: system call과는 다른 것으로 process 안에서 함수를 호출해 함수 위치로 program counter가 이돌하는 것
: system call을 이용해서 만든 프로그램
ex) 작업 관리자
kernel : 모든 system programm이 구현되어 있는 집합체
MS DOS
application과 H/W를 정확히 차단하지 못해 application이 직접 H/W를 건드릴 수 있었다
Monolithic structure
한 덩어리로 UNIX가 예이다
모든 기능이 하나의 실행 차일 안에 들어있어 매우 빠르고 외부랑 소통할 일이 없다. 하지만 너무 크고 수정할 부분이 있으면 다시 하나의 파일을 만들어 build해야 해서 오래 걸리고 불편하다.
microkernel system structure
하나의 커널이 여러 개의 kernel로 쪼개져 있어 kernel이 작아졌다.
kernel 자체가 가벼워져 수정이 용이해졌으나 process끼리 통신을 하지 못해 OS를 이용해야 하기 때문에 느리고 overhead가 발생한다.
loadable kernel module
kernel 모드에서 동작하는데 핵심 kernel이 있고 나머지는 필요할 때마다 올렸다 내렸다 하는 것이다.
Hybrid systems
monolithic과 microkernel의 장점만 취한 것이다.