CPU가 하는 일
- 메모리에서 명령어(4bit)를 읽어들여, 실행
- 다음 명령어 실행 전, interrupt line에 들어온 값이 있는지 확인
동기식 입출력, 비동기식 입출력
동기식 입출력(synchronous I/O)
- I/O 요청 후, 입출력 작업을 완료하고, 그 다음에 사용자 프로그램이 작업을 진행하는 것
- I/O 장치까지 직접 가서 결과를 보고 오는 것
- 읽어들이라는 명령을 보내고, 실제로 I/O 장치까지 가서 읽어와서 그 내용으로 다음 작업을 수행하는 것
- 쓰라는 명령을 내리고, 실제로 I/O 장치까지 가서 직접 쓰고, 그 다음 작업을 수행하는 것
- 구현방법
- I/O가 끝날때까지 CPU를 낭비시킴. 매 시점 하나의 입출력만 일어날 수 있음
- I/O가 끝날때까지 해당 프로그램에게서 CPU를 뺏어서, 다른 프로그램에게 CPU 줌.
비동기식 입출력(asynchronous I/O)
- I/O 요청 후, 입출력 작업이 끝나기를 기다리지 않고, 사용자 프로그램이 그 다음 작업을 진행하는 것
- 주로, 입력 작업이 async로 사용된다(async write)
- 어떤 값을 쓰라고 하고, 다른 동작을 쭉 진행하는 것이 자연스럽기 때문
- 읽어들이는 작업은, 그 값을 읽어들이고 나서 다른 동작을 하는게 자연스러워서 주로 sync이다. (sync read)
- 주로, 입력 작업이 async로 사용된다(async write)
DMA
입출력 하나하나마다 인터럽트가 걸리면, CPU가 그때마다 운영체제로 제어권을 넘기고, 작업을 수행해야 한다.
이런 작업이 너무 비효율적이라, DMA 개발함
역할
- 메모리와 로컬 버퍼를 접근할 수 있다.
- 블럭 단위의 입출력이 끝났을 때만 인터럽트를 건다.
서로 다른 입출력 명령어
1. 일반적인 I/O 방식
- CPU에서 실행 가능한 명령어(기계어) 종류
- 메모리 접근 명령어
- I/O 장치 접근 명령어
2. Memory Mapped I/O 방식
- 메모리 접근 명령어 주소에 연장 주소를 붙인 것.
- 어느 명령어는 메모리 접근 명령어이고, 어느 명령어는 I/O 장치 접근 명령어이다
저장장치 계층 구조
- Primary(Executable)
- CPU가 직접 접근 가능한 저장장치
- 바이트 단위 접근이 가능한 곳이다
- Secondary
- CPU가 직접 접근 불가능한 저장장치
- 바이트 단위 접근 불가
- 예시) 하드디스크 - 섹터 단위
- Caching
- 재사용을 위해, 더 빠른 저장장치에 데이터를 캐싱해두는 것
프로그램의 실행 (메모리 load)
프로그램은, 파일 형태로 파일 시스템에 저장되어있다.
해당 파일이 -> 메모리에 올라가서 -> 프로세스가 되면서 실행되는 것이다
정확하게는, 파일이, virtual memory에 올라가는 것이 먼저이다.
즉, 각 프로그램마다 독자적으로 가상 메모리(가상 주소 공간)가 만들어지는 것이다.
그 후, 사용자 프로그램이 실행될 때, 물리 메모리에 가상 메모리이 있는 값들이 올라가게 된다.
이때 중요한 것은, 물리 메모리에 가상 메모리 전부가 올라가는 것이 아니고, 지금 당장 필요한 부분만 올라가게 된다는 것이다!
지금 당장 필요하지 않은 부분은, 디스크의 swap area에 내려놓게 된다.
- swap area란?
- 디스크의 어떤 부분으로서, 물리 메모리가 전부를 담지 못하기 때문에 잠시 저장하는 공간으로 사용된다.
- 어차피 메모리와 연관된 부분이라, 전원이 꺼지면 데이터 다 사라진다(휘발성).
커널 주소 공간의 내용
커널(운영체제)도 메모리 공간을 차지하는 하나의 프로그램이다.
그래서, code, data, stack 부분으로 구성되어있다.
code
- 시스템 콜, 인터럽트 처리 코드 등 운영체제가 실행해야하는 코드들
data
- 운영체제는 자원을 관리하는 역할을 수행하기 때문에, 각 자원에 대한 자료구조가 필요하다
- 프로세스 - PCB
- CPU,Mem,disk ... - 각 자료구조
stack
- 사용자 프로그램(프로세스) 별로 "커널 스택"이 따로 존재하는 곳이다
사용자 프로그램이 사용하는 함수
- 사용자 정의 함수
- 자신의 프로그램에서 정의한 함수
- 자신의 프로그램의 실행파일(프로세스의 code부분)에 포함되어 있다.
- 라이브러리 함수
- 자신의 프로그램에서 정의하지 않았는데 가져다 쓴 함수
- 자신의 프로그램의 실행파일(프로세스의 code부분)에 포함되어 있다.
- 커널 함수
- 운영체제 프로그램의 함수
- 커널 함수의 호출 = 시스템 콜
- 커널 프로그램의 code 부분