일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- game
- mongoose
- Express
- flask
- jest
- 정렬
- Sequelize
- Python
- 게임
- TypeScript
- AWS
- GIT
- Nest.js
- OCR
- MySQL
- react
- 공룡게임
- Dinosaur
- Bull
- nestjs
- class
- nodejs
- 자료구조
- cookie
- MongoDB
- dfs
- typeORM
- Queue
- JavaScript
- Today
- Total
포시코딩
CPU 본문
CPU
- 컴퓨터에서 뇌의 역할을 한다.
- CPU는 CU, ALU, 여러 레지스터, 캐시로 구성되어 있다.
- CPU는 n개의 코어로 구성되어 있고(코어를 하나의 state(상태)라고도 하는듯)
코어는 m개의 register로 구성되어 있다.
싱글 코어 -> 멀티 코어로 진화 이유
무어의 법칙이 말해주듯 싱글코어의 성능(클럭 수)는 계속 고도화되고 있다.
하지만 마냥 싱글코어의 성능을 올릴 수가 없었는데
고도화 된 CPU의 전력 소모에 따른 파워 서플라이의 한계와 발열 문제로 인한 쿨러의 한계가 있었기 때문이다.
게다가 클럭 수가 올라가도 싱글 코어가 처리할 수 있는 작업의 양은 그다지 차이가 나지 않았다.
이러한 싱글 코어의 성능 향상엔 본질적인 한계가 있기 때문에
싱글 코어의 성능을 프리징하고 차라리 코어의 수를 늘리자는 '멀티 코어'가 나오게 되었다.
* 멀티 코어 -> 멀티하게 state를 가짐 -> state: register들
CPU 생김새
- CU(Control Unit 제어 유닛): 다른 유닛들에 명령을 내리는 역할
- ALU(Arithmetic and Logical Unit 산술/논리 연산 장치)
- Register(레지스터): CPU가 명령어를 처리하기 위해 필요한 여러 데이터를 용도에 맞게 저장하고 있는 도우미
- 범용 레지스터(General-purpose): EAX, ECX, EDX, ...
- 전용 레지스터(Special-purpose): PC(Program Counter), ...
- Cache(캐시): CPU의 성능 향상을 위해 고안된 장치.
어떤 데이터를 갖고 오기 위해서 메모리에 물어보기 전에 캐시가 갖고 있으면 캐시로부터 데이터를 가져온다.
CPU <-> 프로그래머 통신 방법
CPU는 기계어로만 다룰 수 있음. ex) binary
사람이 기계어를 쓴다는건 사실상 불가능하기에 나온 것이 어셈블리어이다.
- 어셈블리어는 CPU 아키텍처에 따라 문법이 조금씩 다르다.
- 보통 연산자는 LOAD, STORE, JMP와 같은 원초적인 명령어들로 이루어져 있다.
- 피연산자는 메모리 주소, 레지스터, 즉시 값 중 하나만 사용할 수 있다.
근데 어셈블리어도 어려워서 프로그래밍 언어가 나옴. ex) C, C++, Java, ...
프로그래밍 언어에 있는 컴파일러를 통해 기계어를 사용할 수 있게 되었다.
명령어 수행 방법
위에서 CPU와 프로그래머는 프로그래밍 언어를 통해 얘기한다는걸 알았다.
프로그래밍 언어에 작성된 코드는 라인마다 기계어 연산으로 치환된다.
이렇게 치환된 기계어는 다음 과정을 거쳐 수행된다.
- 명령어 인출
- CU가 이번에 수행할 명령어 정보를 가져온다.
- 명령어 해독
- 명령어 정보를 성공적으로 인출했으면 명령어를 해독한다.
- 보통 opcode 명령어 코드를 인출하고 opcode의 성격에 맞게 레지스터들을 준비시킨다.
- 실행
- 해독된 명령어를 수행한다.
ex) 산술/논리 관련 연산이라면 ALU가 주체가 되어 실행
- 해독된 명령어를 수행한다.
- 반영
- 이 명령어의 수행 결과를 반영함으로서 명령어 수행의 한 사이클이 끝이 난다.
기타 키워드
opcode, operand
어셈블리어를 보면 다음과 같이 숫자들이 적혀있는 것을 볼 수 있다.
이런 숫자들을 Operation Code(=opcode)라고 한다.
컴퓨터 명령어란 사람이 만든 프로그램(고수준 언어로 작성한 프로그램)을 번역해
컴퓨터가 알아들을 수 있는 명령어(기계 언어)로 바꿔 놓은 것이다.
컴퓨터가 명령을 처리하기 위해서는 이 opcode와 데이터를 찾는 주소(Operand)를 가지고 있어야 한다.
opcode와 operand를 합쳐 명령어(instruction)라고 부른다.
참고: https://watchout31337.tistory.com/373
명령어 집합 구조 Instruction set architecture, ISA
마이크로프로세서가 인식해서 기능을 이해하고 실행할 수 있는 기계어 명령어를 말한다.
최하위 레벨의 프로그래밍 인터페이스로, 프로세서가 실행할 수 있는 모든 명령어들을 포함한다.
ISA는 특정한 CPU 디자인으로 추가된 순수 명령어인 opcode의 집합 규격(기계어)을 포함한다.
CISC도 있지만
RISC CPU는 명령어의 구조와 명령어의 숫자를 단순화 하여 빠른 실행이 가능하고 하드웨어를 줄일 수 있기 때문에 대세라고 한다.
출처: https://ko.wikipedia.org/wiki/%EB%AA%85%EB%A0%B9%EC%96%B4_%EC%A7%91%ED%95%A9
'CS (Computer Science)' 카테고리의 다른 글
함수 호출 스택(call stack) (0) | 2023.04.08 |
---|---|
캐시(Cache) (1) | 2023.01.07 |
Database, MongoDB (0) | 2022.12.13 |
API, RESTful API (0) | 2022.12.01 |
랜덤이 정말 랜덤일까? - Web Crypto API (0) | 2022.11.22 |