프로세서가 필요한 정보를 요청하면 데이터를 읽고 내보내는 것을 input, output 이라 함.
데이터는 메인 메모리에 저장. → 필요한 메모리는 메인 메모리에 있어야 함.
이런 형태로 I/O가 이루어짐.
💡
이런 과정이 어떻게 이루어지는지 살펴보자!
I/O Mechanisms
프로세서와 I/O 장치 사이 데이터를 보내고 읽어들이는 데 크게 2가지 방식이 있음.
processor controlled memory access
프로세서 (cpu)가 제어하는 메모리 접근 방법.
polling (programmed I/O)
주기적으로 I/O 상태 확인.
모든 I/O 장치를 순환.
장점 : 간단함. I/O 장치가 빠르고, 데이터 전송이 잦은 경우 효율적.
단점 : processor의 부담이 큼 (계속 돌고 있어야 함).
interrupt
실제 사용되는 거 확인
I/O 장치가 작업을 완료한 후, 자신의 상태를 프로세서에게 전달.
interrupt 발생 시, 프로세서는 데이터 전송을 수행함.
장점 : polling 대비 low overhead, 불규칙적인 요청 처리에 적합.
단점 : 계속 interrupt를 하면 오히려 방해됨. → interrupt handling overhead.
🤔
프로세서는 명령만 내리고 자기 일에 집중하게 할 순 없을까?
b. direct memory access (DMA)
메모리와 입출력 장치가 직접적으로 연결이 되어 있음. DMA 제어기를 둠으로써 구현이 가능함.
프로세서가 관여하지 않음.
processor controlled memory access은 프로세서가 모든 데이터 전송을 처리해야 하기 때문에 overhead가 큼.
프로세서는 데이터 전송의 시작, 종료만 관여함.
신호 보내는 방식
I/O Services of OS
I/O scheduling
많은 장치로부터 요청을 받기 때문에 순서를 정해줘야 함 (입출력 요청에 대한 처리 순서 결정).
잘 결정하면 시스템의 전반적 성능 향상.
process의 요구에 대한 공평한 처리.
Error handling
입출력 중 발생하는 오류 처리
I/O device information managements
시스템의 장치들에 대한 다양한 정보 저장.
Buffering
I/O 장치와 program 사이에 전송되는 데이터를 buffer에 임시 저장.
전송 속도 또는 처리 단위 차이 문제 해결.
os에서 버퍼링이란, 데이터를 보내는 것과 저장하는 디스크가 있다 할 때 1초에 100개를 보내는 반면 저장이 10개만 가능할 때, 날라가는 것이 아닌 중재해주는 창구를 둔 것임. 이것이 버퍼고, 속도 차이를 완충해줌. 디스크가 처리할 수 있는 범위를 잘라서 보내주는 것임.
동영상에 버퍼링이 걸리는 것도 화면의 그리는 속도보다 네트워크 속도가 느릴 때 생김. 이때도 처음 동영상을 재생할 때 바로 트는 것이 아닌 버퍼를 이용해 속도 차이를 해결함.
Caching
자주 사용하는 데이터를 미리 복사해둠.
cache hit(캐싱)시 I/O를 생략할 수 있음.
버퍼링은 모아두었다 보내주는 거라면 캐싱은 예측을 해서 전달해줌.
Spooling
한 I/O 장치에 여러 프로그램이 요청을 보낼 시, 출력이 섞이지 않도록 하는 기법.
각 프로그램에 대응하는 disk file에 기록.
spooling이 완료되면, spool을 한 번에 하나씩 I/O 장치로 전송.
ex) 프린터에 여러 문서를 출력하라 할 때 문서들이 섞이는 것이 아닌, 순서대로 출력이 됨.
Disk Management
Disk Scheduling
disk access 요청들의 처리 순서 결정.
왜 할까? disk system의 성능을 향상시키기 위해서!
디스크도 스케줄링을 통해 성능이 좋아질 수 있음.
하지만 성능이란 건 측정하기 모호하기에 평가 기준이 필요함.
평가기준
throughput : 단위 시간 당 처리량.
mean response time : 평균 응답 시간.
predictability : 응답 시간의 예측성, starvation 방지.
💡
여기서 잠깐! 성능을 높이려면 디스크가 데이터를 어떻게 읽어오는지에 대한 이해가 필요함.
이전에 배웠던 디스크가 데이터를 읽어오는 과정을 복습해보자.
디스크가 데이터를 접근하는 시간은 seek time, rotational delay, data transmission time으로 구성됨.
seek time
디스크 head를 필요한 cylinder로 이동하는 시간.
rotational delay
필요한 sector가 head 위치로 도착하는 시간.
data transmission time
해당 sector를 읽어서 전송, 기록하는 시간.
→ 디스크 스케줄링에서 성능을 높이려면 a, b를 가지고 순서를 잘 결정해야 함 (읽어오는 시간은 같으니까 c는 제외).
optimizing seek time
FCFS (First Come First Service)
요청이 도착한 순서에 따라 처리.
간단하고 공평한 처리 기법이지만 최적 성능 달성에 대한 고려가 없음. Disk access 부하가 적은 경우에 적합.
SSTF (Shortest Seek Time First)
현재 head 위치에서 가장 가까운 요청 먼저 처리.
처리량은 줄어들지만 예측성이 떨어지고 Starvation 현상 발생 가능. 일괄처리 시스템에 적합.
Scan
현재 head의 진행 방향에서, head와 가장 가까운 요청 먼저 처리.
SSTF의 starvation 문제 해결 및 처리량, 응답 시간이 우수하지만 진행 방향 반대쪽 끝의 요청들의 응답시간이 길어짐.
C-Scan (Circular Scan)
SCAN과 유사. Head가 미리 정해진 방향으로만 이동. 마지막 cylinder 도착 후, 시작 cylinder로 이동 후 재시작.
Scan대비 균등한 기회 제공하지만 불필요한 head 이동이 있음.
Look
Elevator algorithm
Scan (C-Scan)에서 현재 진행 방향에 요청이 없으면 방향 전환. 마지막 cylinder까지 이동하지 않음.
Scan의 불필요한 head 이동 제거
요약
짧은 요청, 간단한 요청부터 처리하면 starvation이 일어남. 균등하게 데이터를 불러와야 함.
optimizing rotational delay
디스크가 돌아가는 시간을 줄이면 효율적으로 사용 가능.
SLTF, Shortest Latency Time First.
회전수를 최대한 줄이면서 서비스를 하겠다!
Fixed head disk 시스템 (head의 이동없이 disk가 돌아가며 데이터를 읽는 방시)에 사용.
Sector queueing algorithm 사용.
각 sector별 queue 유지.
Head 아래 도착한 sector의 queue에 있는 요청을 먼저 처리 함.
Moving head disk의 경우 같은 cylinder에 여러 개의 요청 처리를 위해 사용 가능.
Head가 특정 cylinder에 도착하면, 고정 후
해당 cylinder의 요청을 모두 처리
SPTF (Shortest Positioning Time First)
내가 원하는 위치에 head를 가져다 놓음.
Positioning time = Seek time + rotational delay
Positioning time이 가장 작은 요청 먼저 처리
장점
Throughput ↑, 평균 응답 시간 ↓
단점
가장 안쪽과 바깥쪽 cylinder의 요청에 대해 starvation 현상 발생 가능.
위의 단점을 해소하는 방법으로 Eschenbach scheduling이 있음.
Positioning time 최적화 시도
Disk가 1회전 하는 동안 요청을 처리할 수 있도록 요청을 정렬.
한 cylinder내 track, sector들에 대한 다수의 요청이 있는 경우, 다음 회전에 처리 됨.
RAID Architecture
Redundant Array of Inexpensive Disks (RAID)
여러 개의 물리 disk를 하나의 논리 disk로 사용 (비싸지 않은 여러 disk를 묶어 성능 좋은 것처럼 쓰겠다).
Disk system의 성능 향상을 위해 사용. 다음의 지표로 성능을 측정함.
Performance (access speed) : 얼마나 빨리 원하는 데이터를 읽느냐.
Reliability : 데이터를 얼마나 안전하게 보관할 수 있느냐.
💡
디스크의 성능을 높이는 또 하나의 방법인 RAID는 다양한 형태로 구성됨.
대표적인 level을 살펴보고 전반적인 특징을 이해해보자.
RAID 0
프로세스가 a, b, c, d 모두 필요로 할 때 원래라면 각각을 순차적으로 일어야 함. 하나를 읽는데 드는 시간이 1이라면 총 4의 시간이 걸림. 근데 물리적 디스크 4개를 사용하고 각각 분할해서 저장하면 중첩으로 인해 읽는데 1이란 시간이 걸림. 이상적으로 4배 빠르게 데이터를 접근할 수 있는 것임.
Disk striping 기법 사용.
논리적인 한 block을 일정한 크기로 나누어 각 disk에 나누어 저장.
장점) 모든 disk에 입출력 부하 균등 분배.
Parallel access를 통한 Performance 향상.
단점) 한 Disk에서 장애 시, 데이터 손실 발생 (Low reliability). 또한 한 block에 읽어야 하는 데이터가 모여있다면 이상적인 속도가 나오지 않음.
RAID 0는 접근 속도에 집중한 방법임.
RAID 1
RAID 0에서 낮은 reliability를 보완해 데이터를 안전하게 보관하는 데 초점.
Disk mirroring
디스크 저장 시 복사, 동일한 데이터를 mirroring disk에 중복 저장.
최소 2개의 disk로 구성.
입출력은 둘 중 어느 disk에서도 가능.
장점) 한 disk에 장애가 생겨도 데이터 손실 X.
High reliability.
단점) 가용 disk 용량 = (전체 disk 용량/2 )
RAID 3
데이터를 다 복사하려니 용량이 많이 듦. 에러를 잡을 수 있는 정보를 따로 저장하면 어떨까?