1. [기초지식] 컴퓨터 구조 이해하기

YoonA Kim·2023년 5월 2일

컴퓨터 기초지식

목록 보기
1/3

1. 컴퓨터 들여다보기

1강

어플리케이션 개발자와 시스템 개발자 모두 하드웨어에 대해 잘 알아야한다!
어플리케이션을 가능케 하는 시스템을 만드는 시스템 개발자에게는 하드웨어 지식이 특히 필수.

2강 : 컴퓨터의 겉모습

메인보드
메인보드는 컴퓨터에 들어가는 부품들을 다 연결할 수 있게 해주는 판입니다. 마더보드라고도 하죠.

무언가를 꽂을 수 있는 슬롯이나, 선을 연결할 수 있는 곳들이 있습니다. 여기에 컴퓨터의 부품을 직접 꽂거나 선으로 연결하는거죠. 그리고 이어폰 단자라든가, USB 포트, HDMI 포트 같이, 사용자가 연결할 수 있도록 해주는 것들도 마더보드에 장착되어 있습니다.

CPU
그 다음은 CPU인데요. 마더보드에 부착해서 사용합니다.
CPU는 작은 칩이지만 가장 중요한 부품이고, 대체로 가장 비싸기도 합니다. 컴퓨터의 모든 생각이나 계산이 여기에서 이뤄지죠. 컴퓨터의 뇌라고 볼 수 있습니다.
CPU에 대한 내용은 뒤의 챕터에서 더 다룰게요.

하드 디스크
다음은 하드 디스크입니다. 데이터를 저장하는 공간인데요. Hdd라고도 부릅니다.이렇게 생겼습니다.

내부는 이렇게 생겼구요.

여러분들이 게임을 다운로드 받거나, 영화를 다운로드 받거나, 문서를 편집하다가 저장하면 여기에 특정 방식으로 기록이 되는 겁니다. 기록한 후에 그걸 읽어올 수도 있고요. 신기하지 않나요? 영화 1000개도 이 안에 다 저장할 수 있습니다.
모든 컴퓨터에 hdd가 있는건 아닌데요. 요즘 컴퓨터에는 Hdd 대신 ssd가 있기도 합니다. Hdd는 용량이 큰 대신 속도가 느리고 ssd는 용량이 작은 대신 속도가 빠릅니다.

RAM
다음은 램인데요, 8기가 램, 16기가 램, 이런 얘기들을 많이 들어보셨죠?

이렇게 생겼고 마더 보드에 꽂아서 사용합니다.
램은 저장장치인데요.
램에는 컴퓨터가 켜진 동안에만 가지고 있을 데이터를 저장합니다. 반면에 컴퓨터를 꺼도 남기고 싶은 데이터는 하드 디스크에 저장하죠.
램에 저장한 데이터는 컴퓨터가 꺼지면 사라지는 대신, 데이터를 꺼내 오거나, 수정하는 데 시간이 좀 더 적게 걸립니다. 그래서 컴퓨터는 일부러 하드 디스크에 있는 데이터를 램에 복사해서 작업하기도 합니다.

정리
이 정도가 흔히 컴퓨터들이 가지고 있는 핵심 부품들입니다.
그 외에는 전원을 각 부품에 제공해주는 파워 서플라이, 요즘 잘 쓰지는 않지만 CD나 DVD 같은 걸 읽을 수 있는 것도 있고요.
컴퓨터에서 발생하는 열을 바람으로 열을 배출시켜주는 팬, 비디오나 사운드 관련된 처리를 전문적으로 하는 비디오 카드나 사운드 카드 같은 칩들도 있습니다.

2. 컴퓨터의 언어 이진법

1강

이진법은 컴퓨터의 언어
이진법으로 되어있는 언어를 머신코드라고 한다.

2강

0과 1 만으로도 사전에 약속이 되어있다면 뭐든지 할 수 있다
모스부호 점자 등 처럼

3강 -8강

이진법으로 모든 숫자를 표현할 수 있다.
그리고 사칙연산이 가능하다

9강 16진법

이진법과 함께 컴퓨터에서 자주 사용되는 16진법
2진법을 간단하게 줄일 수 있는 장점
이진수의 네 자리를 16진수의 1자리로 바꿀 수 있으니까

0 1 2 3 4 5 6 7 8 9 A B C D E F 까지 사용 함
십진법 12을 십육진법은 C라도 표시

