Fundamental of CS 26

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (3) 데이터의 형식

3.3  데이터의 형식   인텔 프로세서들이 처음에는 16비트 구조를 사용했기 때문에, 워드라는 단어를 16비트 데이터 타입을 말할 떄 사용한다. 32비트는 '더블워드' , 64비트는 '쿼드워드' 라고 부른다.       • 포인터 : 64bit 머신에선 예상대로 8byte 쿼드워드로 저장됨.      • 부동소수점 : x86계열에서 특별히 10byte 부동소수점 형식 연산을 구현하였으나, 호환성과 성능을 고려하여 이용하지 않는 것이 좋다.   여기서 주목할 점은, 포인터 char * 은 쿼드워드로 표현된다는 것 → 모든 포인터가 다 q로 표현된다.  이 데이터의 형식이 각 인스트럭션의 접미사로 붙여쓰이게 된다.  예를 들면 movb (바이트이동), movw (워드이동), movl (더블워드 이동), m..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (2) 프로그램의 인코딩

3.2  프로그램의 인코딩   GCC컴파일러를 통해 컴파일을 진행하면(커맨트 라인 옵션으로 -Og) 최적화 수준을 적용한다.  일반적으로 최적화 수준을 올리면 최종 프로그램은 더 빨리 동작하지만, 컴파일 시간이 증가하고 디버깅 도구를 실행하기 어려워질 위험이 있으며 만들어진 코드가 기존의 C코드에 비해 너무 많이 변경되어 본래 코드와 기계어 코드간의 관계를 이해하기 어렵게된다.   이러한 GCC 명령은 소스코드를 실행코드로 변환하기 위해 일련의 프로그램들을 호출한다. 앞서 1장에서 보았듯이, 전처리기, 컴파일러, 어셈블러, 링커까지 호출하게 된다.    3.2.1  기계수준 코드   컴퓨터 시스템은 보다 간단한 추상화 모델을 이용해서 세부구현내용은 감추며 추상화의 다른 형태를 사용하고 있다. 이들 중 "..

[CSAPP] Ch 3. 프로그램의 기계수준 표현 : (1) 역사적 관점

Ⅲ. 프로그램의 기계수준 표현   3.0  Intro   GNU GCC C 컴파일러는 어셈블리 코드의 형태로 출력을 만들어 프로그램의 각 인스트럭션을 만들어낸다.대개의 경우 고급 언어가 제공하는 추상화를 사용하는 것이 보다 더 생산적이고 안정적이다. 반면에 어셈블리 코드는컴퓨터 기계에 매우 의존적이기 때문에(회사마다 쓰는 어셈블리 셋이 약간씩 다르다) 컴퓨터 기계에 매우 의존적이라 할 수 있다. 특히 기계어 자체도 CPU가 채택하는 ISA(명령어셋)에 따라 다 다르기 때문에 어셈블리어의 명령어 역시 통일된 규격이 없다. 그렇다면 왜 어셈블리 코드를 알 면 좋을까?     1.  컴파일러의 최적화 성능을 알수있다.     2.  코드에 내재된 비효율성을 분석 가능하다.     3.  시스템의 취약성이 어떻..

[CSAPP] Ch 2. 정보의 표현과 처리 : (2) 정수의 표시

2.0 Intro 이 절에선 정수를 인코딩하기 위해 사용할 수 있는 두 가지 방법 (양수만 표시할 수 있는 방법과, 음수, 0, 양수 모두를 표시할 수 있는 방법) 에 대해 설명한다. 나중에 이들이 수학적 특성, Low-Level 수준을 볼 때 매우 연관되어있음을 알게 될 것이다. 그리고 인코딩된 정수를 다른 길이의 표현에 맞도록 조절하기 위해 확장하거나 축소하는 효과에 대해서도 살펴본다. 2.1 정수형 데이터 타입 2.1.1 C의 다양한 정수형 데이터 타입 아래 두 그림에는 전형적인 32bit와 64bit 프로그램들에서 이들이 갖는 값의 범위를 나타내었다. 각 타입은 unsigned로 선언되어 표시된 숫자가 모두 양수인지, 아니면 기본타입으로 음수도 나타낼 수 있는지 뿐만 아니라 키워드 char, sh..

[CSAPP] Ch 2. 정보의 표현과 처리 : (1) 정보의 저장

Ⅱ. 정보의 표현과 처리   2.0. Intro   현대의 컴퓨터는 두 개의 값을 갖는 신호로 표현되는 정보를 저장하고 처리한다. 이진수인 비트는 디지털 혁명의 근원인다. 이 비트들을 묶어서 가능한 다른 비트 패턴에 의미를 부여하도록 특정 해석방법을 적용하면(PCM), 어떤 유한집합의 원소들을 표시할 수 있게 된다.   이 장에서는 세 개의 가장 중요한 숫자 표현에 대해 살펴본다.    비부호형 인코딩 : 어떤 연산의 경우에는 그 결과값이 표시할 수 없을 정도로 커서 오버플로우를 발생시킬 수 있다.   2의 보수 인코딩 : 양수, 또는 음수값을 같는 부호형 정수를 표시하는 가장 일반적인 방법이다.    예상된 결과를 컴퓨터가 만들어 내지 않았을지는 몰라도, 적어도 일관된 결과를 만든다.   부동소수점 인..

