이전 포스팅에서 Storage에 접근하는 방식에는 순차 접근과 직접 접근의 두 가지 방식이 있는 것을 살펴보았습니다.
다시 정리하자면 순차 접근은 파일을 처음부터 끝까지 순서대로 읽거나 쓰는 방식입니다. 직접 접근은 파일을 임의의 순서로 접근할 수 있는 방식입니다. 파일 내의 특정 위치로 직접 이동하여 읽거나 쓸 수 있는 방식입니다. 그리고 tape와 같은 매체는 순차 접근만 가능하고, 하드 디스크나 플래시 메모리 같은 매체들은 직접 접근이 가능합니다.
하지만 직접 접근이 가능한 매체라고 하더라도, 데이터를 어떻게 관리하는지에 따라 순차 접근만 허용하는 경우도, 직접 접근이 가능현 경우도 있습니다.
디스크에 파일을 저장하는 방법은 크게 세 가지로 나누어 볼 수 있습니다.
- 연속 할당 (Contiguous Allocation)
- 연결 할당 (Linked Allocation)
- 색인 할당 (Indexed Allocation)
앞서 살펴보았던 메모리 관리에서의 할당과 개념이 유사합니다.
연속 할당부터 차례로 살펴보겠습니다.
1. 연속 할당
연속 할당은 하나의 파일을 디스크 상에 연속해서 저장하는 방식입니다.
위 그림에서는 두 개의 블록으로 구성되는 count 라는 파일은 첫 번째 블록과 두 번째 블록이 인접해 있습니다. 만약 블록 6개로 구성되어 있는 파일이라면, 19번 블록부터 24번 블록까지 데이터를 연속적으로 할당하는 방식입니다.
그리고 Directory File은 그 Directory 밑에 있는 파일들의 메타데이터를 내용으로 가지고 있습니다. Directory가 있을 때, 그 Directory에 5개 파일(그림의 count, tr, mail, list, f)의 메타 데이터가 저장이 되어있습니다. count라는 파일을 연속 할당으로 저장을 한다고 가정하면 0번의 위치부터 길이가 2이므로 0,1번 블록에 할당이 되는 방식입니다. list 파일은 28번부터 4개의 블록이 연속적으로 저장된 것을 볼 수 있습니다.
연속 할당 방법의 장단점은 무엇이 있을까요?
연속할당은 각각 파일의 크기가 균일하지 않아서 free 블럭이 생겨 외부 조각이 생길 수 있는 단점이 있습니다. memory 할당에서의 단점과 유사합니다. 새로운 파일이 만들어질 때, 남은 블록보다 크기가 크다면 해당 블록에 할당하지 못하는 문제가 생기는 것입니다.
또한, 중간에 파일의 크기가 커지게 되면 제약을 받을 수 있습니다. 할당되어 있는 블록보다 파일이 커질 수 있습니다. 이렇게 파일이 커질 것을 대비해서 미리 빈 공간을 어느 정도 확보해 놓는 방법이 있습니다. 하지만 미리 여유공간을 확보하더라도 해당 공간만큼만 커질 수 있다는 문제가 있고, 또 미리 할당해 놓으면 지금 당장 사용되지 않는 공간이 되어 내부 조각 문제가 발생합니다.
외부조각 : 아무도 사용하지 않기 때문에 누군가에게 할당이 될 수 있는 공간
내부 조각: 어떤 프로그램에 이미 할당되어 있는데 사용이 되지 않는 공간
연속 할당의 장점도 있습니다. 우선 빠른 I/O 작업이 가능합니다. 디스크에서 데이터를 접근하는 데 걸리는 시간은 탐색 시간, 회전 지연 시간, 데이터 전송 시간으로 구성이 됩니다.
탐색 시간 : Head를 요청한 데이터가 존재하는 트랙 위치까지 이동하는 데 걸리는 시간
회전 시간 : 요청한 섹터가 헤드 아래로 위치될 때까지 디스크 원판을 회전시키는 데 걸리는 시간
데이터 전송 시간 : 헤드가 섹터의 내용을 읽거나 기록하는 데 걸리는 시간
디스크에서 I/O 작업 시 소요되는 대부분의 시간은 디스크 헤드가 이동하는 시간입니다. 실제로 데이터를 읽거나 쓰는 작업은 시간이 크게 소모되지 않습니다.
그래서 연속 할당은 파일이 연속되어 있기 때문에, 디스크 탐색 시간이 적어 파일 전체를 읽고 싶다면 디스크 헤드가 한 번만 이동해서 많은 양의 데이터를 받아올 수 있습니다.
그리고 연속 할당은 파일 시스템 용도 말고 프로세스의 Swap Area 용도로도 사용할 수 있습니다. 파일 저장을 저장하는 것이 아닌, 프로세스의 주소 공간 일부를 물리적인 메모리에서 쫓아내고 나중에 필요할 때 올려놓는 용도로 사용합니다. Swap Area 영역은 프로세스가 끝나면 의미가 없는 정보들로, 임시로 저장해서 대용량의 크기를 빠르게 디스크로 쫓아냈다가 필요하면 다시 메모리에 올려주는 영역입니다. 그래서 공간 효율성보다는 속도 효율성이 더 중요하기 때문에 연속 할당 방식을 사용합니다.
또, 직접 접근이 가능합니다. 예를 들어, mail이라는 파일은 길이가 6이라고 다섯 번째 블록을 보고 싶다고 가정하면 앞의 네 개의 블록에 모두 접근해야 볼 수 있는 것이 아니라, mail이라는 파일이 19번부터 연속 할당이 되어 있기 때문에 19+4=23번 블록을 보면 해당 내용을 확인할 수 있습니다.
2. 연결 할당
파일의 데이터를 연속적으로 배치하는 것이 아니라, 빈 공간이 있다면 데이터를 집어 넣는 방식입니다.
위 그림에서 만약 jeep 라는 파일을 찾으려면 9번 블록에 있고 이것이 16, 1, 10, 25 순으로 연결되어 하나의 파일을 구성하는 것입니다.
장점은 외부 조각이 발생하지 않는 것입니다. 디스크에서 비어있는 블록이면 어디든지 들어갈 수 있기 때문입니다.
단점은 직접 접근이 되지 않고 순차 접근만 가능한 것입니다. 만약 네 번째 블록을 보기 위해서는 첫 번째 블록에 간 후에 두 번째 블록에 접근하고, 두 번째 블록에 접근 후 세 번째 블록에 접근해야 합니다.
그리고 reliability 문제가 있습니다. 중간에 하나 Bad Sector가 나면 그 다음 위치의 블록부터는 접근하지 못합니다.
또, 한 가지의 문제는 포인터의 크기를 고려해야한다는 것입니다. 보통 디스크의 섹터는 512Byte로 구성됩니다. 그래서 디스크로 접근할 때, 디스크에 저장하라는 단위는 512의 배수를 디스크에 저장하라고 요청합니다. 여기서 다음 좌표를 가리키는 포인터를 위해서 하나의 섹터 512 Byte 중 4Byte가 소요되며, 실제 저장할 수 있는 데이터는 512-4=508 Byte가 됩니다. 그래서 한 섹터에 들어갈 내용이 포인터 때문에 두 블록이 사용될 수도 있습니다.
위의 포인터 문제에서 약간 변형을 한 것이 FAT 파일 시스템입니다. FAT 파일 시스템은 Linked Allocation을 약간 변형한 것인데, 포인터를 별도의 위치에 보관하여 reliability와 공간 효율성 문제를 해결한 시스템입니다.
3. Indexed Allocation
Linked Allocation을 약간 변형해 직접 접근이 가능하게 하기 위한 방법입니다. Linked Allocation에서는 중간에 있는 블록을 보려면 순차적으로 접근해야했습니다. 이 문제를 해결하기 위해 Directory File의 위치 정보를 바로 저장하는 게 아니라 Index를 가리키게 해 놓는 것입니다.
Index Block은 이 파일이 어디에 저장이 되어있는지에 대한 위치 정보를 블럭 하나에 열거해 놓은 정보가 들어있습니다. 그래서 만약 앞에서부터 네 번째 블록을 보고싶으면 Index를 통해 직접 접근이 가능합니다.
그래서 Indexed Allocation은 외부 조각이 생기지 않고 직접 접근이 가능한 것이 장점입니다.
단점은 아무리 작은 파일이라고 하더라도 Index 블록이 필요하게 됩니다. 그리고 작은 파일이 아닌 굉장히 큰 파일의 경우에도 하나의 Index 블록으로 다 표현하지 못하는 문제가 생깁니다.
이 문제를 해결하려면 Linked Scheme이나 Multi-Level Index를 사용해야 합니다.
Linked Scheme은 Index 블록에 실제 파일의 위치를 나열하다가 끝까지 도달했는데 파일의 크기를 커버하지 못하면 마지막에 또 다른 Index 블록을 가리키게 해 놓는 방식입니다.
Multi-Level Index는 하나의 Index블록이 직접 파일의 위치를 가리키는 게 아니라, 2단계 Page Table처럼 또 다른 Index를 가리키게 해서 Index가 실제 데이터 위치를 바로 가리키 것이 아닌 두 번 거쳐서 가리키는 방식입니다.
참고자료
[KOCW 이화여대 반효경 교수님 - File Systems Implementation 1]
https://core.ewha.ac.kr/publicview/C0101020140520134614002164?vmode=f
[ Operating System Concepts - Abraham Silberschatz ]