
I/O 작업이 완료되었는지 직접 확인하다고 생각하면 이해가 편하다(끝났다는 인터럽트가 올때까지 대기).
I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에게 넘어간다.
구현방법 1
- I/O가 끝날 때까지 CPU를 낭비시킨다.
- 매시점 하나의 I/O만 일어날 수 있다.
구현방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗는다.
- I/O처리를 기다리는 줄에 그 프로그램을 줄 세운다.
- 다른 프로그램에게 CPU를 준다.

원래는 메모리에 CPU밖에 접근을 못하지만, DMA를 통해서 작은(사소한) 일들을 메모리에 카피를 하고 모아놓은 것을 한번에 CPU에 인터럽트한다(CPU의 효율성).
빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용한다.
CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block단위로 직접 전송한다.
바이트 단위가 아니라 block단위로 인터럽트를 발생시킨다.

- I/O를 수행하는 special instruction에 의해(일반적)
- Memory Mapped I/O에 의해

맨 위에는 항상 CPU
위로갈수록 속도는 빠르지만 가격상의 이유로 용량이 적다.
Primary저장매체는 CPU에서 직접 접근이 가능하고, 저장장치는 전원이 나가면 데이터가 사라지는 휘발성 매체이다(메모리는 비휘발성 매체가 개발중).
Secondary저장매체는 CPU에서 직접 접근이 불가능하다.
Caching : 정보를 좀 더 빠른 저장 시스템으로 복사하는 것.

- 프로그램을 실행시키면 프로그램의 독자적 주소공간(코드, 데이터, 스택) =
Virtual memory이 형성된다(메모리).- 독자적 주소공간을 물리적 메모리에 올려서 실행시키는데, 전체를 올리는 것이 아니라 당장 필요한 부분만 올라가게 한다(낭비를 줄이기 위해서).
- 주소공간 중 당장 필요하지 않은 부분은 디스크의 Swap area에 보관한다.
- File system은 전원이 나가도 데이터가 유지, Swap area는 전원이 나가면 데이터가 사라진다.
- Vitual memory나 Physical memory모두 0번지 부터 시작해서 데이터가 쌓인다. 데이터가 전달될 때 메모리 주소가 달라지는 경우(ex 1000 -> 3000) 메모리 주소 변화를 해준다(하드웨어).

커널 코드
- 시스템 콜, 인터럽트 처리 코드
- 자원 관리를 위한 코드
- 편리한 서비스 제공을 위한 코드
데이터
- 운영체제가 사용하는 여러 자료구조들이 정의가 되어 있다.
- 하드웨어 종류마다 자료구조를 따로 만들어서 관리한다.
- 현재 실행중인 프로그램들을 관리하기 위한 자료구조도 필요하다(Process Control Block).
스택
- 운영체제가 함수를 불러 실행할 때 필요한 스택.
함수(function)
- 사용자 정의 함수 : 자신의 프로그램에서 정의한 함수
- 라이브러리 함수 : 자신의 프로그램에서 정의하지 않고 갖다 쓴 함수, 자신의 프로그램의 실행 파일에 포함되어 있는 함수.
- 커널 함수 : 운영체제 프로그램의 함수, 커널 함수의 호출(시스템 콜).
사용자 함수, 라이브러리 함수 -> 프로세스A의 Address space
커널 함수 -> Kernel Address space

프로그램이 직접 CPU -> user mode. 사용자 정의 함수도 이 부분에서 실행
System call이 일어나면 kernel에서 실행
System call이 끝나면 다시 프로그램에게 CPU권한이 넘겨오고, 다시 System call이 일어나면 kernel에게 넘겨진다.
