•
참고 강의
하드웨어 구조
CPU + Memory로 구성된 컴퓨터와 I/O device들로 구성(간단)
•
memory : CPU의 작업 공간
◦
CPU는 매순간, 매 Clock Cycle마다 메모리에서 기계어를 하나씩 읽어서 실행을 함.
•
키보드, 마우스 → 정보가 안으로 들어가는 device(Input Device)
•
프린트 → 처리 결과가 내보내는 device(Output Device)
•
하드 디스크(보조 기억 장치) → I/O device로 볼 수 있음
◦
Disk에 있는 데이터를 읽어서 메모리로 읽어들이기도 하고(Input Device)
◦
처리 결과를 Disk에 저장하기도 한다(Output Device)
I/O device들은 그 Device를 전담하는 작은 CPU같은게 붙어있다 → device controller(hardware)
•
CPU와 I/O device들은 성능 속도 차이가 존재한다. 따라서, device controller가 각각의 I/O device들을 통제.
•
ex. Disk의 head를 어떻게 움직일지, 어떤 데이터를 읽을지, 디스크 내부를 통제하는 건 CPU의 역할이 아니고 Disk Controller가 그 역할을 한다.
•
CPU는 매 클락마다 Memory에서 Instruction를 읽어서 처리(반복)
•
제어 정보를 위해 control register, status register를 가진다.
◦
buffer에 있는 값을 프로그램으로 넘겨주거나 프로그램에 있는 데이터를 화면에 출력하기 위해 buffer에 담은 다음에 어떻게 하라는 지시는 control register를 통해서 한다.
◦
CPU : Memory, local buffer에 접근 / Device Controller : 자기 자신의 Local Buffer만 접근
device driver(sofeware) : OS 코드 중 각 장치별 처리루틴
•
하드웨어를 사용하기 위해서 디바이스 드라이버를 설치 해야한다.
•
I/O device를 사용해야하는 상황이 오면 디바이스 드라이버를 사용해서 명령을 함.
•
CPU가 I/O device를 실행하기 위해서 필요한 코드를 담고 있다.
•
일을 하기 위한 메뉴얼, 동작을 하기 위해서 무슨 일을 해야하는지 → 디바이스 내부에 펌웨어
Device Controller들의 작업 공간 → local buffer(data register)
CPU안에는 Memory보다는 빠르면서 정보를 저장할 수 있는 작은 공간이 존재 → Register
지금 CPU 안에서 실행되는 것이 운영체제인지, 사용자 프로그램인지 구분해주는 것 → Mode bit
•
사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치
•
0 : 모니터 모드(커널 모드, 시스템 모드), OS 코드 수행
◦
이 때는 무슨 일이든 다 하게끔 되어 있다. ex. 메모리 접근, I/O 접근 가능(특권 명령)
◦
Interrupt가 들어오면 Mode bit를 0으로 바꾸고 CPU 제어권을 OS에게 넘겨줌
•
1 : 사용자 모드, 사용자 프로그램 수행
◦
제한된 Instruction만 실행 가능(보안상의 목적)
◦
메모리 접근, I/O 접근 이런 시도를 하면 Mode bit를 보고 Instruction 실행이 안되도록 구현해둠.
◦
OS가 mode bit를 1로 바꾸어서 넘겨줌
I/O 어떻게 사용하는가?
특정 프로그램이 CPU를 독점하는 것을 막는 것 → Timer
•
If, 계속 CPU를 쓰는 프로그램을 생성(무한 루프를 돔), 다른 프로그램에게 CPU가 넘어가지 못해서 Time Sharing를 사용할 수 없다. → 이런 상황을 위해서 Timer가 존재
•
OS가 사용자 프로그램에게 CPU를 넘겨줄 때, 수십ms의 시간을 타이머에 세팅한 후에 넘겨준다.
•
Instruction 실행 중간에 지정된 시간이 되면 Timer가 Interrupt를 건다.(타이머 Interrupt)
•
OS가 사용자 프로그램에게 CPU를 줄 때는 자유롭게 주지만 한 번 넘어가면 뺏지 못함. 따라서, Timer를 둬서 CPU가 사용자 프로그램에서 OS로 넘어올 수 있도록 만든 것.
•
OS가 관리를 하면서 타이머의 도움을 받아서 실행.
•
CPU의 Time Sharing를 구현하기 위해서 Timer를 두고 있는 것 → 사용자 프로그램이 CPU를 사용하고 싶을 때 이야기
•
I/O를 해야한다면 사용자 프로그램이 I/O를 해달라고 운영체제에게 자진해서 CPU를 넘기게 된다.
◦
I/O device로의 접근은 OS를 통해서만 할 수 있도록 막아뒀다. → I/O 작업을 해야 할 때, 스스로 CPU를 넘겨주는 이유
◦
I/O 작업 자체가 오래걸리다보니 해당 프로그램말고 다른 프로그램에게 CPU를 넘긴다.
◦
I/O 작업을 요청한 프로그램은 I/O Controller가 요청한 작업이 끝나서 local buffer 해당 작업물을 저장하면 CPU에게 Interrupt를 건다. → 자동으로 CPU가 OS에게 넘어감
◦
OS는 해당 buffer값을 해당 프로그램의 메모리 영역으로 copy해주고 Interrupt 당하기 전에 실행하던 프로그램을 실행(PC값에 저장된 주소값에 해당하는 프로그램) → Timer가 남아있다고 한다면, 아니면 I/O 작업을 요청한 프로그램에게 CPU를 준다.
CPU가 인터럽트가 발생했는지 감지하는 곳 → Interrupt line
•
Interrupt : CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외상황이 발생하여 처리가 필요할 경우에 마이크로프로세서에게 알려 처리할 수 있도록 하는 것
→ 각 자원(하드웨어 자원, Device, Peripherals)들의 현 상황을 파악할 수 있는 방식
1.
I/O device가 작업을 처리하기 위해서 걸 수도 있고(Hardware interrupt)
2.
Timer가 시간이 끝나서 걸 수도 있고(Hardware interrupt)
3.
사용자 프로그램이 I/O device를 사용하기 위해서 걸 수도 있다.(sofeware interrupt, trap)
•
System Call : 프로그램이 커널 함수를 호출(커널 모드 진행을 위해)
•
Exception : 프로그램이 오류를 범함(스스로 자신에게 인터럽트를 하는 경우)
•
CPU가 Instruction를 처리하고 있는 중간에, I/O device일을 접근하는 Instruction를 처리하는 상황이 오는데 CPU는 Memory랑만 일하기 때문에 Memory를 접근하는 Instruction만 실행하게 되어 있다. 그러다가 디스크에서 읽어올 것이 있으면 요청을 보내는데 device controller에게 CPU가 일을 직접 시킨다.
•
device controller는 진행한 일을 자신의 local buffer에 저장. Input device에서 뭐가 들어오는지 지켜보는게 아니고 들어오면 알려달라고 한 뒤, 자신의 일을 계속한다(이 행동 자체가 시간이 오래걸리기 때문)
•
“Input device에서 들어오는 값을 사용하지 않으면 더 이상 진행이 안된다” 라고 한다면 CPU가 다른 프로그램에게 넘어간다.
•
하나의 Instruction이 끝나고 나면 Interrupt line를 체크한다. → Interrupt 들어온 게 없으면 다음 Instruction 실행(반복)
•
각각 인터럽트마다 어떤 일을 처리해야하는지 정의되어 있는 코드(처리하는 커널 함수) → Interrupt 처리 루틴(= Interrupt Service Routine, 인터럽트 핸들러)
•
어떤 함수(처리 루틴 주소)를 처리하러 가야하는지 표시해주는 것(일종의 테이블) → 인터럽트 벡터
컴퓨터 시스템에 존재하는 각 자원들의 현 상황을 파악할 수 있는 방식
Interrupt는 언제 처리될까?
Interrupt는 어떻게 처리될까?
중첩된(다중) Interrupt 처리는?
현대의 운영체제는 인터럽트에 의해 구동됨 → Interrupt가 들어올 때만 CPU가 OS에게 넘어감
CPU가 Interrupt를 많이 당한다 == 효율적이지 못하게 동작
DMA(Direct Memory Access) Controller를 두자!
•
중간에 I/O device에 작업이 들어왔을 때 CPU에게 Interrupt를 걸어서 CPU가 I/O device에 있는 내용을 copy하게 하는게 오버헤드가 크다!
•
CPU는 계속 자기일을 하고 있고 중간중간 buffer 들어오는 내용은 작업이 끝났으면 DMA가 직접 buffer에 있는 내용을 복사하는 일을 해준다. 그 작업을 다 하고 나서 CPU에게 Interrupt를 한 번만 걸어서 CPU에게 보고. 중간에 Interrupt를 당하는 빈도가 줄어서 효율적으로 사용할 수 있음
◦
빠른 입출력 장치(인터럽트를 빈번히 거는 장치)를 메모리에 가까운 속도로 처리하기 위해서 사용
◦
CPU의 중재없이 device controller가 device의 buffer storage의 내용을 메모리에 block단위로 직접 전송 → block 단위로 interrupt 발생
•
CPU, DMA가 동시에 같은 메모리 영역을 접근할 수 있기 때문에 memory controller가 이를 중재하는 역할을 함. 누가 먼저 쓰게 할 지 정리하는 역할.