12.2 I/O Hardware
I/O 장치 연결 및 버스 구조
- 장치는 케이블 또는 무선으로 컴퓨터와 신호를 주고받으며, 포트(Port) 또는 버스를 통해 연결됨.
- 버스(Bus): 여러 장치가 동일한 통신선을 공유하며, PCIe(PCI Express)와 같은 고속 버스가 주로 사용됨.
- 데이지 체인(Daisy Chain): 여러 장치를 순차적으로 연결하는 방식.
컨트롤러 (Controller)
- 컨트롤러는 포트, 버스 또는 장치를 작동시키는 전자 장치임.
- 단순 컨트롤러: 직렬 포트 컨트롤러(Serial Port Controller)처럼 특정 신호만을 조작하는 간단한 장치.
- 고급 컨트롤러: 파이버 채널(Fiber Channel, FC) 컨트롤러처럼 별도 회로 기판(HBA 포함)과 프로세서를 가지고 있는 복잡한 장치.
12.2.1 Memory-Mapped I/O
- CPU가 장치 컨트롤러의 특정 레지스터(Registers) 에 데이터를 읽고 쓰는 방식으로 I/O 작업 수행.
- 메모리 맵드 I/O 방식: 장치의 제어 레지스터가 물리적 메모리 주소 공간에 매핑됨.
- 표준 데이터 전송 명령으로 I/O를 수행하여 속도가 빠름.
- 그래픽 컨트롤러는 화면 내용을 저장하는 대형 메모리 맵 영역을 사용함.
- 대부분의 현대 시스템은 메모리 맵드 I/O 방식 사용.
I/O 장치의 주요 레지스터
- 데이터 입력 레지스터(Data-in Register): 장치에서 입력 데이터를 저장하며, CPU가 이를 읽음.
- 데이터 출력 레지스터(Data-out Register): CPU가 장치로 데이터를 출력할 때 사용.
- 상태 레지스터(Status Register): 현재 명령의 완료 여부, 오류 발생 여부 등을 나타내는 비트 정보 포함.
- 제어 레지스터(Control Register): 장치의 동작 모드를 설정하는 역할.
12.2.2 폴링 (Polling)
호스트와 컨트롤러 간의 상호작용은 복잡할 수 있지만, 기본적인 핸드셰이킹(handshaking) 개념은 간단하다. 컨트롤러는 상태 레지스터의 busy 비트를 사용하여 작업 중인지 여부를 나타내고, 호스트는 command-ready 비트를 통해 명령이 준비되었음을 알린다.
호스트가 데이터를 출력할 때의 과정:
- 호스트가 busy 비트가 클리어될 때까지 지속적으로 읽음 (즉, 컨트롤러가 준비될 때까지 기다림).
- write 비트를 설정하고 데이터를 data-out 레지스터에 기록.
- command-ready 비트를 설정.
- 컨트롤러는 command-ready 비트를 감지하고 busy 비트를 설정.
- 컨트롤러는 명령을 읽고, 데이터를 가져와 I/O 작업을 수행.
- 작업이 끝나면 command-ready 비트와 busy 비트를 클리어.
- 이 과정이 반복되며, 초기 단계에서 호스트는 바쁜 대기(busy-waiting) 혹은 폴링(Polling)을 수행한다.
- 폴링은 짧은 시간 간격으로 계속해서 반복적으로 입력 신호를 읽어서 신호의 변화를 감지하는 방법이다.
- 하지만 컨트롤러가 느릴 경우 CPU가 불필요하게 자원을 낭비할 수 있어 비효율적이다. 이를 해결하기 위해 인터럽트(interrupt) 방식이 도입된다.
12.2.3 인터럽트 Interrupts
- 인터럽트는 하드웨어가 CPU에 특정 이벤트가 발생했음을 알리는 메커니즘이다.
- 폴링보다 효율적이며, 특히 빠르게 처리해야 하는 I/O 장치(예: 키보드 입력, 네트워크 패킷 수신 등)에서 유용하다.
기본 인터럽트 처리 과정
- CPU는 명령어를 실행할 때마다 인터럽트 요청(interrupt-request) 라인을 확인.
- 인터럽트가 발생하면 CPU는 현재 상태를 저장하고 인터럽트 핸들러로 점프.
- 인터럽트 핸들러가 원인을 확인한 후 처리.
- 인터럽트 처리가 완료되면 원래 실행 중이던 작업으로 복귀
인터럽트 벡터와 인터럽트 체이닝
- CPU는 인터럽트 벡터(interrupt vector) 를 통해 어떤 핸들러를 실행할지 결정함.
- 하지만 인터럽트 벡터가 충분하지 않을 경우, 인터럽트 체이닝(interrupt chaining) 을 사용하여 여러 핸들러를 연결하여 처리함.
12.2.4 직접 메모리 접근 (Direct Memory Access, DMA)
대량 데이터를 전송하는 장치(예: 디스크 드라이브)에서 일반적인 CPU가 하나씩 데이터를 전송하는 프로그램된 I/O(Programmed I/O, PIO) 방식은 비효율적이다. 이를 해결하기 위해 직접 메모리 접근(DMA) 컨트롤러가 사용된다.
- DMA 전송 과정
- 호스트가 DMA 명령 블록을 메모리에 작성함.
- 이 블록에는 전송 소스 주소, 목적지 주소, 전송 크기 등의 정보가 포함됨.
- CPU는 DMA 컨트롤러에 이 명령 블록의 주소를 전달한 후 다른 작업 수행 가능.
- DMA 컨트롤러가 CPU 개입 없이 메모리 버스를 직접 제어하여 데이터 전송 수행.
- 전송이 완료되면 DMA 컨트롤러가 CPU에 인터럽트를 발생시켜 작업 완료를 알림.
DMA 전송 단계
- CPU와 DMA의 관계
- DMA 컨트롤러가 메모리 버스를 점유하면 CPU는 메모리에 접근할 수 없지만, 캐시된 데이터는 사용할 수 있음.
- 이 과정에서 CPU 성능이 일시적으로 저하될 수 있으나, CPU의 부담을 줄여 전체 시스템 성능을 향상시킴.
- DMA와 메모리 보호
- 물리적 메모리 주소 사용 vs. 직접 가상 메모리 접근(DVMA): 일부 시스템은 DMA가 가상 주소를 직접 사용하도록 지원함.
- 일반적으로 보호 모드(Protected Mode) 커널에서는 사용자 프로세스가 장치 명령을 직접 실행하지 못하도록 제한함.
- 메모리 보호 기능이 없는 커널에서는 장치에 직접 접근이 가능하지만, 보안 및 안정성 문제가 발생할 위험이 있음.
12.3 Application I/O Interface
운영체제는 I/O 장치를 표준적이고 통일된 방식으로 다룰 수 있도록 여러 계층과 인터페이스를 사용한다. 이를 통해 응용 프로그램은 디스크 종류에 관계없이 파일을 열거나, 새로운 장치를 추가할 때 운영체제 변경 없이 사용할 수 있다.
- I/O 시스템 구조
- 추상화, 캡슐화, 소프트웨어 계층화 기법을 활용하여 하드웨어의 차이를 감춤.
- 장치 드라이버: 각 장치에 맞게 설계되지만 표준 인터페이스를 제공하여 커널의 I/O 서브시스템과 하드웨어의 차이를 중재
- I/O 장치의 주요 특성
- 문자 스트림 vs. 블록 전송: 데이터를 한 바이트씩 전송하는 문자 스트림 장치와, 블록 단위로 전송하는 블록 장치.
- 순차 접근 vs. 랜덤 접근: 정해진 순서대로 데이터를 읽는 순차 접근 장치와, 원하는 위치에서 데이터를 읽을 수 있는 랜덤 접근 장치.
- 동기식 vs. 비동기식: 일정한 응답 시간을 갖는 동기식 장치와, 응답 시간이 불규칙한 비동기식 장치.
- 공유 가능 vs. 전용 사용: 여러 프로세스가 동시에 사용할 수 있는 공유 장치와, 단독으로만 사용할 수 있는 전용 장치.
- 읽기-쓰기, 읽기 전용, 단일 쓰기: 읽기와 쓰기가 가능한 장치, 읽기만 가능한 장치, 한 번만 기록할 수 있는 장치 등.
- 운영체제의 장치 접근 방식
- 블록 I/O (디스크 같은 저장 장치)
- 문자 스트림 I/O (키보드, 마우스 같은 입력 장치)
- 메모리 매핑 파일 접근 (파일을 메모리에 직접 매핑하여 사용)
- 네트워크 소켓 (네트워크 통신 장치)
12.3.1 블록 및 문자 장치 (Block and Character Devices)
- 블록 장치는 디스크 드라이브와 같은 블록 단위로 데이터를 처리하는 장치이며, read(), write(), seek() 등의 명령을 지원함.
- 문자 장치(예: 키보드, 마우스)는 get() 및 put()과 같은 인터페이스를 통해 문자 단위로 데이터를 처리함.
12.3.2 네트워크 장치 ( Network Devices)
- 디스크 I/O와 달리 네트워크 I/O는 주소 지정 및 성능 특성이 다르므로 별도의 소켓(socket) 인터페이스를 제공함.
- 소켓을 생성하고 원격 주소와 연결하며, 패킷을 송수신하는 등의 기능을 제공함.
12.3.3 Clocks and Timers
- 운영체제는 현재 시간 조회, 경과 시간 측정, 특정 시점에 작업 실행과 같은 기능을 제공함.
- 하드웨어 타이머(프로그램 가능 인터벌 타이머, HPET 등)는 특정 시간이 지나면 인터럽트를 발생시켜 프로세스 스케줄링, 디스크 캐시 플러시, 네트워크 시간 초과 등의 작업을 수행함.
- NTP(Network Time Protocol)와 같은 프로토콜을 통해 시스템 시계의 시간 오차를 보정할 수 있음.
12.3.4 논블로킹 및 비동기 I/O
- 블로킹 I/O: 시스템 호출을 실행하면 프로세스 실행이 중단되며, 완료 후 재개됨.
- 논블로킹 I/O: 호출 즉시 반환되며, 전송된 바이트 수를 반환함.
- 비동기 I/O: 요청 즉시 반환되지만, 작업 완료 후 별도의 방식(콜백, 신호 등)으로 완료 여부를 알림.
- select() 시스템 호출을 활용하면 여러 개의 I/O 장치에서 동시에 데이터를 감지할 수 있음.
12.3.5 벡터 I/O (Vectored I/O)
- 벡터 I/O(readv, writev)는 한 번의 시스템 호출로 여러 개의 버퍼를 처리하는 방식임.
- 단일 시스템 호출로 여러 개의 데이터를 읽거나 쓸 수 있어 성능 향상 및 시스템 호출 오버헤드 감소에 유리함.
- 데이터 전송을 원자적으로 처리할 수 있어 동시 I/O 작업에서도 데이터 무결성을 유지할 수 있음.
12.4 Kernel I/O Subsystem
12.4.1 I/O 스케줄링
- 운영체제는 I/O 요청을 최적의 순서로 처리하여 성능을 향상하고, 프로세스 간 공정한 장치 접근을 보장하며, 평균 대기 시간을 줄인다.
- 이를 위해 각 장치별 대기 큐를 유지하며, 요청 순서를 조정한다. 가상 메모리 서브시스템의 요청이 애플리케이션보다 우선시될 수도 있다.
12.4.2 버퍼링 (Buffering)
- 버퍼는 두 장치 간 또는 장치와 애플리케이션 간 데이터 전송을 저장하는 메모리 영역이다.
- 버퍼링의 주요 목적:
- 속도 차이 조정: 네트워크에서 SSD로 파일을 받을 때, 네트워크 속도가 SSD보다 훨씬 느리므로 데이터를 일시적으로 저장할 버퍼가 필요하다. 이를 위해 더블 버퍼링(double buffering) 기법이 사용된다.
- 전송 크기 차이 해결: 네트워크에서 작은 패킷으로 분할된 데이터를 다시 조립하기 위한 버퍼 사용.
- 복사 의미 보장(copy semantics): 애플리케이션이 데이터를 디스크에 쓰기 전에 내용이 변경될 경우, 운영체제가 별도 커널 버퍼에 데이터를 저장하여 원본 데이터를 보호한다.
12.4.3 캐싱 (Caching)
- 캐시는 빠른 메모리에 데이터를 저장하여 원본 접근보다 빠르게 제공하는 기술이다.
- 캐시와 버퍼의 차이:
- 버퍼: 원본 데이터의 유일한 사본을 보관.
- 캐시: 기존 데이터의 복사본을 저장하여 빠른 접근을 가능하게 함.
12.4.4 스풀링과 장치 예약 (Spooling and Device Reservation)
- 스풀(spool)은 프린터와 같은 장치가 여러 개의 데이터 스트림을 동시에 처리할 수 없을 때 사용하는 버퍼다.
- 운영체제는 모든 프린터 출력을 가로채어 개별 파일로 저장한 후, 순차적으로 출력한다. 일부 운영체제에서는 이를 시스템 데몬이 관리하고, 다른 운영체제에서는 커널 스레드가 처리한다.
12.4.5 오류 처리(Error Handling)
- 운영체제는 메모리 보호 기능을 통해 시스템 장애를 방지할 수 있다.
- 하드웨어 및 소프트웨어 오류는 일시적인 경우(예: 네트워크 과부하)와 영구적인 경우(예: 디스크 컨트롤러 고장)로 나뉜다.
- 일시적인 오류는 재시도(retry)로 복구될 수 있지만, 영구적인 오류는 복구가 어렵다.
- 대부분의 I/O 시스템 호출은 성공 또는 실패 여부만 반환한다.
12.4.6 I/O 보호 (I/O Protection)
- 사용자가 불법적인 I/O 명령을 실행하는 것을 방지하기 위해, 운영체제는 I/O 명령을 특권 명령으로 지정한다.
- 즉, 사용자는 직접 I/O 명령을 실행할 수 없으며, 운영체제에 시스템 호출을 요청해야 한다.
- 운영체제는 요청의 유효성을 확인한 후 I/O를 수행한다.
- 또한, 메모리 매핑 및 I/O 포트에 대한 접근을 보호하여 무단 접근을 차단한다. 다만, 그래픽 게임이나 동영상 편집 소프트웨어의 성능을 고려해 일부 메모리에 대한 접근을 허용하는 경우도 있다.
아래는 생략.. 그냥 이러쿵 저러쿵
'운영체제 공룡책' 카테고리의 다른 글
[운영체제 공룡책] 14장 File -System Implementation (0) | 2025.03.25 |
---|---|
[운영체제 공룡책] 13장 File -System Interface (0) | 2025.03.24 |
[운영체제 공룡책] 11장 Mass -Storage Structure (0) | 2025.03.19 |
[운영체제 공룡책] 10장 가상 메모리 (0) | 2025.03.18 |
[운영체제 공룡책] 9장 메인 메모리 (0) | 2025.03.17 |