16진법을 0x라고 표기함 (여기서 x는 작은 내림)

10강 비트와 바이트

비트
bit는 binary digit의 약자로 데이터의 최소 단위
이진수로 총 몇 자리인지를 나타냄
예를들어 1001의 경우 4비트, 11001011은 8비트

바이트
바이트는 비트의 8배. 즉 이진수 8자리의 단위
1 Byte = 8 bit 인거죠.

비트와 바이트 둘 다 알파벳 b로 시작하기 때문에 줄여서 적을때는 보다 작은 단위인 bit는 소문자 b로, 보다 큰 단위인 Byte는 대문자 B로 적는다

https://bakey-api.codeit.kr/api/files/resource?root=static&seqId=4618&directory=9ktvzyvkk-image.png&name=9ktvzyvkk-image.png

3. 논리연산

1강 0과 1을 전달하는 법

컴퓨터 속 부품들은 전기를 통해 0과 1을 주고받음
그것을 가능하게 하는 것이 모든 부품에 들어있는 반도체 덕분
반도체 : 상황에 따라 전기가 통하기도 통하지 않기도 하는 물체
참고) 전기가 잘통하면 도체 / 잘 안통하면 반도체

2강 논리연산

0은 off 또는 거짓
1는 on 또는 참

3강 ~ 6강 7가지 기본 논리연산

4. 회로설계

2강 ~ 3강

위의 논리연산을 조합하여 컴퓨터의 칩들의 만들 수 있는데 그것을 회로설계(circuit design)이라고 한다.

복잡한 회로를 간단한 박스로 덮듯이 만드는 것을 회로의 추상화라고 한다. 컴퓨터 안의 작은 박스모양의 칩들도 크고작은 논리 설계를 갖고 있는 것을 단순하게 박스모양으로 가려 추상화 한 것이다. 그리고 여러 칩들을 조립해 기능과 기능을 더해 복잡한 기능을 하는 컴퓨터까지 만들게 된다.

5. CPU

1강

사람들이 이해할 수 있는 파이썬 같은 언어 = 고수준언어
컴퓨터가 이해할 수 있는 저수준 언어 = 머신코드

고수준을 머신코드로 바꿔주는 것 = 컴파일러, 인터프리터
머신코드를 처리하는 곳이 CPU 중앙처리장치

머신코드의 자릿수가 곧 CPU의 입력선 개수이다.
CPU의 첫번째 선에 1이 입력되는 전기가 on 흐르고
두번째 선에 0이 입력되면 전기가 흐르지 않는 방법이다.

CPU마다 머신코드 자리수가 정해져있고
이보다 짧거나 길면 인식하지 못한다.
CPU의 입력선의 개수가 8개면
8자리의 머신코드 1줄이 CPU동작의 최소단위, CPU가 어떻게 행동할지 주는 명령이라 Instruction이라고 한다.

CPU가 인스트럭션을 받아 스스로 해결할 수 있는 것이면 바로 결과물을 내고, 아니면 주변 다른 칩에게 다시 신호를 보내 도움을 받기도 한다.
CPU가 여러 칩들을 가동시키는 중심역할, 머리역할이기에 CPU가 망가지면 다른 칩들도 사용할 수 없다. 그래서 가장 중요하고 비싼 부품이다.

2강

Opcode(Operation code) : CPU 1개가 여러 기능을 할 수 있도록, 어떤 기능을 해야하는지 알려주는 코드.
예: opcode가 0이면 덧샘을, 1이면 뺄샘일 해라

ALU(Arithmetic logic unit) : 여러가지 연산기능을 할 수 있는 칩

