입출력 시스템
입출력장치란?
입출력장치는 컴퓨터 시스템에서 데이터를 입력하고 출력하는 데 사용되는 장치들을 의미합니다.
- 입력장치: 사용자가 데이터를 컴퓨터에 전달할 수 있도록 도와줌 ex) 키보드, 마우스 등
- 출력장치: 컴퓨터가 처리한 결과를 사용자에게 전달 ex) 프린터, 모니터 등
⇒ CPU, 메모리보다 다루기 까다로움
- 입출력장치에는 종류가 너무 많습니다.
- 장치가 다양하면 장치마다 속도, 데이터 전송 형식 등도 다양 → 규격화 어려움
- 일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률을 낮습니다.
⇒ 장치 컨트롤러(하드웨어)로 관리하자: 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받음
장치 컨트롤러

- CPU와 입출력장치 간의 통신 중개: 규격화하기 어려운 입출력 장치의 어려움을 해소
- 오류 검출: 장치 컨트롤러에 연결된 입출력 장치에 오류가 없는지 검출
- 데이터 버퍼링: CPU와 입출력 장치의 전송 속도 차이를 완화
- 입력 시: 느린 속도로 들어오는 데이터를 버퍼에 모았다가 한 번에 CPU로 전송
- 출력 시: 빠른 속도로 보내는 데이터를 버퍼에 잠시 보관했다가, 느린 장치가 처리할 수 있는 속도로 전달
입출력 버스 변천사
버스(Bus)란? 버스는 컴퓨터 시스템 내부의 다양한 부품들(CPU, 메모리, 주변 장치 등)이 서로 데이터를 주고 받는 공통의 통로를 의미합니다. ex) 주소 버스, 데이터 버스, 제어 버스
초기에는 주변 장치가 많지 않았고, CPU와 메모리 속도도 빠르지 않아 모든 장치를 하나의 버스로 연결해 데이터를 주고 받았습니다.

하지만 CPU와 메모리의 성능이 향상되고 주변장치가 다양해지면서 입출력을 CPU가 직접 관리하는 것이 비효율적이게 되고, 속도차이로 인해 하나의 버스만으로 연결하는 것도 문제가 되었습니다.
입출력 제어기 도입

입출력 제어기를 사용해 CPU 대신 입출력장치로부터 데이터를 가져오는 구조로 발전하였습니다.
버스 분리
하나의 입출력 버스 공유로 인해 고속 주변장치의 입출력 속도가 저하되는 문제가 있었고, 이를 해결하기 위해 버스를 고속 입출력 버스와 저속 입출력 버스로 분리하였습니다.
- 입출력 버스로 감당하기 어려운 그래픽 카드는 입출력 버스에서 분리하고 메인 버스에 바로 연결하여 사용

하지만 여전히 데이터 간의 이동을 CPU가 주도하고, 이동하는 데이터도 반드시 CPU가 거치기 때문에 대용량 데이터가 이동할 때는 CPU는 입출력장치를 위한 연산 때문에 리소스를 뺏기게 됩니다. 입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 직접 메모리 접근 입출력 방식인 DMA가 등장하게 되었습니다.
직접 메모리 접근(DMA, Direct Memory Access)
입출력 제어기는 주변 장치들의 입출력을 대행사고, 여러 채널에서 온 데이터를 메모리에 옮기는 역할을 합니다. 이때 CPU 도움 없이도 메모리에 접근할 수 있도록 입출력 제어기에 DMA라는 권한을 부여합니다.

[동작 방식]
- CPU는 DMA 컨트롤러에게 A라는 명령을 내립니다.
- DMA 컨트롤러는 CPU의 명령을 받자마자, CPU를 대신하여 하드디스크와 메모리 사이의 데이터 전송을 직접 관리합니다.
- 입출력 제어기는 여러 채널에 연결된 장치들이 전송한 데이터를 적절하게 나누어 하나의 유의미한 데이터 흐름을 만듭니다.
- 이 과정 동안 CPU는 완전히 자유로워져서 다른 연산 작업을 수행할 수 있습니다.
- 데이터 전송이 모두 끝나면, DMA 컨트롤러는 CPU에게 인터럽트 신호를 보내서 작업을 완료합니다.
⇒ CPU가 사용하는 작업 공간인 메인 메모리가 DMA 제어기와 공유되는 문제가 존재 → 공간 분리 (Memory mapped I/O)

