[읽을거리] 하드 디스크 동작 원리

예전에 궁금해서 찾아 긁어두었던 내용입니다.
어디를 봐도 출처가 안 적혀 있어서 올리기 심히 난감합니다만, 어쨌건 하드 정리하는 김에 올려둡니다. –;;;

=============================================================

하드디스크의 주요 구조를 나누어보면 플래터와 헤드, 스핀들모터와 헤드암, 회로기판등으로 나눌수 있다.

플래터는 자상체를 입힌 금속 원판으로 자료를 여기에 기록한다. 이런 플래터를 여러장 축에 꽂아서 돌리는데 이때의 축이 스핀들 축이고, 이 축을 돌리는 모터가 스핀들 모터이다. 그리고 플래터에 자료를 읽고 쓰는 헤드는 헤드암에 연결되어 있으며 헤드암을 이동시켜 헤드가 원하는 주소로 움직이게 해주는 역할을 한다. 이 헤드암은 엑츄에이터(Actuator)라고도 하며 이것을 구동하는 것은 VCM(Voice Coil Motor)이다.

헤드는 플래터의 앞뒷면을 모두 사용하므로 플래터 한 장당 두 개의 헤드가 필요하며 또한 최근의 하드들은 속도 향상을 위해 쓰기 헤드와 읽기 헤드가 따로 있어 엄밀히 말하면 플래터 한 장당 헤드가 4개가 있다고 할 수 있다.

또한 하드디스크의 속도는 헤드를 이동시키는 VCM과 스핀들 모터와 상관관계가 좀 있다고 할 수 있으나 회전수가 빠르다고 하드의 동작속도가 무조건 빠르다고는 할 수 없다. 오히려 하드내에서 동작하는 Buffer와 그 Buffer를 얼마나 optimize된 코드로 작동시키느냐가 더 관건일 수 있다.

하드는 명령을 받으면 읽기/쓰기 헤드를 엑츄에이터의 동작으로 플래터 위로 이동시킨다. 이때 플래터는 스핀들 축을 중심으로 고속으로 회전한다. 보통 초당 90~120회의 고속으로 회전한다. 플래터가 회전하는 동안 읽기/쓰기 헤드는 앞뒤로 움직이면서 자기가 있어야 할 위치를 찾아 이동한다. 헤드는 위에서 말한 것처럼 헤드암에 연결되어 있으며 이 헤드암이 원하는 데이터가 있는 트랙으로 Seek를 하여 데이터를 읽고 쓰는 것이다. 읽거나 쓰는 순간에 플래터 즉 디스크에 자장을 파악해 전기 신호인 0과 1을 파악하게 되는 것이다. 반대로 쓰는 경우엔 데이터를 0과 1로 변환하여 플래터에 기록하게 된다. 물론 데이터를 단순히 0과1로 변환하여 쓰는 것은 아니고 중간에 데이터를 효율적으로 압축하여 즉 Encoding하여 쓰고 읽을 때는 다시 Decoding하여 읽어와 Host에 전달하게 되는 것이다.

헤드는 플래터 표면에 배열된 자기입자의 자기 극성을 읽음으로써 데이터를 읽어 들인다. 그러다가 데이터를 기록하라는 명령이 내려지면 헤드는 자기장을 이용해서 플래터 표면의 자성입자에 자기를 다시 배열해 줌으로써 데이터를 기록하게 되는 것이다. 이때 기록하는 방법은 N극 또는 S극의 자기장 형태로 자성입자의 배열을 바꿈으로 기록하는 것이다. 그리고 이를 읽어 들이면서 N극과 S극의 자료는 0과 1의 디지털 신호로 바뀌어 Host로 전송되는 것이다. 디스크에 기록되어지고 지워지는 모든 파일에 관한 정보는 플로피와 마찬가지로 FAT(File Allocation Table)라는 파일 할당 테이블이라는 파일 목록 정리 공간에 잘 정리 되어 기록 되어 진다. 이 FAT는 HDD의 맨 앞 부분에 위치하게 된다.

하드디스크는 플로피와 달리 쉬지 않고 돌아간다. 물론 장시간 사용치 않을 경우엔 HDD 내부에서 Stanby Mode로 들어가서 스핀들을 멈추게 하는 기능은 있다.

어쨌든 플로피는 디스크를 읽을 때만 돌리지만 하드는 쉬다가 돌 경우에 플래터를 돌려서 안정된 속도가 나오기까지의 시간도 꽤 큰 시간으로 간주되어 낭비되기 때문에 좀 더 빠른 속도를 구현하기 위하여 항상 플래터를 돌리고 있는 것이다. 이런 이유 때문에 하드가 많은 열을 내는 이유이기도 하다.

