28.색인할당, 디스크 탐색시간, FCFS, SSTF

보조기억장치중 하드디스크를 배운다
동심원이 있고 원판이 있다. 원판에 자성물질을 발라서 디스크 헤더에 전기를 흘려 기록을 하고 읽을 때는 고속으로 회전시켜 코일에 전류가 유도되는데 이를통해 읽는다.
이를 트랙이라 하고 보통 디스크는 앞 뒤로 쓰는데 트랙이라는 용어보다는 실린더라는 용어를 많이 쓰고 있다.
트랙을 쪼개서 섹터라 한다 섹터는 512b정도 된다. 이를 네개정도 모아서 블록이라고 한다.
하드디스크를 포멧하면 내용을 다지우고 나면 poll of block이라 한다.

연속할당

블록 하나가 1kb라고 가정하자 3.6kb파일을 하나 만들었을때 블록을 연속적으로 만들어주면 내부단편화가 발생한다.
하지만 헤더가 많이 안움직여도 되므로 빠르다. 디스크 헤더의 이동 최소화 = 빠른 i/o 성능
하지만 데이터를 지웠을 때 외부단편화가 발생한다.(곳곳에 흩어지는 holes로 인해)

연결할당

디렉토리라는것은 메인메모리에 저장되고 OS에서 관리된다. 파일 이름, 만들어진날짜 등등을 보관한다. 하지만 우리눈엔 안보이고 커널에만 보이는것이 있는데 파일의 위치가 그것이다. 파일의 시작위치를 지정해두고 파일이 연결리스트 형태로 이어진다. 포인터 저장을 위해 4바이트가 필요하다는점, 헤더가 많이 움직여야한다는점, 중간부터 읽을 수 없다는점이 단점이다.

FAT

연결할당의 단점을 해결하기 위해 포인터만을 모은 테이블(FAT)을 만든것.

색인할당 (Indexed Allocation)

3.6kb 파일을 만드려면 한 블록이 1kb일때 4개가 필요한데 인덱스 테이블을 특정한 블록에 저장하고 디렉토리에는 파일의 인덱스 블록의 주소를 갖고있다. 즉 인덱스 블록은 포인터의 모음이며 하나의 파일당 하나씩 갖고있다.

데이터가 들어있는것은 데이터블록 주소가 들어있는것은 인덱스 블록이며 파일 하나당 인덱스 블록이 필요하다.
Direct access 가능하고 외부 단편화 없다.

인덱스 블록을 위해 블록을 할당해야 하는것이 단점이다. 1바이트 짜리를 저장하는데도 블록의 크기만큼(예를들었을 경우 1kb)만큼 할당해줘야 한다.

파일의 최대크기: 1블록의 크기가 512바이트라 가정해보자. 주소를 표현하는데는 4바이트 이므로 128개의 인덱스를 갖을 수 있다. 여기서 512바이트 * 128을 계산하면 64kb이다. 즉 파일의 최대 크기는 64kb이다.

예제: 1블록 = 1KB = 4바이트 x 256개 인덱스
즉 256 * 1KB = 256KB

해결방법1: Linked : 이를 개선하기 위해 인덱스를 갖는 블록이 다른 인덱스 블록을 가르키는것.

해결방법2: Multilevel index : 하나의 인덱스 블록이 여러개의 인덱스 블록을 가르키는것.

해결방법3: Combined : 처음 인덱스 블록에서 앞쪽은 실제로 데이터를 가르키고 나머지 블록은 인덱스 블록을 가르키고..이는 유닉스에서 쓰임..

디스크 스케줄링.

대표적인 보조기억장치는 하드디스크이다. 디스크는 원판에 트랙이 있고 디스크를 움직여서 해당되는 트랙으로 이동한다. 제일 오래 걸리는 시간이 헤더를 움직이는 Seek time이 오래걸린다, 디스크가 도는 시간은 rotational delay(1분에 7200번돈다) 트랙이 헤더를 지나가면서 읽히는 시간이 transfer time이라 한다.

다중 프로그래밍 환경에서 여러개의 프로세스가 동시에 돌아간다. 여러프로세스가 디스크를 사용하려면 디스크 큐에 들어가야한다. 이때 어떻게 하면 탐색시간 즉 디스크 헤더를 가장 적게 움직일 수 있을까…

디스크 스케줄링 1. FCFS

먼저온놈한테 먼저 서비스를 제공.
200 cylinder disk, 0 .. 199
Disk queue: 98 183 37 122 14 124 65 67
Head is currently at cylinder 53
Total head movement = 640 cylinders

극혐이다,….

디스크 스케줄링 2. SSTF

Shortest-Seek-Time-First 의 약어로서 최소화 되는것을 먼저하는것.

즉 지금위치를 기준으로 했을 때 가장 짧은곳을 먼저 가는것.
200 cylinder disk, 0 .. 199
Disk queue: 98 183 37 122 14 124 65 67
Head is currently at cylinder 53
Total head movement = 236 cylinders

Share