CS 스터디/운영체제

[입출력 시스템] 1. 입출력 시스템

doobi 2023. 8. 24. 18:33

1. 입출력장치와 채널

 

저속 주변장치 : 메모리와 주변장치 사이에 오고 가는 데이터의 양이 적고, 데이터 전송률이 낮은 장치

ex) 키보드, 프린터, 마우스

고속 주변장치: 메모리와 주변장치 사이에 오고 가는 데이터의 양이 많고, 데이터 전송률이 높은 장치

ex) 그래픽 카드, 하드디스크

 

여러 주변 장치는 메인보드 내의 버스로 연결된다. 이때 버스를 1개만 사용하면 병목 현상이 발생한다. 

따라서 여러 개의 버스를 묶어서 사용하는데 이때 데이터가 지나다니는 하나의 통로를 채널이라고 부른다. 

채널을 효율적으로 사용하기 위해서는 속도가 비슷한 장치끼리 묶어서 사용하는 것

-> 전체 데이터 전송 속도를 향상시킬 수 있다. 

 

2. 입출력 버스의 구조

 

과거) 폴링방식

: CPU가 작업을 진행하다가 입출력 명령을 만나면 직접 입출력장치에서 데이터 가져옴.

작업 처리 시간보다 데이터 이동 시간이 오래 걸려서 작업 효율이 떨어짐.

 

중간) 입출력 제어기 사용

: 모든 입출력을 입출력 제어기(I/O controller)가 제어

입출력 제어기를 사용하면 느린 입출력장치로 인해 CPU와 메모리 작업이 느려지는 것을 막을 수 있어 전체 작업 효율이 향상된다.

하지만 저속 주변장치 때문에 고속 주변장치의 데이터 전송이 느려지는 문제가 있다. 

 

최근) 입출력 버스의 분리

: 입출력 버스를 고속 입출력 버스와 저속 입출력 버스로 분리

고속 입출력 버스에는 고속 주변장치를 연결하고, 저속 입출력 버스에는 저속 주변장치를 연결

두 버스 사이의 데이터 전송은 채널 선택기가 관리한다.

 

3. 직접 메모리 접근

메모리는 CPU의 명령에 따라 작동한다. 

이때 직접 메모리 접근(DMA)은 CPU의 도움 없이도 메모리에 접근 할 수 있도록 입출력 제어기에 부여된 권한으로, 입출력 제어기에는 직접 메모리에 접근하기 위한 DMA 제어기가 마련되어 있다. 

 

입출력 제어기는 여러 채널에 연결된 주변장치로부터 전송된 데이터를 적절히 배분하여 하나의 데이터 흐름을 만든다.

이때 채널 선택기는 여러 채널에서 전송된 데이터 중 어떤 것을 메모리로 보낼지 결정한다.

이렇게 주변장치에서 전송된 데이터는 DMA를 거쳐 메모리에 올라간다.

 

메인 메모리는 CPU가 작업하는 전용 공간이다. 그런데 DMA 제어기가 입출력 장치에서 가져온 데이터 혹은 입출력 장치로 가져갈 데이터가 있을 때도 이 공간을 사용한다. 즉 CPU와 DMA의 작업 공간이 겹친다. 

=> CPU와 DMA 가 작업하는 공간을 분리하여 메인메모리를 운영하고, 이를 메모리 맵 입출력 이라고 부른다. 

 

4. 인터럽트

 

외부 인터럽트

외부 인터럽트는 주변장치의 입출력 요구나 하드웨어의 이상 현상을 CPU에 알려주는 역할을 하는 신호이다.

전원 이상이나 기계적 오류로 발생하는 인터럽트를 포함하기 때문에 하드웨어 인터럽트라고도 한다.

이때 입출력 제어기와 DMA 제어기의 협업으로 작업이 완료되면 입출력 제어기는 CPU에 인터럽트를 보낸다.

- CPU가 요청한 작업을 완료했을 때, 하드웨어에 이상이 발생했을 때 등 다양한 경우에 인터럽트가 발생한다.

 

컴퓨터 시스템에는 다양한 종류의 장치가 있기 때문에 CPU가 인터럽트를 받아도 어느 장치에서 온 인터럽트인지 확인하기 어렵다. 따라서 각 장치에 IRQ라는 고유의 인터럽트 번호가 부여되어 있다. 

 

내부 인터럽트

숫자를 0으로 나누거나 자신의 주소 공간을 벗어나서 작업하는 것과 같이 프로세스의 오류와 관련된 인터럽트는 내부 인터럽트이다. 

내부 인터럽트는 프로세스의 잘못이나 예상치 못한 문제 때문에 발생하므로 예외상황 인터럽트라고도 부른다.

 

시그널

사용자가 자발적으로 발생시키는 인터럽트

작동중인 프로세스를 끄려고 ctrl + c를 누르거나, kill명령어를 사용하는 것

 

 

인터럽트 벡터와 인터럽트 핸들러

시스템 내에는 100개가 넘은 인터럽트가 있다. 인터럽트는 한 번에 하나가 발생하기도 하고 한꺼번에 여러개가 발생하기도 한다.

인터럽트 벡터는 여러 인터럽트 중 어떤 인터럽트가 발생했는지 파악하기 위해 사용하는 자료 구조이다.

벡터값이 1일 경우 인터럽트가 발생했다는 의미다.

 

인터럽트 핸들러는 다양한 인터럽트의 처리 방법을 함수 형태로 만들어놓은 것이다. 운영체제는 인터럽트가 발생하면 인터럽트 핸들러를 호출하여 작업을 한다. 또한 사용자 인터럽트 시그널의 경우 자신이 만든 인터럽트 핸들러를 등록할 수 있다.

 

 

5. 버퍼링

 

버퍼

버퍼는 속도가 다른 두 장치의 속도 차이를 완화하는 역할을 한다.

느린 장치를 통해 들어오는 데이터를 버퍼에 보아 한꺼번에 이동하면 효율적이고, 느린 속도를 보완할 수 있다.

주변장치뿐만 아니라 커널에서도 버퍼를 사용한다. 커널이 입출력장치로 보내야 할 데이터를 버퍼에 담아놓으면 입출력 제어기가 커널 버퍼에서 입출력장치로 데이터를 보낸다. 입출력 작업이 완료되기 전에 다른 작업을 할 수 있어 시스템의 성능이 좋아진다.

 

단일 버퍼와 이중 버퍼의 차이

단일 버퍼보다는 이중 버퍼를 사용하는 것이 유리하다. 

단일 버퍼를 사용하면 데이터를 버퍼에 담는 작업과 데이터를 퍼가는 작업을 동시에 하기가 어렵다.

이중 버퍼를 사용할 경우 하나는 담는 용, 하나는 가져가는 용으로 쓸 수 있어 유용하다.

 

버퍼 운용 시 주의점

시스템 효율성을 위해 운영체제는 버퍼가 다 찼을 때 입출력장치로 데이터를 전송하도록 하고, 

데이터가 꽉 차지 않을 경우 일정 시간이 흐른 후 데이터를 전송하도록 한다.

 

하지만 버퍼가 다 차지 않아서 데이터가 전송되지 않았을 때, 저장장치를 제거하는 경우 문제가 발생한다. 

이때는 Flush를 해야한다. 

플러시는 버퍼가 다 차지 않아도 강제로 버퍼의 내용이 저장장치로 옮겨지도록 하는 것이다. 

플러시가 일어나면 저장장치의 손상을 방지하기 위해 입출력장치의 전원이 차단된다.