Crash Course: Computer Science를 정리했습니다.
부울 연산과 논리 게이트
Boole
부울 대수학은 George Boole이 창안한 참 거짓을 다루는 분야이다. 이를 활용해 true일 경우 전기가 통하고, false일 경우 전기가 통하지 않는 것으로 하여, 하나의 트랜지스터로 인풋 아웃풋이 모두 가능하게 했다.
Gate
게이트는 전류의 흐름을 통제하기에 붙여진 이름이다.
- NOT Gate
- NOT 논리표와 같다
- 삼각형모양
- AND Gate
- 둘다 참이어야만 참
- 두개의 인풋
- 하나의 아웃풋
- 트랜지스터 두개가 같이 켜져있어야만 전류가 흐르다
- D 모양
- 둘다 참이어야만 참
- OR Gate
- 하나만 참이어도 참
- 두 트랜지스터를 병렬로 연결했을 때
- 우주선 모양
- XOR (Exclusive or)
- 모든 입력이 참이면 거짓이 된다
- 둘 중 하나만 참이어야 참
- 매우 유용한 연산!
- 우주선 모양이 스마일짓는 모양
Binary
ture를 1, false를 0으로 하여 이진수로 연산한다.
이진수의 합을 구할 때 1 + 1이면 뒷자리를 0으로 하고 1을 받아올린다.
64비트로 나타낼 수 있는 가장 큰 숫자는 대략 920경이나 된다!
부동 소수점 Floating point
소수점은 수들 사이로 이동 가능하기 때문에 이렇게 부른다. 이를 나타내기 위한 여러 방법이 개발되었는데,
예를 들어 625.9는 0.6259 * 10^3 으로 적는다.
- 전자는 유효숫자( significand )
- 후자는 지수 ( exponent )
32비트 부동 소수점 표기법에서
- 첫번째 비트 : 양이나 음의 부호를 나타내는 숫자를 넣는데 사용
- 그 다음 8비트 : 지수를 저장하는 데에 사용
- 나머지 23비트 : 유효숫자 나타내는 데에 사용
아스키코드와 유니코드
컴퓨터는 문자를 나타낼 때 단순히 숫자를 사용한다.
- 알파벳에 번호를 매긴다
- 1600년대 베이컨 5비트
- 아스키 코드 (7비트) 드디어 구두점이 가능하게 되다
- 유니코드 - 각각의 국제적인 제도를 없애고 보편적 인코딩 구조로 대체
ALU : 컴퓨터의 수학적인 두뇌
숫자를 저장하고 나타내는 것은 컴퓨터의 중요한 기능이다. 계산의 진정한 목적은 숫자를 구조화하고 목적이 있는 방식으로 다루는 것이다. ALU( = Arithmetic & logic unit = 컴퓨터의 산술적이고 논리적인 부분)에서 이 내용을 다룬다.
구성 단위
산술 단위 arithmetic unit
- 모든 수치 연산 처리
- 증분 작업도 한다
- XOR의 출력은 부분적으로 정확하나 1+1이 문제 (받아올리는 값 = carry bit)
- 바로 AND 게이트
- 따라서 이 두 게이트를 합친다 = HALF ADDER 반가산기
- 바로 AND 게이트
- 전가산기는 더 복잡하다! FULL ADDER TABLE
- 최대 입력은 1+1+1
- 8BIT RIPPLE CARRY ADDER
- 반가산기로 A0+B0 해준다음에
- carry 값을 받아서 A1, B1과 함께 전가산기
- 전가산기 과정을 반복
- 그러나 마지막에 carry가 남으면 8비트를 초과하게 되어서 오버플로!
- 에러가 나거나 예상치 못한 동작 발생
- 피하기 위해서는? 전가산기를 더 사용해서 회로를 확장하자! 16비트나 32비트로
- 그러나 게이트를 많이 소모하고, 캐리비트들이 움직이는 시간이 많이 걸린다.
- 따라서 현대 컴퓨터는 CARRY-LOOK-AHEAD ADDER (올림수 예견 가산기)라는 약간 다른 회로 사용
- 더 빠르고 정확하게 이진수를 더한다
- 따라서 현대 컴퓨터는 CARRY-LOOK-AHEAD ADDER (올림수 예견 가산기)라는 약간 다른 회로 사용
- 그러나 게이트를 많이 소모하고, 캐리비트들이 움직이는 시간이 많이 걸린다.
논리 단위 logic unit
- AND OR NOT과 같은 논리 연산을 한다
- 음수인지 확인하는 테스트를 하기도
- 1비트로 신호 출력도 한다
- 두개의 숫자를 뺐는데 결과가 0이라면
- 이미 만들어져 있는 0 테스트 회로가 true를 출력할 것 (이 회로는 OR로 이루어져있고 끝에 NOT이 있어서 0이라면 1이 나오게 되어있다!)
- 두 숫자가 같은 숫자인지 판단할 때 유용
- A가 B보다 작은지 테스트하고 싶다면
- A에서 B를 빼고 음의 신호가 참인지 보면 된다
- NEGATIVE FLAG
- A에서 B를 빼고 음의 신호가 참인지 보면 된다
- 가산기 수행하기 위한 FLAG
- 오버플로
- 이들은 보편적이고 자주 사용되는 신호들
- 두개의 숫자를 뺐는데 결과가 0이라면
레지스터와 램
레지스터
하나의 값을 저장하는 데 사용하는 작은 일렬로 된 메모리 뭉치이다. 그리고 이것들을 확장하면 RAM을 만들 수 있다!
RAM (Random Access Memory)
서로 다른 주소에 수많은 수들을 저장할 수 있는 메모리 저장소. RAM은 전원이 켜져있을 때만 정보를 저장한다.
SRAM Static Random Access Memory , DRAM.. 등등 여러 종류의 램이 있는데, 다른 논리회로, 캐퍼시티 등의 차이가 있을 뿐 기본적으로 메모리 셀이 대량으로 포개진 행과 열 안에서 정보 비트를 저장하는 기술들이다.
Persistent Memory (영구 메모리)
전력 공급 없이도 정보를 저장할 수 있는 메모리이다.
CPU Central Processing Unit 중앙처리장치
연산에 사용될 데이터는 레지스터 or 메모리의 주소에서 온다.
- 명령어 주소 레지스터 instruction address register
- 프로그램의 어디에 있는지 추적할 수 있는 레지스터
- 현재 instruction의 메모리 주소를 저장한다.
- 명령어 레지스터 Instruction register
- 현재 수행되는 명령어가 저장되는 레지스터
처음 컴퓨터가 부팅되면 모든 레지스터는 0에서 시작한다.
CPU 동작 단계 사이클
필요한 것들 : RAM, ALU, CONTROL UNIT(위의 것들을 추상화한 것)
- Clock : 정확하고 규칙적인 시간에 전기 신호를 발생시켜 Control Unit이 CPU의 내부 동작을 완벽하게 발 맞춰 진행시킬 수 있게 해준다.
- Clock speed : CPU가 아래 사이클의 각 단계를 수행하는 속도. 단위는 헤르츠 (주파수 단위)
- 컴퓨터나 스마트폰은 기가헤르츠!
- Overclocking : clock 속도를 올리면 CPU 속도 빠르게 가능
- Underclocking : 특히 배터리가 있는 기기들은 CPU속도를 느리게해서 전력 소모를 줄일 필요가 있다.
- 동적 주파수 스케일링 dynamic frequency scaling : 이런 식으로 상황에 맞게 clock speed를 높이거나 낯추는 것
- Clock speed : CPU가 아래 사이클의 각 단계를 수행하는 속도. 단위는 헤르츠 (주파수 단위)
- fetch phase 인출 단계
- instruction을 가져오는 것
- Decode phase
- instruction이 무엇인지 해독한다.
- Execute phase
- 실행!
RAM과 CPU CHIP[control unit, ALU] 두 부품은 서로 address data enable 선들을 통해 통신한다
명령어와 프로그램
명령어와 데이터는 같은 메모리에 (이진수로) 저장되어 있다.
명령어 종류
- JUMP는 해당 주소로 이동하는 것. 예를 들어 JUMP 0이면 처음으로 갈 수 있다.
- HALT는 중요! 끝을 명시해야 한다.
- immediate value : 많은 메모리주소를 가리키기 위해 고안되었다.
고급 CPU 설계
우리가 사용하고 있는 컴퓨터는 매초 수십억개의 명령어를 실행 중이다. 그리고 탑재되어 있는 명령어의 수는 수천개에 이른다.
BUS
BUS란 데이터를 연결하는 선. 이걸 통해 CPU와 RAM은 데이터를 주고받을 수 있다.
Cache
CPU 안에 들어있는 작은 RAM. 킬로바이트-메가바이트의 크기.
- Cache hit : CPU가 요청하는 데이터가 캐쉬에 있는 경우
- Cache miss : 캐쉬에 없는 경우
캐쉬는 램에서 받아온 데이터를 저장하기도 하지만 CPU에서 받아온 데이터를 저장하기도 한다. 이러다보면 램에 있는 데이터와 불일치하는 경우가 생긴다.
이를 해결하기 위한 것이 dirty bit
dirty bit란 저장된 각 메모리 블럭에 대한 특별한 flag이다. 보통 캐쉬가 꽉 찼을 때 동기화를 진행한다. dirty를 체크하여, dirty하면 새 블럭을 가져오기 전에 오래된 걸 RAM으로 옮겨 저장하게 된다.
명령어 파이프라이닝
명령어 stream을 효율화시키는 방안을 뜻한다. 명렁어는 fetch-decode-execute의 3클럭 3사이클로 돌아간다. 하지만 각 과정 당 사용하는 부분이 다르기 때문에 decode하고 있을 때 다음 작업 fetch도 가능하다. 그러나 이 경우 생길 수 있는 문제가 있다.
- 데이터 의존성
- 이전 명령어와 기존 명령어가 CPU의 같은 부분을 사용하는 문제.
- 필요하다면 지연시키는 과정이 필요하다.
- 해결하기 위한 방안 : out-of-order execution
- 조건부 JUMP
- 조건부 점프에 걸리면 꽤 지연될 수 있다.
- 해결하기 위한 방안 : 예측실행
- 분기 예측 정확도 90% 이상. CPU의 과제
- 슈퍼스칼라 : 한 개 이상의 명령어를 실행 가능!
- 멀티 코어 프로세서 : 아예 코어를 늘려버리는 것. 각각의 코어에서 동시 작업이 가능하다
- 코어가 아주아주 많은 것이 슈퍼컴퓨터.