KOCW 사이트를 이용하여 듣게 된 반효경 교수님의 운영체제 강의 내용을 간단히 정리하여 포스팅합니다.
write는 async 하게 작동되는 것이 자연스러움. 만약 sync하게 작업시키고 싶을 때 sync 쓸 수도 있음. 구현하기 나름인 것.
그런데 io는 비교적 (cpu 작업에 비하면) 오래 걸리는 작업이므로 이를 기다리면 cpu가 낭비 될 수 있다. 그래서 다른 동기 프로세스에 cpu를 넘기게 된다. 이것이 위에 있는 구현 방법 2이다. 동기식 입출력이 보통 이 방식으로 구현된다.
io 작업이 끝나면 cpu에 인터럽트 걸게 된다. 그런데 io 작업이 쉴새 없이 쏟아진다면..?
왼쪽은 일반적인 IO 방식이다. 메모리 접근해야 하는 instruction과, 각 io device별로 접근하는 instruction이 각자 따로 있다.
오른쪽은 Memory Mapped I/O 방식으로, io device에다가 메모리 주소의 연장 주소를 붙여서 접근한다.
위로 갈수록 빠르고, 비싸고, 용량이 적고, 휘발성이다.
primary 영역 → cpu가 접근해서 실행이 가능한 바이트 단위로 접근이 가능하다. 바이트 단위로 접근이 가능하다.
secondary 영역 → byte 단위가 아닌 섹터 단위로 접근이 가능하다. executable하지 않은 매체이다.
Caching → 빠른 매체로 정보를 읽어 들여 놓아 사용하는 것이다. 그러나 용량이 작으므로 어떤 것을 지우고 할 지가 주요 이슈가 된다.
프로그램은 disk 상에서 file system 용도로 자신만의 독자적인 주소 공간을 가진다. 이를 virtual memory라고 하며, code(기계어 코드), data(전역 변수), stack(함수 호출, 리턴 시 스택으로 쌓는 영역)으로 구성되어 있다.
프로그램이 실행되면, 이를 물리적인 메모리로 올려서 실행하게 된다. 프로그램을 물리적인 메모리에 다 올리는 게 아니라 필요한 부분만 올려서 사용한다. 그래서 메모리의 낭비를 줄일 수 있다. 필요가 적어진 메모리는 디스크의 swap에 내려놓게 된다(메인 메모리의 연장 공간).
프로그램마다 각 주소는 0번지 부터 시작하게 된다. 그런데 virtual memory에서 physical memory로 갈 때 주소가 변환되어야 하는데, 이는 하드웨어의 도움을 받아야 한다. (logical memory address → physical memory address)
cpu, mem, disk 하드웨어를 관리하기 위해서 커널 내 data 영역에 주소 공간을 만들어 관리를 하게 된다.
커널은 프로세스도 관리하게 되는 데, 각 프로그램 마다 운영체제가 관리하는 자료구조가 필요하다. program contral block. 프로세스 마다 pcb가 만들어져 관리하게 됨.
함수 호출 및 실행에 스택 영역이 사용됨.
사용자 프로그램마다 커널 스택도 따로 두게 됨.
대부분의 프로그래밍 언어는 함수 구조로 짜여져 있다. 기계어로 컴파일 되어도 어디부터 어디까지가 함수 구조로 짜여져 있는지 쓰여져 있다. 또한 컴파일 시 프로그램 안에 포함되어 있는 함수는 사용자 정의 함수, 라이브러리 함수이다.
반면에 커널 함수는 커널 코드 안에 들어 있는 함수이다.
사용자 프로그램 안에는 사용자 함수 및 라이브러리 함수의 코드가 있으므로, 커널 함수를 쓰고 싶다면 점프를 해야 한다.
그런데 점프는 physical memory 상에서 이루어지는 것이므로, 사용자 코드에서 커널 코드로 점프를 하는 것은 불가능하다.
따라서 system call을 통해 커널 함수를 호출해야 한다.
==> 커널 함수 호출할 때는 system call을 통해서 cpu 자원을 kernel로 넘어가게 해서 커널 함수를 실행하게 된다.
프로그램의 실행을 user mode와 kernel mode로 나누어 살펴본 사진이다. program이 cpu 잡고 있을 때 → user mode이고, system call을 하게 되면 kernel로 제어권이 변경되며 커널 공간의 코드가 실행된다. 시스템 콜이 끝나면 프로그램으로 cpu 제어권이 넘어오고 다시금 자기의 제어권에 있는 코드를 실행하는 양상이 반복된다.
강의 | 운영체제(2014, 이화여대), 반효경