1.
컴퓨터 시스템의 동작
- 컴퓨터가 실행되기 시작하면 무슨 일이 일어나는가?
- Bootstrap program(firmware) 가 실행이 된다.
- 시스템을 진단하고 초기화를 수행한다.
- 그리고, OS Kernel을 적재하고 실행시킨다. (Bootstrap loader)
- OS Kernel
- 부팅된다. (초기)
- 어떠한 일(event)을 대기한다.
- 그리고 그 이벤트를 처리한다.
- 현대의 운영체제들은 Interrupt driven programs 이다.
- Bootstrap program(firmware) 가 실행이 된다.
#필기
- 펌웨어(Firmware)
아주 작은 프로그램으로, 메인보드에 위치해있다. 해당 프로그램은 전원을 켜면 실행이 된다.
첫번째로, 하드웨어의 진단(e.g. 키보드 유/무에 따른 경고)과 초기화를 수행한다.
두번째로, 운영체제를 읽고 실행을 한다. - 펌웨어가 어떻게 OS를 찾아서 실행을 하는가?
A. 대부분 지정된 위치에 있기 때문에 루틴대로 찾아온다. 바로 OS를 읽어오는 것이 아니고 해당 위치의 Loader를 읽고 Loader가 OS를 읽어오는 식으로 진행된다. 이 과정을 부팅과정이라고 한다. - OS는 부팅이 완료가 되면 아무것도 안하고 기다린다. 어떠한 이벤트를 기다리고, 이벤트를 처리하는 일 이 2가지를 계속해서 반복하는데 이 이벤트라는 개념은 Interrupt를 뜻한다.
- Interrupt는 운영체제에 보내는 일종의 request signal 이다. 운영체제는 수동적이기 때문에 요청을 줘야 운영체제가 일을 한다. 그래서 운영체제에서 Interrupt가 중요하다.
- 유저나 프로그램이 Request를 하면, OS에게 Interrupt 형식으로 전달이 되고 OS는 request에 대한 처리를 수행한다.
2.
근대의 컴퓨터 시스템(구조)
- Common Bus
컴퓨터들 컴포넌트들 간의 데이터를 전송하는 서브 시스템 - CPU, memory and device controllers
위의 요소들은 common bus에 의해서 연결이 되어 있다. (직접 연결이 아님) - I/O 장치와 CPU
각 디바이스 장치들과 CPU는 동시에 실행이 가능하다.- 해당 동시실행성 때문에 메모리 사용의 경쟁이 있는데 이를 synchronization issue라고 일컫는다.
#필기
- Common 버스가 위치적/개념적으로 중심에 위치한다.
또한, 각 device들의 data를 공유해서 이용할 수 있게 한다.
3.
컨트롤러
- 각 디바이스 컨트롤러는 각자의 버퍼를 가지고 있다(local buffer).
- CPU는 local buffer와 main memory 에 서로 데이터를 전달한다.
(buffer -> memory / memory -> buffer) - I/O는 디바이스로부터 컨트롤러에 local buffer까지를 나타낸다.
- Device controller는 어떠한 수행이 끝나면 그것이 끝났다고 CPU에게 인터럽트(interrupt)를 발생시켜서 알려준다.
4.
인터럽트
- 인터럽터의 정의
하드웨어나 소프트웨어가 필요함을 나타내는 asynchronous signal(언제든지 나타날 수 있다)이다.- H/W의 도움을 받는다.
- 각 인터럽트는 특정한 번호(IRQ number)에 의해 등록이 되어 있다.
- 인터럽트 핸들러(interrupt handler)에 의해 처리가 된다.
- 코드의 세그먼트를 분리하여 인터럽트가 각각의 (인터럽트)타입에 의해서 어떠한 수행을 해야할지 결정한다.
- 인터럽트 핸들러의 테이블을 interrupt vector라고 한다.
- 이벤트 생성의 매커니즘
- H/W interrupt
- CPU에게 신호를 보낸다.
- S/W interrupt
- System call(=monior call) : 프로그램의 요청
ex. I/O access, memory aloocation, ... - Exception
ex. Divide by zero, invalid memory access, I/O exception, ...
- System call(=monior call) : 프로그램의 요청
- H/W interrupt
#필기
- 인터럽트는
아임어그로CPU의 주의를 끈다 - asynchronous라는 표현은 해당 일이 언제든지 나타날 수 있다는 속성을 나타낸다.
예를 들어 키보드 입력같은 이벤트는 컴퓨터 입장에서 언제 발생할 수 있는지 알 수가 없다. 이런 이유로 interrupt는 asynchronous. - supported by H/W의 경우, CPU가 interrupt를 수행할 수 있도록 보조를 한다.
- IRQ number : Interrupt Request #
- interrupt handler는 인터럽트를 다루기 위한 "정의된" 처리를 나타낸다.
- interrupt vector는 인터럽트가 여러개이기 때문에 그를 다루고 처리할 것이 필요한데, 이때 테이블 형태로 제공되는 것
- 인터럽트 핸들러는 여러개 있고, 몇 번 벡터가 어느위치에 있다고 알려주는 것이 인터럽트 벡터이다.
- 인터럽트 처리 순서 (대략적)
i) Interrupt 발생
ii) Look up the Table(interrupt vector)
iii) Jump to Handler
- System call같은 경우, 일부로 발생을 시킨다. 운영체제의 기능이 필요하기 때문인데, Exception은 그와 반대로 에러/버그로 발생한다.
5.
인텔 프로세서의 이벤트 벡터 테이블
- 0-31까지는 가릴수 없는(non-maskable) 중요한 인터럽트이다.
- 32~255까지는 가릴 수 있다(인터럽트가 발생하지 않게 할 수 있다).
#필기
- 각 번호가 각 인터럽트를 나타낸다.
또, 어떤 경우엔 한 번호에 동작이 여러개의 동작(인터럽트)가 일어날 수 있다. - mask를 사용하면 특정 interrupt를 무시할 수 있게 한다.
- 그래서 중요한 것은 non-maskable로 설정하여 항상 일어날 수 있게 한다.
- 상대적으로 중요(심각)하지 않은 것은 maskable로 경우에 따라서 발생을 조절할 수 있다.
- 표를 통해, 각 번호가 각 인터럽트를 나타낸 다는 것을 알 수 있고 인터럽트는 종류가 매우 많다는 것을 알 수 있다. 따라서 다음과 같은 관계(?)를 유추할 수 있다.
- 인터럽트는 종류가 매우 많다. 그에 따라서 인터럽트 핸들러도 (대응하듯) 매우 많다.
- 인터럽트 핸들러가 여러개임에 따라서 핸들러를 찾아가기 위한 특정 ID가 필요하다.
- 해당 아이디는 인터럽트의 고유 ID로 IRQ number로 지정이 된다.
- 인터럽트가 발생하면 해당 인터럽트의 IRQ를 가지고 인터럽트 백터(표)를 look up하고, 알아낸 주소로 이동하여 Handling을 수행한다.
6.
Hardware Process (실제 인터럽트가 발생하는 방식)
해당 예제는 CPU의 Insturction 실행 단계의 일부이다.
// <pesudo code>
InterruptRequest = FALSE;
...
while(haltFlag not set during execution){
IR = memory[PC]; // Fetch into the IR
PC++; // Point the PC at the next instruction
execute(IR); // Execute the current instruction (+ Decode)
if(InterruptRequest){ // Interrupt the current process
save_PC(); // Save the PC
restore_PC(IRQ); // Branch to the ISR for this IRQ
}
}
#필기
- 인터럽트의 발생을 확인하기 위한 Flag 존재 (InterruptRequest), 발생시 1로 변함
- 명령어를 실행 직후, Interrupt Request를 체크한다. (이 부분이 위 슬라이드에서 CPU의 인터럽트 보조가 이루어지는 부분)
- 인터럽트가 발생하면 save_PC();를 통해 PC를 저장한다. Handler 처리 이후에 다시 원래 프로그램을 실행하기 위해서 저장하는 것이다.
- restore_PC(IRQ);는 Handler를 실행하기 위한 것인데, 주석의 ISR은 Interrupt Service Routine을 의미한다. 해당 루틴(핸들러)로 이동하기 전에, IRQ를 통해 interruptVector(table)을 먼저 Look Up한 후에, Handler의 위치로 이동을 한다.
7.
Interrupt Mechanism
- 인터럽트 핸들링
- CPU는 현재 작업을 멈추고 인터럽트 핸들러에게 실행을 옮깁니다(주-를 옮긴다).
- 인터럽트 벡터는 각 인터럽트에 대응하는 인터럽트 핸들러가 적힌 표
- 인터럽트는 해당하는 핸들러에 의해서 처리된다.
- 인터럽트가 발생한 프로그램으로 복귀
- 인터럽트가 발생하기 전에 필수적이고 중요한 정보들은 반드시 저장해야 한다.
- CPU는 현재 작업을 멈추고 인터럽트 핸들러에게 실행을 옮깁니다(주-를 옮긴다).
8.
Interrupt-based I/O
- CPU는 요청을 보내고 현재의 수행중인 프로세스 혹은 작업을 지속한다.
- 입출력 장치에서 데이터 전송이 완료되면, 인터럽트를 발생시킴
#필기
- 만약 인터럽트가 없으면 어떻게 되는가??
A. CPU가 request를 요청한 후 그 순간 부터 동작이 다 끝날 때까지 지켜보고 다른 일을 하지 못한다.
9.
I/O Device Access
종류)
- 오래된 시스템의 경우
-> Busy waiting 방법을 사용 (Interrupt를 사용하지 않음) - 현대 시스템의 경우
-> Interrupt-driven I/O 방식
-> DMA (Direct memory Access) : 발전된 Int. driven
- Busy waiting - old system
- CPU는 디바이스의 상태(끝났는지)를 주기적으로 계속 체크한다.
-> 문제점 : CPU는 I/O 장치의 수행이 끝날 때 까지 아무것도 하지 못함
- CPU는 디바이스의 상태(끝났는지)를 주기적으로 계속 체크한다.
#필기
- I/O가 언제 끝나는지 알 수가 없어서 CPU가 다른 일을 못하고 계속 확인하게 됨
- Q. old system에 사용된 방식인데 현대의 컴퓨터들은 이 방법을 계속 사용할까?
A. 그래도 사용하긴 함, 매우 빨리 끝나느 경우나, 아주 간단한 것 혹은 너-무 중요한 것에 대해서 사용한다.
- Interrupt-driven I/O cycle
- CPU가 I/O에게 일을 시켜버리고, 다할 때까지 (interrupt가 올 때 까지) 자기의 일을 수행함
- 작업이 완료되면 I/O가 인터럽트를 발생시키고, CPU는 이를 통해 buff에 있는 데이터 처리
#필기
- 키보드/마우스의 경우 데이터가 작아서 그냥 CPU가 인터럽트 형식으로 버퍼에서 데이터를 가져가서 처리를 직접 해버린다.
- 그러나, 디스크 같은 경우 데이터의 양이 매우크다. 버퍼까지만 가게 되면 CPU가 그 데이터를 옮기는데 다시 CPU 타임을 많이 소진하게 되는 문제 점이 있다.
- 그래서 I/O로 가져오는 양이 매우 많은 경우에는 DMA방식을 사용한다.
- DMA (Direct Memory Access)
- 디바이스 컨트롤러가 직접 큰 규모의 데이터를 메인메로리로 직접 전송해버림
- CPU는 data transfer를 실행할 필요가 없음!
#필기
- Disk 같은 경우 I/O하는 크기가 커서 DMA를 통해 CPU가 관여하지 않게 메인 메모리에 바로 보내버림
- Buffer에서부터 메모리까지일어나는 Transfer조차도 CPU가 관여하지 않게 되는 장점이 있음
'무제 메모장' 카테고리의 다른 글
1.4 Operating System Structure and Operation (0) | 2021.04.11 |
---|---|
1.3 Computer System Architecture (0) | 2021.04.09 |
1.1 Chain of Responsibility Pattern (0) | 2021.04.06 |
4.1 Socket Communication Test (0) | 2021.04.06 |
1.1 Definitions of operating system (0) | 2021.03.16 |