보통 우리가 사용하는 컴퓨터를 넓은 범위에서 보자면, CPU와 Memory로 이루어진 Computer와 그 이외의(키보드, 마우스, 모니터, 디스크 등) I/O디바이스로 이루어져 있다.
메모리는 cpu의 작업 공간이다.
cpu는 매 사이클마다 메모리에서 인스트럭션(명령어)을 하나씩 읽어서 일을 하게 된다.
device controller
각각의 I/O device는 디바이스를 전담하는 cpu가 있다. 각각의 디바이스를 내부에서 통제하는 것이다.
local buffer
device controller도 메모리와 같은 작업공간이 있다.
cpu와 I/O디바이스의 처리속도 차이가 많이 난다. 그렇기 때문에 local buffer에 저장해두었다가 읽어 들이기도 한다.
registers
cpu안에서 메모리 보다 빠르면저 정보를 저장하는 공간
mode bit
cpu에서 수행되는 것이 작업이 운영체제인지, 사용자프로그램인지 구분해주는 것이다. CPU제어권이 운영체제에 있는지, 사용자프로그램에 있는지를 구분해주기 위한 것이다.
interrupt line
cpu는 메모리에 있는 인스트럭션만 반복해서 수행을 하게 되는데, 디바이스에서 수행되어진 내용을 어떻게 알 수 있을까?
주변기기가 CPU에게 어떤 사실을 알리는 일을 Interrupt라고 한다.
cpu가 A라는 프로그램을 수행하다가 경우에 따라서 input()이라는 명령어로 키보드 입력을 받아야 하는 경우라면 어떻게 해야 할까?
항상 메모리만을 작업하는 것이 아니라 키보드, 화면, 디스크에서 작업을 해야 하는 경우도 있다. 그런 경우 cpu가 직접 i/o디바이스에 접근하는 것이 아니라, 일을 시키는 인스트럭션을 통해 device controller에게 일을 시키게 된다.
timer
만약에 특정 프로그램이 무한루프 작업을 하는 프로그램이라면 cpu가 한번 넘어가면 계속 cpu를 쓸 것이고 다른 프로그램에 넘어가지 못하게 된다.
그래서 timer라는 하드웨어가 있다.
특정 프로그램이 cpu를 독점하는 것을 막는 역할을 한다.
처음 컴퓨터를 켜면 운영체제가 cpu를 가지고 있다가, 프로그램이 실행되면 cpu를 넘겨주는데, 그냥 넘겨주는 것이 아니라 timer에 어떤값을 세팅한 후에 넘겨준다.
사용자 프로그램은 계속 cpu를 사용하는 것이 아니라 세팅된 시간이 되면, timer가 cpu에게 interrupt를 준다. 세팅시간이 끝났다고, cpu는 인스트럭션 실행 후 interrupt line을 확인하는데, 확인해서 interrupt가 있다면, cpu는 하던 일을 멈추고 cpu의 제어권이 사용자프로그램에서 운영체제로 넘어가게 된다.
timer interrupt를 cpu에게 주어서 제어권이 사용자프로그램에서 운영체제로 넘어가게 된다.
mode bit이 0일때는 운영체제가 cpu제어권을 가지고, cpu에서 실행 중일때는 무슨 일이든 할 수 있다고 정의되어 있다.
mode bit이 1일때는 사용자프로세스가 cpu제어권을 가지고, 보안상의 이유로 제한된 인스트럭션만 cpu에서 수행할 수 있다.
I/O디바이스에 접근하는 인스트럭션은 mode bit이 0일 때, 즉 운영체제가 cpu제어권을 가질때만 가능하다.
운영체제가 사용자프로그램에 cpu를 넘겨 줄때 timer에 특정 값을 세팅 후 넘겨주게 된다. 그렇지 않으면, 사용자 프로그램이 cpu제어권을 놓지 않아서, 다른 프로그램이 cpu를 사용하지 못하게 된다.
사용자프로그램은 직접 I/O디바이스 에 접근할 수 없다.
운영체제를 걸쳐서 접근할 수 있다. 그렇기 때문에 cpu제어권을 운영체제에게 넘기게 된다(시스템콜). 넘어온 CPU제어권은 I/O디바이스에게 요청한 작업에 대한 응답이 넘어 올때 까지 다른 프로그램에게 cpu를 넘겨준다.
I/O요청이 끝나게 되면 device controller에서 cpu에 인터럽트를 걸게되고, 그러면 제어권이 다시 운영체제로 넘어가게 되고, 앞서 I/O요청을 한 프로세스에게 다시 할당 차례가 되면 할당해준다.
시스템 콜
프로그램이 운영체제 요청을 하기위해서 interrupt를 걸 수 있다. 이렇게 해서 I/O 요청을 할 수 있다.
I/O를 위한 인터럽트는 다음과 같다.
사용자 프로그램이 운영체제에 시스템 콜(소프트웨어 인터럽트) 을 한다.
운영체제가 I/O를 위한 요청을 보낸다.
요청에 대한 작업이 끝나면 하드웨어 인터럽트가 발생
현대의 운영체제는 인터럽트에 의해 구동된다.