티스토리 뷰

Study/OS

[OS] Mint64OS 22절 실수 연산

생각많은 소심남 2013. 1. 30. 19:35

지금까지는 순전히 정수만 다뤘다. 사실 메모리의 비트도 하나하나가 정수이고, 거기에 메모리를 이동할 때도 비트연산만 했기 때문에 실질적으로 실수를 다룰 일은 거의 없었다. 하지만 컴퓨터의 원래 목적은 실험의 데이터를 뽑아내는데 있었고, 이때는 정확성 측면에서 실수가 필요하다. 물론 요즘에 와서는 실수 연산을 필요로 하는 프로그램은 적어졌지만, 그때의 그 흔적이 프로세서에 남아있는데 이걸 FPU(Floating Point Unit) 라고 한다. 흔히 부동소수점 연산기라 불리는데 과거에는 x87 coprocessor라는 이런 실수 연산에 특화된 장치를 현재의 프로세서에 이식되어 있다.

 일단 프로세서가 주로 하는 일은 연산이다. 연산을 하기위해서는 당연히 인자가 필요할 것이고, 이 인자를 계속 가지고 있을 그릇이 필요하다. 보통 이 인자들을 General Purpose Register안에다가 집어넣고 필요할 때 꺼내서 형태를 취했는데, 지금까지 다룬 것처럼 정수만을 다뤘기 때문에 실질적으로 실수 연산을 하기 위해서는 실수를 담기 위한 FPU Register가 필요하다. 물론 이밖에도 추가적으로 MMX(Multimedia Extension)이나 XMM register가 필요하다.

컴퓨터의 실수 연산을 가장 간단하게 테스트 해볼 수 있는 것이 바로 원주율 계산이다. 원주율은 무리수이며 아마 현재까지 구한 원주율의 자리수는 1조 자리였던 것으로 기억한다. 아무튼 그만큼 컴퓨터의 성능을 극도로 테스트 해볼 수 있는 연산이며, 일반 사용자는 Super PI 라는 프로그램을 통해서 테스트를 해볼 수 있다.

당연히 실수 연산을 처리하기 위해서는 하나의 task로 올려야 하며, 물론 그와중에 있을 task Switch에 대비하여 Context를 저장해야 한다. 또한 FPU의 사용 빈도에 따라서 처리 흐름이 달라지기 때문에 구현상에서 이걸 구분해줄 수 있는 플래그가 필요하다. 책에서는 이걸 구현함과 동시에 실수 연산을 반복해서 테스트할 수 있는 100개의 task를 생성했다.



댓글