(8) 입출력 시스템과 디스크 관리
- -
들어가기 전에
- 각각의 I/O Device는 CPU가 아닌 각각의 Device Controller가 관리한다.
- 그리고 Device controller 를 위한 작은 메모리 공간을 local buffer 라고 부른다. (일종의 register)
- 입출력이 필요한 경우
- 사용자 프로그램은 시스템 콜을 통해 운영체제에 I/O 요청
- trap 사용해 인터럽트 벡터의 특정 위치로 이동 -> 서비스 루틴으로 이동
- 운영체제는 Device controller 에게 요청
- 입출력이 끝나면 Device controller 가 interrupt 를 걸어 대답한다.
✔️ Device driver : 각 장치별 처리 루틴 (소프트웨어)
✔️ Device Controller : 각 장치를 제어하는 일종의 작은 CPU (하드웨어)
입출력 시스템
컴퓨터는 필수 장치(CPU, 메모리)와 주변장치(입출력장치, 저장장치)로 구성되고,
주변장치는 데이터 전송 속도에 따라 저속 주변장치와 고속 주변장치로 구분된다.
- 저속 주변장치: 메모리와 주변장치 사에이 오고 가는 데이터 양이 적어 데이터 전송률이 낮은 장치.
ex) 키보드, 마우스, 스캐너 - 고속 주변장치: 메모리와 주변장치 사에이 오고 가는 데이터 양이 많아 데이터 전송률이 높은 장치.
ex) 그래픽 카드(초당 수집장의 그래픽을 보여주어야 함)
각 장치는 메인 보드에 있는 버스로 연결되고, 버스는 여러 개의 버스를 묶어서 사용하는데 그 통로를 채널이라고 한다.
여러 채널을 효율적으로 사용하기 위해 전송 속도가 비슷한 장치끼리 묶어서 채널을 할당한다.
🔺 입출력 버스의 구조
폴링 방식(초기 구조)
![](https://blog.kakaocdn.net/dn/bgu0gq/btsdY1Z2Sqn/ydpyEODdhzz25bXJp0dKkK/img.png)
초기에는 모든 장치가 하나의 버스로 연결되고, CPU가 작업을 진행하다가 입출력 명령을 만나면 직접 입출력 장치에서 데이터를 가져왔는데 이를 폴링(polling) 방식이라고 한다.
- 폴링 방식: 하드웨어 상태를 수시로 체크하여 명령을 받을 수 있는지 확인
- 단점 : 주변 장치는 CPU와 메모리보다 매우 느리기 때문에 폴링 방식을 사용하면 CPU 대기 시간이 길어져 작업의 속도가 매우 느려진다.
입출력 제어기를 사용한 구조 (device controller)
![](https://blog.kakaocdn.net/dn/R7eiN/btsdY1yZcbX/mgpeSSZxwoMMLn7exU9TvK/img.png)
모든 입출력을 입출력 제어기(I/O Controller)에 맡기는 구조
입출력 제어기는 2개의 채널로 나뉜다.
- 메인버스는 고속으로 작동하는 CPU와 메모리를,
- 입출력 버스는 주변장치가 사용한다
✅ 입출력 처리 방식 ( 빠른 순서 순)
1️⃣ 채널에 의한 I/O
- DMA 개념을 확장해 구현한 입출력만을 위한 전용 처리 장치
- CPU처럼 독자적으로 메모리에 저장된 명령어를 처리할 수 있다.
- 입출력 채널은 CPU 개입 없이 입출력 처리를 수행하며,
- 선택 채널 (selector channel) : 한 번에 하나의 입출력 장치 제어
- 다중화 채널 (Multiplexor channel) : 한 번에 여러 장치에 대한 입출력 제어
🔺 버퍼링
- 버퍼 : 데이터를 임시로 저장하거나 보유하는 데 사용되는 영역 (메모리)
- 속도가 다른 두 장치의 속도 차이를 완화하는 역할을 한다.
- 입출력 장치는 느린 장치를 통해 들어오는 데이터를 버퍼에 모아 한꺼번에 이동시켜 느린 속도를 보완한다.
- 이 때 한 버퍼는 데이터를 담는 용도로 쓰고, 다른 버퍼는 데이터를 가져가는 용도로 쓴다.
- 시스템 효율성을 위해 운영체제에서는 버퍼가 가득 찼을 때 입출력장치로 데이터를 전송하도록 설계되어 있다.
- 이러한 특성 때문에 외부 저장 장치를 제거하거나 파일 입출력 시 버퍼에만 있고 저장장치에는 반영되지 않는 경우가 생길 수 있다.
🔺 스풀링 (Spooling)
- 메모리가 아닌 디스크를 버퍼로 사용
- 대부분의 프린터 등의 입출력 장치들은 스풀링 기능을 적용
2️⃣ 직접 메모리 접근 (DMA)에 의한 I/O
- Direct Memory Access
- 일반적으로 메모리는 CPU에서만 접근이 가능한데, CPU에서 직접 메모리를 access 하면 속도가 느리다는 단점이 있다.
- 직접 메모리 접근(DMA)은 CPU를 대신해 I/O 장치와 메모리 사이의 데이터 전송을 담당하는 장치를 지칭하고,
- 입출력을 위한 인터럽트 발생 횟수를 최소화해 컴퓨터 시스템의 효율을 높이는 방식이다.
CPU는 자기 할 일 하고 있다가, DMA가 적절히 조율해서 CPU 한테 한 번만 interrupt 건다.
[ 실행 순서 ]
- CPU -> DMA : 프로그램에서 I/O 발생유효 데이터면 DMA 시작 가능하다.
- 디스크 컨트롤러에게 데이터 읽어오고 checksum 확인하라는 명령 발동.
- DMA -> 디스크 컨트롤러 : Requests transfer to Mem
- 디스크 컨트롤러 -> 디스크 : Data transferred
- 디스크 컨트롤러 ->DMA : ACK (쓰기 완료 후 응답)
- DMA -> CPU : interrupt
3️⃣ 인터럽트 처리에 의한 I/O
- 입출력 인터페이스가 I/O 장치의 상태를 검사해 준비되면 인터럽트 신호를 발생해 입출력 처리를 요구한다.
- CPU는 context switching 을 통해 인터럽트 서비스 프로그램을 수행한다.
- 입출력이 처리될 때까지 CPU가 다른 작업을 수행할 수 있어 효율성이 증가된다.
👆 인터럽트란?
- 입출력 제어기가 주변장치의 입출력 요구나 하드웨어 이상 현상을 CPU에 알려주는 역할을 하는 신호
- CPU가 요청 한 작업을 완료했을 때,
- 키보드로 데이터를 입력받았을 때,
- 네트워크 카드에 새로운 데이터가 도착했을 때,
- 하드웨어에 이상이 생겼을 때
- 각 장치에는 IRQ라는 고유의 인터럽트 번호를 부여해 CPU는 어떤 장치에서 발생한 인터럽트인지 파악한다.
- 외부 인터럽트: 입출력 및 하드웨어 관련 인터럽트
(ex. 전원 이상, 기계적 오류) - 내부 인터럽트: 프로세스의 오류로 발생하는 인터럽트
(ex. 숫자 0으로 나누기, 주소공간 벗어나는 작업하기) - 시그널: 사용자의 요청으로 발생하는 인터럽트
(ex. 리눅스에서 ctrl + c로 작동중인 프로세스 끝내기)
- 외부 인터럽트: 입출력 및 하드웨어 관련 인터럽트
4️⃣ 프로그램에 의한 I/O
- CPU 상에서 실행되는 프로그램 에 의해 입출력이 제어 됨
- CPU는 I/O 장치에 명령을 보내고 동작이 완료될 때까지 대기한다.
- CPU는 주기적으로 I/O 장치의 상태를 검사해야 한다. (폴링 방식)
- CPU 자원이 낭비된다.
디스크 관리
- 컴퓨터의 대표적인 2차 저장장치
- 메모리는 휘발성이라 전원이 나가면 내용이 사라지지만, 디스크는 소멸하지 않는 기억장치다. (영속성)
- 프로그램 실행을 위한 메모리의 부족으로 인해 사용 (Swap space)
- 하드디스크 : 움직이는 헤드를 가진 하드디스크 드라이브
✅ 하드 디스크 구조
하드디스크는 스핀들(spindle)이라는 원통 축에 여러 개의 플래터(platter)가 달려있는 구조이다.
- 플래터 : 표면에 자성체가 발려 있어 자기를 이용하여 0과 1의 데이터를 저장. 항상 일정한 속도로 회전함. (일반적으로 일반 컴퓨터에는 3.5인치를 노트북에는 2.5인치를 사용)
- 트랙: 플래터에서 회전축을 중심으로 데이터가 기록되는 동심원(섹터의 집합)
- 섹터: 물리적 개념. 하드디스크의 가장 적은 저장 단위.
- 실린더: 여러 개의 플래터에 있는 같은 트랙의 집합
- 헤드: 데이터를 읽거나 쓸 때 사용하는 부위
- 디스크의 내부, 물리적으로는 Sector 가 가장 작은 단위지만,
- 디스크의 외부, 논리적으로는 Block 이 가장 작은 단위로 사용된다.
🔺 디스크의 데이터 전송 시간
- 각속도 일정 방식의 회전 : 일정한 시간 동안 이동한 각도가 같다.
- 하드디스크의 플래터는 항상 일정한 속도로 회전하여 바깥쪽 트랙의 속도가 안쪽 트랙의 속도보다 훨씬 빠르다.
![](https://blog.kakaocdn.net/dn/EZ0jS/btsd0nOttDF/K0IRY1KEukbbXbr9fdikhK/img.png)
- 탐색 시간: 헤드가 특정 섹터의 트랙까지 이동하는데 걸리는 시간
- 회전 지연 시간: 플래터가 회전하여 원하는 섹터를 만날 때 까지 걸리는 시간
- 전송 시간: 헤드가 섹터에 있는 데이터를 읽어 전송하는 시간
🔺 Disk Management
- 하나의 물리적 디스크를 논리적 디스크로 파티셔닝 한 후,
- Disk에 파일 시스템을 설치해 사용하거나, Swap area 로 사용할 수 있다.
🔺 Physical Formatting (Low-level)
- 디스크 컨트롤러가 읽고 쓸 수 있도록 섹터를 나누는 과정
- 각 섹터는 Header + 실제 Data (보통 512 byte) + Trailer 로 구성된다.
- Header 와 Trailer는 컨트롤러가 직접 접근해 운영한다.
🔺 Partitioning
- 디스크를 하나 이상의 실린더 그룹으로 나누는 과정
- OS는 이것을 독립적인 disk 로 취급한다. (Logical Disk)
🔺 Logical Formatting
- 파일 시스템 만들기
- FAT, I-node 등의 구조를 포함한다.
🔺 Booting
- ROM 에 있는 "small bootstrap loader"의 실행
- Sector 0 은 모든 디스크에서 Boot block 이다.
✅ 디스크 스케줄링
- 디스크의 데이터 전송 시간 중에는 탐색 시간이 가장 느리다.
- 디스크 스케줄링(disk scheduling)은 트랙의 이동을 최소화하여 이 탐색 시간을 줄이는데 목적이 있다.
- 일반적으로 디스크 스케줄러가 실제 디스크 안에 존재하는 것은 아니므로, 논리 블럭 단위로 스케줄링 한다.
- 디스크 스케줄링 알고리즘은 교체할 수 있도록 OS와 별도의 모듈로 작성되는 것이 바람직하다.
🔺 디스크 스케줄링 종류
![](https://blog.kakaocdn.net/dn/bxpZtl/btsd00SUPUx/JkqymCXnI3EamiWyFR8K90/img.png)
✔️ FCFS 디스크 스케줄링
- 가장 단순한 디스크 스케줄링 방식으로, 요청이 들어온 트랙 순서대로 서비스
- 15 -> 8 -> 17 -> 11 -> 3 -> 23 -> 19 -> 14 -> 20 (이동 거리 65)
✔️ SSTF(Shortest Seek Time First) 디스크 스케줄링
- 현재 헤드가 있는 위치에서 가장 가까운 트랙부터 서비스
- 만약 다음에 서비스할 두 트랙의 거리가 같다면 먼저 요청받는 트랙을 서비스
- 15 -> 14 -> 17 -> 19 -> 20 -> 23 -> 11 -> 8 -> 5 (이동 거리 31)
- 효율성은 좋지만 아사 현상을 일으킬 수 있음. 헤드가 중간에 위치하면 가장 안쪽이나 바깥쪽에 갈 확률이 적어짐
✔️ 블록 SSTF 스케줄링
- 블록 단위로 트랙을 관리하여 멀리 있는 트랙도 몇 번만 양보하면 서비스 받을 수 있음(에이징 적용)
- 공평성 위배를 어느 정도 해결한 방법
- 15 -> 17 -> 8 -> 11 -> 3 -> 23 -> 20 -> 19 -> 15 (이동 거리 51)
- FCFS 보다 성능이 좋지 않음
✔️ SCAN 디스크 스케줄링
- disk arm이 디스크 한 쪽 끝에서 다른 쪽 끝으로 이동하며 가는 길목에 있는 모든 요청을 처리하는 방식
- 가장 많이 사용되는 기법 중 하나
- 15 -> 14 -> 11 -> 8 -> 3 -> 0 -> 17 -> 19 -> 20 -> 23 (이동 거리 38)
- 디스크 헤드 이동거리 측면에서 효율적이다.
- SSTF 보다 성능이 조금 떨어지지만 FCFS 보다 성능이 좋음
- 실린더 위치에 따라 대기 시간이 다르다는 문제점
- 동일한 트랙의 요청이 연속적으로 발생되면 헤드가 더 이상 나아가지 못해 바깥쪽 트랙이 아사 현상을 겪는 문제 발생
✔️ C-SCAN 디스크 스케줄링
- 헤드가 한 쪽 끝에서 다른 쪽 끝으로 이동하며 길목에 있는 모든 요청을 처리
- 다른 쪽 끝에 도달하면 요청을 처리하지 않고 바로 출발점으로 이동한다.
- 15 -> 14 -> 11 -> 8 -> 3 -> 0 -> (작업없이 이동) -> 24 -> 23 -> 20 -> 19 -> 17 (이동 거리 46)
- SCAN 보다 균일한 대기 시간을 제공함
- 그러나 작업 없이 헤드를 이동하여 매우 비효율적
✔️ LOOK 디스크 스케줄링
- 더 이상 서비스할 트랙이 없으면 헤드가 끝가지 가지 않고 중간에서 방향을 바꿈
- 15 -> 14 -> 11 -> 8 -> 3 -> 17 -> 19 -> 20 -> 23 (이동 거리 35)
✔️ C-LOOK 디스크 스케줄링
- C-SCAN의 LOOK 버전
- 15 -> 14 -> 11 -> 8 -> 3 -> (작업없이 이동) -> 23 -> 20 -> 19 -> 17(이동 거리 38)
✅ RAID (Redundant Array of Inexpensive/Independent Disk)
- 디스크 여러 개를 묶어서 사용
- RAID는 자동으로 백업을 하고 장애 발생 시 이를 복구하는 시스템이다.
- RAID 0, 1, 10, 2, 3, 4, 5, 6, 50, 60 등이 있음. (중복 저장 정도를 어떻게 하느냐)
- 처리 속도 향상 : 여러 디스크에 분산 저장하고, 병렬적으로 읽어온다. (Interleaving, striping)
- 신뢰성 향상 : 동일 정보를 여러 디스크에 중복 저장해 하나의 디스크가 고장나도 다른 디스크에서 읽어올 수 있다. (Mirroring, shadowing)
RAID 0(스트라이핑)
![](https://blog.kakaocdn.net/dn/ci8LI0/btsdZhuSiRS/KAUAU0ALjwvKTusRQqmrIk/img.png)
- 같은 규격의 디스크를 병렬로 연결하여 여러 개의 데이터를 여러 디스크에 동시에 저장하거나 가져올 수 있음
- 데이터를 여러 갈래로 찢어서 저장하기 때문에 스트라이핑이라고 부름
- N개의 디스크로 구성된 RAID 0은 1개의 디스크로 구성된 시스템보다 약 N배 빠름
- 장애 발생 시 복구하는 기능이 없음
- 따라서 속도는 증가하지만 안정성은 낮아짐
RAID 1(미러링)
![](https://blog.kakaocdn.net/dn/bp29kN/btsdZz28Rzx/XE2jZzYCTRtrNY8PimflHK/img.png)
- 같은 데이터를 2개의 디스크에 저장(백업 디스크 활용)
- 같은 크기의 데이터를 최소 2개 이상 필요로 하며 짝수 개의 디스크로 구성
- 장애 발생시 미러링된 디스크를 활용하여 데이터를 복구할 수 있음
- 그러나 비용이 증가하고 같은 내용을 두 번 저장하기 때문에 속도가 느려짐
RAID 2
![](https://blog.kakaocdn.net/dn/GXu7A/btsdY34FRt8/XluhgigjaPg6IvVi9tSO11/img.png)
- 오류 교정 코드(ECC)를 따로 관리하여 오류가 발생하면 디스크를 복구
- 비트별로 만들어진 오류 교정 코드는 별도의 디스크에 따로 보관하고 있다가 장애 발생시 이 코드를 이용
- n개의 디스크에 대해 오류 교정 코드를 저장하기 위한 n-1개의 추가 디스크 필요
- 오류 교정 코드를 계산하는데 시간을 소비
- 잘 사용되지 않음
RAID 3
![](https://blog.kakaocdn.net/dn/bJEAIn/btsdZhBBwWN/7k5WtanRvZtUKKRCIyUaLk/img.png)
- 오류 검출 코드인 패리티를 사용하여 데이터를 복구.
- 섹터 단위로 데이터를 나누어 저장 짝수 패리티(1의 총수를 짝수로) 혹은 홀수 패리티(1의 총수를 홀수로)를 사용하여 장애가 난 비트를 추정
- 4개의 디스크당 1개 정도의 추가 디스크 필요
- 패리티 비트를 구성하는 데 많은 시간이 소비(데이터를 읽거나 쓸 때 패리티 비트를 구성하기 위해 모든 디스크가 동시에 동작해야 함)
RAID 4
![](https://blog.kakaocdn.net/dn/bj9BAn/btsd0umoNHD/k0hNEO3q5pXCZRt4ewKXpk/img.png)
- RAID 3와 같은 방식이지만 블록 단위로 데이터를 나누어 저장
- 데이터가 저장되는 디스크와 패리티 비트가 저장되는 디스크만 동작한다는 것이 장점
- 패리티 비트를 추가하기 위한 계산량 많음. 그러나 추가되는 디스크 양 적음.
RAID 5
![](https://blog.kakaocdn.net/dn/bURxhi/btsd14U3KGj/n5DbuATnHLx1XipyFARNtK/img.png)
- 패리티비트를 여러 디스크에 분산하여 구성
- 병목 현상 완화
- 패리티 비트가 있는 디스크가 고장나도 복구 가능. 한 디스크에 장애 발생 시 다른 디스크에 있는 패리티 비트 이용해 복구
RAID 6
![](https://blog.kakaocdn.net/dn/U8WoT/btsdYPFnBPN/fR5W6iydRkHiUiH4OgSN7K/img.png)
- RAID 5와 같은 방식이지만 패리티 비트가 2개
- RAID 5와 달리 디스크 2개가 동시에 장애가 발생했을 때도 복구 가능
- 패리티 비트를 2개씩 운영해서 부담이 커짐
RAID 10
![](https://blog.kakaocdn.net/dn/bmuK9b/btsd15GqDZV/DH0ZyEwBpz3B9x3bN1uy5K/img.png)
- 미러링 기능을 가진 RAID 1과 빠른 데이터 전송이 가능한 RAID 0을 결합한 형태
- RAID 01과 달리 일부 디스크만 중단하여 복구 가능
RAID 50 or 60
![](https://blog.kakaocdn.net/dn/bKydHv/btsd0ozRHlb/gwAO0yNTGqnoFdZ8exKaFk/img.png)
- RAID 5 또는 6으로 묶은 두 쌍을 다시 RAID 0으로 묶어 사용
'CS > OS' 카테고리의 다른 글
(7) 파일 관리 (0) | 2023.05.05 |
---|---|
(6) 가상 메모리 (요구 페이징/ 페이지 교체 알고리즘) (0) | 2023.05.04 |
(5) 메모리 관리 전략 (페이징, 세그멘테이션) (0) | 2023.05.04 |
(4) Deadlock / 세마포어 & 뮤텍스 (0) | 2023.05.04 |
(3) 분산 시스템 / 멀티 프로세스 vs 멀티 스레드 (0) | 2023.05.04 |
소중한 공감 감사합니다