본문 바로가기
운영체제

운영체제 26장 - 파일 관리(1) : 파일 할당 -

by ChocoPeanut 2017. 5. 15.

운영체제 26

- 파일 할당 -

 

앞선 장들에서는 운영체제가 하는 역할 중 가장 중요하다고 볼 수 있는 프로세스 관리와 메모리 관리에 대해서 배웠다. 하지만 이외에도 운영체제는 다양한 일을 한다고 알고 있다. 그 중에서 파일 할당에 대한 것을 알아보겠다.


컴퓨터 시스템 자원에서 가장 중요한 부분은 CPU이다. CPU를 어느 프로세스에 나누어 줄 것인가가 프로세스 관리를 하는 역할이다. 그 다음 중요한 자원이 메인 메모리인 주기억장치이다. 메인 메모리에 대해 페이징이나 가상 메모리와 같은 방법을 사용하는 것이 메인 메모리 관리를 하는 역할에 속했다. 다음으로 중요하다고 할 수 있는 컴퓨터 시스템 자원으로는 하드 디스크와 같은 보조기억장치라고 할 수 있다. 보조기억장치는 파일 시스템을 관리하는 역할을 수행한다.


대표적인 보조기억장치는 하드 디스크이다. 하드 디스크는 트랙(track)과 트랙을 자른 섹터(sector)로 이루어져 있다. 또한 같은 거리에 존재하는 트랙들의 집합을 실린더(cylinder)라고 한다. 일반적으로 Sector size512bytes인데 크기가 너무 작으므로 Sector들을 여러 개 모아놓은 것은 Block이라고 한다. 하드 디스크는 이러한 Block들을 단위로 읽고 쓰기를 진행한다. 디스크는 처음에 free block인 비어있는 block으로 구성되게 된다. 그런데 Block 단위로 디스크가 돌아가기 때문에 파일에 Block을 할당할 때 free block이 생기게 된다. Block 안의 크기를 다 못 채우고 파일이 저장되는 것이다. 그러면 Block에서 남는 공간이 발생하게 된다. 메모리 관리에서 했던 내부 단편화와 비슷한 현상이라고 할 수 있다. 이렇게 되면 공간이 낭비되므로 효율이 안 좋게 된다. 그런데 그렇다고 해서 Block의 크기를 줄이게 되면 디스크에서 읽고 쓰는 과정이 매우 오래 걸리게 될 것이다. 하나의 파일을 읽는데 더 많은 Block을 읽어야하기 때문에 속도가 떨어지게 되는 것이다. 어떻게 하면 free block을 잘 할당할 것인지, 속도를 감소시키지 않게 할 것인지를 따지면서 파일을 할당하는 것이 중요하다.


크게 파일 할당에는 3가지 방법이 있다. 연속 할당, 연결 할당, 색인 할당이다.


연속 할당각 파일에 대해 디스크 상의 연속된 블록을 할당하는 방법이다. 하드 디스크에 block들이 나열되어 있는데 여기에 연속된 순서대로 파일을 저장하는 것이다. 이렇게 되면 디스크가 읽어 들어갈 때 이동 경로를 최소화할 수 있다는 장점이 있다. 빠른 I/O의 성능을 가질 수 있는 것이다. 순서적으로 읽을 수도 있고 특정 부분을 바로 읽을 수도 있게 한다. 동영상이나 음악, VOD 와 같이 크기가 큰데 실시간인 자료들에 적합하다고 할 수 있다. 하지만 단점도 존재한다. 특정 파일이 삭제되면 중간에 빈 공간인 hole이 생성되게 된다. 계속해서 파일의 생성과 삭제를 반복하면 곳곳에 흩어지는 hole들이 생성되게 된다. 이는 외부 단편화가 생긴 것으로 생각할 수 있다. 그러면 디스크의 공간 낭비가 매우 심하게 될 것이다. 또한 연속되게 파일을 할당하면 중간에 파일의 크기를 계속 증가시킬 수 없다. 뒤의 block에는 다른 파일이 공간을 차지하고 있으니 크기 조절이 불가능하게 된다.



연결 할당파일을 linked list의 형태로 저장을 하는 것을 말한다. 파일은 각자 디랙토리를 가지고 있는데 여기에는 어떤 block에 할당되어 있는지를 기억한다. 디렉토리에 제일 처음 저장되는 block을 가리키게 되고 각 block은 포인터를 저장을 위한 4바이트 이상을 가지고 있어서 다음 block을 지칭하게 된다. 새로운 파일이 만들어진다고 생각을 하면 비어있는 임의의 block을 첫 block으로 지정하고 파일이 커지면 다른 block을 할당 받고 포인터를 이용해 연결을 하면 된다. 이런 방법을 사용하면 외부 단편화를 없앨 수 있다. 임의의 자리에 넣고 포인터로 연결만 하면 되기 때문에 딱 block에 맞는 사이즈만 맞추어 넣으면 되기 때문이다. 하지만 단점도 존재한다. 연결 할당을 하게 되면 각각 순서대로 포인터로 연결되어 있기 때문에 순서대로 읽는 것 밖에 할 수 없다. 중간에 있는 자료만 읽고 싶어도 포인터를 따라 가지 않으면 읽을 수 없기 때문이다. 또한 포인터 저장을 위해 4바이트 이상을 손실시켜야 되고 만약 포인터가 끊어지면 이하 접근이 불가하기 때문에 낮은 신뢰성을 가진다. 그리고 포인터를 따라가는 과정을 거쳐야 하므로 속도 면에서 느릴 수 있다.



색인 할당파일 당 인덱스 block을 사용하여 파일을 할당하는 방법이다. 인덱스 block은 각 파일에 할당된 포인터를 저장하는 모음이다. 연결 할당과 같은 방식으로 할당을 하지만 인덱스 block을 둔다는 점에서 다르게 된다. 인덱스 block에 각 포인터에 대한 정보를 저장하게 되면 연속 할당의 장점인 순서적으로 읽을 수도 있고 특정 부분을 바로 읽을 수도 있게 한다. 또한 연결 할당의 장점인 외부 단편화도 없어지는 효과를 가지게 된다. 하지만 인덱스 블록에 할당에 따른 저장 공간의 손실이 발생할 수 있다.