그림을 보면 이해가 쉽다.
동기식 입출력을 보자.
사용자 모드에서 실행 중이던 프로세스 A가 시스템 콜 요청을 한다.
mode bit을 0으로 바꾸고 커널모드로 인터럽트 서비스 루틴을 실행한다.
'파일을 읽어 와라' 라는 요청이었다고 해보자.(data transfer 부분)
'파일을 읽어 오기 완료' 전까진 CPU는 기다리기만 한다.
비동기식 입출력의 경우,
인터럽트 서비스 루틴을 실행하고 바로 CPU는 사용자 프로그램에 넘어가
I/O 작업을 하는 동안 프로그램을 실행시키고 있는 것이다.
I/O 작업이 완료되면 해당 I/O Device controller가 인터럽트로 알려준다.
둘 중 뭐가 좋고 나쁨의 문제가 아니다.
내가 프로그램을 만들 때, 반드시 결과를 받아야 다음 일을 진행할 수 있을 경우에는 동기식을 쓰고,
아닐 경우엔 비동기식으로 코드를 짜면 되는 것이다.
DMA 컨트롤러가 없는 경우를 보자.
CPU에게 인터럽트가 ㅈㄴ 많이 온다.
키보드 a 하나 눌렀다고 인터럽트 걸고, 클릭 하나 했다고 인터럽트 걸고, CPU가 일을 제대로 할 수 있겠는가?
DMA는 I/O 작업을 일정 량이 차면, buffer storage의 내용을 메모리에 전송을 하고,
CPU에 인터럽트 요청을 1번 보내는 것이다.
이를 통해 인터럽트의 빈도를 줄일 수 있다.
'파일 시스템'에서 자세하게 설명하지만, 쉽게 설명하자면
I/O device도 주소가 있다. 근데 이게 커널 영역에 있어, 운영체제만 알 수 있는 것이다.
이걸 사용자 메모리에 올려 운영체제 도움 없이도 접근하는 것이다.
위로 갈수록 빠르고, 비싸고, 휘발성이 있다.
하드 디스크에 실행 파일인 프로그램이, 실행하면
프로세스 마다 0번지 부터 code, data, stack 영역으로 가상 메모리 address space를 부여 받는다.
그 다음에 주소 변환을 통해서 물리적인 메모리에 실제로 올라가는 것이다.
커널 영역에는