인터럽트
입출력 제어기와 DMA 제어기의 협업으로 작업이 완료`되면 입출력 제어기는 CPU에 인터럽트를 보냅니다.
- 다양한 입력장치 구분을 위해 IRQ를 부여 → 어떤 장치에서 발생했는지 파악 가능
- IRQ(Interrupt ReQuest): 장치별 고유의 인터럽트 번호
[인러럽트 동작 과정]
- 인터럽트 발생: CPU에게 인터럽트 신호 전달
- 현재 작업 중단: CPU 작업 중단
- 인터럽트 처리: CPU는 인터럽트의 종류를 파악하고, 해당 인터럽트를 처리할 특정 코드를 실행
- 원래 작업 복귀: CPU가 중단했던 원래의 작업을 진행
인터럽트의 종류
- 외부 인터럽트: 입출력장치로부터 오는 인터럽트 뿐만이 아니라 전원 이상이나 기계 오류로 발생하는 인터럽트를 포함 (하드웨어 인터럽트)
- 내부 인터럽트: 프로세스 잘못이나 예상치 못한 문제로 발생 (예외 인터럽트)
- 시그널: 운영체제가 특정 프로세스에게 보내는 소프트웨어적인 알림이나 사용자가 직접 발생시키는 인터럽트
인터럽트 벡터와 핸들러

- 인터럽트 백터: 여러 인터럽트 중 어떤 인터럽트가 발생했는지 파악하기 위해 사용하는 자료구조입니다.
- 1이면 인터럽트 발생
- 인터럽트 핸들러: 인터럽트의 처리 방법을 함수 형태로 만들어 놓은 것 입니다. 운영체제는 인터럽트가 발생하면 인터럽트 핸들러를 호출하여 작업을 진행합니다.
- ex) 0으로 나누기 오류가 발생하면 해당 오류를 처리하는 전용 핸들러를 호출
버퍼
버퍼
속도가 다른 두 장치의 속도 차이를 완화하는 역할을 하는 저장 공간입니다. 대표적으로 CPU 처리 속도에 비해 입출력 장치의 처리 속도가 느려 버퍼를 이용해 두 속도차이를 완화합니다.

단일 버퍼와 이중 버퍼
단일 버퍼를 사용하면 데이터를 버퍼에 담는 작업과 버퍼에 있는 데이터를 퍼가는 작업을 동시에 하기 어렵기 때문에 이중 버퍼를 사용해 한 번은 데이터를 담는 용도로, 다른 버퍼는 데이터를 가져가는 용도로 사용합니다.

하드 디스크
저장장치는 입력된 데이터를 저장하고 저장된 데이터를 출력하여 알맞은 시스템 동작에 사용되기 때문에 입출력장치로 분류됩니다.

자기적인 방식으로 데이터를 저장하는 보조기억장치입니다. 플래터라고 불리는 회전하는 디스크에 자기적인 방식으로 데이터를 기록하고 읽어오는 원리로 동작합니다.
- 플래터(Platter): 회전하는 원형 디스크판으로 각각의 자기판에 데이터가 자기적으로 기록됩니다. 하드 디스크에서 실질정으로 저장되는 곳으로 N극(0)과 S극(1)으로 저장합니다.
- 스핀들(Spindle): 플래터를 회전시키는 원판으로 회전 속도는 하드 디스크의 성능에 영향을 미칩니다.
- 헤드(Head): 플래터를 대상으로 데이터를 읽고 쓰는 장치입니다. 플래터 위에서 미세하게 떠 있는 채로 움직입니다.
- 액추에이터 암(Actuator Arm): 헤드를 원하는 위치로 이동시키는 팔입니다.
플래터의 구조

하나의 플래터는 여러개의 논리적인 단위로 구성되어 있습니다.
- 섹터(Sector): 트랙을 여러 개의 부채꼴 모양으로 나눈 가장 작은 저장 단위입니다. 디스크 입출력은 이 섹터 단위로 이뤄집니다.
- 클러스터(Cluster): 연속된 섹터의 모음입니다. 파일에 할당되는 최소 단위입니다.
- 트랙(Track): 플래터 중심을 기준으로 동심원을 이루는 영역입니다. 데이터는 이 트랙에 저장됩니다.
- 실린더(Cylinder): 여러 장의 플래터가 있을 때, 같은 위치에 있는 트랙들의 집합을 말합니다. 여러 플래터의 같은 트랙에 데이터를 저장하면 헤드를 한 번만 움직여도 여러 트랙에 동시에 접근할 수 있어 효율적입니다.
디스크 액세스 시간

탐색 시간
하드 디스크의 특정 섹터에 저장된 데이터를 읽거나 쓰기 위해서는 그 섹터를 포함하는 트랙으로 헤드가 이동해야 합니다. 이때 헤드가 현재 위치에서 목표 트랙까지 이동하는 시간을 탐색 시간이라고 합니다.
회전 지연 시간
헤드가 특정 트랙까지 이동했다면 플래터가 회전하여 목표 섹터가 헤드에 도달할때까지 기다려야 합니다. 이때 걸리는 시간을 회전 지연 시간이라고 합니다.
데이터 전송 시간
헤드가 원하는 섹터에 있는 데이터를 읽어 전송하는 데 걸리는 시간입니다.
총 전송 시간 = 탐색 시간 + 회전 지연 시간 + 전송 시간
- 탐색 시간이 디스크 액세스 시간에서 가장 큰 비중을 차지
디스크 스케줄링
디스크 스케줄링이란?
하드 디스크의 데이터 전송 시간 중 가장 많은 비중을 차지하는 것은 탐색시간인데 디스크의 성능을 높이기 위해서는 탐색 시간을 최소화해야 합니다. 디스크 스케줄링은 트랙의 이동을 최소화하여 탐색 시간을 줄이는 데 목적이 있습니다.

아래의 트랙 순선에 따라 각각의 알고리즘을 적용해 보겠습니다.

FCFS 디스크 스케줄링 (First Come First Service)

- 요청이 들어온 순서대로 서비스
- 총 이동 거리: 7+9+6+8+20+4+5+6=65
SSTF 디스크 스케줄링 (Shortest Seek Time First)

- 현재 헤드가 있는 위치에서 가장 가까운 트랙부터 서비스
- 다음에 서비스할 두 트랙의 거리가 같다면 먼저 요청 받은 트랙을 서비스
- 가장 가까운 트랙이 계속 생기면 안쪽이나 바깥쪽 트랙 요청은 계속해서 밀려나 기아상태 발생 가능
- 총 이동 거리: 1+3+3+1+3+12+3+5=31
블록 SSTF 디스크 스케줄링 (Block SSTF)
- SSTF 디스크 스케줄링의 기아상태을 어느 정도 해결함

- SSTF 디스크 스케줄링에 에이징을 적용한 것
- 총 이동 거리: 2+9+3+8+20+3+1+5=51
SCAN 디스크 스케줄링

- 헤드가 디스크 한쪽 끝(0 or 24)에서 시작하여 반대편 끝까지 움직이며 헤드가 한쪽 끝 트랙에 이르게 되면 헤드의 움직이는 방향을 역으로 하여 다시 계속 처리하는 방식
- 방향 기준: 가장 가까운 거리에 있는 디스크의 방향으로 고정
- 실제로 구현되는 대부분의 디스크 스케줄링의 기본 전략이 되었음
- 총 이동 거리: 1+3+3+5+3+17+2+1+3=38
C-SCAN 디스크 스케줄링 (Circular SCAN)

- SCAN 디스크 스케줄링을 변형한 것으로 헤드가 한쪽 방향으로 움직일 때는 요청받은 트랙을 서비스하고 반대 방향으로 돌아올 때는 서비스하지 않고 이동만 함
- 헤드 총 이동 거리: 1+3+3+5+3+24+1+3+1+2=46
LOOK 디스크 스케줄링

- 더이상 서비스할 트랙이 없으면 헤드가 끝까지 가지 않고 중간에 방향을 바꿈
- 트랙의 끝(0 or 24)으로 이동 X → SCAN 디스크 스케줄링을 개선한 것
- 헤드 총 이동 거리: 1+3+3+5+17+2+1+3=35
C-LOOK 디스크 스케줄링 (Circular LOOK)

- C-SCAN 디스크 스케줄링의 LOOK 버전
- 더 이상 서비스할 트랙이 없으면 해드가 중간에 방향을 바꿈
- 총 이동거리: 1+3+3+5+20+3+1+2=38
회전 지연 시간 최적화를 위한 디스크 스케줄링
기존의 디스크 스케줄링 기법은 탐색 시간을 최소화하는 것이 목표였습니다. 아래의 스케줄링 기법들은 회전 지연 시간 최소화에 초점을 둔 스케줄링 기법입니다.
- 회전 지연 시간: 디스크 헤드가 원하는 트랙에 도착한 후, 디스크 원판이 회전하여 원하는 섹터가 헤드 아래로 올 때까지의 기다리는 시간
SLTF 디스크 스케줄링 (Shortest Latency Time First)

회전하는 방향상 가장 가까운 순서로 서비스 진행 (회전 지연 시간만 고려)
SPTF 디스크 스케줄링 (Shortest Positioning Time First)

- ‘위치 결정 시간(Positioning Time)’이 가장 짧은 요청을 다음 서비스 대상으로 선택
- 위치 결정 시간 = 탐색 시간 + 회전 지연 시간
SATF 디스크 스케줄링 (Shortest Access Time First)

- ‘접근 시간(Access Time)’이 가장 짧은 요청을 다음 서비스 대상으로 선택
- 접근 시간 = 위치 결정 시간(탐색 시간 + 회전 지연 시간) + 전송 시간 → 세 개를 모두 고려한 디스크 스케줄링
⇒ 탐색 시간이 회전 지연 시간보다 훨씬 작을 경우 회전 시간 최적화에 초점 필요
RAID
여러 개의 디스크를 하나로 묶어서 사용하는 기술입니다. 여러개의 디스크를 사용함으로써 더 높은 성능을 얻거나, 안정성(데이터 복부 능력)을 높이는 것을 목표로 합니다.
[RAID의 목표]
- 성능 향상: 여러 디스크에 데이터를 분산하여 동시에 읽고 씀으로써, 데이터 입출력 속도를 높입니다.
- 안정성 향상: 하나의 디스크가 고장 나더라도 데이터가 유실되지 않도록 데이터를 복제하거나 오류 복구 정보를 저장합니다.
RAID는 구성 방식에 따라 0~6, 10 등이 존재합니다.
RAID 0 (스트라이핑)

- 병렬로 연결되 여러 개의 디스크에 데이터를 나눠서 입출력할 수 있도록 구성
- 전체 디스크를 모두 동시에 사용하기 때문에 성능은 단일 디스크의 N배 + 용량 N배
- 하나의 디스크라도 문제가 발생할 경우 전체 RAID에 영향을 미침 → 안정성 1/N배
RAID 1 (미러링)

- 하나의 데이터를 2개의 디스크에 나누어 저장하여 장애 시 백업 디스크롤 활용
- 저장하는 데이터와 같은 크기의 디스크가 하나 더 필요하기 때문에 비용 증가
- 같은 내용을 두 번 저장하기 때문에 속도가 느림
RAID 2 (Hamming Code ECC)
오류 정정 코드(ECC, Error Correction Code)란? 데이터에 오류가 생겼는지 검출하고, 그 오류를 스스로 수정(정정)할 수 있도록 데이터에 추가되는 부가 정보입니다. 일반적으로 해밍 코드나 패리티 비트와 같은 기술을 이용해 오류를 정정합니다.
- 패리티 코드: 오류가 발생했다는 사실만을 알려줍니다. 데이터에 1비트의 패리티를 추가해 전체 비트의 합이 홀수인지 짝수인지 검사합니다.
- 해밍 코드: 오류가 어디에서 발생했는지 알려줍니다. 데이터에 여러 개의 패리티 비트를 추가하여, 오류가 발생하면 이 패리티 비트들의 조합을 통해 오류가 발생한 정확한 위치를 식별할 수 있습니다. + 오류 스스로 정정 가능

- 오류 정정 코드를 따로 관리해서 오류가 발생하면 ECC 코드를 이용해 복구
- 데이터를 비트 단위로 분리하여 여러 개의 디스크에 나누어 저장 → 디스크 컨트롤러 복잡, ECC 코드를 저장하기 위한 별도의 디스크가 많이 필요해서 비효율적임
- 비트 단위로 나눈 이유? ECC 변환 작업을 수워하게 하기 위해
RAID 3 (Parity EDC)
오류 검출 코드(EDC, Error Detection Code)란? 데이터에 오류가 생겼는지 여부만을 검출하는 데 사용하는 기술입니다. 어디에 오류가 있는지, 어떻게 수정해야하는지는 모릅니다.

- 바이트 단위로 분리하고 오류 검출을 위해 패리티 디스크 1개 존재 (패리티 드라이브)
- 손상된 드라이브의 데이터를 나머지 정상 드라이브들의 데이터와 패리티 데이터를 XOR 연산하여 복구 진행
- XOR 연산: A XOR B XOR C = P 일때, A XOR C XOR P = B
- 바이트 단위로 분리하기 때문에 너무 작게 쪼개져 현재는 사용하지 않음
- 패리티 비트에 의해 1개의 디스크 에러는 복구 가능하지만 2개 이상의 디스크 에러 시 복구 불가능
RAID 4

- RAID 3과 유사하게 하나의 패리티 드라이브를 사용
- 데이터가 자주 변경되면 모든 쓰기 작업이 패리티 드라이브로 몰리기 때문에 병목 현상 발생
- RAID3과 달리 데이터를 블록 단위로 나누어 디스크에 분산 저장을 수행
RAID 5 (Parity ECC, 분산 저장)

- 블록 단위로 분리하고 모든 드라이브에 패리티 정보를 분산 저장
- 병목 현상 해결 → 안정성 향상
RAID 6 (Parity ECC, 분산 복수 저장)

- 패리티 비트 디스크를 2개로 구성한 방식 → 2개 이상의 디스크 에러 복구 가능
- 안정성을 높여야 하는 서버 환경에 주로 사용 ex) 금융
RAID 10

- RAID 0 + 1
- RAID 0을 구성한 후에 스트라이핑 그룹을 통째로 미러링(RAID 0)
- 스트라이핑을 먼저 진행했기 때문에 성능을 우선 → 잘 사용 안 함
- RAID 10 (RAID 1 + 0)
- RAID 1을 구성한 후에 미러링 그룹들을 스트라이핑(RAID 1)
- 미러링을 먼저 진행했기 때문에 안정성을 우선
상황 추천 RAID 이유
| 속도만 필요 | RAID 0 | 블록 단위 스트라이핑으로 읽기/쓰기 속도 극대화 |
| 안정성 최우선 | RAID 1 | 미러링으로 장애 발생 시 즉시 복구 가능 |
| 성능과 안정성 균형 | RAID 5 | 블록 단위 + 분산 패리티로 효율적이며 안정성 확보 |
| 안정성 강화 (이중 보호) | RAID 6 | 이중 패리티로 동시에 2개 디스크 장애 허용 |
| 고성능 + 고안정성 (비용 무관) | RAID 10 | 스트라이핑과 미러링 결합으로 속도와 안정성 모두 확보 |
'CS > 운영체제' 카테고리의 다른 글
| 6. 가상메모리 관리 (0) | 2025.08.08 |
|---|---|
| 9. 파일시스템 (4) | 2025.08.04 |
| 5. 페이징 (3) | 2025.08.03 |
| 7. 세그먼테이션 (3) | 2025.07.25 |
| 4. 동기화 및 병행성 제어 (6) | 2025.07.16 |