티스토리 뷰
CS:APP Ch02. Representing and Manipulating Information - 1
초리 2021. 3. 30. 17:212.1 Information Storage
대부분의 컴퓨터는 메모리의 개별 비트를 접근하기 보다는 8비트, 혹은 바이트(byte) 단위로 접근한다.
기계 수준(machine-level) 프로그램은 (가상) 메모리를매우 큰 바이트 배열로 본다.
메모리의 모든 바이트는 주소(address)라고 불리는 유일한 번호로 식별되고, 주소들의 집합을 가상 주소 공간이라고 한다.
어떻게 컴파일러와 런타임 시스템이 다른 프로그램 오브젝트를 저장하는 메모리 공간을 관리할 수 있는 단위로 나눌 수 있는 가를 공부한다.
2.1.1 Hexadecimal Notation
한 단일 바이트는 8비트이다. 이진수로 00000000 ~ 11111111의 범위를 갖는다. (Decimal : 0 ~ 255)
이진수는 장황하고 복잡하기 때문에 16진수(Hexadceimal, hex)를 사용한다.
16진수는 00 ~ FF의 범위를 갖는다. (1 ~ 9, A ~ F)
C에서 0x나 0X로 시작하는 숫자는 16진수이다. ex) FA1D37B -> 0xfa1d378 or 0XFA1D37B
기계 수준 프로그램을 다루는 일반적인 작업은 10진수, 2진수, 16진수 사이를 수동적으로 변환하는 것이다.
2.1.2 Data Sizes
모든 컴퓨터는 포인터 값의 명목상의 크기인 워드(word) 크기를 가지고 있다.
가상 주소는 워드에 의해 인코딩되기 때문에, 워드 크기에 의해 결정되는 가장 중요한 시스템 파라미터는 가상 주소 공간의 최대 크기이다.
w-비트 사이즈의 기계에 대해서, 가상 주소는 0부터 2^w - 1의 범위를 다룰 수 있다.
최근에는 32비트에서 64비트 컴퓨터로 많이 바뀌었다.
32비트 워드 사이즈는 가상 주소 공간에 4GB로 제한을 해놨고, 64비트는 16 엑사바이트로 제한된다.
컴퓨터와 컴파일러는 정수나 부동 소수점(floating point)와 같은 데이터를 인코딩하기 위해 다른 방법을 사용하여 다양한 데이터 형태를 지원한다. C언어는 정수와 부동 소수점에 대한 다양한 데이터 형태를 지원한다.
부호가 없으면 대부분의 자료형은 signed 값이다. char는 예외다.
프로그래머는 1바이트 signed 값을 보증하기 위해 [signed] char을 사용해야 하지만 대부분 무감각적이다.
프로그래머는 다른 기계와 컴파일러를 아우르어 이식할 수 있도록 프로그램을 만들어야 한다.
2.1.3 Addressing and Byte Ordering
바이트를 다루는 프로그램 오브젝트에 대해서, 두 가지 관습을 지켜야 한다
- 오브젝트의 주소가 어떻게 되는 지
- 메모리에 어떻게 바이트들을 정렬할 지
모든 가상적인 기계에서 멀티 바이트는 인접한 바이트 시퀀스로 저장된다.
예를 들어, int x는 0x100의 주소를 갖는다. (이는 &x가 0x100)
x의 4바이트는 메모리 위치 0x100, 0x101, 0x102, 0x103에 저장된다.
오브젝트를 표현하는 데 바이트를 정렬하는 것에는 두 가지 관습이 있다.
어떤 기계는 최하위 바이트부터 최상위로 정렬하거나, 반대로 최상위부터 최하위 바이트로 정렬한다.
최하위 바이트부터 정렬하는 것을 리틀 엔디언(Little endian), 최상위 바이트부터 정렬하는 것을 빅 엔디언(Big endian)이라고 한다.
주소가 0x100에 있는 int 형의 x변수의 16진수 값이 0x1234567이라고 하면, 다음 사진과 같이 리틀 & 빅 엔디언으로 정렬할 수 있다.
대부분의 인텔 호환 기계들은 리틀 엔디언이며 IBM이나 오라클은 빅 엔디언 모드를 사용한다.
ARM 마이크로프로세서는 리틀과 빅 엔디언을 사용할 수 있지만 안드로이드나 iOS는 리틀 엔디언으로 작동된다.
대부분의 애플리케이션 프로그래머들에게 바이트 정렬은 보이지 않는다. 그러나 가끔씩 바이트 정렬이 문제가 될 때가 있다.
- 이진 데이터가 다른 네트워크에 있는 다른 기계와 소통할 때 (리틀 --> 빅)
- 정수 데이터를 나타내는 바이트 시퀀스를 볼 때
- 일반적인 타입 시스템을 우회해서 프로그램이 작성되었을 때
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void *x) {
show_bytes((byte_pointer) &x, sizeof(void *));
}
void test_show_bytes(int val) {
int ival = val;
float fval = (float) ival;
int *pval = &ival;
show_int(ival);
show_float(fval);
show_pointer(pval);
}
위 코드를 통해 다른 프로그램 오브젝트에 대한 바이트 표현 출력하고 캐스팅(casting)을 사용할 수 있다는 것을 볼 수 있다.
int와 float의 결과는 동일하지만 바이트 정렬이 다를 수 있고, 포인터 값은 기계에 따라 다르다.
2.1.4 Representing Strings
C에서 문자열은 null 문자로 끝나는 문자의 배열이다.
각 문자는 ASCII 문자 코드 기준에 의해 인코딩되어 표현된다.
예를 들어, "12345"의 문자열을 위의 show_bytes함수를 통해 표현하면 31 32 33 34 35 00이 나타난다.
ASCII 기준에 십진수 a는 0x3a로 시작하고 null 문자인 0x00으로 종료된다.
2.1.5 Representing Code
다른 기계 타입은 다른 명령문과 인코딩을 사용한다.
다른 운영체제에서 실행되고 있는 같은 프로세서조차도 코딩 관습이 달라서 바이너리와 호환되지 않는다.
기계의 관점에서 컴퓨터 시스템의 기본적인 개념은 바이트 시퀀스이다.
2.1.6 Introduction to Boolean Algebra
이진 값은 컴퓨터가 어떻게 인코딩하는지, 정보를 처리하는지에 대한 핵심이기 때문에 0과 1값에 대한 수학적 지식이 발전했다.
부울 대수는 두 원소로 구성된 집합 {0, 1}로 정의된다.
부울 연산 중 ~ 는 NOT으로 대응되며, ¬ 기호로 표기된다.
& 는 AND 연산이며, ∧ 기호로 표기되며, | 연산은 OR 연산이며 ∨기호로 표기된다.
^ 연산은 XOR 연산이며, ⊕ 기호로 표기된다.
위 네 가지의 부울 연산은 비트 벡터(bit vector)에도 적용된다.
비트 벡터은 유한 집합(finite set)을 표현하는데 유용하다.
2.1.7 Bit-Level Operations in C
C에서 가장 유용한 특징 중 하나는 비트와 관련된 부울 연산을 지원한다는 것이다.
|, &, ^, ~ 연산은 필수적인 데이터 타입에 적용된다.
2.1.8 Logical Operations in C
C는 논리 연산자인 ||, &&, ! 들을 지원한다. 이것은 비트 수준의 연산과 사뭇 다르다.
논리 연산에서는 0이 아닌 수에는 TRUE를 0은 FALSE를 반환한다.
논리 연산자인 &&, ||와 비트 연산자인 &, |의 또 다른 구별점은 논리 연산자에서 표현식의 첫 번째 변수에 대한 값을 확인할 수 있으면
두 번째 변수 값은 평가하지 않는다.
2.1.9 Shift Operations in C
C는 또한 비트 패턴을 왼쪽이나 오른쪽으로 시프트(shift)하는 것을 지원해준다.
x << k이면 x를 k비트만큼 왼쪽으로 이동한다. k의 최상위 비트는 떨구고 오른쪽 끝을 k만큼 0으로 채운다.
오른쪽 시프트는 x >> k이며 두 가지 형태로 지원한다. (논리적, 산술적)
'Computer Science > Computer Architecture' 카테고리의 다른 글
CS:APP Ch02. Representing and Manipulating Information - 3 (0) | 2021.04.01 |
---|---|
CS:APP Ch02. Representing and Manipulating Information - 2 (0) | 2021.03.31 |
CS:APP Ch01. A Tour of Computer Systems - 3 (0) | 2021.03.27 |
CS:APP Ch01. A Tour of Computer Systems - 2 (0) | 2021.03.27 |
CS:APP Ch01. A Tour of Computer Systems - 1 (0) | 2021.03.26 |