일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 알고리즘
- programmers
- C++
- 테코테코
- useDispatch
- json-server
- redux
- 리액트
- Python
- Get
- 항해플러스
- createSlice
- 매일메일
- Algorithm
- react-router
- maeil-mail
- 프로그래머스
- react-redux
- sw expert academy
- redux-saga
- redux-toolkit
- 코딩테스트합격자되기
- JavaScript
- 항해99
- SW
- 자바
- 이코테
- java
- axios
- react
- Today
- Total
Binary Journey
I/O 란 무엇인가? 본문
최근 자격증 시험을 준비하면서 SQLP 교재에서 "디스크 I/O, 파일 단위 I/O, 블록 단위 I/O"라는 개념을 접했다. 사실 CS 관련 서적을 보면 I/O라는 용어는 흔히 등장하지만, 나는 그동안 "I/O"라고 읽고 그냥 지나쳤다. 하지만 정확히 무엇을 의미하는지 제대로 이해하고 싶어졌다. 이제라도 확실히 알아두는 게 중요할 것 같아 블로그에 정리해 보려고 한다.
"기억보다는 기록을!"
I/O의 기본 개념
컴퓨터는 내부적으로 연산을 수행하는 CPU(중앙처리장치)와 데이터를 저장하는 메모리(RAM, HDD, SSD)로 이루어져 있다. 하지만 이 내부 시스템만으로는 외부 세계와 정보를 주고받을 수 없기 때문에 입출력 장치(I/O 장치)가 필요하다.
I/O란?
I/O(Input/Output, 입출력)은 데이터를 입력받고 출력하는 과정을 의미한다.
- 입력(Input): 사용자가 데이터를 입력하거나 외부에서 데이터를 가져오는 작업
- 예: 키보드 입력, 마우스 클릭, 센서 데이터, 파일 읽기, 네트워크 수신 등
- 출력(Output): 입력된 데이터를 가공하여 사용자나 다른 시스템으로 보내는 작업
- 예: 화면 출력, 프린터 인쇄, 스피커 소리 출력, 파일 저장, 네트워크 전송 등
I/O 장치
컴퓨터와 데이터를 주고받는 장치는 모두 I/O 장치라고 부른다.
입력 장치 (Input) | 출력 장치 (Output) |
보드, 마우스, 마이크, 터치스크린, 카메라, 스캐너 | 모니터, 프린터, 스피커, LED 디스플레이 |
I/O의 동작 방식
컴퓨터에서 I/O는 CPU와 메모리 사이에서 데이터를 주고받는 방식으로 작동한다.
CPU가 직접 I/O 장치와 데이터를 주고받을 수도 있지만, 버퍼(Buffer)를 활용하여 데이터를 저장하고 처리하는 방식이 일반적이다.
I/O 작업은 속도가 느려 CPU가 직접 처리하면 비효율적이므로, DMA(Direct Memory Access) 같은 기법을 사용해 CPU 개입을 줄이기도 한다.
I/O 의 종류
I/O는 단순한 입력과 출력이 아니라 다양한 방식과 최적화 기법이 존재한다.
디스크, 파일, 네트워크, 메모리 등 여러 I/O 타입이 있으며, 각기 다른 방식으로 최적화된다.
1. 디스크 I/O
HDD나 SSD에서 데이터를 읽고 쓰는 작업을 의미한다.
- 예: 파일 저장, 데이터베이스 읽기/쓰기, OS 페이징
- 최적화 방법: SSD 사용, 캐싱, 버퍼링, RAID, 압축 등
💡 RAID(Redundant Array of Independent Disks)란?
RAID는 여러 개의 디스크를 하나의 논리적 장치로 묶어 성능을 향상하거나 데이터 보호를 강화하는 기술이다.
속도를 높이거나 장애 발생 시 데이터를 보호하기 위해 여러 개의 디스크를 조합하는 방법이라고 생각하면 된다.
주로 더 빠른 읽기/쓰기 속도의 성능 향상, 하드디스크 고장 시 데이터 손실 방지의 장애 대비(데이터 보호), 디스크를 하나처럼 사용 가능한 스토리지 용량 확장이 목적이다.
2. 파일 I/O
파일을 열고, 읽고, 쓰고, 닫는 작업을 의미한다.
- 예: 로그 파일 기록, 설정 파일 읽기, CSV 파일 저장
- 최적화 방법: 비동기 처리, 파일 압축, 메모리 매핑(mmap)
💡 메모리 매핑(Memory-Mapped Files, mmap)이란?
파일을 디스크에서 직접 읽지 않고 메모리(RAM)에 매핑하여 빠르게 접근하는 방식이다.
- 대용량 파일을 한 번에 로드하지 않고 필요한 부분만 로드할 수 있다. (Lazy Loading)
- OS가 자동으로 캐싱하여 속도가 빠르다.
- 다만 RAM을 많이 사용하므로 주의가 필요하다.
데이터베이스, IPC(프로세스 간 통신), 영상 스트리밍 등에 활용된다.
3. 네트워크 I/O
네트워크를 통해 데이터를 송수신하는 작업을 의미한다.
- 예: 웹 API 호출, FTP 파일 전송, 채팅 메시지 송수신
- 최적화 방법: 비동기 I/O, Keep-Alive, 로드 밸런싱, 캐싱
💡 Keep-Alive란?
네트워크 연결을 일정 시간 동안 유지하여 TCP 연결을 재사용하는 방식이다.
- HTTP 요청 시 새로운 TCP 연결을 만들면 오버헤드가 크다.
- Keep-Alive를 사용하면 웹사이트 로딩 속도와 API 응답 시간이 빨라진다.
- Connection: keep-alive 헤더를 추가하여 활성화할 수 있다. (HTTP/1.1부터 기본 활성화)
4. 메모리 I/O
CPU와 RAM 간 데이터 이동을 의미하며, 휘발성 메모리(RAM)는 데이터를 디스크로 이동할 수도 있다.
- 예: CPU 연산 처리, OS 페이지 캐시, 데이터 버퍼링
- 최적화 방법: 메모리 캐시, DMA(Direct Memory Access)
5. 장치 I/O
입출력 장치(키보드, 마우스, 모니터, 프린터 등)와의 데이터 교환을 의미한다.
- 예: 키보드 입력, 마우스 이벤트, 프린터 출력
- 최적화 방법: 버퍼링, 인터럽트 기반 처리, DMA
6. 그래픽 I/O
GPU(Graphics Processing Unit)와 데이터를 주고받는 작업을 의미한다.
- 예: 게임 렌더링, 3D 그래픽, 동영상 재생
- 최적화 방법: GPU 가속, VRAM(비디오 메모리) 활용, 다이렉트 렌더링
I/O 의 세부 개념
직렬 I/O & 병렬 I/O
구분 | 직렬 I/O (Serial I/O) | 병렬 I/O (Parallel I/O) |
특징 | 데이터를 한 비트씩 순차적으로 전송 | 데이터를 여러 비트씩 동시에 전송 |
예시 | UART(시리얼 통신), USB, 블루투스 | 프린터 포트(구형), PCI Express, 메모리 버스 |
블록 I/O & 문자 I/O
구분 | 블록 I/O (Block I/O) | 블록 I/O (Block I/O) |
특징 | 데이터를 고정된 크기 블록 단위로 읽고 씀 | 데이터를 한 글자(바이트) 단위로 처리 |
예시 | 디스크 I/O, 데이터베이스 | 터미널 입력, 키보드 타이핑 |
동기 I/O & 비동기 I/O
구분 | 동기 I/O (Synchronous I/O) | 비동기 I/O (Asynchronous I/O) |
특징 | 작업이 끝날 때까지 기다림 | 요청 후 다른 작업을 수행 가능 |
예시 | 일반적인 파일 읽기/쓰기 (read(), write()) | async/await 기반 네트워크 요청, DB 비동기 처리 |
마치며
그동안 막연하게 지나쳤던 I/O 개념을 정리해 보았다.
파일, 네트워크, 디스크 등 다양한 I/O 방식이 있으며,
최적화 방법도 각기 다르다는 점이 흥미롭다.
이제 CS 서적에서 I/O가 나오면 가볍게 지나치지 않고, 좀 더 깊이 있게 이해할 수 있을 것 같다. 🚀