저자 github
1주차
- Chapter 01 ~ 03
- 기본숙제: p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기
- 추가숙제: p. 100의 스택과 큐의 개념을 정리하기
01 컴퓨터 구조 시작하기
1-2 컴퓨터 구조의 큰 그림
1. 메모리: 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
2. CPU: 컴퓨터의 두뇌. 메모리에 저장된 명령어를 읽어 들이고, 읽어 드린 명령어를 해석하고, 실행함.
-
내부 구성 요소
- 산술논리연산장치(ALU, Arithmetic Logic Unit): 컴퓨터 내부에서 수행되는 대부분의 계산 수행. 위키(ko) 위키(en)
- 레지스터(register): 임시 저장 장치.
- 제어장치(CU, Control Unit): 제어 신호, control signal이라는 전기 신호를 내보내고 명령어를 해석하는 장치.
예컨대, CPU가 메모리에 저장된 값을 읽고 싶을 땐 메모리를 향해 메모리 읽기라는 제어 신호를 보낸다.
3. 보조기억장치
- 하드디스크, SSD, USB 메모리, CD-ROM
- 전원이 꺼져도 저장된 내용을 잃지 않음
4. 입출력장치
- 마이크, 스피커, 프린터, 마우스, 키보드 등
- 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
💡 보조기억장치는 관점에 따라 입출력장치의 일종으로 볼 수 있다.
5. 메인 보드와 시스템 버스
- 여러 컴퓨터 부품을 부착할 수 있는 슬롯과 연결 단자 있음
- 버스: 메인보드 내부 버스를 통해 메인보드에 연결된 부품들은 서로 정보를 주고받을 수 있음.
- 시스템버스: CPU, 메모리, 보조기억장치, 입출력 장치를 연결하는 가장 중요한 버스
- 주소 버스
- 데이터 버스: 명령어와 데이터
- 제어 버스
02 데이터
2-1 0과 1로 숫자를 표현하는 방법
✔️ [참고] Word란?
→ 64비트 워드 CPU
이름 | 비트 개수 |
---|
nibble | 4 |
byte | 8 |
half word | 16 |
word | 32 |
double word | 64 |
2의 보수(two's complement)
- 사전적인 의미: 어떤 수를 그보다 큰 2n에서 뺀 값
- 모든 이진수의 0과 1을 뒤집는다 → 거기에 1을 더한다.
- flag: 이진수만 봐서는 이게 음수인지 양수인지 구분하기가 어렵다. 그걸 컴퓨터가 이해하기 위한 부가 정보
16진수
모두를 위한 컴퓨터 과학(CS50 2019) [5.메모리] 참고
2-2 0과 1로 숫자를 표현하는 방법
🤔 pandas로 데이터 프레임을 읽거나 저장할 때, 가끔 만나는 인코딩 에러를 이해할 수 있어서 좋았다.
1. 아스키 코드
- ASCII(American Standard Code for Information Interchange)
- 초창기 문자 집합, 영어알파벳/아라비아 숫자/일부 특수 문자
- 7bit → 27, 128개의 문자
- 하나의 아스키 문자를 나타내기 위해 8비트를 사용합니다. 여기서 1비트는 party bit. 오류 검출을 위해 상ㅇ되는 비트(실제 문자 표현에는 사용되지 않음)
2. EUC-KR(한글 인코딩)
- 완성형 인코딩: 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 방식
- 한글 한 글자를 표현하려면 16bit가 필요
- 네 자리 십육진수로 나타낼 수 있다.
- 쀍, 쀓, 믜는 표현할 수 없다. → 모든 한글을 표현할 수 없다는 것 때문에 문제가 발생함. → 이 문제를 해결하려고 CP949(Code Page 949). 하지만, 한글을 모두 표현하지 못함.
3. 유니코드와 UTF-8
- 모든 언어를 아우르는 문자 집합과 통일된 표준 인코딩 방식
- 현재 제일 많이 사용함
- UTF = Unicode Trasformation Format
- UTF-8: 통상 1바이트부터 4바이트까지의 인코딩 결과
03 명령어
3-1 소스 코드와 명령어
3-2 명령어의 구조
- 이 부분은 이해가 잘 되지 않아서 지금은 보류!
연산 코드와 오퍼랜드
- 명령어: 연산코드와 오퍼랜드로 구성
연산 코드(operation code) | 오퍼랜드(operand) |
---|
연산 코드 필드 명령어가 수행할 연산 연산자 | 오퍼랜드 필드 연산에 사용할 데이터가 저장된 위치 피연산자 |
오퍼랜드(주소 필드)
- 연산에 사용할 데이터
- 연산에 사용할 데이터가 저장된 위치
- 숫자, 문자(연산에 사용할 데이터), 메모리, 레지스터 주소
연산 코드(operation code) | 오퍼랜드 | 오퍼랜드 | 설명 |
---|
mov | eax | 0 | 오퍼랜드가 2개, 2-주소 명령어 |
pop | rbq | | 오퍼랜드 1개, 1-주소 명령어 |
ret | | | 오퍼랜드 하나도 없음, 0-주소 명령어 |
연산코드
유형(CPU마다 종류와 생김새가 다름)
-
데이터 전송
-
산술/논리 연산
- ADD/SUBTRACT/MULTIPLY/DIVIDE
- INCREMENT/DECREMENT
- AND/OR/NOT
- COMPARE
-
제어 흐름 변경
- JUMP
- CONDITIONAL JUMP
- CALL
- RETURN
-
입출력 제어
- READ(INPUT)
- WRITE(OUTPUT)
- START IO
- TEST IO
주소 지정 방식
🤔 텍스트로 정리했지만, 그림으로 이해하기. 이름 자체로 이해해도 좋을 듯하다.
이 외의 주소 지정 방식은 4장에서 학습!
- 유효주소: 연산의 대상이 되는 데이터가 저장된 위치
- 즉시 주소 지정 방식(immadiate addressing mode): 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식. 표현할 수 있는 데이터의 크기가 작아지지만 이하 주소 지정 방식들보다 빠르다.
- 직접 주소 지정 방식(direct addressing mode): 오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식
- 간접 주소 지정 방식(indirect addressing mode): 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식. 두 번의 메모리 접근이 필요하므로 일반적으로 느림.
- 레지스터 주소 지정 방식(register addressing mode): 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방식. CPU 외부에 있는 메모리보다 내부에 있는 레지스터에 접근하는 게 더 빠르다. 다만, 직접 주소 지정방식처럼 표현할 수 있는 크기의 제한이 생긴다.
- 레지스터 간접 주소 지정 방식(register indirect addressing mode): 연산에 사용할 데이터를 메모리에 저장하고 그 유효 주소를 저장한 레지스터를 오퍼랜드에 명시하는 방식. 간접 주소 지정 방식보다 빠르다.
숙제
1. 기본 숙제
확인문제 (p51)
- 프로그램이 실행되려면 반드시 (메모리)에 저장되어 있어야 합니다.
확인문제 (p65)
- 1101(2) 의 음수를 2의 보수로 표현하면, 0011(2)
2. 추가 숙제
p. 100의 스택과 큐의 개념을 정리하기
[미리보기]운영체제의 메모리 관리
물리적인 메모리 크기보다 큰 프로그램을 어떻게 실행할 수 있을까?
- 후에 운영체제에서 만나게 될 내용들이다. 지금은 느낌만.
- 페이징 기법: 컴퓨터가 메인 메모리에서 사용하기 위해 2차 기억 장치로부터 데이터를 저장하고 검색하는 메모리 관리 기법
- 스와핑(swapping)
🦖 게임을 좋아했고, 제대로 실행되지 않는 컴퓨터를 낑낑대면서 본체를 열어대던 어린 시절(?)이 떠올랐다. 그때, 참 많이 뜯고 망가뜨렸었는데 ㅋㅋㅋ 그때의 결핍 덕분에 이렇게 공부하고 있나? 🤔