혼공컴운

[혼공컴운] 1장. 컴퓨터 구조 시작하기

게으른 the lazy 2024. 7. 4. 15:50

https://wikidocs.net/223730

0. 욕망


  • 대학교 1학년 때 한 친구가 있었다.
  • BiDuRi라는 아이디를 쓰던 그 친구는 컴퓨터를 잘 다뤘다.
  • Quake 3를 좋아했고, 나에게 Need For Speed라는 게임도 알려줬다.
  • 나는 ip address라는 게 있는 줄도 모르던 시절이었다.
  • 어느 날인가, 컴퓨터에 대해 얘기를 하고 있었다.
  • 그 친구가 이런 표현을 했다.
  • "램(RAM)은 말하자면 책상 같은 거야."
  • 컴퓨터가 어떻게 동작하는지 1도 알지 못하던 나였으나
  • 그 한 문장으로 인해 갑자기 모든 것이 다르게 느껴졌다.
  • 컴퓨터 내부를 감싸고 있던 안개가 살짝 걷히는 기분이었다.
  • 그리고 생각했다. "더 알고 싶다!"

  • 컴퓨터 구조라는 과목이 전산과에 있다는 것을 알게 되었다.
  • 하지만 내 전공만으로도 벅찼다.
  • 결국 미루고 미루다 정식으로 배울 기회는 갖지 못했다.
  • 그래도 틈날 때마다 찾아보고 공부하고 고민하면서
  • 이제는 이런 그림들을 그리게 되었다.

출처: https://wikidocs.net/219235

출처: https://wikidocs.net/223730



  • 이 이야기와 별 상관없는 반전: BiDuRi는 전산과가 아니었다.

1. 컴퓨터 구조 시작하기

  • 컴퓨터의 구성 요소와 각 요소의 역할에 대해 알아본다.
  • 우선은 큰 그림을 머리 속에 그리는 것이 목표이다.

1.1 컴퓨터 구조는 왜 알아야 하는가

  • 한줄요약: 몰라도 된다. 코딩 노예가 되어도 괜찮다면.
  • 그냥 잘 돌아가기만 하는 코드는 누구나 문법 좀 공부하면 짤 수 있다.
  • 그리고 당연히, 누구나 할 수 있는 일은 내가 아니어도 할 사람이 있다는 뜻이다.
  • 직장에서 살아남는 가장 확실한 방법은 대체불가자원이 되는 것이다.
  • 좋은 개발자가 되고는 싶은데 컴퓨터 구조와 운영체제를 공부하기 귀찮다는 건
  • 살은 빼고 싶은데 운동은 하기 싫다는 것과 동치가 아닐까?


1.2 컴퓨터 구조: 큰 그림 이해하기

  • 일단 숲을 조망하고 나무를 보러 들어간다.
  • 숲은 두 가지 모습을 가지고 있다: 하드웨어와 소프트웨어
  • 하드웨어는 부품이라고 부르고,
  • 소프트웨어는 정보라고 부른다.

1.2.1 컴퓨터가 이해하는 정보: 데이터와 명령어

  • 간단하다.
  • "이거 해"라고 시킬 때
  • "이거"에 해당되는 재료를 데이터라고 부르고
  • "이거 해"라는 문장은 명령어라고 부른다.

1.2.2 컴퓨터의 핵심 부품: CPU, 메모리, 보조기억장치, 입출력장치

  • 컴퓨터는 이렇게 생겼다.

출처: dall-e한테 시킴

