CS/Operating System

23. I/O Device 관리

공부중인학생 2024. 1. 30. 14:11

 

PC 내부에는 다음과 같은 메인보드에 CPU, memory, hard disk drive 등의 다양한 I/O 디바이스가 있습니다. 이런 디바이스들을 전부 I/O bus에 연결되어 있습니다. I/O bus와 I/O 디바이스 사이에는 I/O controller가 존재하며 CPU로부터 받은 I/O instruction을 수행합니다.

 

 

 

I/O controller는 I/O bus에 인터페이스 하기 위한 bus interface logic을 가지고 있고 I/O 디바이스를 제어하기 위한 인터페이스도 가지고 있습니다. 그리고 내부에 레지스터들이 들어 있는데 이 레지스터는 데이터 레지스터와 컨트롤 레지스터로 나뉩니다. 데이터 레지스터에는 디바이스로부터 읽어온 정보를 저장하는 input data register와 출력할 정보를 저장하는 output data register가 존재합니다.

 

컨트롤 레지스터에는 디바이스나 컨트롤러의 현재 상태를 표현해주는 status register와 CPU로부터 받은 명령어를 저장하는 control register가 존재합니다. 

 

 

 

I/O 프로그래밍은 고급 언어와 다르게 machine dependent하게 수행이 됩니다. 이때 I/O 컨트롤러에 있는 레지스터 값을 읽거나 수정합니다. 위 사진은 CPU가 I/O 프로그래밍된 코드를 수행할 때 I/O address bus, data bus, control bus의 이용하여 I/O controller와 통신하는 모습을 보여줍니다. 

 

 

 

I/O 디바이스는 크게 3가지 범주로 볼 수 있습니다. character device는 data transter unit이 byte나 character로 마우스나 키보드 터미널 등이 포함됩니다. block device는 data transfer unit이 볼륨 데이터로 disk drive나 flash drive 등을 말합니다. network device는 인터넷과 통신 미디어와 연결하기 위한 NIC 등이 존재합니다.

 

OS에서 이렇게 디바이스의 범주를 나누는 이유는 디바이스들마다 OS가 해결해야 하는 문제들이 다르기 때문입니다. 블락 디바이스의 경우 볼륨 데이터에 대한 수정이 일어나기 때문에 data transfer time이 오래걸려서 OS가 data transfer delay를 축소하기 위한 메커니즘(caching 등)을 제공해줘야 합니다. 

 

캐릭터 디바이스는 data transfer time이 짧지만 캐릭터 디바이스마다의 속성이 다 다르기 때문에 이 속성들을 캡슐화(encapsulation) 사용자들이 사용하기 쉽게 만들어줘야 합니다. 네트워크 디바이스의 경우 프로토콜 프로세싱을 지원해야 합니다.

 

 

 

블락 디바이스 중 하드디스크와 플래시 메모리에 대해 알아보겠습니다. 하드디스크의 경우 자화된 디스크 플레이트가 존재하며 read/write 헤드가 데이터를 읽거나 씁니다. 하드디스크는 위 사진과 같이 데이터를 저장하는 여러 장의 디스크 플레이트가 존재합니다.

 

하드디스크의 중심에 있는 작은 조각들을 섹터(sector)라고 부릅니다. 이 섹터는 디스크 드라이버에서 data transfer의 기본 유닛입니다. 이 섹터의 사이즈는 파일 시스템에서의 블락 사이즈와 일치하여 섹터와 로지컬 블락이 1 to 1으로 매핑됩니다. 

 

섹터들을 가지고 있는 동심원은 트랙(track)이라고 부르며 이 트랙은 같은 플레이트에 존재하는 섹터들의 집합으로 이해하면 됩니다. 하드디스크의 플레이트는 양면이 다 자화되어 있어 위 사진과 같이 3개의 플레이트가 존재할 때 6개의 자화 된 영역이 존재합니다.

 

섹터들은 linear array 형태로 묶여 있어서 블락에 1 to 1으로 매핑이 되어 있습니다. 이를 통해서 디스크 드라이브 상에 저장된 한 블락을 읽을 때 섹터에 접근할 수 있습니다. 섹터들은 3차원적인 주소를 가지기 때문에 이렇게 1차원적인 블락 인덱스로 바꿔야 1 to 1 매핑이 가능합니다. (어떤 플레이트에 있는지, 어떤 트랙에 있는지, 그 트랙에서 몇 번째 섹션인지 이렇게 3가지 차원의 정보를 가짐)

 

이번에는 섹터들을 매핑하는 방법에 대해서 알아보겠습니다. 플레이트 가운데는 실린더라는 원통이 존재하는데 이것은 같은 동심원을 갖는 트랙들의 집합을 의미합니다. 이 실린더를 사용하여 매핑을 하는데 이때 동일한 실린더에 있는 섹터들은 전부 인접하게 매핑을 진행해야 합니다. (read/write 헤더가 움직일 때 모든 헤더가 같이 움직이기 때문에 동일한 실린더에 있는 섹터를 읽는 것이 딜레이가 적음)

 

 

 

