computer science

[OS] 운영체제 I/O System & Disk Management

yjs3819 2021. 10. 12. 15:03
728x90

I/O System이 어떻게 동작하고, OS는 시스템 성능을 높이기 위해서 어떻게 I/O System을 support하는지 알아보자.
또, 디스크는 OS가 어떻게 관리하는 지도 알아보자.

I/O System (HW)

I/O System은 기본적으로 입력장치라면 데이터를 입력 받아서 메모리에 저장하고 프로세서가 메모리에 저장된 데이터를 사용하여 연산할것이다.
반대로 출력장치라면 프로세서가 연산/명령을 하여 메모리에 저장된 데이터를 출력장치로 내 보낼 것이다.

I/O Mechanisms

좀더 세밀하게 어떤 방식으로 I/O를 통해서 데이터가 전송되고 처리하는지를 알아보자.

Processor controlled memory access

이름에서 알수 있듯이 I/O로 부터 주고 받는 데이터는 프로세서(CPU)의 제어를 받는 방식이다.

위 그림처럼, 메모리와 I/O장치 사이에 존재하여 데이터 전송을 제어한다.

이러한 Processor controlled memory access 방식은 두가지가 존재한다.

  • Polling
  • interrupt

Polling (Programmed I/O)

프로세서가(cpu)가 주기적으로 I/O장치의 상태를 확인한다. 계속 확인하다가 I/O로 부터 데이터를 받거나 건네줘야하면 프로세서가 확인하여 메모리에서 데이터를 꺼내거나 메모리에 데이터를 저장한다.

즉, 프로세서가 하는게 너무많다.

Polling 장점
  • 프로세서가 I/O장치들의 상태를 계속 확인하기에 간단하다.
  • I/O장치가 매우 빠르고 데이터 전송이 잦으면 효율적이다.
Polling 단점
  • 프로세서의 부담이 너무 크다. (계속해서 I/O장치들의 상태를 확인해야 하므로)
  • I/O장치가 느리면 Polling하는데도 너무 시간이 오래걸려 오버헤드가 크다.

Interrupt

프로세서가 I/O장치들의 상태를 계속 확인하고 있는게 아닌, I/O장치가 작업을 완료한 뒤, 자신의 상태를 프로세서에게 전달한다. 즉, 프로세서는 다른일을 하고 있거나 쉬고있으면 I/O장치가 '나 데이터 보낼준비 됐어!'하고 프로세서를 '콕' 찌르는 것이다.

Interrupt 장점
  • Polling에 비해서는 프로세서의 오버헤드가 적다.
  • 불규칙적인 요청처리에 적합하다.(I/O가 준비되면 프로세서를 콕 찌르기에 불규칙적이어도 상관없다!)
Interrupt 단점
  • 인터럽트 자체를 관리하는데 오버헤드가든다. 아무래도 인터럽트가 발생하면 프로세서가 하던일을 그만두고, 일단 I/O장치로부터 전달된 데이터를 처리해야하닌까 오버헤드가 있겠다.

Direct Memory Access (DMA)

I/O장치와 메모리 사이의 데이터 전송을 프로세서 개입없이 수행하는 매커니즘이다.

보면 입출력 장치와 메모리가 직접적으로 연결되어있는 것을 볼 수 있다.

DMA에서 프로세서는 데이터 전송의 시작/종료만 관여하기에 Processor controlled memory access보다 프로세서의 부담이 훨씬 적다.

DMA를 통해 I/O장치로부터 어떤식으로 데이터가 전송되는지 보다 자세히 알아보자.

  1. 먼저 프로세서가 DMA제어기에게 명령을한다.
  2. DMA제어기는 명령을 받아서, 디스크 제어기에 '메모리에 데이터 전송해'라고 다시 명령한다.
  3. 디스크로부터 메모리에 데이터가 전송된다.
  4. 디스크 제어기는 데이터전송이 메모리로 완료됐다고 DMA제어기에 전한다.
  5. DMA제어기가 프로세서에 인터럽트 신호를 보낸다.

I/O로부터 전송되는 데이터를 어떤식으로 처리하는지의 매커니즘을, 크게 두가지 방식에서 살펴봤다. 프로세서가 관여하는 Processor controlled memory access, 그리고 프로세서의 제어 없이 메모리와 I/O장치간 직접적으로 연결되어있는 Direct Memory Access에 대해서 살펴보았다.

I/O Services Of OS

I/O성능 향상을 위해서 OS가 어떠한 기능들을 제공하는지 하나하나 용어를 통해서 알아보자.

I/O Scheduling

