컴퓨터에서 작동되는 장치는 저장장치, 전송 장치, 사용자 인터페이스 장치 등으로 나뉩니다.
- 포트 : 컴퓨터 시스템과 접속하는 연결점.
- 버스 : 하나 이상의 장치들이 사용하는 공동 선. 회선의 집합으로, 어떻게 메시지를 주고받을 지 정한 프로토콜까지 포함.
- 데이지 체인(daisy chain) : 연속적으로 연결되어 있는 하드웨어 장치. 하나의 버스처럼 동작하며, A가 B에 연결되고, B가 C, C가 컴퓨터의 포트까지 연결되어있는 구조.
- 컨트롤러 : 포트, 버스, 장치를 작동할 수 있는 전자장치 집합체.
위 이미지에서는 확장 버스(expansion bus)가 상대적으로 느린 장치(키보드, 직렬, USB 포트)들을 연결하고 있고, PCI 버스가 프로세스-메모리 서브 시스템을 확장 버스에 연결하고 있습니다.
- PCI 버스 : 일반적인 PC system bus. PCIe(PCI express) bus는 하나 이상의 레인을 통해 데이터를 전송하는 유연한 버스입니다.
왼쪽 하단에는 직렬연결 SCSI(SAS) 버스에 4개의 디스크가 연결되어 있는 SAS 컨트롤러가 연결되어 있습니다.
<메모리 맵드 입출력>
모든 컨트롤러는 제어용 또는 데이터용 레지스터를 가지고 있어서, 프로세서는 이 레지스터에 비트 패턴을 쓰거나 읽어서 입출력을 수행합니다.
메모리 맵드 입출력(memory-mapped I/O) 방식 : 장치 레지스터들이 메모리 주소와 일대일 대응. 메모리 영역에 데이터를 기록 -> 컨트롤러가 자동으로 출력 -> 메모리를 기반으로 스크린 이미지 형성. 단순하고 빨라서 오늘날의 대부분의 I/O는 메모리 맵드 I/O를 사용합니다.
<입출력 장치 컨트롤러>
- 입력(data-in) 레지스터 : 입력을 위해 읽기 수행
- 출력(data-out) 레지스터 : 데이터 출력을 위해 쓰기 수행
- 상태(status) 레지스터 : 호스트가 읽는 용도. (ex) 명령이 완료되었는지, 입력 레지스터로부터 한 바이트를 읽어도 되는지, 오류가 있었는지
- 제어(control) 레지스터 : 주변 장치에 입출력 명령을 내리거나, 장치의 모드를 변경하기 위해 쓰기를 수행하는 대상.
<폴링(Polling)>
호스트가 컨트롤러와 협력하여 출력하는 방식은 핸드셰이킹(hand-shaking) 방식으로 이루어집니다. 컨트롤러는 상태 레지스터의 busy 비트를 통해 자신의 상태를 나타내고(바쁠 때는 1로 설정하고, 다음 명령을 받을 준비가 되면 0으로 소거) , 호스트는 이를 읽어옵니다.
1) 호스트는 소거될 때까지 반복적으로 루프를 돌면서 busy 비트 검사. 이 단계에서 하는 busy-waiting을 폴링이라 합니다.
2) 호스트가 명령 레지스터에 쓰기 비트를 설정하고, 출력 레지스터에 출력할 바이트를 씀.
3) 호스트가 명령 준비 완료 비트를 설정.
4) 컨트롤러는 명령 준비 완료 비트가 설정된것을 알았을 때 자신의 비지 비트를 설정.
5) 컨트롤러는 명령 레지스터를 읽고 쓰기 명령임을 알게되고, 해당 바이트를 읽어와 출력.
6) 컨트롤러는 명령 준비 비트를 소거하고, 입출력이 끝났음을 알리기 위해 비지 비트를 소거.
대부분의 컴퓨터 구조에서는 한 장치를 폴하기 위해 3개의 CPU 명령 사이클로 충분한데, 장치가 서비스할 준비가 되는데에 시간이 오래 걸린다면 폴링은 비효율적인 연산이 됩니다. 이런 폴링의 문제점을 해결하기 위한 기법이 인터럽트 기법입니다.
<인터럽트(Interrupt)>
: 입출력 장치가 CPU에게 자신의 상태 변화를 통보하는 하드웨어 기법.
- 입출력 request line : CPU 하드웨어가 가지는 선으로, CPU가 매 명령어를 끝내고 다음 명령어를 수행하기 전에 검사합니다. 입출력 하드웨어 컨트롤러가 자신이 사용가능한 상태일 때 이 라인을 통해 인터럽트 신호를 보내면 CPU는 하던 작업을 중단하고, 인터럽트 핸들러로 하여금 다른 일을 합니다.
- 특수 상황에서는 인터럽트 발생을 연기시킬 수 있어야 하는데, 대부분의 CPU는 중단이 불가능한 Nonmaskable interrupt와 잠시 무시할 수 있는 Maskable interrupt를 함께 사용합니다.
- Nonmaskable interrupt : 복구가 불가능한 메모리 에러를 막기 위한 event가 저장되어 있는 interrupt
- 인터럽트 벡터 : 인터럽트가 발생했을 때 해당 인터럽트를 처리할 수 있는 서비스 루틴의 주소입니다.
- 인터럽트 사슬화(chaining) 기술 : 인터럽트 핸들러 리스트의 head를 가리키는 것. 인터럽트가 발생했을 때 하려는 서비스를 찾을 때까지 head부터 내려오며 확인합니다.
- 인터럽트 우선순위 수준 : 높은 우선순위의 인터럽트가 낮은 우선순위 인터럽트의 실행을 선점할 수 있게 합니다.
- 운영체제가 인터럽트를 다른 용도로도 사용합니다.
- 가상메모리 페이징 : 페이지 폴트는 인터럽트를 일으키는 예외이고, CPU는 하던 일을 미루고 페이지폴트를 처리하는 핸들러로 하여금 페이지 폴트를 발생시킨 프로세스를 wait 큐로 보내고, 페이지 캐시 관리를 수행하고, 요청된 페이지의 입력을 스케줄하고, 다른 프로세스가 수행을 다시 시작하도록 스케줄하고, 인터럽트로부터 돌아갑니다.
- 소프트웨어 인터럽트(= 트랩) : 외부가 아닌 CPU 내부에서 자신이 실행한 명령이나 CPU 명령 실행에 관련된 모듈이 변화하는 경우에 발생하는 예외상황시 발생합니다. 프로그램 실행 중 처리 불가능한 오류나 이벤트를 알리기 위해 발생하며, 트랩 또는 예외(exception)이라 부릅니다. 또, 프로그램 내에서 특별한 서비스를 요하거나 감시를 목적으로 의도적으로 프로그램이 발생시킨 특별한 명령어에 의해 발생되기도 합니다.
<직접 메모리 접근(Direct Memory Access)>
: 입출력 장치가 CPU를 거치지 않고 메모리에 접근하는 방식입니다. 입출력 장치의 모든 데이터가 CPU를 거쳐 메모리에 접근하게 되면 CPU 연산 처리 과정에서 더 많은 명령어를 처리해야 하는 부담이 생기기 때문에 직접 메모리 접근 기능이 도입되었습니다. (모든 입출력 데이터가 DMA 컨트롤러를 거치는 것은 아님)
1) 입력 장치로부터 데이터가 들어옴
2) DMA 컨트롤러가 메모리로 데이터 전송
3) DMA 컨트롤러가 데이터를 보냈다는 정보를 CPU한테 인터럽트 신호로 전송. 사이클 스틸링(cycle stealing)이라 하며, CPU 속도를 저하시키지만 전체적으로 봤을 때 시스템 성능을 향상시킵니다.
4) 램은 DMA 컨트롤러가 보낸 데이터를 받음
CPU는 입출력 DMA 컨트롤러에게 대략적인 처리 결과 보고만 받고, 직접적인 데이터 관리는 DMA 컨트롤러에서 하기 때문에 입출력 장치에 의해 생기는 CPU 활성이 줄어듭니다.
'[Computer Science] > [운영체제(OS)]' 카테고리의 다른 글
[운영체제(OS)] 12-3) 커널 입출력 서브시스템, 입출력 요청 주기 (0) | 2023.04.06 |
---|---|
[운영체제(OS)] 12-2) 응용 입출력 인터페이스, 입출력 성능 (0) | 2023.04.05 |
[운영체제(OS)] 11-4) 저장장치 연결, RAID (0) | 2023.04.03 |
[운영체제(OS)] 11-3) 저장 장치 관리, 스왑 공간 관리 (0) | 2023.03.31 |
[운영체제(OS)] 11-2) 디스크 스케줄링, NVM 스케줄링 (0) | 2023.03.30 |