CPU: Memory에서 instruction(기계어)를 읽어와서 실행하는 것을 반복한다.
registers:
mode bit: CPU에서 실행되고 있는 것이 사용자 프로그램인지 운영체제인지 구분해주는 장치
Interrupt line: CPU가 사용자 프로그램을 사용하다가 I/O device에 접근이 필요한 경우,
Timer: CPU의 time sharing을 구현하기 위한 하드웨어로 특정 프로그램이 CPU를 독점하는 것을 막는다. timer에 할당된 시간이 끝나면 timer가 timer interrupt를 걸어서 CPU 제어권이 실행되던 프로그램에서 운영체제로 넘어가게 한다.
Memory: CPU의 작업공간.
I/O device: 입출력 장치. input device의 예시로는 키보다, output device의 예시로는 프린터와 모니터를 들 수 있다. Disk의 경우 disk에 저장되어있는 데이터를 읽기도 하고, 실행결과를 저장할 수도 있기 때문에 I/O가 모두 가능한 device로 볼 수 있다.
device controller: 각 I/O device를 전담하는 작은 CPU 역할을 한다.
local buffer: device controller의 작업공간
사용자 프로그램이 무한 루프 등으로 인해 한 번 실행되었을 때 CPU를 계속 사용하게 된다면 다른 프로그램을 실행할 수 없을 것이다. 이를 방지하기 위하여 사용자 프로그램을 실행할 때 timer에 시간을 설정하여 사용자 프로그램이 정해진 시간동안만 CPU를 사용하도록 한다. 시간이 다 되면 timer에서 CPU에 interrupt를 걸어 운영체제에게 CPU 제어권을 넘겨준다.
interrupt를 당한 시점의 register와 program counter를 save한 후 CPU의 제어를 interrupt 처리 루틴에 넘긴다.
[인터럽트 관련 용어]
interrupt의 종류에 따라서 이후 어떤 작업이 필요한지가 달라진다. interrupt의 종류 별로 어떤 동작을 해야하는지에 대한 함수가 '인터럽트 처리 루틴', 이런 인터럽트 처리 루틴의 주소를 정리해놓은 것을 '언터럽트 벡터'라고 한다.
I/O device controller
I/O는 device와 local buffer 사이에서 일어난다.
Device Controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알린다.
Device Driver(장치구동기): OS 코드 중 각 장치별 처리 루틴 - software
Device Controller(장치 제어기): 각 장치를 통제하는 일종의 작은 CPU - hardware
DMA가 없다면?
메모리에 접근할 수 있는 것은 CPU 밖에 없기 때문에 입출력 장치에서 I/O가 완료될 때마다 device의 buffer storage에 있는 bit 단위의 입력값을 memory로 옮기기 위하여 CPU에 interrupt를 걸어야한다. 이 경우 CPU가 I/O device에 의해 interrupt의 발생 빈도가 높아져 CPU가 효율적으로 운영될 수 없다는 문제점이 발생한다.
따라서 DMA를 통해 I/O device의 buffer storage에 있는 입력값을 memory로 복사한다. memory에 데이터가 block 단위로 쌓이게 되면 CPU에 interrupt를 걸어 CPU가 이를 처리하도록 한다. 이를 통해 CPU가 효율적으로 동작할 수 있도록 돕는다.
모든 입출력 명령은 특권 명령이다.
사용자 프로그램이 I/O를 수행하는 과정
1. system call: 사용자 프로그램이 운영체제에게 I/O를 요청
2. trap(software interrupt)을 사용하여 interript vector의 특정 위치로 이동
3. 제어권이 interrupt vector가 가리키는 interrupt service routine으로 이동
4. 올바른 I/O 요청인지 확인 후 I/O 수행
5. I/O 완료 시 interrupt(hardware interrupt)를 사용하여 CPU에 알림
I/O를 요청한 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어간다. 즉 I/O 작업이 완료되기 전까지 CPU 제어권이 사용자 프로그램에게 없는 상태이다.
[구현방법 1]
-I/O가 완료될 때까지 CPU를 다른 프로그램에게 넘겨주지 않기 때문에 CPU를 낭비시킨다.
-요청된 I/O가 완료될 때까지 CPU가 다른 프로그램을 실행하고 있지 않기 때문에 매 시점 하나의 I/O만 발생한다.
[구현방법 2]
-I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗는다.
-I/O 처리를 기다리는 줄에 그 프로그램을 줄 세운다.
-다른 프로그램에게 CPU를 준다.
I/O가 시작되면 끝나기를 기다리지 않고 CPU 제어권이 사용자 프로그램에게로 즉시 넘어간다. 즉 I/O가 완료될 때까지 CPU가 쉬도록 두지 않고, 실행되고 있던 사용자 프로그램 내에서 CPU가 I/O와 상관없는 작업을 실행하도록 한다.
두 경우 모두 I/O의 완료는 interrupt로 알려준다.
: 동기식 입출력과 비동기식 입출력은 I/O 요청 ~ 완료 시점까지 CPU 제어권이 사용자 프로그램에게 있는지 여부에 따라서 구분한다. CPU 제어권이 사용자 프로그램에게 없으면 '동기식 입출력', 있으면 '비동기식 입출력'이다.
CPU에서 사용하는 instruction에는 memory에 접근하는 것과 I/O 장치에 접근하는 것이 있다.
I/O Device에는 device address가 부여되고, Memory에는 memory address가 부여하여 각각의 address에 접근하는 instruction을 따로 사용한다.
I/O 장치에도 memory address를 부여하여 memory와 I/O 장치 모두 memory address에 접근하는 instruction을 사용한다.
위쪽에 있을수록 속도가 빠르고, 단위 당 가격이 비싸고, 휘발성이다.
Address space는 code, data, stack으로 구분되며, 프로그램을 실행하는 과정에서 필요한 부분은 pysical memory에, 그렇지 않은 부분은 Swap area에 분리되어 놓여지므로 virtual memory이다.
Disk의 File system은 비휘발성, Swap area는 휘발성
code: 커널 코드
data: CPU, memory, disk, PCB(process control block)
stack: 함수를 호출하거나 return할 때 stack을 사용해야하는데, 이때 사용되는 각 process의 커널 stack.
1) 사용자 정의 함수
2) 라이브러리 함수
3) 커널함수
1, 2는 Process Address space의 code 부분에 위치하고, 3은 Kernal Address space의 code 부분에 위치한다.