입출력 장치는 되게 많아서, 입출력요청이 한번에 되게 많이 들어올수 있다. 이러한 많은 요청에 대한 프로세서의 처리 순서를 결정하는 것을 OS가 한다.
시스템 성능을 높이기 위해 어떤 I/O의 요청을 먼저 처리할지 정할수 있다.

Error handling

입출력 요청중 발생하는 오류를 OS가 처리한다.

I/O device information managements

I/O장치의 정보를 OS가 관리한다.

Buffering

유튜브를 보다보면 버퍼링이 발생해서 짜증나는 경험이 많이 존재한다.
이러한 버퍼링은 OS가 제공하는 기능이다.

입출력장치로부터 1초에 100개의 데이터가 들어온다는 상황을 가정해보자.
반면에 디스크에는 1초에 10개밖에 데이터를 저장하지 못한다.

그러면 90개의 데이터는 사라져야하나?

중간에 '버퍼'를 두어서 잠시 데이터를 저장할수 있다.
이를 버퍼링이라한다.

다시 풀어서 말하면 I/O장치와 프로그램 사이에 전송되는 데이터를 버퍼에 임시저장하는 것을 버퍼링 이라한다.

위의 가정과 반대상황에서도 버퍼링은 적용된다.

유튜브 영상을 보여주는데 60FPS가 필요하다 해보자.(1초에 60 Frame필요)
그런데 내 방의 네트워크의 속도로는 데이터가 30FPS밖에 들어오지 않는다.

이러한 상황에서 OS는 버퍼링이라는 기능을 통해 버퍼에 60개 이상의 Frame들을 저장해 두었다가, 프로그램에 전달한다.
버퍼링에 필요한 프레임이 찰때까진 기다려야 하지만 우리는 그래도 기다리면 60FPS의 영상을 볼수있다.

전송속도나 처리단위 차이 문제를 해결하기 위해 OS가 제공하는 기능인 버퍼링이 사용된다.

Caching

하드웨어적인 캐시에대해서 알아볼때도 공부한 개념이다.
뽀인트는 예측해서 미리 올려둔다이다. - 지역성 특징을 활용해 매우 효율적이다라고 했다!

I/O로부터 들어오는 데이터나 나가는 데이터를 미리 메모리에 올려놔서, 실제로 I/O 까지 접근하지 않아도 되는 것을 Caching이라 한다.
Cache hit시 I/O를 생략할수 있다.(시스템 성능향상 확 오름)

Spooling

실제로 프린터기를 사용하다보면 스풀중 이라는 단어를 들어본 적이 있다.

프린트기 하나에 A, B, C, D종이 네개를 프린트해달라고 동시에 요청하면 어떻게 출력할까?
우리의 기억으론 순서대로 하나씩 출력했다. A출력하다 B출력하고 다시 A출력하고.. 이런게 아닌!

이러한 기능을 OS가 도와주고, 이 기능을 Spooling이라 한다.

즉, 한 I/O장치에 여러 프로그램이 요청을 보낼 때 출력이 섞이지 않도록 하는 기법이다.

각 프로그램에 대응 되는 디스크파일(Spool이라고도함)에 기록한다음 - 스풀링(Spooling)
Spooling 이 완료되면 그때서야 기록한 Spool을 하나씩 I/O장치로 전송한다.

Disk Scheduling

Disk에 데이터가 저장되어있다.
이 Disk에 저장된 데이터에 access 하는 요청들의 처리 순서를 결정하는 것이 바로 Disk Scheduling이다.
프로세스 스케쥴링과같이 다양한 기법들이 존재하고, 시스템의 성능을 향상시키기 위해 다양하게 존재한다.

고려할 요소

  1. Seek time
    헤드를 필요한 실린더로 이동하는 데 걸리는 시간
  2. Rotational delay
    Seek time이 끝나고 필요한 Sector가 head아래로 위치하는데 걸리는 시간(축을 기준으로 돌아서)
  3. Data transmission time
    Rotational delay가 끝나고 해당 섹터의 데이터를 읽어서 전송하는 시간

Optimizing seek time

Seek time을 최적화할수 있는 다양한 디스크 스케쥴링을 알아보자.
즉, 헤드를 접근할 섹터가 있는 실린더로 이동하는데 걸리는 시간을 줄이는데 도와주는 다양한 기법들을 알아보자.

FCFS(First Come First Service)

이름만 들어도 이제알수있다.
먼저 요청이 들어온 순서에 따라서 처리하겠다는 기법이다. 당연히 간단하고 공평하지만 시스템 최적화하는 요소가 없다는 것을 알수있다.!!(우리는 지금까지 다양한 스케쥴링기법들을 알아왔었다.)

(요청이 들어온 섹터부터 접근하닌까 이리저리 헤드가 엄청 움직이는것을 볼수 있다.)

