Computer Science/컴퓨터 구조 (Computer Architecture) 17

CS:APP | Chapter 1 | 컴퓨터 시스템 overview

CSAPP 1장의 각 소단원을 읽으면서 주요 내용과 추가적으로 알아본 정보들을 기록하는 포스팅😎 1장은 컴퓨터 시스템 전반을 얕고 넓게 훑는 챕터이다. 글자색이 다른 부분은 내가 따로 추가한 생각 혹은 정보이다 (= 틀릴 수도 있다) 1.1 정보는 비트와 컨텍스트로 이루어진다 소스 프로그램은 byte(= 8 bit) 단위로 구성된다. 대부분의 컴퓨터 시스템은 text 문자를 아스키 표준을 사용하여 표시한다. 아스키 표준은 각 문자를 byte 길이의 정수 값으로 나타낸다. 텍스트 파일: hello.c 처럼 아스키 문자들로만 이루어진 파일 바이너리 파일: 텍스트 파일을 제외한 다른 모든 파일 컨텍스트(context) 모든 시스템 내부의 정보는 bit들로 표시됨. 서로 다른 객체들을 구분하는 유일한 방법은 이..

[혼공컴운] Ch4. CPU의 작동 원리 (레지스터)

레지스터 레지스터는 CPU 내부의 작은 임시저장장치. 프로그램 속 명령어와 데이터는 실행 전후로 레지스터에 저장된다 레지스터는 앞선 ALU와 제어장치 대비 프로그래머 입장에서 더 중요하다. 우리가 개발하고 실행하는 것이 명령어, 데이터이기 때문이다. 우리는 레지스터에 담긴 값들을 관찰할 수 있다. 업무상으로도 레지스터에 담긴 값을 관찰할 일이 생각보다 많다. 로우레벨(시스템, 임베디드, 해킹 등) 개발자들은 더더욱 많다. 레지스터의 종류 CPU 내부에는 다양한 종류의 레지스터가 있고, 각각의 역할이 있다 (CPU마다 레지스터 종류와 이름이 다르기에, 일단 공통적인 것들을 일반화해서 알아두자) 프로그램 카운터 (명령어 포인터, Instruction Pointer) 메모리에서 읽어들일 명령어의 주소를 저장한..

[혼공컴운] Ch4. CPU의 작동 원리 (ALU, 제어장치)

ALU와 제어장치 CPU는 ALU, 제어장치, 여러개의 레지스터 로 이루어져 있다. ALU: 계산하는 장치 (산술논리 장치) 제어장치: 제어 신호를 발생시키고 명령어를 해석하는 장치 ALU (산술논리 장치, Arithmetic logic unit) (해당 강의에서는 다루지 않으나, ALU 안에는 가산기, 검출기 등 다양한 회로가 있다.) ALU가 받는 정보 (input to ALU) 계산을 하기 위해서는 피연산자와 수행할 연산이 필요하다 2 + 1 을 수행하라 → 2와 1은 피연산자이고, +는 수행할 연산(연산자)이다 피연산자는 레지스터에서 받아들이고, 수행할 연산은 제어장치로부터 제어신호로써 받아들이게 된다 ALU가 내보내는 정보 (output from ALU) 1. 연산 결과 binary 형태의 연산..

[혼공컴운] Ch3. 명령어 주소 지정 방식

명령어 주소 지정 방식 오퍼랜드 필드에 레지스터가 담길 수도 있고, 메모리 주소가 담길 수도 있고, 데이터가 직접 담길 수도 있다. CPU 입장에서는 연산에 사용될 데이터가 메모리 주소에 있든, 레지스터에 있든, 아니면 명령어에 직접적으로 명시되어 있든 연산에 사용될 데이터들을 빠르게 찾아 실행시킬 수 있어야 한다. '어떻게 해야 CPU가 데이터를 빠르게 찾을 수 있을까?' 에 대한 방법이 명령어 주소 지정 방식이다. 명령어 주소 지정 방식 (Addressing modes) - 연산에 사용할 데이터가 저장된 위치를 찾는 방법 - 유효 주소를 찾는 방법 - 다양한 명령어 주소 지정 방식들 즉시 주소 지정 방식 (Immediate addressing mode) 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명..

[혼공컴운] Ch3. 명령어, 컴파일

고급 언어와 저급 언어 고급 언어: 개발자가 이해하기 쉽게 만든 언어 C, C++, 파이썬, 자바, 자바스크립트 등 저급 언어: 컴퓨터가 이해하고 실행하는 언어 기계어: 0과 1로 이루어짐 어셈블리어: 기계어를 사람이 이해하기 편하도록 만듦 컴파일 언어와 인터프리트 언어 고급 언어 → 저급 언어 변환 과정 컴파일 인터프리트 고급 언어는 변환 방식에 따라 컴파일 언어 혹은 인터프리터 언어로 구분된다. 그러나 칼로 무 자르듯 딱 나뉘는 것은 아니고(파이썬은 A, 자바는 B ..), 그냥 컴파일 방식과 인터프리터 방식 두 가지가 있다고 이해하는 편이 낫다 컴파일 언어 고급 언어(소스 코드) → 컴파일(컴파일러) → 저급 언어(목적 코드) 작성된 소스 코드는 컴파일러에 의해 저급 언어로 변환되고(컴파일), 컴파..

[혼공컴운] Ch2. 데이터

1. 이진법 컴퓨터는 Binary만 이해 가능. 전기가 들어온 경우 vs 안 들어온 경우 이진법으로 음수를 표현하는 방법 2의 보수법: 음수를 표현하는 대표적인 방법 (보수: 보충해 주는 수) 현재의 숫자에서 자릿수가 1단계 올라갈 수 있는 수가 몇인지를 구하면 된다. 어떤 수를 그보다 큰 2^n에서 뺀 값 2의 보수 쉽게 구하는 법: 모든 0과 1을 뒤집고 1을 더한 값 Q1. 왜 2의 보수가 음수인가요? B가 A의 음수라면, -B 는 -(-A), 즉 A이겠지? 2의 보수로 구한 값의 보수를 또 구하면 제자리로 돌아오기 때문에, 음수를 표현하는 최적의 방법이다. Q2. 어떠한 이진수를 봤을 때 그게 음수인지 양수인지 어떻게 구별하죠? 예를 들어, -(1011)을 표현하기 위한 0101과 십진수 5를 표..

[혼공컴운] Ch1. 컴퓨터 구조 개괄

1. 컴퓨터 구조를 알아야 하는 이유 좋은 개발자가 되기 위해서는, 프로그래밍 언어의 문법과 함께 컴퓨터의 근간을 알아야 한다. 이를 알아야 문제해결 능력이 향상되고, 성능/용량/비용을 고려한 개발을 할 수 있기 때문이다. 1) 문제해결능력 컴퓨터구조에 대한 이해는 프로그래밍 언어의 문법만으로는 해결하기 어려운 문제들을 해결할 수 있도록 돕는다. 분명 코드는 제대로 작성했는데 동작하지 않는 경우가 있다. 내 개발환경에서는 문제없이 돌아갔는데 실제 사용자들에겐 오류가 뜨는 것이다. 이런 케이스는 문법 오류가 원인이 아니다. 여기서 더 나아가지 못하는 개발자가 있고, ‘한 번 들여다 봐야겠다!’ 하고 컴퓨터 내부를 거리낌없이 들여다 보는 개발자가 있다. 좋은 개발자는 컴퓨터를 미지의 대상으로 여기지 않고, ..