1> 실행중인 프로그램들에게 짧은 시간씩 CPU를 번갈아 할당
2> 실행중인 프로그램들에 메모리 공간을 적절히 분배
쉬지않고 일한다 즉 메모리에서 instruction을 읽어서 실행하고 또 실행한다.
1) OS 혹은 2) 사용자 프로그램이 가진다.
한 프로그램의 독점을 막는다.
정해진 시간이 흐른뒤 OS에 제어권을 넘기도록 인터럽트를 발생시킨다.
세팅시간 3 -> 2 -> 1 -> 0(인터럽트 발생)
인터럽트가 발생하면 CPU를 뺏는다.
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 OS에 피해가 가지 않도록 하기 위한 보호장치
OS가 CPU 실행한다. I/O Device에 접근, 메모리에 접근 등 제약없이 거의 다 가능하다.
즉 인터럽트나 Exception 발생시 하드웨어가 mode bit를 0으로 바꾼다(커널모드)
사용자프로그램이 CPU를 실행한다.
OS가 CPU를 실행하는 것과 다르게 제한이 걸린다.(보안의 문제)
만약 다시 사용자 프로그램에게 CPU를 넘기면 mode bit를 1로 셋팅한다(유저모드)
Device Controller는 I/O가 끝났을 경우에 인터럽트로 CPU에 그 사실을 알린다.(HW인터럽트)
제어정보를 위해 control register, status register를 가진다.
데이터를 저장하는 local buffer도 가진다.
I/O 장치가 인터럽트를 너무 자주걸어서 CPU가 방해받는 현상이 일어난다.(DMA 컨트롤러가 필요한 상황)
I/O의 작업이 끝나면 DMA controller가 local buffer에 있는 내용을 메모리에 복사한다. local buffer에는 I/O디바이스의 그동안의 작업이 쌓인다.
작업이 다 끝나면 CPU에 인터럽트를 한번만 건다.(CPU야 메모리에 다 올려놓았어!)
즉 CPU가 데이터를 메모리에 옮기지 않고 DMA 컨트롤러가 데이터를 메모리로 옮긴다. CPU가 할일을 대신함.
1) CPU는 메모리와 local buffer(I/O)에 둘다 접근 가능하다.
2) Device Controller(I/O)는 local buffer(I/O)에만 접근이 가능하다.
3) DMA Controller와 CPU는 메모리에 접근이 가능하다.
모든 입출력명령은 특권명령으로 OS를 통해서만 가능하다.
이런경우 System Call(프로그램이 직접 인터럽트를 거는 상황)이 발생한다.
I/O 요청을 위해 OS의 함수를 호출하려면 OS의 주소로 가야하지만 modebit가 1이기 때문에 불가능하다.
이런경우 프로그램이 직접 인터럽트 line을 셋팅하는 인스트럭션을 실행한다.(프로그램이 직접 인터럽트를 거는 상황)
-> 하드웨어가 modebit를 0으로 바꾼다.
인터럽트 당한 시점의 레지스터와 program counter를 save한 후 CPU 제어를 인터럽트 처리 루틴에 넘긴다.
HW가 발생시킨 인터럽트(일반적인 인터럽트)
1) Exception: 프로그램이 오류를 범한 경우
2) System Call: 프로그램이 커널 함수를 호출하는 경우
키보드를 뚝딱이면 키보드 프로그램이 System Call(I/O명령은 특권명령으로 커널영역을 읽어야 함)발생시킴. System Call을 통해 인터럽트 벡터가 가리키는 어떤 루틴실행
커널의 함수부분에는 Device Controller에게 I/O를 지시하는 인스트럭션이 있음
키보드의 입력이 localbuffer에 쌓이면 이제 이 입력을 메모리공간에 올려놓아야함
메모리에 다 올려놓았음!
OS(커널)는 평소에 CPU를 사용할 일이 없다. 오직 인터럽트가 오는 경우에만 CPU가 OS(커널)에게 넘어간다.
늘 사용자 프로그램이 CPU를 쓰고 있다.
OS를 만들면서 "이런 인터럽트가 들어오면 이런일을 해야함" 정의해 놓음
각 인터럽트 종류마다 어디있는 함수를 실행해야 하는지 그 주소를 정의해놓음
ex>
1번 인터럽트-> func1
2번 인터럽트-> func2
각 인터럽트마다 처리해야 할 실제코드