1. Computer Architecture
지금까지 컴퓨터의 발달, OS의 구조, 프로세스에 대해서 알아보았다. 이제 프로세스의 실행이 실제 컴퓨터 구조에서 어떻게 실행되는지 조금 더 깊게 들어가보자.
프로세스의 실행 과정에서 HW간의 데이터가 교환된다. 이때 이 교환되는 통로를 Bus라고 한다. 여기서 이 Bus의 구성에 따라서 전체 시스템의 throughput이 달라진다. 예를 들어 모든 시스템이 하나의 Bus로만 데이터가 주고받아진다고 생각해보자 그렇다면 I/O 속도가 CPU의 처리속도를 따라가지 못하여 전체 시스템의 throughput이 낮아질 것이다. 이러한 구조를 단일 Bus 구조라고 하고, 같은 버스에 연결된 디바이스들 사이의 속도차로 인해 발생하는 throughput의 저하를 Bottleneck(병목 현상)이라고 한다.
그렇다면 이런 병목현상을 줄이기 위해서는 어떻게 해야할까? Bus의 수를 늘려 처리속도가 비슷한 HW끼리 묶고, 그 버스를 연결하는 Extension bus interface를 추가한다.
이러한 구조를 계층적 버스 구조라고 한다. 이렇게 속도에 따라 Bus를 계층적으로 나누고, 추가 인터페이스를 통해 연결하면 시스템의 전체 throughput이 증가하게 된다. 그런데 여기서 두 계층을 나눠주는 Extension bus interface란 무엇일까? I/O를 처리하는 기법으로 두 통로를 효율적으로 연결하는 인터페이스이다. 여기에는 Pooling과 DMA가 있는데 이것이 어떻게 작용하는지 알아보기 전에 이 과정에 필요한 기초 하드웨어 메커니즘들에 대해서 알아보자.
2. Basic HW Mechanisms - Event handling mechanism
이벤트를 처리하는 방법으로는 예기치 못한 순간에, 비동기 적인 이벤트를 처리하기 위한 기법인 Interrupt과 동기적 이벤트를 처리하기 위한 Trap이 있다. 먼저 Interrupt에 대해 자세히 알아보면, Interrupt은 Timer interrupt와 같이 Chipset과 같은 HW에 의해 발생할 수도, System call과 같이 SW에 의해 발생할 수 있다(HW Interrupt와 SW Interrupt). Interrupt은 심지어 interrupt을 핸들링 중일때도 올 수 있기 때문에 다음과 같은 순서로 진행된다. 일단 interrupt를 처리를 시작할 때 interrupt를 Disable하고, 다시 돌아오기 위해 현재 상태(state)를 저장한다. 그리고, 짧은 ISR(Interrupt Service Routine)으로 점프하고 Routine이 끝난다면 저장한 실생 상태를 복원하고 중단된 지점부터 다시 시작한다. 이때 Disable한 Interrupt는 어딘가에, 우선순위에 따라 정렬되어 저장될 것이고 이 우선순위는 HW마다 다를 것이다.
Trap은 Devide by zero와 같은 프로그램 에러에 의해서 발생하고, Trap handler에 의해서 처리되는데 Interrupt와 다르게 실행 상태를 저장하지도, 복원하지도 않는다. breakpoint과 같이 때에 따라서 다시 trap이 발생하기 이전(정확히는 그 다음 PC)으로 돌아오긴 하지만 이는 상태를 복원하는게 아니라 HW Instruction으로 잠시 실행을 멈추는 방식이다. Trap은 Fault, Abort와 함께 Exception에 포함된다.
Interrupt때는 상태를 저장하지만, Exception때는 상태를 저장하지 않으므로 Interrupt땐 Context switching이 가능하지만 Exception때는 그렇지 못한다. 따라서 다른 프로세스가 그 CPU(Core)에 실행 가능 여부가 다르다. 조금 더 자세한 내용은 아래에서 살펴보자.
3. I/O 처리 기법
Control Register, Status Register, Input Register, Output Register 총 4개의 Register를 갖는다 그리고 Register들이 Memory에 매핑되어 I/O과정에 관여한다. 이에 대해서는 이후 DMA때 자세히 알아보자. High -Level의 I/O요청을 low-level machine specific instruction(CPU Instruction)으로 해석하는 회로인 I/O Controller또한 이에 관여한다. 이를 활용하여 활용하여 실제로 어떻게 I/O를 처리하는지 알아보자. 크게 두가지 방법에 대해 알아보자
-1. Pooling (Programmed I/O)
Pooling은 Loop 안에서 주기적, 반복적으로 이벤트의 도착 여부를 확인하는 방식이다. Controller나 장치가 매우 빠른 경우에는 적합하지만 그렇지 않아 이벤트 도착 시간이 길다면 반복적인 체크가 CPU연산이므로 CPU Time을 낭비한다는 문제가 있어서 사용률이 떨어진다.
-2. Direct Memory Access(DMA)
Pooling의 모든 I/O연산(I/O Device 상태 확인, Bus에 데이터 write)이 CPU연산에 의해 진행된다는 문제를 해결하는 방식이다. DMA Controller라는 프로세서를 사용함으로써 CPU의 I/O요청을 DMA Controller가 I/O Device와 Memory 사이의 데이터 전송을 수행으로 치환하여 이 I/O시간에 CPU가 다른 일을 처리할 수 있게 되는것이다. 이 과정은 다음 이미지를 보면서 확인해보자.
DMA가 추가적인 Hardware를 필요로 하고 성능을 극대화 하기 위해서 적당한 Parallelism이 필요하다는 문제점이 있지만 성능을 위해 이를 감내한다고 한다.
4. I/O Device access
I/O Device에 접근하기 위해서 Controller가 갖는 Register의 Bit pattern을 읽고 씀으로써 장치와 통신하는 I/O instruction(Intel의 in out) 방식과 Device Register들을 Memory공간에 mapping하여 메모리 주소를 통해 device에 접근하는 Memory mapped I/O으로 구성된다.
'학교 공부 > OS' 카테고리의 다른 글
운영 체제 (Operating System) - CPU Scheduling (0) | 2021.11.28 |
---|---|
운영 체제 (Operating System) - Kernel System Call 이해와 구현 (0) | 2021.11.28 |
운영 체제 (Operating System) - Process (0) | 2021.11.28 |
운영 체제 (Operating System) - 운영체제 구조 (2) (0) | 2021.11.28 |
운영 체제 (Operating System) - 운영체제 구조 (0) | 2021.11.27 |