read/write를 헤드를 통해서 특정 섹터를 읽는 과정에 대해서 알아보겠습니다. seek 오퍼레이션을 통해서 실린더를 수평 이동 시킵니다. 하드디스크 드라이브에서 섹터를 읽을 때 가장 큰 딜레이가 발생하는 구간입니다.

 

read/write 헤더가 특정 실린더에 적절하게 위치에 있다면 읽고자 하는 섹터가 회전을 통해 헤더 밑으로 올때까지 기다려야 합니다. 이 딜레이를 rotational delay라고 부릅니다. (두 번째로 큰 딜레이), 세 번째 딜레이는 섹터에 있는 내용을 읽어 들일 때 발생하는 transfer time입니다.  

 

 

 

seek time은 0에서 20ms의 긴 시간이 필요합니다. rotation delay는 3600~5400RPM 일 때 0~16ms의 딜레이가 발생합니다. 이 두 시간에 0이 존재하는 경우는 운 좋게 읽고자 하는 부분이 헤더 바로 밑에 있는 경우도 있기 때문입니다. (반대로 20, 16ms는 맥시멈값이 됩니다.)

 

세 가지 딜레이를 비교했을 때 transfer time에 비해서 나머지 두 딜레이는 단위가 달라질 정도의 큰 차이가 난다는 것을 알 수 있습니다. 파일 시스템 최적화에서는 seek time을 잘 분산시켜서 사용자가 느낄 수 없게 하는 것이 중요한 목표입니다.

 

 

 

최근에는 하드디스크 드라이브를 SSD로 대체하는 추세입니다. SSD는 플래시 메모리(flash memory)를 사용한 저장장치입니다. 플래시 메모리를 디스크와 같은 저장장치로 사용하기 위해서는 NAND 플래시 메모리를 사용해야 합니다. NAND 플래시 메모리는 DRAM과 다르게 워드 단위의 액세스가 불가능합니다. (디스크처럼 블록 단위의 액세스)

 

위 사진에서는 2048개의 블록으로 플래시 메모리가 구성되어 있습니다. 이 블록은 64개의 페이지로 나뉩니다. 이때 페이지는 페이징에서 나온 페이지와 다른 플래시 메모리만의 단위입니다. 페이지는 데이터를 저장하는 부분과 사용하지 않는 spare area라는 영역으로 나뉩니다. (error correction코드나 메타데이터등을 가지는 영역)

 

 

 

플래시 메모리를 스토리지로 사용할 때 read, write operation 외에 erase operation이 존재합니다. 플래시 메모리는 read에는 아무런 제약이 없지만 wrtie의 경우 비워져 있는 곳에만 가능합니다. (비워져 있는 곳이 아니라면 write 하기 전에 erase를 진행해야 함)

 

NAND 플래시 read/write의 기본 단위는 페이지로 read는 한 페이지를 읽을 때 20 마이크로 초가 소요되지만 write는 한 페이지를 수정할 때 10배 더 걸립니다. (operation마다 소모되는 시간의 규모가 차이가 남)

 

플래시 메모리는 2가지 제약이 존재합니다. write 전에 erase를 해야 한다는 것과 반복적으로 wrtie와 erase를 할 경우 worn out이 되는 것입니다. (한 곳이 닳아 없어지는 문제), 그래서 wear leveling이라는 방법을 통해서 한 곳이 심하게 망가지지 않게 방지해야 합니다. (균등하게 erase before write 하는 방법)

 

 

 

동작에 대해서 자세히 알아보겠습니다. 0번 페이지에 valid 한 값이 적히면 메타 데이터에 valid가 들어가 있게 됩니다. 1번 페이지에 이미 데이터가 들어가 있는데 다시 write operation이 들어오게 되면 erase가 이뤄져야 합니다. erase operation은 페이지 단위가 아니라 블록 단위로 지우기 때문에 블록 내 모든 페이지를 지워야 합니다. (LPN은 로지컬 페이지 넘버)

 

그래서 페이지 1을 지우는 대신에 페이지 1을 invalid로 바꾸고 다른 블록의 빈 페이지 1에 modify 된 값을 적게 됩니다. 이전까지는 로지컬 페이지 넘버가 일치했지만 이 operation으로 인해 일치하지 않는 문제가 발생했습니다. 

 

 

 

이 경우 로지컬 넘버를 통해서 파일 콘텐츠를 액세스 하는데 피지컬 넘버가 흩어져 매핑이 유지되지 않습니다. 이를 해결하여 로지컬 페이지 넘버와 피지컬 페이지 넘버를 매핑하기 위해서는 매핑 테이블이 필요합니다. 이렇게 계속 진행되다 보면 자리를 차지하지만 페이지들이 전부 invalid 하여 사용할 수 없는 블록들이 생깁니다.

 

그래서 전체 valid 한 페이지 개수가 굉장히 적으면 새로운 블록에다 복사를 하고 전체를 invalidate를 하고 erase를 진행합니다. 이 opeartion이 garbage collection입니다. 

'CS > Operating System' 카테고리의 다른 글

25. Files and Directories  (0) 2024.02.03
24. Device Drivers  (2) 2024.01.31
22. Trends in Memory Management  (1) 2024.01.29
21. Trashing and Working set  (1) 2024.01.27
20. Demand Paging  (2) 2024.01.26