SSTF(Shortest Seek Time First)

이제 헤드가 가장 적게 움직여 Seek time 을 줄이도록 하는 것이 필요하다는 것을 느꼈다.
바로 SSTF가 현재 헤드위치에서 가장 가까운 요청먼저 처리하는 스케쥴링 기법이다.
즉 시스템 성능(처리량, 평균응답시간..)을 높여준다.

이것만 봐도! 혹시 starvation문제가 발생할것 같은 느낌이들지 않는가?

현재 헤드와 거리가 먼 섹터에 대한 요청은 계속 후순위로 밀려 요청을 처리하지 않게되는 Starvation(기아 현상)이 일어날수 있다.

여러 요청을 모았다가 한번에 처리하는 일괄 처리 시스템에서 유용한 디스크 스케쥴링 기법이다.

(이렇게 total seek distance가 FCFS에 비해선 절반 이상 감소된걸 볼수있다.)

Scan Scheduling

SSTF는 기아현상이 일어날수있는 단점이있다.
그래서 일단 헤드가 모든 실린더를 다 도는 기법이 나왔다.
현재 헤드에서 가장 가까운 요청이 들어온 실린더 방향으로 일단 진행하는데 끝까지 진행한다.(끝이라면 surface끝까지 헤드가 진행한다는 것이다.)
끝까지 왔으면 이제 진행방향 반대로 다시 진행한다.

일단 모든 실린더를 헤드가 거치므로 기아현상은 일어나지 않는다.
처음에 헤드가 움직이는 방향은 가까운 실린더 방향으로 이동하기에 처리량도 준수하다.
그러나, 처음에 헤드가 진행하는 반대방향에서 요청이 들어온 섹터에는 접근이 되게 느린걸 알수있다.(반대방향 갔따가 다시 돌아오기 때무네..)

(헤드가 0까지 간다음에 다시 255가지 가기 때문에 200에 있는 섹터에 대한 요청 처리는 매우 늦게하는걸 볼수 있다)

S-Scan Scheduling

Scan과 유사하지만 헤드가 진행하는 방향을 간다음에 반대로 휙도는게 아니라 반대방향으로 바로가서 다시 요청을 순차적으로 처리하는 것이다.

화살표로 표시하면

<---- (최초 진행방향이 왼쪽이면)
끝까지 간다음
다시 반대편에서
<-----------------------

이렇게 헤드가 실린더를 탐색하는 것이다.

즉, Scan 에 비해서 균등한 기회를 제공한다는 특징이있다.

(보면 0까지 헤드가 갔다가 바로 255까지 휙가버리는걸 볼수있다.)

물론 255를 횡단해야하므로 그만큼 단점이있지만 탐색하지않고 헤드가 그냥 움직이는거라 비교적 괜찮다.

Looking Scheduling

Scan, C-Scan은 진행방향에 더이상 요청이 없어도 실린더 끝까지 갔는데, 이 스케쥴링 기법은 엘레베이터마냥 앞에 요청이 없으면 가지 않는다. 즉, 불필요한 헤드의 이동이 없다. - 굳!

(20에서 앞에 더이상 요청이없으므로 바로 휙돈것을 볼수있다.)

지금까지 헤드가 실린더로 움직이는 시간인 Seek time을 줄일수있는 다양한 스케쥴링 기법들을 알아보았다. 이젠 축을 중심으로 Platter를 회전시키는 Rotational delay시간을 줄일수있는 다양한 기법을 알아보자.

Optimizing Rotational Delay

SLTF(Shortest Latency Time First)

Fixed head disk(헤드가 실린더를 찾으려 움직이지않고 고정, 모든 실린더위에 헤드가 존재하는 형태임) 시스템에서 사용하는 기법이다.

각 트랙섹터별 큐를 유지한다음 헤드아래에 해당 트랙섹터가 도착하면 큐에있는 요청을 먼저 처리하는 기법이다.

즉, 로테이션 하면서 헤당 큐에 저장된 트랙섹터의 모든요청을 처리해나가며 회전해나간다.

SPTF (Shortest Positioning Time First)

Positioning time = seek time + rotational delay
이 Positioning time이 가장 작은 요청부터 먼저 처리한다.

당연히 기아현상을 발생할수 있다.

  • Eschenbach Scheduling
    위 SPTF기법을 최적화하는 기법이다.
    트랙섹터에 하나의 요청만 처리하고 Platter를 돌림으로써 기아현상을 막는다.
    그러나 하나의 트렉섹터에만 집중적으로 요청이들어오는 시스템같은 경우에는 매우 비효율적이겠다.

RAID Architecture