하나의 칩이 여러 기능을 하게끔 만들기 위해 기능의 갯수만큼 옵코드도 (이진수의 자릿수가 많아짐으로써많아져야한다.
CPU의 옵코드는 평균적으로 6자리 내외, 즉 64개의 기능이다.

Instruction의 가장 앞자리 6자리가 주로 옵코드이다.
인스트럭션의 앞숫자들은 '어떤 기능을 할지'를 뜻한다.

3강-4강 CPU와 저장장치

머신코드로 된 Instruction을 CPU에게 주면, 정해진 동작을 수행한다.

CPU의 Instruction 대부분 저장장치 관련된 기능이 대부분이다.
CPU가 기능을 하더라도 중간결과를 계속 어딘가에 저장해야하고,
예전에 저장해둔것을 가져와야한다.

CPU 밖에는 하드디스크와 램이라는 저장장치가 있고
CPU 안에는 레지스터라는 컴퓨터에서 가장빠른저장장치가 들어있다.
레지스터는 고가라서 최소한의 개수로 사용된다.
레지스터가 저장할 수 있는 크기에 따라 8-bit, 16-bit, 32-bit 다양한데,
이 레지스터의 성능이 CPU의 성능을 크게 좌지우지한다.

컴퓨터의 세가지 저장장치는 다음과 같다.

CPU는 하드디스크로 직접 송수신하지 않는다.
하드디스크와 CPU 사이가 너무 멀어서 시간이 오래걸리기때문
그래서 CPU는 지금 당장 필요한 것만 하드디스크에서 램으로 가져오게끔 해서
속도가 빠른 램과 빠르게 일을 한다.
예 : 포토샵같은 큰 프로그램을 실행하면 로딩하는데 시간이 오래걸리는데, 이것이 하드디스크에서 램으로 데이터를 가져오는 시간이다.

컴퓨터를 꺼도 저장되는, 지금 쓰지 않는 파일들은 비휘발성 메모리인 하드디스크에 저장하고 있다.
만약 저장되어던 엑셀파일을 실행시키면,하드디스크에서 램으로 파일을 가져오게 된다.
레지스터는 엑셀의 셀간의 구체적인 연상을 하는데 사용된다.
엑셀을 수정하여 저장하는 순간 램의 수정본이 하드디스크로 넘어가 비휘발성으로 저장된다.

5강

메모리주소 : RAM에서 명령코드/데이터 값을 저장하는 주소로서 변수처럼 활용된다.
컴퓨터의 명령은 다음과 같이 실행된다
예 : "하드디스크에서 1011010 데이터를 램의 0001 메모리 주소에 가져와!"
"램의 0010 메모리 주소에 있는 값을 CPU 레지스터a에 저장해!"

메모리 주소에 저장되는 인스트럭션의 앞자리는 옵코드
그 뒤에는 또메모리주소이거나 레지스터의 번호가 적혀있다.
또는 메모리 주소 그 자체가 레지스터와 주고받는 데이터 값이기도 하다.

RAM의 메모리주소 안에서도 일부부분은 명령코드만,
일부부분은 데이터만 위치를 구분지어 저장된다.

Opcode는 LOAD, STORE 같은 저장, 불러오기 기능의 Instructon도 있고,
사칙연산, 논리연산, 비교연산 등 레지스터의 값을 활용하는 연산 Instruction도 있고,
Instruction 별 처리 순서를 바꿔서 뒤에 있는 것을 먼저 처리하게끔 만드는 Instruction도 있다....

6강 ~ 7강

CPU는 생각보다 단순한 기능들로만 모든 일들이 이루어진다.
불러오기 / 저장하기 / 복사하기 / 연산

고수준언어로는 매우짧은 사칙연산도 머신코드로 하면 몇줄의 긴 코드가 되는 것이다.
고수준 언어와 머신코드 사이의 논리구조를 아예 변경해주는 컴파일러가 있는 덕분이다.
복잡한 머신코드를 쉽게 이해할 수 있는 고수준언어로 바꿔주는 것이 추상화, 프로그래밍의 추상화라고 한다.
인간이 더 중요한 것에 집중할 수 있게끔 도와주는 것이다.

고수준언어가 없던 시절, 길고 긴 머신코드를 인간이 일일이 잘라가며 해독했는데
이를 쉽게 하기 위해 만들어진 것이 어셈블리 언어(읽을 수 있는 머신코드, Symbolic machine code)이다.
즉, 어셈블리 언어는 고수준언어와 머신코드 사이에 있는 언어이다.
어셈블리 언어로 표현된 것을 머신코드로 바꿔주는 것을 어셈블러(assembler)라고 한다.

8강 CPU의 크기

윈도우를 깔때 32-bit냐 64-bit냐를 고를 수 있는데,
이것은 CPU가 32자리냐 64자리냐르 뜻한다

32비트는 인스트럭션이 2의 32승, 40억, 즉 4GB
32비트 윈도우라고 하면, 메모리주소에 최대 4GB까지 저장해서 처리할 수 있었던 것이다.

요즘은 64비트, 16EB로 쓴다.
이것도 언젠가 부족해져서 더 비트의 CPU를 쓰게 될지도 모른다.

6. 컴퓨터의 성능

1강 ~2강 컴퓨터의 속도

CPU의 성능 중 '3.6GHz'라고 헤르츠라고 표시된 지표가 있다.
이를 클락레이트, 클락스피드라고 한다.
헤르츠는 1초에 몇번이나 반복하는지를 표기하는 단위이다.

컴퓨터의 모든 일들은 부품칩들간의 전기신호를 주고받음으로써 작동하는데
칩A에서 칩B로 한번 전기신호가 나는 것을 Cycle 또는 Clock이라고 한다.

그래서 클락레이트 3.6GHz는 1초에 칩들간에 36억번 신호를 주고 받는다는 뜻
보통 CPU와 ALU 사이에 덧셈은 3 사이클, 로드명령은 5 사이클, 스토어명령에는 4사이클이 걸린다.

클락스피드가 크면 클수록 빠르게 작동한다는 뜻이다.

컴퓨터의 속도와 관련된 다른 지표들로는 다음과 같은 것이 있습니다.
클럭이 얼마나 빠르냐 (Clock Speed)

한 클럭에 얼마나 많은 일을 할 수 있느냐 (CPI, IPC, IPS)
CPI (Cycles per instruction)
한 Instruction이 평균적으로 몇 사이클만에 완료되는지를 나타내는 지표입니다. 예를 들어, 불러오는 LOAD 명령, 저장하는 STORE 명령, 더하는 ADD 명령이 있는데, LOAD 명령은 5 사이클, STORE는 3 사이클, ADD 는 4 사이클이라고 합시다. CPI는 이 명령들이 평균적으로 몇 사이클이 소요되는지를 나타내는 지표라서, 평균을 내서 4 CPI 라고 할 수 있습니다.

IPC (Instructions per cycle)
이 CPI를 뒤집으면 IPC가 됩니다. 4 CPI이면, 1/4 IPC인 거죠. CPI나 IPC나 사실은 같은 개념인데, 성능을 표현할 때는 IPC를 더 많이 사용합니다. CPI는 낮아야 좋은 거고, IPC는 높아야 좋은 거라서 그런 것 같네요.

IPS (Instructions per second)
Clock speed는 클럭이 얼마나 빨리 움직이는지를 알려주고, IPC는 그 하나의 클럭에 얼마나 많은 코드를 얼마나 소화할 수 있는지 알려줍니다. 이 둘을 합쳐서 한번에 보고 싶을 수도 있는데요. 이 때 IPS를 사용합니다. IPS는 1초에 실행할 수 있는 Instruction의 개수를 나타내는데, clock speed와 IPC를 곱하면 됩니다.

몇 개의 코어가 있느냐 (멀티 코어)
듀얼 코어라고 하는 건, CPU 하나 안에, 사실상 두 개의 CPU가 따로 따로 동작하도록 만들었다는 겁니다. 무작정 클럭 스피드를 올리는 데에 한계가 있으니, 새로운 방식을 선택한 거죠.

이론상으로는 듀얼 코어는 2배의 속도로 빨라져야 하겠지만, 실제로는 50% 정도 더 향상됩니다. 프로그램이 실행될 때, 동시에 실행할 수 있는 것과 동시에 실행할 수 없는 작업들이 있을테니, 두 개의 코어 중 하나만 일하고, 하나는 쉬고 있는 시간들이 생기게 되는 거죠.

요즘에는 대부분 멀티 코어를 사용하기 때문에 무조건 클럭 스피드만 높다고 빠른 건 아닙니다. 예를 들어, 듀얼 코어 4.2GHz와 쿼드 코어 3.5GHz를 비교하면, 쿼드 코어가 훨씬 빠르죠.

3강 ~ 5강 프로그램의 성능 향상

많은 회사들이 우리 프로그램을 빠르게 만들기를 목표로 가지고 있다.
프로그램의 실행 시간을 결정하는 것은 두가지다

  • 그 프로그램에 얼마나 많은 Instruction이 있는가
  • Instruction을 실행하는 속도가 얼마나 빠른가

즉, 인스트럭션을 실행속도를 높이거나,
인스트럭션을 실행할 수있는 속도가 정해져있을때, 프로그램을 가동시키기 위한 인스트럭션의 수가 적으면 프로그램이 빨라진다.

성능향상방법 (1) : Instruction의 개수 줄이기

Instruction(실행코드) 즉 머신코드를 짧게 만드는데 드는 요인은 세가지다
언어, 알고리즘, 컴파일러

언어
같은 기능을 하는 코드를 썼을 때,
고수준 언어로서 더 간결한 파이썬은 더 긴 머신코드를
더 복잡한 C언어는 더 짧은 머신코드를 만든다.
어셈블리언어는 더 짧아진다(어셈블리언어 1줄이 곧 머신코드 1줄)
그래서 코딩언어별로 속도가 다르다는 말을 하는 것이다.

알고리즘
또한 같은 기능을 하더라도 알고리즘을 잘 짜야지 머신코드가 짧아진다.
A에서 G까지 가는데 그 경로가 다른 아래의 예시처럼...

알고리즘
마지막으로 고수준언어를 머신코드로 해독하는 프로그램인 컴파일러의 성능에 따라서 달라진다.
똑같은 파이썬 코드를 저성능 컴퍼일러는 더 긴 머신코드로
고성능 컴파일러는 더 짧은 머신코드로 바꿀 수 있다.

성능향상방법 (2) : Instruction의 실행속도를 올리기

CPU의 성능은 클락스피드, IPS, CPI 등의 지표로 알 수 있다.
CPU의 한정된 성능에서 Instruction을 더 빠르게 만들기 위한 사람들의 노력으로
몇가지 방법들이 개발되었다.

파이프라인
인스트럭션을을 하나하나 하나의 부품씩 순차적으로 실행하지 않고,
각 부품들이 최대한 쉬는시간 없이 일을 동시에 진행시켜 과정을 최적화시키는 것이다.
예 : 1번가져오기 - 1번계산하기 - 1번저장하기 - 2번 가져오기 - 2번 계산하기... 이렇게 하지 않고 아래처럼 동시에 하는 것

예측
한번 사용한 데이터는 다시 사용할 가능성이 높다.
대부분의 프로그램에 "최근에 열어본 파일" 기능이 있는 것처럼

이렇게 다시 사용할 가능성이 높아서 RAM 보다 더 가까이 더 빠르게 가져오기위해
저장해두는 곳을 캐쉬(Cache)라고 한다.
하드디스크에서 램으로 가져온 데이터들 중에 사용될 것이라 예측 된 데이터를 Cache에 저장해둔다.

그리고 캐시 메모리도 더 효율적으로 활용하기 위해 레벨 1~3으로 등급을 나눠서 작동하는 경우도 있다.

그외
그외에도 개발을 할때 성능을 더 높일 수 있는 공식같은 방법들이 많다.

예를 들어 "Make the common case fast, 자주 일어나는 일을 빠르게 하라"
명령들이 10개 있으면, 그 10개의 명령이 똑같은 빈도로 활용되지 않는다.
더 사용빈도가 높은 명령의 속도를 높여야 전체 프로그램의 속도가 빨라진다.

6강 무어의 법칙이 깨지다

intel의 창시자 무어가 1965년에 내민 예측? 또는 업계의 비전은
"반도체의 밀도는 2년마다 2배씩 증가"하는 것.

반도체의 밀도가 증가하기 위해서는
반도체 사이의 선이 얇아져야하는데, 그 선은 이제 나노미터까지 왔다.

선이 얇아지니 오히려 성능을 떨어뜨리기 시작했다.
반도체 간의 간격이 너무 가까워 반도체 하나에서의 발열이 옆 반도체로 쉽게 전이되어
이상발열현상이 자주 일어나거나
전류가 발생하면 그 주위에 형성되는 자기장때문에 가까운 반도체까리 영향을 받는 현상이 많아짐

그래서 2배씩 밀도를 높이는 목표를 멈추겠다고 선언한 인텔.

하지만 CPU의 성능을 높이기 위해
클락스피드만 높이는데에는 한계가 있으니 듀얼코어, 쿼드코어라는 새로운 혁신이 일어났듯이
반도체에도 또다른 혁신이 있을 것이당!

이상 코드잇의 컴퓨터 구조 이해하기 교육과정을 필기한 것입니다.

profile
코딩 배우는 중

0개의 댓글