The Stack : 인터럽트 메커니즘(Interrupt Mechanism)

0. Intro TRAP 명령어를 활용하면 운영체제의 코드에 해당하는 서비스 루틴을, JSR/JSRR 명령어를 활용하면 프로그래머가 직접 작성한 서브 루틴을 실행한 뒤 원래 프로그램의 실행 흐름으로 돌아온다. 그리고 둘 다 돌아올 때는 RET(= JMP R7) 명령어를 사용한다. 인터럽트 메커니즘도 어찌 보면 비슷할 수 있다. 외부 장치에 의해 인터럽트가 발생하면 그 장치가 요청한 인터럽트 서비스 루틴을 실행하러 잠시 어디론가 갔다가 다시 돌아오기 때문이다. 하지만 인터럽트 메커니즘은 TRAP 서비스 루틴 호출이나 JSR/JSRR 서브 루틴 호출과 그 방식이 아예 다르다. 인터럽트 메커니즘의 중요한 핵심은 해당 인터럽트 서비스 루틴에 갔다가 돌아왔다는 사실을 프로세서가 전혀 알지 못해야 한다는 것이며, ..

Trap Routines and Subroutines - 시스템 함수와 사용자 함수

0. Intro 인간의 뇌가 감당할 수 있는 복잡성에는 한계가 있기에, 인간은 여러 추상화 기법들을 발전시켜 나갔다. 대표적으로 데이터 추상화(Data Abstraction)와 함수 추상화(Functional Abstraction)가 있다. 데이터 추상화(Data Abstraction)는 현실에 존재하는 특정 객체의 복잡한 속성을 딱 필요한 것으로만 단순화하여 표현하는 것을 말한다. 가령 '학생'이라는 객체는 이름, 키, 나이, 학번 등의 속성으로 정의할 수 있다. 반면 함수 추상화(Functional Abstraction)는 자주 수행되는 특정 동작의 코드들을 하나의 뭉치(Segments)로 만들고, 필요할 때마다 그것을 재활용하는 것을 말한다. 그 코드 뭉치(Code Segments)를 컴퓨터 용어로..

IO - 입출력장치

0. Intro 우리는 지금까지 메모리에 올라가 있는 프로그램의 명령어들을 해석하고 실행하는 것과 관련한 내용들을 다루었다. 그러면 이제 다음 물음을 던져야 할 때이다. "메모리의 데이터는 어디에서 온 것일까??", "메모리의 데이터는 어떤 과정을 거쳐서 인간이 볼 수 있는 형태로 출력이 되는 것일까?" 이 물음에 대한 답은 바로 입출력(I/O) 장치에서 찾을 수 있다. 프로그램을 실행하는 것도 결국은 하드디스크라는 외부 장치로부터 프로그램 코드를 입력받아 메모리에 올리는 것으로 해석할 수 있다. 이번 포스팅에서는 그러한 입출력 장치에 대해 조금 더 자세히 알아보도록 할 것이다. 1. 입출력 장치 (Input and Output Device) 1-1. 장치의 분류 I/O 장치는 다음과 같이 대략 두 가지..

어셈블리어, 어셈블러 (Assembly Language)

이전엔 ISA에 대해 공부했고, 그 규칙을 이해하여 기계어를 코딩하면 CPU에게 원하는 동작을 수행시킬 수 있음을 알게 되었다. 그러나 0과 1만으로 직접 코딩을 하는 건 너무 불편했다. (오래 전 전산학 전공하신 분께서 천공 뚫는게 지겨워 그만두셨다는걸 힘껏 이해할 수 있었다.) 그래서 인간에게 조금 더 친숙한 형태로 어셈블리어(Assembly Language)가 고안이 되었고, 그 결과 프로그램 개발 속도가 혁신적으로 향상되었다. 어셈블리어는 저급 언어(Low-level Language)라고 부르기도 한다. CPU가 저급 언어로 작성된 프로그램을 이해해서 실행하려면 변환 과정이 필요하다. 저급 언어로 작성된 코드는 어셈블러(Assembler)라는 프로그램에 의해 CPU의 ISA 체계에 맞게 기계어로 ..

해시(Hash)

1. 해싱을 이용한 탐색 다양한 방법으로 구현한 맵의 최고성능은 시간 복잡도 O(logn)이다.그러나, 이보다 더 빠른 탐색시간을 갖는 해싱으로 맵을 구현하면 탐색 연산의 이론적인 시간 복잡도가 O(1)이 된다.   1.1 해싱이란?  해싱은 하나의 문자열을 보다 빨리 찾을 수 있도록 해시 함수에 문자열 입력값을 넣어, 주소에 직접 접근할 수 있는 짧은 길이의 값이나 키 특정한 값으로 추출하는 것을 의미한다.    문자열을 찾을 때, 키값의 문자를 일일이 비교하는 것이 아니라, 문자열에 산술적인 연산으로 해시 키를 계산하여 인덱스(항목이 저장된 위치)에 직접 문자열을 저장해 둔다면, 찾을 때는 한 번의 해시 키 계산만으로 도 쉽게 찾을 수 있게된다.이렇게 키값의 연산에 의해 직접 접근이 가능한 구조를 H..