RAID란 Redundant Array of Inexpensive Disks를 의미한다.
여러개의 하드디스크를 함께 사용하는 방식을 의미한다.

왜?
당연히 디스크 시스템의 성능향상을 통해 시스템 전체의 성능향상을 도모하기 위해!!

RAID는 두가지 관점을 중요하게 생각한다.

  1. Performance (access speed) 성능이다, 데이터 접근 속도
  2. Reliability, 안정성이다.

두가지 측면을 위해 RAID는 아키텍쳐를 구성한다.

RAID 0

OS는 디스크를 블럭단위로 본다고 하였다.(디스크 = 블럭의 집합)
디스크 여러개에 블럭을 균등하게 분배하는 아키텍쳐를 의미한다.

디스크 여러개에 블럭이 존재하므로 병렬적으로 디스크들에 동시에 접근하기에 데이터 접근속도 (Performance)가 향상될 것이다.

그러나

하나의 디스크에서 장애가 발생하면 해당 디스크의 블럭이 손실되어 데이터 손실이 일어난다.

즉, Performance에는 좋지만 Reliability는 낮다.

RAID 1

RAID 0과 다르게 Reliability를 중요하게 생각하는 아키텍쳐이다.

동일한 디스크를 하나더 중복하여 저장하는 것이다. (백업 디스크!)

어느 한 디스크에 장애가 생겨 데이터 손실되어도, 백업 디스크가 존재하기에 괜찮다!!

그러나 하나의 디스크만 저장해도되는데 두배를 저장해야하므로 그만큼 용량이 많이 차지하게 된다.

RAID 3

RAID0에 패리티 디스크까지 추가하여 안정성까지 갖춘 아키텍쳐이다.
차이점은 하나더있다. RAID 0 은 여러 디스크에 블럭단위로 균등하게 분할하였지만 RAID3는 블럭을 나눈 바이트 단위로 디스크마다 저장하게 된다.

즉, 하나의 블럭에 대해 접근하는 것은 모든 디스크에 IO 부하가 균등하다는 의미이다.

그리고 하나의 디스크가 장애가 생겨 블럭을 나눈 바이트가 손실되어도, 패리티 디스크가 있어서 복구가 가능하다.

그러나 여러 디스크와 하나의 패리티 디스크가 있으므로 패리티 디스크에대한 병목현상이 심한 단점이 있다.

RAID 4

RAID 3 과 비슷하지만 다른점은 디스크가 블럭을 나눈 바이트 단위를 저장하는게 아닌 블럭단위를 저장하는 것이다.
즉, 하나의 블럭에 대해 접근하면 하나의 디스크의 IO만 생긴다.(RAID 3과 다른점)

그렇기에 하나의 디스크에 있는 블럭에만 계속 접근하고자 하면 해당 디스크에 병목현상이 생길수있다.

그리고 패리티 디스크가 하나있으므로 RAID 3과같이 패리티 디스크에 대한 병목 현상도 생길수 있다.

RAID 5

RAID3, RAID4 와 다르게 디스크마다 패리티 정보를 가지고있다.(개별적으로 패리티 정보를 가지고있는 패리티 디스크가 있는 구조가 아니다!)
그렇기에 오류 확인과 복구를 위해 패리티 디스크로 요청하는 병목현상이 없겠다.

그리고 RAID4와 같이 디스크 마다 블럭을 가지고 있다.

또, 하나의 디스크가 장애가 생겨도 다른 디스크들에 저장된 패리티 정보를 통해 복구가 가능하다.

꽤 유용하다. 그래서 현재 가장 널리 사용되는 RAID 아키텍쳐이다.

RAID란 여러 디스크를 함께 사용하는 방식이다. 디스크시스템의 성능향상과 안정성을 위해서.. 여러개의 레벨의 아키텍쳐가 존재하는 것을 알게되었다.

결론

지금까지 I/O시스템과 디스크 시스템에 대해서 공부해보았다. 기본적인 메커니즘은 어떤지, 어떤식으로 OS가 관여하여 성능 향상에 도모하는지 등등을.. 지금까지 OS에 대해서 하나하나 살펴보았다. 세밀 하게 하나 하나 외우는건 의미가 없을 것 같다(스케쥴링같은 것이 너무많음.) 그러나 이젠 컴퓨터가 낯설지 않다는것, 그리고 대충 어떤식으로 동작하는지 안다는 것은 나에게 굉장한 의미가 있다. 학교에서 OS수업을 들었지만 다시 복습할겸, 그리고 제대로 빡세게 공부해볼겸 지금까지 달려왔다. 정말 유용하고 좋은시간이었다.

참고

https://www.youtube.com/watch?v=omDkxSyol98&list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&index=45

728x90