컴퓨터 시스템 구조
Computer
- CPU
- mode bit : 사용자 모드 (0 : 커널, 1 : 사용자)
- registers : CPU가 일시적으로 데이터를 저장하는 기억장치 입니다
- interrupt line : 들어온 인터럽트를 확인하는 공간입니다
- Memory: CPU의 작업 공간입니다
- CPU
timer : 한 작업 당 CPU를 일정시간 동안만 사용할 수 있도록하는 하드웨어 입니다 (인터럽트를 CPU에 겁니다)
DMA controller: CPU의 interrupt 작업을 대신해줍니다 (I/O 작업의 결과를 메모리에 반영하고 완료하면 CPU에 Interrupt를 한 번만 작업합니다)
memoery controller : DMA, CPU의 메모리 접근을 제어합니다 (DMA와 CPU가 동시에 같은 메모리를 작업하지 않도록 합니다)
I/O device
device controller : 각 device를 제어합니다
local buffuer : device controller 작업 공간입니다
Device Controller
- 해당 I/O 장치유형을 관리하는 일종의 작은 CPU입니다
- 제어 정보를 위해 control register, status register를 가집니다
- 일종의 data register인 local buffer를 가집니다
- I/O 작업은 실제 device와 local buffer 사이에 일어나고 I/O 작업이 완료되면 Device Controller는 Interrupt로 CPU나 DMA에 완료됨을 알려줍니다
- device driver VS device controller
- device driver는 OS 코드 중에서 각 장치별 처리루틴을 작성한 software 입니다
- device controller는 각 장치를 통제하는 일종의 작은 CPU인 hareware 입니다
Timer
- 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시키는 하드웨어 입니다
- 타이머는 매 클럭마다 1씩 감소되고 0이 되어지면 타이머 인터럽트가 발생합니다
- CPU를 특정 프로그램이 독점하는 것으로부터 보호합니다
- 타이머는 time sharing을 하기위해 많이 사용되어집니다
DMA (Direct Memory Access)
- CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송하도록 해줍니다
- 바이트 단위가 아니라 block 단위로 인터럽트를 발생시키기 때문에 CPU에 인터럽트가 적게 걸립니다
인터럽트 (Interrupt)
- 인터럽트 : 인터럽트를 당한 시점의 레지스터와 program counter를 저장한 후 CPU의 제어를 인터럽트 처리 루틴에 넘깁니다
- 인터럽트의 종류
- Interrupt (하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트입니다
- Trap (소프트웨어 인터럽트)
- Exception: 프로그램이 오류를 범한 경우
- System call: 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것
- 인터럽트 관련 용어
- 인터럽트 벡터 : 해당 인터럽트의 처리 루틴 주소를 가지고 있습니다
- 인터럽트 처리 루틴(Interrupt Service Routine, 인터럽트 핸들러) : 해당 인터럽트를 처리하는 커널 함수입니다
I/O System Call 흐름 자세히 보기
- 사용자 프로그램은 I/O 명령은 특권 명령이여서 OS의 도움이 필요합니다.
- 따라서 System Call을 사용하여 운영체제에게 I/O를 요청하게 됩니다.
- trap을 사용하여 인터럽트 벡터의 특정 위치로 이동하고 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동합니다
- 이 I/O 요청이 올바른 요청인지 확인후 I/O를 수행합니다
- I/O 완료 시 제어권을 시스템 콜 다음 명령으로 옮깁니다
작업 흐름 - I/O 작업
- CPU가 Program A를 작업하고 있습니다
- Program1에서 I/O 작업을 요청하기 위해 시스템 콜을 실행합니다
- 해당 시스템 콜로 인해서 인터럽트가 걸려서 CPU 제어권이 OS로 넘어갑니다
- OS에서 I/O 작업을 처리하도록 해당 device에 요청합니다
- OS에서 스케쥴링하여 다음 작업인 Program B에 CPU를 넘겨줍니다
- 이후에 해당 device에서 I/O 작업을 마치고 CPU의 interrupt line에 완료 인터럽트를 겁니다
- CPU는 instruction을 실행하면서 interrupt line에 인터럽트가 들어온 것을 확인하고 CPU 제어권이 OS로 넘어갑니다
- OS에서는 완료된 I/O 작업을 확인하고 Program1을 실행 가능 상태로 전환하여 스케쥴링합니다.
작업 흐름 - Timer
- OS에서 스케쥴링하여 Program A에 CPU 제어권을 넘겨주고 Timer를 설정합니다.
- Program A가 작업하고 있다가 작업이 완료되기 전에 Timer에 시간이 만료되어서 CPU에 Interrupt가 걸립니다.
- CPU는 Interrupt를 확인하고 CPU의 제어권이 OS로 넘어갑니다
- OS는 동일하게 다음 스케쥴링된 프로그램에게 CPU 제어권을 넘겨주고 Timer를 설정합니다
동기식 입출력과 비동기식 입출력
- 동기식 입출력 (synchronous I/O)
- I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램으로 넘어갑니다
- 구현 방법 1
- I/O가 끝날 때까지 CPU를 가지고 있습니다
- CPU낭비가 심하고 매시점 하나의 I/O만 일어날 수 있습니다
- 구현 방법 2
- I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗습니다
- I/O 처리를 기다리는 줄에 그 프로그램을 줄 세우고 다른 프로그램에게 CPU를 줍니다
- 비동기식 입출력 (asynchronous I/O)
- I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 다시 원래의 사용자 프로그램에게 넘어갑니다
- 두 경우 모두 I/O 완료는 인터럽트를 통해서 알려줍니다
프로그램의 실행 (메모리 load)
File System에 존재하는 프로그램이 메모리에 load될 때 code, data, stack 영역으로 구분되어지는 Virtual memory로 형성되어 지고, 실제 메모리에 올라가는 부분은 Virtual memory와 매핑되어지는 일부분만 올라갑니다. 이후에 메모리의 일부분은 File System에 존재하는 Swap area와 교체가 일어나면서 메모리에 올라갔다가 내려오게 됩니다.
커널 주소 공간의 내용
code
- 시스템 콜, 인터럽트 처리 코드
- 자원 관리를 위한 코드
- 편리한 서비스 제공을 위한 코드
data
- PCB
- CPU, Memory, Disk에 관한 데이터
stack
각 프로세스에 관한 커널 스택
참조
- 반효경 교수님 운영체제 강의