Reference - Operating Systems: Three Easy Pieces
https://pages.cs.wisc.edu/~remzi/OSTEP/
I/O Devices
이번 파트부터는 I/O 및 File system에 대해 다루는 OS의 persistence에 관한 내용이다.
I/O Device는 굉장히 중요한데, cpu / 메모리와는 큰 차이점이 있다. 바로 각각이 다 unique하다는 점이다.
각 device의 목적도 다 다르고, 대역폭 / latency 등 모두 다르다.
그렇다면 이런 I/O device는 어떻게 system과 integrated될까? 또 어떻게 효율적으로 수행할까?
I/O system의 구조는, 먼저 CPU가 main memory와 memory bus로 연결되어 있고 다른 디바이스는 필요 bandwidth에 따라
GPU 및 PCI처럼 큰 bandwidth가 필요한 경우나 SSD의 경우 General I/O bus에, 기타 키보드, 마우스, USB 등의 경우 Peripheral I/O bus에 붙인다. 참고로 요즘 system 분야의 연구는 GPU의 발전에 따라 해당 bus가 병목지점이 되고 있어서 이를 해결하기 위한 bus architecture로 몰리고 있다고 한다.
DIMM = RAM, SATA ports = HDD ports, PCI(e) slots = 메인보드에 그래픽카드, 사운드카드 등 장착하는 slots
- Canonical Device : 표준장치
= type과 상관없이 device를 사용하는 것이며, device가 가져야 할 표준을 말한다. 중요한 두 구성요소로 Hardware interface와 Internal structure가 있다.
Hardware Interface : 최소 3개의 register를 필요로 한다.
Status register : device의 current status
command register : 특정 task 수행하도록 device에게 명령
Data register : 데이터를 장치에서 가져오거나 장치로 보냄
위 세 레지스터를 통해 os가 디바이스를 control할 수 있다.
그 과정은 STATUS가 BUSY가 아닌 경우, 데이터를 디바이스의 DATA 레지스터에 보내고, COMMAND 레지스터에 명령어를 쓴다음 디바이스를 시작하고, STATUS==BUSY가 아닐때(=끝날때)까지 기다린다.
이때 시작과 끝에서 STATUS==BUSY를 확인하는 단계를 polling이라고 하며, 이때문에 CPU가 낭비된다.
이러한 낭비 줄이기 위해, trap table을 활용한 interrupt를 발생시킨다. context switch를 통해 I/O 도중 CPU가 다른 task를 할 수 있게 한다. 하지만 interrupt가 항상 맞진 않는데, device의 성능이 매우 빠를 경우, context switch에 따른 overhead가 더 크게 작용해서 속도가 느려질 수 있다.
따라서, device가 빠르면(=I/O 처리시간이 짧으면) polling, device가 느리면 interrupt를 선택하는 것이 좋다.
- Programmed I/O
데이터의 사이즈가 클 경우, CPU는 데이터를 메모리에서 디바이스로 copy할 때 많은 시간을 낭비한다.
이처럼 CPU가 데이터 이동에 관여하는 걸 Programmed I/O라 한다. 하지만 이는 비효율적이다.
따라서 특별한 목적의 프로세서인 Direct Memory Access(DMA) controller를 사용한다.
- DMA
DMA는 하드웨어로 구현되어 있으며, 메모리에 붙어 있다. os가 controller에게 copy 연산을 시키고, cpu는 그 시간에 다른 작업을 할 수 있다. DMA로 copy하는 과정을 살펴보겠다.
1. os의 일부분인 device driver가 디스크 데이터를 버퍼의 특정 주소에 옮기라고 하면,
2. device driver는 disk controller에게 데이터를 전송하라고 말한다.
3. 그럼 disk controller가 DMA transfer를 초기화하고
4. disk controller가 DMA controller에게 데이터를 보낸다.
5. DMA controller는 데이터를 버퍼의 특정 주소로 보낸다.
6. 데이터를 다 보내면, DMA가 CPU에게 전송이 끝났다는 interrupt를 보낸다.
이때 중요한 것은 CPU는 사용하지 않으며, 데이터 전송시 캐시의 더티 데이터는 DMA 전에 flush해야 한다.
- Methods of Device interaction
OS가 어떻게 디바이스와 통신할까? 즉, OS가 어떤 register가 특정 I/O device에 사용되는지 어떻게 알까?
이는 두 방법이 있다.
1. Special I/O instructions (old style)
: I/O를 위한 CPU instruction을 사용하는 것. in / out instruction을 쓴다.
2. Memory-mapped I/O
: 하드웨어가 디바이스 레지스터를 마치 메모리 안에 있는것처럼 이용가능하게 만드는 것이다.
디바이스를 초기화한 뒤 가상 메모리 공간에 mapping하고, update가 일어났을 땐 메모리가 아니라 디바이스로 보낸다.
'CS > 운영체제' 카테고리의 다른 글
[운영체제] 23. Flash-based SSD (0) | 2023.12.08 |
---|---|
[운영체제] 22. HDD and RAID (1) | 2023.12.08 |
[운영체제] 20. Swapping - Policy (1) | 2023.12.08 |
[운영체제] 19. Swapping Mechanism (1) | 2023.12.08 |
[운영체제] 18. Paging - smaller table (0) | 2023.12.08 |