본문 바로가기

운영체제/반효경 교수님 - 운영체제 강의

운영체제 8강 - 디스크 관리

현재 포스팅은 반효경 교수님의 운영체제 강의 + 추가적인 내용을 바탕으로 정리된 글입니다 :)

1. 디스크의 구조

디스크의 외부에서는 디스크를 일정한 크기의 저장 공간들로 이루어진 1차원 배열처럼 취급을 하게 됩니다. 이때 일정한 크기의 저장 공간들을 논리 블록(logical block)이라고 합니다. 디스크에 데이터가 저장될 때에는 논리 블록 단위로 저장되고, 디스크 외부로 입출력이 일어날때도 논리 블록 단위로 전송됩니다.

 

이때 논리 블록에 저장된 데이터를 접근하려면 어떻게 해야할까요???

이는 배열에 접근하려는 것처럼 해당 블록의 인덱스 번호를 디스크에 전달함으로서 접근할 수 있습니다. 이때 디스크 컨트롤러는 해당 논리 블록이 저장된 물리적 위치적 위치를 찾아 요청된 데이터에 대한 입출력 작업을 수행하게 됩니다.

 

각 논리 블록이 저장되는 디스크내의 물리적인 위치를 섹터(sector)라고 합니다. 즉 논리 블록 하나가 섹터 하나와 1:1로 매핑되어 저장되는 것입니다.

 

디스크의 물리적인 구조는 마크네틱의 원판(platter)로 구성되며, 하나의 디스크 내의 원판 수는 하나일 수도 있고 여러개 일수도 있습니다. 이때 각각의 원판은 트랙으로 구성되고, 이 트랙은 섹터로 구성되어있습니다.

 

여러 개의 원판에서 상대적인 위치가 동일한 트랙들의 집합을 보통 실린더(cylinder)라고 부릅니다.

디스크에 데이터를 읽고 쓰기 위해서는 암(arm)해당 섹터가 위치한 실린더로 이동한 후 원판이 회전하여 디스크 헤드가 저장된 섹터 위치에 도달해야 합니다!


2. 디스크 스케줄링

여러 디스크 스케줄링 기법에 대해 알아보기 전에 이와 관련된 개념들에 대해 간단히 알아보겠습니다 :)

 

디스크에 대한 접근 시간(access time)은 크게 탐색시간(seek time), 회전 지연 시간(Rotational Latency Time), 전송 시간(transfer time)으로 구분됩니다.

 

탐색 시간은 디스크 헤드를 해당 실린더 위치로 이동시키는데 걸리는 시간을 뜻하고, 회전 지연 시간은 디스크가 회전해서 읽고 쓰려는 섹터가 헤드 위치에 도달하기 까지 걸리는 시간을 뜻합니다. 전송 시간은 해당 섹터가 헤드 위치에 도달한 후 데이터를 실제로 섹터에 읽고 쓰는데 소요되는 시간을 뜻합니다.

 

디스크 입출력의 효율을 높이기 위해서는 이러한 디스크 입출력에 소요되는 접근시간을 최소화 해야 합니다.

이때 회전 지연 시간과 전송시간은 상대적인 수치가 작을 뿐 아니라, 운영체제 입장에서 통제하기 힘든 부분입니다. 따라서 운영체제는 탐색 시간을 줄이기 위해 헤드의 움직임을 최소화하는 스케줄링 작업을 진행합니다.

 

디스크 스케쥴링이란 효율적인 디스크 입출력을 위해 여러 섹터들에 대한 입출력 요청이 들어왔을 때, 이들을 어떠한 순서로 처리할지 결정하는 메커니즘을 의미합니다. 이때 디스크 스케줄링의 가장 큰 목적은 디스크 헤드의 이동 시간을 줄이는 것입니다.

 

지금부터는 여러 디스크 스케줄링 기법에 대해 알아보겠습니다!

 

1. FCFS 스케쥴링