프롬프트: desktop computer, without monitor, side-view, from top of the mainboard, with side cover removed. CPU, RAMs, Graphic card and HDD should be shown

  • 그래픽카드는 신경쓰지 말자.
  • 사무실에서 일하는 사람을 머리 속에 떠올려보자.
  • 필수 요소들이 있다.
    1. 일하는 사람이 있어야 하고
    2. 작업물들을 올려둘 책상이 있어야 하고
    3. 자료의 장기 보존을 위한 책장도 있어야 하고
    4. 이 모든 것들이 들어있을 사무실이 필요하다.
  • 컴퓨터도 똑같다.
    1. 일하는 CPU가 있어야 하고
    2. CPU가 작업할 정보가 올라가 있을 메모리가 있어야 하고
    3. 정보의 장기 보존을 위한 보조기억장치가 있어야 하고
    4. 이 모든 것들을 이어주는 메인보드가 필요하다.
  • 자세한 내용은 이곳이곳에 적어둔 것으로 대신한다.

  • CPU보다 메모리를 먼저 봐야 한다.
  • 이유는 뒤에서 알게 된다.
  • 메모리는 책상이다.
  • 사실 물건을 아무렇게나 놓을 수 있는 책상은 아니고,
  • 엄청나게 많은 칸으로 나뉘어져 있는 책상이다.
    • 굳이 계산하자면 수 천억 개 정도의 칸으로 되어 있다. (계산 확인 필요)
  • 각 칸에는 주소가 부여되어 있다.
  • 메모리에는 명령어와 데이터가 올라간다.
  • "100이랑 200이랑 더해"라고 시킬 때
  • '100', '200', '더해' 같은 것들이 메모리의 어떤 영역을 차지한다.
    • 칸이 아니라 영역이라고 쓴 이유는, 한 칸은 너무 작아서 실제로는 몇 칸을 점유하고 있을 때가 대부분이기 때문이다.
  • 후술하겠지만, CPU가 일할 때 값을 직접 가져가기보다 주소만 가져가서 일할 때가 많다.
  • 그래서 명령어도 '3번지와 4번지 값을 더해'라는 식으로 표현될 때가 많다.

  • CPU는 일하는 사람인데, 좀 더 뜯어볼 수 있다.
  • 산술논리연산장치(이하 ALU), 레지스터, 제어장치로 구성된다.
  • ALU는 계산기다. 사람의 두뇌 중 사고영역이다. (그런게 있다고 치자.)
  • 레지스터는 사람의 두뇌 중 단기기억영역이다.
    • C언어에서 만드는 레지스터 변수가 여기에 들어간다.
    • 그래서 빠르지만 좁다.
  • 제어장치는 사람의 팔이다.
    • 딱 맞는 비유인지 모르겠지만 그냥 그렇다고 치자.
    • 지금 알아야 할 제어 신호는 2가지이다.
    • 메모리 읽기: 메모리한테 "야 줘"라고 말한다.
      • 책상에 쓰인 정보를 단기기억영역에 저장한다.
    • 메모리 쓰기: 메모리한테 "야 받아"라고 말한다.
      • 정보를 책상 위에 적는다.

  • CPU가 100과 200을 더하는 과정은 아래와 같다.
    1. 제어장치가 메모리에게 읽기 신호를 보낸다.
    2. 메모리가 보내준 정보를 레지스터에 저장한다.
    3. 정보를 보니 '3번지와 4번지 값을 더하라'고 써있다.
    4. 제어장치가 읽기 신호를 통해 3번지, 4번지 값을 요청한다.
    5. 3, 4번지에 저장된 값이 레지스터에 저장된다.
    6. ALU가 일한다. 두 값을 더한다.
    7. 연산 결과를 레지스터에 저장한다.
    8. 제어장치가 읽기 신호를 통해 다음 할 일(명령어)을 물어본다.
    9. 메모리가 보내준 명령어는 '결과를 저장하라'이다.
    10. 제어장치가 쓰기 신호를 통해 레지스터의 정보를 메모리에 쓴다.

  • 메모리는 CPU와 가까우므로 작업이 빠르다.
  • 그런데 CPU가 퇴근하면(전원을 끄면) 책상이 리셋된다.
  • 그래서 보조기억장치가 필요하다.
  • 우리가 HDD, SSD라고 부르는 것들이다.
  • 보조기억장치는 책장이다.
  • 전원과 무관하게 정보를 저장할 수 있다.
  • 여기서 명령어와 데이터의 경계가 모호해지는데,
  • 보조기억장치에 저장된 명령어는 데이터일까, 명령어일까?
  • 데이터의 형태를 하고 있지만 역할은 명령어이다.
  • 데이터의 형태이지만 메모리가 올라가 프로세스가 되면서 명령어가 된다(고 알고 있다).
  • 자세한 내용은 후반부 언젠가 나올 것이라 기대된다.

  • 입출력장치는 키보드, 마우스, 모니터 등이다.
  • 지금 내가 타이핑을 하고 있듯이 사용자가 정보를 입력할 수 있고,
  • 지금 여러분이 화면을 보고 있듯이 사용자에게 정보를 출력할 수 있다.

  • 이 모든 것들을 연결하는 것이 메인보드이다.
  • 사무실로 치자면 사무실 공간 그 자체이다.
  • 좀 더 정확히는 시스템 버스라는 이름의 통로를 통해서 정보를 주고받는다.
  • 시스템 버스는 주소 버스, 데이터 버스, 제어 버스로 구성된다.
  • 각각의 역할은 이름이 이미 말해주고 있다.

  • CPU의 동작 원리를 알려주는 엄청난 영상을 소개하며 1장을 마친다.


1.3 확인문제

Q. 프로그램이 실행되려면 반드시 (뭐뭐)에 저장되어 있어야 한다.

A. 표현이 조금 모호한 것 같은데, 프로그램이 파일을 말하는 것이라면 보조기억장치이고, 프로세스를 말하는 것이라면 메모리이다.