오늘은 입출력 장치에 대해서 알아봅시다.
입출력 장치
입출력 장치는 mechanical part와 electronic part로 이루어져 있습니다. 이 중에서 electric part를 우리는 Controller라고 부르기도 합니다.
Controller에는 Control Register, Status Register, internal buffer 등으로 이루어져 있습니다.
- Control Register는 해당 레지스터의 비트를 1로 만듦으로써 정해진 연산 또는 동작을 수행하게 하는 역할을 합니다.
- Status Register는 해당 디바이스의 상태를 나타냅니다. I/O가 잘 수행되었는지, 에러가 있는지 등을 Status Register의 특정 비트를 확인함으로써 알 수 있습니다.
- Internal Buffer는 여러 용도로 쓰이지만, 주로 OS가 할당한 작업들을 나열해놓는 임시 저장 공간입니다.
그렇다면 이런 입출력 장치에는 어떤 종류가 있을까요?? 크게 3가지로 나누어봤습니다.
입출력 장치의 종류
Human Readable I/O Device
- 유저와 소통하기 위한 장치
- Display, Keyboard, mouse
Machine Readable I/O Device
- 전자 장비와 소통하기 위한 장치
- Disk, tape, Sensor, Controller
Communication
- 원격 장치와 소통하기 위한 장치
- 유선장치, 모뎀
입출력 관리
우리가 생각하는 입출력 장치는 너무나도 종류가 많습니다. 그렇다면 OS는 이러한 모든 장치에 대해서 작동 원리나 처리하는 로직을 모두 알아야할까요?? 만약 그렇다면 어떤 개인이 개발한 장치 때문에 OS가 이 장치를 다루기 위한 코드를 만들어서 배포해야할까요??
그렇지 않습니다. 실제로 우리도 많이 겪어봤을 텐데요, 보통 어떠한 장치를 이용하기 위해서(ex. 프린터) 드라이버라는 것을 설치해본 적이 있을 것입니다.
네!! 맞습니다. 사실 OS는 이 드라이버를 통해서 다양한 기기에 대한 동작을 수행할 수 있게 됩니다. 하단의 그림을 확인해보시죠.
하단에는 하드웨어 즉, 장치들이 있습니다. 이 장치들은 각각의 Controller를 통해서 동작을 수행합니다. Controller는 software에 설치한 device driver와 통신합니다. 그 후, driver는 OS에게 요청을 하게 되며 OS는 이를 인지하고 관리할 수 있습니다.
이 때, 어떤 driver든 OS에 공통적으로 접근할 수 있도록 interface를 두었습니다. 이에 따라 어떠한 장치를 개발할 때, 하드웨어 측면을 구현한 후 driver까지 개발합니다.
이후, 해당 driver를 OS에 설치하게 되면, 이제 OS는 이러한 장치를 사용할 수 있게 됩니다.
운영체제의 입출력 관리 기능
운영체제가 입출력 장치를 관리하기 위해 제공하는 기능은 크게 6가지가 있습니다.
1. Device reservation
OS는 입출력 장치들을 보관하고 적재적소에 실행해야합니다. 따라서, 여러 장치들을 대기시키거나 실행시키는 작업을 수행할 수 있습니다.
2. Device Scheduling
대기큐에 있는 장치들을 언제 누구부터 실행할지 정하는 기능을 수행할 수 있습니다.
3. Error Handling
OS가 관리하는 장치의 오류를 적절하게 대처하는 기능을 제공합니다.
4. Buffering
CPU가 I/O device에게 내리는 명령의 속도는 굉장히 빠릅니다. 이에 비해 해당 명령을 읽어와서 처리하는 과정은 상대적으로 느리므로 만약 CPU가 엄청난 양의 작업을 장치에게 요청했을 때, 해당 장치는 주어진 요청을 모두 수용하지 못합니다. 따라서 Buffer를 두어서, 해당 작업들을 저장하게합니다.
1. 앞서 설명한 입출력 장치와 CPU의 속도를 맞추기 위함입니다.
2. 데이터 전송 사이즈르 맞추기 위해서입니다. 만약 우리가 I/O 장치에 1MB를 전송해야한다고 해봅시다. 하지만 전송단위는 1KB라고 한다면, 이를 보내기 위해서는 어떤 곳에 임시 저장해두고 조금씩 보내는 과정이 필요합니다.
그 때, Buffer를 사용하게 됩니다.
3. copy semantics
만약 여러명이 데이터가 큰 파일을 print 한다고 해봅시다. 그렇다면 print 이후 변경 내용이 반영되어서 출력될까요?? 그렇지 않습니다. 사실 우리는 print를 눌렀을 때의 data 값만 출력하고 싶으므로, 해당 데이터를 버퍼에 저장하게 됩니다.
5. Caching
메인 메모리에 입출력 장치의 내용 일부를 저장하여, I/O에 직접 접근하지 않아도 메인 메모리에서 찾을 수 있는 기능을 제공합니다.
6. Spooling
보조기억장치의 구조 중 일부로, 메인 메모리에 print를 진행하려고 할 때, 조금씩 버퍼로 옮겨서 동작을 수행할 수 있게 도와줍니다.
실제로 여러 사람이 print를 수행하게 된다면, 각 수행의 대상이 되는 데이터의 일부분들만을 불러옴으로써 동시동작처럼 보일 수 있습니다.
오늘은 입출력 장치에 대해서 알아봤습니다. 감사합니다.
'CS > OS' 카테고리의 다른 글
[운영체제] I/O 제어 (1) | 2023.11.11 |
---|---|
[운영체제] 인터럽트 처리 (0) | 2023.11.11 |
[운영체제] 리눅스의 파일 시스템 (0) | 2023.11.02 |
[운영체제] 파일 시스템 (1) | 2023.10.28 |
[운영체제] 디렉토리 (1) | 2023.10.28 |