FCFS 스케줄링디스크에 먼저 들어온 요청을 먼저 처리하는 방식으로 동작합니다.

FCFS 스케줄링이 적용되는 디스크에서는 최악의 경우, 만약 입출력 요청이 디스크의 한쪽 끝과 반대쪽 끝에 번갈아 도착한다면, 디스크는 계속 왕복하며 일을 처리해야 하므로 탐색시간이 매우 길어질 수 있습니다.

 

현재 헤드 위치가 50번 실린더에 있고, (105, 180, 40, 120, 10, 125, 65, 70)의 순으로 입출력 요청이 들어왔다고 가정해보겠습니다.

처음에 헤드는 50에서 105으로, 그 후에 요청 순서대로 180, 40, 120, 10, 125, 65, 70으로 움직이게 되어 헤드는 총 640 거리를 이동하게 됩니다.

 

2. SSTF(Shortest Seek Time First)

SSTF 스케줄링헤드의 현재 위치로부터 가장 가까운 위치에 있는 요청을 제일 먼저 처리하는 방식입니다.

앞선 예시와 마찬가지로 (105, 180, 40, 120, 10, 125, 65, 70)순으로 요청이 왔다고 가정해보겠습니다.

이때는 50과 가장 가까운 40을 시작으로 65->70->105 .... 180 순으로 헤드가 이동한 후 마지막에 10으로 헤드가 이동하게 됩니다.

 

이처럼 SSTF는 헤드의 이동거리를 줄여 디스크 입출력의 효율성을 증가 시키지만, 자칫 기아 현상을 발생시킬 수 있습니다.

예를들어 현재의 헤드 위치로부터 가까운 곳에서 지속적인 요청이 들어올 경우 헤드 위치에서 멀리 떨어진 곳의 요청은 무한히 기다려야 하는 문제가 발생할 수 있기 때문입니다. 또한 FCFS와 비교해 볼때 헤드의 이동거리를 많이 줄일 수 있지만, SSTF가 헤드 이동거리 측면에서 가장 우수한 알고리즘은 아닙니다.

 

3. SCAN 알고리즘

SCAN 알고리즘헤드가 디스크 원판의 안쪽 끝과 바깥쪽 끝을 오가며, 그 경로에 존재하는 모든 요청을 처리하는 방식입니다.

즉 디스크이 어떠한 위치에 요청이 들어오는가와 상관없이 헤드는 정해진 방향으로 이동하면서 길목에 있는 요청들을 처리하며 지나가는 것입니다.

이러한 SCAN 알고리즘은 건물 안의 엘리베이터 동작과 유사하기에 간혹 엘리베이터 알고리즘 이라고도 불립니다 :)

 

현재 헤드 위치가 50이고, 디스크 헤더가 0번 실린더 방향으로 이동하며 앞선 예시와 마찬가지로 (105, 180, 40, 120, 10, 125, 65, 70)순으로 요청이 왔다고 가정해보겠습니다.

 

그러면 우선 0번으로 이동하는 과정에서 40,10번 실린더 위치에 들어온 요청을 처리하고 이후 65,70, 105 .... 순으로 요청을 처리하게 됩니다!

 

이러한 SCAN 알고리즘에서는 FCFS처럼 불필요한 헤드의 이동이 발생하거나, SSTF처럼 일부 지역이 지나치게 오래 기다리는 현상이 발생하지 않습니다.즉 효율성과 형평성을 모두 만족하는 알고리즘이라 볼 수 있습니다.

 

하지만 모든 실린더 위치의 기다리는 시간이 공평한것은 아닙니다. 제일 안쪽이나 제일 바깥쪽 위치보다는 가운데 위치가 기다리는 평균시간이 더 짧기 때문입니다. 즉 헤드가 가운데 위치를 지나가는 주기는 양 끝을 지나가는 주기의 절반에 불과합니다. 

 