Seek Time, 소위 하드디스크의 데이터 전송 시간은 탐색속도, 헤드 활동 시간, 회전 지연시간, 전송시간을 합한 시간이다. 탐색속도는 헤드암이 해당 실린더로 이동하는 시간을 말하고 헤드활동시간은 데이터가 저장된 트랙을 선택하기까지의 시간이다. 회전지연 시간인 Latency Time은 헤드가 원하는 섹터 위에 위치할 때까지 회전하는 시간을 뜻하며, 읽은 데이터를 메모리로 전송하는데도 시간이 걸린다.

플래터와 헤드는 동작중에는 떨어져 있는데 이 거리는 비행기가 지상 10미터 위에서 나는 것과 비유되기도 한다. 그정도로 간격이 좁다는 것이다. 어쨌든 중요한 것은 플래터와 헤드가 붙어 동작하는 것이 아니라는 것이다.

보통 이 사이는 천만분의 1인치 정도이며 제품에 따라서는 이천만분의 1도 안되는 것이 있다. 이처럼 정밀한 장비이기 때문에 먼지 하나도 치명적인 오류를 일으키는 원인이 될 수 있는 것이다. 때문에 하드디스크는 일반적인 부품과는 달리 반도체 생산라인처럼 청정실(Clean Room)에서 작업을 하고 밀봉을 하게 되는 것이다. 이때 청정실의 청정도는 클래스 100이하의 작업실이어야 한다. 이 말은 1평방 피트에 먼지(0.5마이크론 기준)입자가 100개 이하인 곳이어야 한다는 것이다.

그래서 하드디스크를 보면 스티커 같은 것이 붙어 있고 그 스티커를 떼면 A/S가 안된다고 되어 있는 것을 본 적이 있을 것이다. 이것은 그것을 떼어낼 경우 먼지가 하드내부에 들어가게 되고 먼지가 들어가면 하드는 정상적인 동작을 할 수 없기 때문이다.

예전의 하드디스크는 파워를 끄기전에 파킹프로그램을 이용하여 파킹을 해야만 했다. 이 파킹을 하는 이유는 간단하다. 예전처럼 오토 파킹이 되지 않았을 때는 하드가 동작하다가 파워를 끄는 경우에는 데이터가 있는 그 자리에 헤드가 착륙을 하게 된다. 그러면 다시 파워를 넣을 때 헤드가 부상하기 전까지는 플래터와 마찰을 하게 되어 그 부분에 문제가 생길수도 있게 되는 것이다. 또한 이 상태로 운반을 하다가 미세한 충격이 있더라도 데이터 저장부분에 이상이 생길수도 있는 것이다. 그래서 파킹이라는 것이 필요하게 되는 것이다.

그렇다면 요즘의 하드는 모두 오토파킹이 되는데 전원을 끄는데 어떻게 무슨힘으로 파킹을 할 수 있을까 궁금증이 생길 것이다.

전원이 꺼진 상태에서 헤드를 파킹존까지 이동시키는 것은 바로 스핀들모터의 회전력에서 발생하는 전력을 이용하게 된다. 비록 전기가 끊어졌지만 관성에 의하여 스핀들 모터는 한동안 회전하게 되는데 이때 스핀들 모터의 회전은 발전기의 역할을 할 수 있으므로 헤드를 파킹존으로 보낼수 있는 동력을 확보하는 것이다. 이는 자동차나 자전거가 달리는 동안 발생하는 운동에너지를 전기에너지로 바꾸어 충전하거나 전구를 밝히는 원리와 같은 것이다.

그리고 이 파킹존에 헤드가 들어 오면 헤드는 일정한 힘으로 떨어지지 않게 힘이 작용하고 있어 위와 같이 운반시 헤드가 흔들리지 않도록 하고 잇다. 그리고 이 파킹존은 데이터 영역과는 달리 레이저로 미세한 구멍이 뚤어져 있어 하드가 처음 동작시에 마찰에 의해 잘 동작되지 않는 것을 막도록 해 놓았으며 일정한 힘으로 잠겨져 있는 헤드는 헤드암에 이 잠겨진 힘보다 더 큰 힘의 전류를 흘려 헤드가 잠겨진 상태에서 벗어나게 하는 것이다.

즐겨찾기 추가 버튼

<script language=”JavaScript1.2″>
var favoriteurl=”http://www.happylinuxing.com”
var favoritetitle=”해피리눅싱”
function addfavorites(){
if (document.all)
window.external.AddFavorite(favoriteurl,favoritetitle)}
</script>

<a href=”javascript:addfavorites(“>즐겨찾기추가</a>

주민번호 앞자리 다치면 자동으로 다음으로 포커스 이동

text 필드에 maxLength를 체크하여 지정된 곳으로 focus 를 이동시킨다.

<script language=”javascript”>
function moveNext(varControl, varNext)
{
if(varControl.value.length == varControl.maxLength)
{
varNext.focus();
varNext.select();
}
}
</script>
<form>
<input type=”text” name=”jumin1″ size=”6″ maxlength=”6″ OnKeyUp=”moveNext(this, jumin2);”>
<input type=”text” name=”jumin2″ size=”7″ maxlength=”7″ OnKeyUp=”moveNext(this, jumin1);”>
</form>