컴퓨터에 데이터를 저장하는 저장소 역할을 수행하는 부품이다.
컴퓨터의 하드 디스크와 동일한 역할을 수행하는 부품으로, 스토리지를 서버와 직접 연결할 수 있다.
자기적인 방식으로 데이터를 저장하는 보조기억장치
단위 : 트랙(Track), 섹터(Sector), 실린더(Cylinder)
1) 탐색 시간
접근하려는 데이터가 저장된 트랙까지 해드를 이동시키는 시간
2) 회전 지연
헤드가 있는 곳으로 플래터를 회전시키는 시간
3) 전송 시간
하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간
전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장 장치
특징
읽기와 쓰기는 페이지 단위로, 삭제는 블록 단위로 이루어진다!!!!
예. SSD(Solid-State Driver), SD 카드, USB 등
단위 : 셀 (Cell)
하나의 셀에 1bit의 데이터 저장
하나의 셀에 2bit의 데이터 저장
하나의 셀에 3bit의 데이터 저장
PC나 서버에 직접 연결하여 사용하는 저장 장치
서버와 하드웨어를 1:1로 연결하고, 저장 공간이 부족할 경우 새로운 DAS 연결로 저장 공간의 확장이 가능하다.
네트워크를 통해 연결하여 사용하는 저장 장치
스토리지가 다른 호스트 없이 직접 네트워크에 연결된다.
DAS와 NAS의 단점을 해결한 형태의 저장 장치
스토리지(광 케이블 스위치)와 서버 간에는 SAN 연결, 서버와 클라이언트 간에는 LAN 연결하여 전용 네트워크를 통해 파일을 공유한다.
데이터의 안정성 또는 높은 성능을 위해 여러 개의 물리적 보조기억장치를 하나의 논리적 보조기억장치처럼 사용하는 기술로, 주로 하드디스크와 SSD를 사용한다.
여러 개의 하드 디스크나 SSD를 마치 하나의 장치처럼 사용하는 RAID의 구성 방법
단순히 여러 개의 보조기억장치에 데이터를 나누어 저장하는 방식
여러 번에 걸쳐 나누어 읽고 쓰지 않고, 여러 개의 저장 장치가 동시에 읽고 쓰기 때문에 읽기/쓰기 속도가 빠름
RAID 0을 구성하는 저장 장치 중 하나가 고장나면 다른 저장 장치의 데이터를 읽는데 문제가 발생
RAID 0의 안전성 문제를 보완하기 위해 등장한 방법으로, 스트라이핑과 미러링을 통해 여러 대의 저장 장치로 RAID를 구성하고 이와 똑같은 복사본을 만드는 방식
저장 장치에 문제가 생겨도 복사본을 통해 간단하게 복구 가능
저장 장치 개수가 한정될 경우 사용 가능한 용량이 적음
완전한 복사본을 만드는 대신 오류를 검출하고 복구하기 위한 정보를 저장한 장치를 두는 구성 방식
패리티 비트를 통해 장치의 오류를 검출, 복구함으로써 RAID 1보다 적은 저장 장치로 데이터를 안전하게 보관할 수 있음
패리티 비트를 저장하는 저장 장치에도 데이터를 쓰게 되기 때문에 병목 현상 발생
패리티 비트를 분산 저장하여 병목 현상을 해소하는 RAID 구성 방식
RAID 5처럼 패리티 비트를 저장 장치에 분산시킴과 동시에 서로 다른 패리티 비트를 하나 더 추가하여 오류 검출, 복구 수단을 증가시킨 방식
RAID 4, RAID 5보다 안전한 구성
새로운 정보를 저장할 때마다 두 개의 패리티 비트를 저장해야 하기 때문에 RAID 5보다 쓰기 속도가 느림
입출력 시스템은 물리적 입출력 장치와 입출력 모듈을 포함하는 개념이다.
입출력 장치에는 모니터, 프린터, 마우스, 키보드 등이 있으며 실제 입출력을 수행하는 장치이다.
입출력 모듈은 메모리, 프로세서 레지스터 등 내부 저장 장치, 물리적 입출력 장치 사이의 이진 정보를 전송하는 역할을 한다.
하드웨어 장치는 케이블 또는 무선 신호를 통해 컴퓨터 시스템과 통신하며, 포트라는 연결점을 통해 컴퓨터에 접속한다.
입출력 하드웨어는 크게 저장 장치, 전송 장치, 사용자 인터페이스 장치 등으로 구분된다. 입출력 하드웨어는 '시스템 버스'와 연결되어야 하는데, 물리적인 입출력 장치가 바로 시스템 버스와 연결되는 것이 아니라 장치 컨트롤러를 통해 연결된다.
입출력 장치의 다양성, 낮은 전송률로 인한 문제를 해결하기 위해 입출력 장치와 컴퓨터 내부를 연결하는 장치 컨트롤러가 필요하다.
장치 컨트롤러의 동작 감시, 제어를 통해 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있도록 하는 프로그램
장치 드라이버와 장치 컨트롤러의 소통은 장치 컨트롤러 내부에 있는 특정 레지스터들의 값을 장치 드라이버가 읽거나 쓰는 방식으로 수행된다.
응용 프로그램 - 시스템 콜 - 커널의 장치 드라이버 - 장치 컨트롤러 - 입출력 장치 (입출력 하드웨어)
1) 응용 프로그램(프로세스)이 입출력을 요청한다.
2) CPU는 System Call로 운영체제에 요청을 보낸다.
3) 운영체제가 요청을 받아들여 커널의 장치 드라이버에게 입출력을 요청한다.
4) 입출력이 발생한다.
5) 장치 컨트롤러는 입출력의 완료를 알린다.
6) 장치 드라이버는 입출력 완료를 운영체제에게 알린다.
7) 운영체제는 CPU에게(프로세스에게) 입출력의 완료를 알린다.
프로그램 속 명령어로 입출력 장치를 제어하는 방식으로, CPU가 프로그램 명령어 실행 과정에서 입출력 명령어를 만나면 장치 컨트롤러와 상호작용한다.
💻 입출력 작업 과정
1) CPU가 백업 명령을 마주침 ▶ CPUI가 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령 표시
(백업 명령 = 하드 디스크에 쓰기 명령)
2) 하드 디스크 컨트롤러가 하드 디스크 상태 확인 후 준비 상태가 되면 상태 레지스터에 준비 완료 표시
3) CPU가 주기적으로 상태 레지스터 값을 확인하다가 준비 완료를 확인하면 백업 데이터를 데이터 레지스터에 쓰기
메모리 사상 입출력 (Memory-mapped I/O)
메모리에 접근하기 위한 주소 공간과 입출력 장치를 위한 주소 공간을 하나로 간주하는 방법
메모리 접근과 장치 컨트롤러의 레지스터 접근을 위한 명령어가 다를 필요가 없다.
전체 1024개의 주소 중 512개는 메모리 주소, 512개는 레지스터 주소를 표현한다.
- 510번지를 읽어라 ▶ 510번지 메모리에 저장된 데이터를 읽어라
- 517번지를 읽어라 ▶ 프린터 컨트롤러의 상태 레지스터 값을 읽어라
고립형 입출력 (Isolated I/O)
메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법
제어 버스를 통해 메모리와 입출력 장치 컨트롤러에 대한 접근 제어가 가능하며, 입출력 전용 명령어를 사용해야 한다.
CPU가 장치 컨트롤러에 입출력 작업을 명령하고 다른 작업을 수행하다 장치 컨트롤러가 인터럽트 요청을 보내면 인터럽트 서비스 루틴을 수행하는 방법이다.
장치 컨트롤러는 입출력 장치를 제어하며 입출력 작업을 수행한 후 작업이 끝나면 CPU에게 인터럽트 요청 신호를 보내 작업 종료를 알린다.
💻 여러 개의 입출력 인터럽트가 발생하면?
- 인터럽트 발생 순서대로 처리
- 우선 순위가 높은 인터럽트 순으로 처리
💻 인터럽트 우선순위는 누가 정하나요?
대표적인 방법으로 PIC(Programmable Interrupt Controller)라는 하드웨어를 사용합니다.
PIC는 여러 장치 컨트롤러에 연결되어 있는데, 장치 컨트롤러에서 보낸 인터럽트 요청 중
CPU가 가장 먼저 처리해야 할 인터럽트 요청의 주체인 장치 컨트롤러에 대해 CPU에게 알리는 역할을 합니다.
💻 인터럽트 처리 과정을 알려주세요!
1) PIC가 여러 장치 컨트롤러의 인터럽트 요청을 수신한다.
2) CPU에게 우선 순위가 높은 인터럽트 요청 신호를 전송한다.
3) CPU가 확인 신호를 보낸다.
4) PIC가 CPU에게 인터럽트를 요청한 장치 컨트롤러에 대한 정보를 보낸다. (인터럽트 벡터)
5) CPU가 인터럽트 서비스 루틴을 실행한다.
CPU를 매번 거치지 않고 직접 메모리에 접근 가능한 입출력 기능으로, 시스템 버스에 연결된 DMA 컨트롤러가 필요하다.
💻 DMA 입출력 과정
1) CPU가 DMA 컨트롤러에 입출력 장치 주소, 수행할 연산, 메모리 주소 등의 정보를 주며 작업을 명령
2) DMA 컨트롤러가 CPU를 대신하여 장치 컨트롤러와 상호작용하며 입출력 작업 수행 (DMA 컨트롤러는 메모리에 직접 접근 가능)
3) 입출력 작업이 끝나면 CPU에게 인터럽트를 걸어 작업 종료를 알림
DMA 컨트롤러가 CPU를 대신해서 입출력 작업을 수행할 때 시스템 버스를 통해 데이터를 전송하는데, 시스템 버스는 공용 자원이므로 동시에 사용 불가능하다.
그래서 DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않을 때마다 조금씩 이용하거나, CPU가 일시적으로 시스템 버스를 사용하지 않도록 한 후 집중적으로 이용한다.
DMA 컨트롤러를 이용한 입출력 작업은 시스템 버스를 두 번 사용하게 되는 부작용이 존재한다.
시스템 버스를 너무 자주 사용하면 CPU가 시스템 버스를 이용하지 못할 때가 많아진다는 뜻이다.
이 문제를 해결하기 위해 시스템 버스가 아닌 입출력 버스를 별도로 구성하여 DMA 컨트롤러와 장치 컨트롤러 사이를 연결하면 시스템 버스 사용 빈도를 줄일 수 있다.
Blocking : 호출된 함수가 자신의 작업을 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않아 호출한 함수가 대기하는 것
자신의 작업 중 다른 주체가 작업을 시작하면 그 작업이 끝날 때까지 대기
Non-blocking : 호출된 함수가 결과에 관계없이 호출한 함수에게 값을 반환(제어권을 넘겨줌)하고, 호출한 함수가 다른 작업을 하는 동안 작업을 수행하다가 결과를 반환하는 것
다른 주체의 작업에 관련없이 자신의 작업을 수행할 수 있음
입출력 작업이 진행되는 동안 user process가 자신의 작업을 중단한 채 입출력 작업이 끝날 때까지 대기하는 방식
💻 입출력 작업 과정
1) 프로세스(또는 스레드)가 커널에게 I/O를 요청하는 함수 호출 (system call)
2) 프로세스(또는 스레드)는 작업 결과를 받을 때까지 대기
3) 커널이 I/O 작업을 완료하면 작업 결과 반환
User Process가 입출력 작업을 요청하면 커널이 I/O 호출에 대해 즉시 응답하여 User Process 작업의 중단 없이 다른 작업을 수행할 수 있도록 하는 방식
💻 입출력 작업 과정
1) 입출력 작업을 위해 커널에게 I/O를 요청하는 함수 호출 (system call)
2) 커널은 입출력 작업의 완료 여부와 관계 없이 즉시 응답
3) 프로세스(또는 스레드)는 입출력 작업이 수행되는 동안 다른 작업 수행 가능
4) 프로세스(또는 스레드)는 다른 작업을 수행하는 동안 주기적으로 system call을 보내 입출력 작업이 완료되었는지 커널에게 요청하고, 완료되면 입출력 작업 완료
모든 작업 수행이 I/O의 진행시간과는 관계없이 빠르게 동작하기 때문에, User Process는 자신의 작업을 오랜시간 중지하지 않고도 I/O 처리를 수행할 수 있다.
그러나 반복적으로 system call이 발생하기 때문에 이것 또한 Resource 낭비가 된다.
이러한 Non-Blocking I/O는 데이터를 입력할 때만 전송하는 게 아니라 주기적으로 계속 반복하기 때문이다.
그래서 Non-Blocking I/O 문제인 반복적인 system call 호출을 해결하기 위해 I/O 이벤트 통지 모델이 도입되었다.
I/O 작업 상황(결과) 반환 방식에 따라 sync, async 방식으로 분류된다.
호출하는 함수가 호출되는 함수의 작업 완료 후 리턴을 기다리거나, 또는 호출되는 함수로부터 바로 리턴 받더라도 작업 완료 여부를 호출하는 함수 스스로 계속 확인하며 신경쓰는 방식
호출되는 함수에게 callback을 전달해서, 호출되는 함수의 작업이 완료되면 호출되는 함수가 전달받은 callback을 실행하고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는 방식