본글은 『Tucker의 Go 언어 프로그래밍』 스터디 요약 노트입니다.
www.youtube.com/watch?v=CIyLurz-Ius
0과 1
컴퓨터는 이진법으로 데이터를 읽고 쓴다. 이진법은 예전 컴퓨터부터 이어지는 컴퓨터의 중요한 특성이다.
컴퓨터는 이진법을 트랜지스터를 통해서 구현 한다.
그런데 그 이전에는 진공관이 있었다.
진공관
초기 컴퓨터는 진공관을 통해서 이진법을 구현했는데
많은 단점들이 존재했다..
- 부피가 크고 무겁다.
- 가격이 비싸다.
- 전기를 많이 먹는다.
- 고장이 잘 난다.
이런 단점들 때문에 컴퓨터의 발전은 지금과는 달리 다소 느렸는데
트랜지스터가 등장하면서 컴퓨터는 폭발적으로 발전하게 된다.
트랜지스터
트랜지스터는 성질이 다른 두가지 실리콘을 겹쳐서 만든 것이다.
그 종류로는 n형과 p형이 있다.
그림과 같이 NPN , PNP 형태가 있다.
n형은 -를 띠고 p형은 +를 띤다고 생각하면 된다. 그리고 각각은 다리를 가지고 있다.
p형이 가진 다리를 베이스라고한다..
트랜지스터의 원리
건전지를 연결하면 전기가 흐르지 않아 전구에 불이 켜지지 않는다.
p형이 전자의 흐름을 막고 있는 것이다.
그런데 베이스(p형에 연결된 다리)에 전압을 가하면 전기가 흘러 전구에 불이 켜지게 된다.
따라서 전기가 흐르기도 하고 흐르지 않게 할 수도 있다.
전기가 흐르면 1 전기가 안흐르면 0 으로 표현할 수 있다.
트랜지스터의 스위치 특성 때문에 이진법 표현이 가능해진다.
트랜지스터를 이용한 논리소자
논리소자라고 하면 어렵게 느껴지지만 그 예로 and, or , xor , not 이 있다.
XOR을 제외하고는 모두 익숙한 표현이다.
1이면 '있다'(True)로 생각하고 0이면 '없다'(False)로 생각하면 된다.
두개의 입력이 있다고 가정하자 입력은 1과 0만 가능하다.
가능한 논리소자는 ..
- AND : 두 입력이 같을 때 1출력
- OR : 두 입력 중 하나만 1이면 1이 출력
- XOR : 두 입력이 서로 다를 때 1이 출력
- NOT : not 은 입력이 한개이다. 입력이 1이면 0이 출력되고 0이 입력되면 1이 출력된다.
1비트 가산기(ADD)
비트는 트랜지스터 하나라고 생각하면 된다.
1비트 가산기는 1비트끼리 연산한 결과를 보여준다.
결과를 자세히 보자면..
이진수 1 과 이진수 1을 더하면 그 결과가 10으로서 자리수가 늘어난 것을 알 수 있다.
모든 입력이 1인 경우에만 자리가 올림이 되었고 이때 논리소자는 AND이다.
입력이 다른 때는 자리올림수가 0이고 합의 결과가 1이다. 이 논리소자는 XOR이다.
이 단위를 논리소자로 만들어서 그 결과값을 다시 이 소자의 입력으로 넣는 방식으로
2비트 가산기 , 3비트 가산기 , 등등을 만들 수 있다.
또 감산기 , 곱셈기 , 나눗셈기도 만들어 결과적으로 계산기를 만들 수 있다.
그런데 컴퓨터는 계산기와는 다르다. 어떻게 계산기는 컴퓨터가 되었을까?
계산기에서 컴퓨터로
프로그램이란?
정해진 연산을 정해진 순서대로 실행하는 것이다.
즉, 명령을 적어놓은 문서를 보고 순서대로 실행하는 것이다.
폰노이만 구조
폰노이만은 현대 컴퓨터의 구조를 설계했다.
각 구조를 살펴보자면
입력장치는 키보드와 같은 역할을 한다.
출력장치는 모니터를 예로 들 수 있다.
메모리는 데이터 저장소이다.
그리고 CPU가 연산과 제어의 역할을 수행한다.
명령어가 적힌 문서를 보고 (메모리에 있음)
컴퓨터는 한 줄의 명령을 읽는다.
그리고 CPU가 명령을 수행한다.
그 후 다시 돌아가 다음 줄을 수행한다.
이 행위의 반복이 컴퓨터의 동작이다.
- 프로그램 로드
실행파일 즉 명령이 적힌 문서는 하드디스크에 있다.
실행파일이 실행되면 OS가 실행파일 내용을 메모리에 로드한다.(복사해서 올림) - 데이터 로드 및 캐싱
복사해놓은 명령어를 CPU의 캐시에 데이터를 또 복사해서 올린다.
그후에 CPU가 명령에 필요한 데이터를 램메모리에서 복사해서 가져온다.
그런데 CPU가 메모리에서 데이터를 가져올 때 필요한 데이터만 가져오는 것이 아니고
그 주위에 있는 데이터를 한꺼번에 가져온다.
왜냐하면 일반적으로 다음 명령에 쓰일 데이터는 그 전에 쓰인 데이터 주변에 있을 확률이 높기 때문이다.
필요할 때마다 데이터를 가져오는 것을 방지함으로써 더 효율적인 시스템이 된다.
그러나 필요한 데이터가 캐시에 없을 때는 메모리에 가서 가져오는데
이를 캐시 미스이라고 한다.
그리고 연관된 데이터가 묶여 있는 것을 data locality 라고 한다. - 연산 및 저장
명령을 CPU레지스터에 데이터를 복사해 놓고 실제로 연산을 수행한다.
컴퓨터 동작 = 요리?
위의 설명은 처음 볼 때는 이해하기 어려웠다.
하지만 tucker님이 요리로 비유해 설명을 해주셨을 때 80% 정도 이해가 된 것 같다.
요리를 한다고 했을 때 필요한 것들은 무엇인가?
- 레시피 : 어떻게 수행할지 쓰여진 명령 = 실행파일,프로그램
- 마트 : 하드디스크 (마트는 가려면 차가 필요하다. 데이터를 가져오기에 가장 느리다. )
- 냉장고 : 램 메모리 (마트보다 가까워서 속도가 빠르다. )
마트에서 필요한 재료를 사와서 냉장고에 넣은 상태라고 하자.
(실행파일을 하드디스크에서 램메모리로 복사해 온 것)
예를 들어서 닭을 손질하라는 명령을 읽었다. 그렇다면 냉장고에 있는 재료를 꺼내야하는데 그 근처에 있는 다른 재료까지 싱크대(캐시)에 가져오는 것이 효율적이다. (data locality)
만약 다음 명령에 무가 필요한데 무가 없다면 다시 냉장고를 열고 무를 가져온다. 이 때도 무만 가져오는 것이 아니고 근처 재료를 같이 가져온다. (캐시 미스)
이제 닭을 손질해야한다. 닭은 실제로 도마(레지스터) 위에서 손질한다.(CPU가 명령 수행)
레지스터의 크기는 정해져있다.(도마의 크기가 정해져 있듯이)
현대 컴퓨터는 64비트(8바이트)로 정해져있고 옛날에는 32비트 레지스터를 가졌다.
이런식으로 컴퓨터의 동작을 정리할 수 있다.
'프로그래밍언어 > Go' 카테고리의 다른 글
연산자『Tucker의 Go 언어 프로그래밍#6』 (0) | 2021.05.16 |
---|---|
fmt 패키지를 이용한 텍스트 입출력 / Tucker님의 Go 언어 프로그래밍 #5 (0) | 2021.05.08 |
변수 / Tucker님의 Go 언어 프로그래밍 #4 (0) | 2021.05.07 |
Go mod,build,실행 (Tucker의 Go언어 #3) (0) | 2021.05.04 |
프로그래밍 언어 / Tucker님의 Go 언어 프로그래밍 #2 (0) | 2021.05.01 |