프로그래밍언어론

아키텍쳐 - 1

winwin-k9 2023. 4. 14. 02:09

메모리 계층 구조

메모리 크기는 레지스터에 있는 주소의 크기로 결정된다.

32비트 기계: 4GB
64비트 기계: 제곱만큼 가능

메모리가 커지면서 같은 칩 내부에 다 들어갈 수 없다. CPU속도가 메모리 접근속도 보다 훨씬 빠르게 발전하고 있다.

레지스터의 구조
레지스터는 가장빠른 메모리로서 지연시간 없이 접근이 가능하다.
레시스터는 저장소로 이용되고나 다른 특수 목적으로써 이용될 수 도 있다.

  • 백터 계산용 큰 레지스터
  • PC, fp
  • 직전 계산 셜과 상태값 또는 overflow의 여부를 나타내는 상태 레지스터

레지스터의 값을 메모리로 내보냈다가 다시 읽어오는 일을 최소화 하기 위한 방식으로 레지스터를 사용한다.

캐시

캐시는 하드웨어에 의해 관리된다.
1차 캐시와 메모리 캐시가 있는데, 기계에 따라 on chip캐시를 여러개 두기도 한다.
캐시의 운영 정책은 HW가 결정한다.
명령문의 데이터 접근이 캐시에 없으면 캐시미스, 내보낼 캐시 블록을 정해 수정된 경우 메모리에 저장하고 새로 접근할 부분을 가져온다.

데이터 접근 단위는 byte, word, double-word, quad-word단위로, 최근 기계는 대부분 4바이트(word)단위로 데이터를 접근한다.

버스가 word단위로 전달되기 때문에 4바이트로 표현하는 것이 효율적
명령문 내에서 offset으로 주소를 표현하기 때문에 2비트를 절약할 수 있다.

메모리 갭
프로세서의 속도와 메모리로 접근할때의 속도 차이가 매우 크다.
따라서 메모리로 접근할때 대기하는 시간이 있기 때문에 매우 비효율적이다.
따라서 레지스터의 활용이 중요해 지는데, 컴파일러가 최적화 단계에서 레지스터의 할당을 조절한다.

또한 하드웨어적으로 데이터 접근을 지역적으로 하기위한 알고리즘을 구성하여 캐싱 효율을 개선한다.

데이터 표현

Big endian

word단위로 주소를 올라가는 방향으로 할당한다.

워드에서 37을 바이트 변환시 첫번째 바이트가 0이 올라온다.

변환시 뒤의 비어있는 bit를 가져와야 하기 때문에 이것이 문제가 된다.

Little endian

word단위로 주고가 내려가는 방향으로 할당한다.

Big endian의 빈 bit을 가져와야 하는 문제점이 사라지지만, 사람이 이해하기 어렵다는 단점이 있다.

칩별로 리틀, 빅 엔디안 방식이 다르며 OS가 결정하도록 하는 방식도 있다.

정수 표현

정수표현은 signed와 unsigned가 있다.
signed는 signed끼리만 더하고, unsigned는 unsigned끼리만 더하는 등 다른 명령문 세트가 지원된다.
언어에서 지원하지 않아도 주소계산때문에 unsigned가 필요하다.

 

Signed의 표현
Signed는 부호 한비트로 표현한다.
2의 보수 방식으로 양수는 unsigned는와 같고(양수는 앞이 0), 음수는 앞이 1이다.
더하기빼기 연산을 음수 양수에 같이 적용 가능하다.

 

부동소수점

부동소수점이란 실수를 컴퓨터 상에서 근사하여 표현할 때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것으로, 유효숫자를 나타내는 가수와 소수점의 위치를 풀이하는 지수로 나누어 표현한다.
사인(s, 1bit), 지수부(exponent, 8bit), 가수부(significant, 23bit)가 존재.

 

 

 

 

부동소수점 변환 예시

숫자 -314.625를 IEEE 754 부동소수점 방식으로 표현해 보겠습니다.

 

부호부

첫번째로 부호를 확인합니다.

부호가 음수이므로 32비트의 가장 앞자리는 1이 됩니다.

가수부

두번째로 숫자의 절대값을 2진수로 표현합니다.

314.625는 2진수 100111010.101 (2) 가 됩니다.

이 2진수의 소수점을 아래와 같이 왼쪽으로 이동시켜서 소수점 왼쪽에 1만 남도록 합니다.

 
 

이제 2진수 100111010.101 (2) 를 아래와 같이 표현할 수 있는데, 이 방식을 정규화된 표현 방식이라고 합니다.

 
 

그리고 소수점의 오른쪽 부분 00111010101을 가수부 23비트의 앞에서부터 채워줍니다.

남는 자리는 0으로 채워줍니다.

 
 
 
 

지수부

이제 지수부를 채울 차례입니다.

지수는 8입니다.

지수 8에 bias인 127을 더해줍니다. (bias는 2 k-1 로 주어지는데 k는 지수부의 비트수 8입니다.)

아래와 같이 8에 bias를 더한 135를 2진수로 변환합니다.

 
 

변환한 2진수 10000111 (2) 을 8비트 지수부에 채워줍니다.

 
 
 

위와 같은 과정을 통해 숫자 -314.625를 32비트 단정도 부동소수점 방식으로 표현하면 11000011100111010101000000000000가 됩니다.

728x90