Computer : CPU(프로세서) + Memory
CPU : 하드웨어에 부착한 모든 장치의 동작을 제어하고 명령을 실행
연산장치 + 제어장치 + 레지스터로 구성Memory : CPU의 작업 공간

Registers, Cache, Memory는 CPU가 직접 접근할 수 있으며 바이트, 벡터 단위로 데이터를 읽고 쓰는 것이 가능
Register : 프로세서 내부에 있으며, 프로세서가 사용할 데이터를 보관하는 가장 빠른 메모리
메인 메모리 : 프로세서 외부에 있으며, 프로세서에서 즉각적으로 수행할 프로그램과 데이터를 저장
물리적 주소라고 함. 프로그래머가 수식이나 변수를 사용하면 컴파일러가 프로그램을 기계 명령어로 변환할 때 변수와 명령어에 주소를 할당하는데 이 주소를 논리적 주소라고 함. 이 논리적 주소를 물리적 주소로 변환하는 과정을 메모리 맵이라고 함
cache : 프로세서 내부나 외부에 있으며, 처리 속도가 빠른 프로세서(register)와 상대적으로 느린 메인 메모리의 속도 차이를 보완하는 고속 버퍼
Disk는 CPU가 직접 접근할 수 없어 바이트, 벡터 단위로 데이터를 읽는 것이 불가능하며 섹터 단위로만 읽을 수 있음
CPU는 매 시간마다(매 클럭마다) memory에서 기계어를 읽어서 처리
I/O devices : disk + keyboard + monitor + etc
각 I/O 마다 device controller가 붙어서 각 디바이스를 전담하는 CPU 역할을 수행
CPU의 작업 공간인 momory처럼 각 I/O device도 작업 공간이 존재하는 이것을 local buffer라고 함

CPU 안에는 메모리 보다 더 빠면서 정보를 저장할 수 있는 registers가 존재
mode bit은 CPU에서 사용되는 프로그램 운영체제인지 사용자 프로그램인지를 확인하는 역할을 수행
1 : User mode => 사용자 프로그램 수행0 : kerner mode => OS Code 수행 사용자 프로그램을 수행 중에는 mode bit가 1이며 이때 사용자 프로그램이 I/O device에 접근하기 위해서는 CPU를 통해 메모리에 상주하는 OS에 접근해야 함. 이때 interrupt를 걸어주면 mode bit가 0으로 바뀌고 커털 함수가 실행. 이후 I/O device에서 데이터 처리를 완료하면 I/O device controller가 interrupt를 걸어주고 mode bit가 1로 바뀌며 사용자 프로그램이 다시 cpu 점유를 가져가게 됨.
정해진 시간이 흐른 후 특정 프로그램의 CPU 점유를 회수 후 다른 프로그램에 할당
CPU는 실행되는 순간 종료되기까지 메모리에 올라온 기계어를 굉장히 빠른 속도로 처리하는 역할만을 담당. 따라서 많은 프로그램이 CPU를 돌려가며 점유하며 사용한다. 따라서 특정 프로그램이 CPU를 독점하고 있는 것은 굉장히 큰 문제가 될 수 있다.
CPU를 거치지 않고 입출력 장치가 메모리와 직접 데이터 전송을 할 수 있도록 함.
메모리에 올라온 프로그램이 I/O device에 접근하는 상황에서 대용량 데이터를 효율적으로 처리할 수 있어야 한다. 예를 파일을 하드디스크에서 메모리로 읽어오는 경우 대량의 데이터 전송이 필 이는 CPU에 부하를 줄 수 있음.
CPU가 DMA 컨트롤러에 디스크에서 메모리로 데이터를 전송하도록 명령
전송할 데이터의 시작 주소와 크기를 설정
DMA 컨트롤러가 디스크 컨트롤러에게 데이터를 요청
디스크에서 읽은 데이터가 DMA를 통해 메모리로 직접 전송
데이터 전송이 완료되면 DMA 컨트롤러가 인터럽트를 발생시켜 CPU에게 알림
I/O 장치와 로컬 버퍼를 사용하여 데이터 전송을 관리함.
키보드로 입력을 받을 때마다 interrupt를 발생시킨다면 CPU는 굉장히 자주 interrupt를 받을 것이고 이는 매우 비효율적.
프로그램이 키보드를 사용하기 위해 시스템 콜을 통해 CPU에 요청
시스템 콜 : I/O device에 접근하기 위해 커널 함수를 호출해야되는데 이것을 사용자 프로그램이 CPU에 요청하는 것CPU는 시스템 콜을 처리하여 커널 함수를 호출. 이 함수는 I/O 작업을 설정하고, I/O 디바이스를 컨트롤러에게 작업을 넘김
디바이스 컨트롤러는 작업 명령을 받아 수행 후 데이터를 버퍼에 저장
작업 명령이 수행되면 Interrupt를 발생시켜 CPU에게 작업 완룔를 알림
CPU는 인터럽트 감지고하 인터럽트 서비스 루틴 수행
이때 입출력을 어떻게 처리하냐에 따라 동기식 입출력과 비동기식 입출력을 나누어짐
동기식 입출력 : I/O에 요청 후 작업이 완료될 때까지 기다림
비동기식 입출력 : I/O에 요청 후 입출력 작업을 기다리지 않고그대로 제어가 다시 해당 프로그램으로 넘어감