이러한 SCAN 알고리즘의 위치에 따른 탐색시간의 편차를 보완하기 위해, 다음에 소개드릴 C-SCAN 알고리즘이 제안되었습니다.

 

4. C-SCAN 알고리즘

C-SCAN 알고리즘은 SCAN 처럼 헤드가 한쪽 끝에서 다른 쪽 끝으로 이동하며 가는 길목에 있는 모든 요청을 처리합니다. 그러나 그냥 SCAN 방식과는 달리 헤드가 다른 쪽 끝으로 도달해 방향을 바꾼 후에는 요청을 처리하지 않고 곧바로 출발점으로 다시 이동만 합니다.

 

이러한 방식은 SCAN 보다 좀 더 균일한 탐색 시간을 제공합니다. 즉 SCAN보다 헤드의 이동거리는 조금 길어지지만 탐색 시간의 편차를 줄일 수 있는 것이 장점입니다.

 

 

5. LOOK과 C-LOOK 알고리즘

앞서 설명드린 SCAN 알고리즘에서는 요청의 존재 여부와 관계 없이 헤드가 무조건 디스크의 한쪽 끝에서 다른 쪽 끝으로 이동합니다. 이에 반해 LOOK 알고리즘헤드가 한쪽 방향으로 이동하다가, 그 방향에 더 이상 대기 중인 요청이 없으면 헤드의 이동 방향을 즉시 반대로 바꾸는 스케줄링 방식입니다.

 

C-LOOK 알고리즘은 전방에 요청이 없을때 방향을 바꾼다는 측면에서는 LOOK과 유사하지만, 한쪽 방향으로 이동할때만 요청을 처리한다는 점에서 C-SCAN과 유사합니다.

 

지금까지 살펴본 디스크 스케줄링 기법들 중 SCAN,C-SCAN 및 이들을 좀 더 개선한 LOOK, C-LOOK 등의 스케줄링 알고리즘이 디스크 입출력이 많은 시스템에서 FCFS나 SSTF에 비해 더 효율적인 것으로 알려져 있습니다.


3. 다중 디스크 환경에서의 스케줄링

포털 사이트와 같이 수많은 동시 사용자를 서비스하는 서버에서는 다수의 디스크를 함께 사용합니다.

 

이때 동일한 정보를 여러 디스크에 중복 저장함으로써 인기 있는 데이터를 여러 디스크로부터 동시에 서비스할 수 있고, 일부 디스크에 오류가 발생해도 지속적인 서비스가 가능하며, 정보의 유실을 방지할 수 있습니다.

 

앞서 설명드린 스케줄링 기법들은 하나의 디스크 내에서 입출력 요청의 처리 순서를 결정하는 것이라면, 다중 디스크에서의 스케줄링은 작업을 수행할 디스크를 결정한 문제까지 포함합니다. 이러한 시스템에서는 스케줄링의 목표에 따라 요청을 처리할 디스크를 결정하는 기준이 달라집니다.

 

예를 들어, 탐색 시간을 줄이는 것이 목표라면 여러 디스크 중에서 헤드의 현재 위치가 요청한 데이터와 가장 가까운 디스크를 선택하는 방법을 사용할 수 있습니다.  좀 더 거시적인 관점에서 각 디스크 간의 부하 균형(load balancing)을 이루도록 스케줄링 하는 것이 중요합니다.

 

최근에는 전력 소모를 줄이는 것 또한 디스크 관리의 또 다른 중요한 목표로 인식되고 있습니다. 이때 전력 절감 측면에서는 모든 디스크에 요청을 골고루 분산시키기보단 일부 디스크에 요청을 집중하고 나머지 디스크는 회전을 정지 시키는 것이 더 효과적입니다.

 


개발자 준비생이 대학 강의를 듣고 정리한 내용입니다

혹시 틀린 내용이 있다면 댓글 부탁드리겠습니다!! 곧바로 수정하겠습니다 :)