[스터디] 시스템 프로그래밍 - Chapter 1. 컴퓨터 구조에 대한 첫 번째 이야기

2023. 9. 11. 17:16·독서/뇌를 자극하는 윈도우즈 시스템 프로그래밍
목차
  1. 01. 시스템 프로그래밍의 이해와 접근
  2. - 시스템 프로그래밍의 정의
  3. - 왜 우리는 시스템 프로그래밍을 공부해야 할까?
  4. 02. 컴퓨터 하드웨어의 구성
  5. 03. CPU의 내부를 살펴보기
  6. - 클럭 신호Clock Pulse
  7. 04. 폰 노이만
  8. - 현대 컴퓨터 아키텍쳐의 설계자
  9. - 프로그램 실행 과정
  10. - 프로그램 실행 과정과 Stored Program Concept
  11. 05. 하드웨어 구성의 재접근
  12. - 데이터 이동의 기반이 되는 버스 시스템

뇌를 자극하는 윈도우즈 시스템 프로그래밍(저자, 윤성우)


01. 시스템 프로그래밍의 이해와 접근

- 시스템 프로그래밍의 정의

시스템 프로그래밍을 알아보기 위해서 시스템 프로그램에 대해서 먼저 알아보자. 시스템 프로그램은 하드웨어를 사용할 수 있도록 도와주는 소프트웨어를 말한다. 대표적으로 Window, Linux, Mac, 등과 같은 OS가 있다.

 

그렇다면 시스템 프로그래밍은 하드웨어의 성능을 사용해서 작업할 수 있게 프로그램을 만드는 행위라고 설명할 수 있다.

 

- 왜 우리는 시스템 프로그래밍을 공부해야 할까?

소프트웨어를 개발하는 입장에서 시스템 프로그래밍의 중요도는 높다. 하드웨어의 성능을 이용한다고 말하면 단순히 전산학이나 전기 회로, 등의 전공에서 중요도가 부각될 것 같지만, 하드웨어의 구조를 이해하고 작동 방식에 대해서 알 수 있으면 효율적인 소프트웨어를 설계할 수 있기 때문이다.

 

02. 컴퓨터 하드웨어의 구성

- CPU, Central Processing Unit

컴퓨터를 사람으로 비유하면, CPU는 사람의 뇌에 해당한다. 복잡한 장치이다 보니, 위 사진에서는 ALU와 Register, 컨트롤 유닛, Bus Interface가 있는데 다음 주제에서 조금 더 상세하게 작성하겠다.

 

- 메인 메모리, Main Memory

컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역이다. 프로그램을 실행하면 메인 메모리 위로 올라가 실행된다.

 

- 입·출력 버스, I/O Bus

컴퓨터를 구성하고 있는 요소 사이에서 데이터를 주고 받기 위해서 사용되는 경로다. 데이터의 종류에 따라서 어드레스 버스Address Bus, 데이터 버스Data Bus, 컨트롤 버스Control Bus로 구분 지을 수 있다. 

 

03. CPU의 내부를 살펴보기

ALU, Arithmetic Logic Unit

CPU의 내부에서 연산을 담당하는 블록이다. 이외의 나머지 블록들은 연산을 하는데 도움을 주는 블록으로 이루어져있다. 처리하는 연산은 크게 두가지로, 산술 연산(덧셈, 뺄셈)과 논리 연산(AND, OR)이다.

 

컨트롤 유닛, Control Unit

연산을 진행하기 위해서 ALU로 데이터를 보내야한다. 하지만 앞서 말했듯이 ALU는 연산만을 진행하는 블록이기에 전달 받은 데이터를 이해할 수 없다. 이 때, 컨트롤 유닛을 통해서 ALU에게 연산을 진행시킬 수 있다.

 

즉, 전달 받은 명령어를 해석하여 ALU가 연산만 진행할 수 있도록 도움을 주는 블록이다.

 

Register Set

CPU에서 이미 전달 받은 명령어가 있어서, ALU와 컨트롤 유닛이 작동중이라면 어떻게 될까? 새로운 명령어를 제거하고 작업이 끝난 이후에 다시 할당을 해야한다면, 우리는 아마 컴퓨터를 키고 나서 수많은 시간을 명령어 전달에 할애하게 될 것이다.

 

Register Set은 ALU와 컨트롤 유닛에서 이미 처리중인 명령이 있을 때, 임시적으로 새로운 명령 정보를 저장할 수 있는 공간이다. 이는 CPU 내부에 존재하는 아주 작은 메모리로 2진 데이터(Binary Data)를 저장할 수 있다.

* 2진 데이터(Binary Data) : 01001과 같은 0과 1로 이루어진 데이터를 의미함.

 

Register들은 CPU 내부에 여러 개가 존재하고 각각의 용도가 정해져 있는 것이 일반적이며, CPU에 따라서 개수와 형태가 다르다.

 

Bus Interface

명령어와 데이터들을 CPU에 전달하기 위한 요소다. 컴퓨터는 단일 장치로 움직이는 것이 아니라, CPU, GPU, RAM, 등 다양한 장치들이 데이터를 주고 받으면서 작동하는데 각자 내부에서 사용되는 데이터는 조금씩 다를 것이다.

 

GPU의 데이터를 그대로 CPU가 받게 된다면 정상적으로 수행하지 못할 가능성이 존재한다. 이때, 원활하고 수월한 데이터 전달을 가능하게끔 하는 역할을 입·출력 버스I/O Bus가 담당하고 있다. 그렇다면 해당 기능을 사용할 수 있는 장치가 필요한데, 이것이 버스 인터페이스Bus Interface다.

 

즉, I/O Bus의 통신 방식을 이해하고 있는 장치다. I/O Bus를 통해서 데이터를 전달받고 내보내야 하는 데이터를 I/O bus에 실어서 내보낼 수 있게 하는 역할을 담당한다.

 

- 클럭 신호Clock Pulse

위 사진에서는 클럭 신호에 대해서 설명하지 않았으나, 중요한 개념이기 때문에 중간에 설명한다. 클럭 신호는 타이밍을 제공하는 매우 중요한 요소다.

 

CPU는 매 클럭이 발생할 때, 클럭에 맞춰서 일을 하는데 CPU의 클럭 속도가 높을 수록 처리하는 명령어의 수가 많아지는 것이기 때문에 컴퓨터의 전체적인 성능이 좋아지게 된다.

 

왜 클럭 신호가 필요한가?

이 예시는 우리가 실생활에서 만나는 신호등을 가지고 빗대어 설명한다. 신호등이 존재하지 않는다면, 자동차들은 길을 가다가 멈출 필요가 없기 때문에 빠르게 움직일 수 있을 것이다. 하지만 도로가 사거리라면 어떻게 될까?

 

서로 원하는 방향을 가기 위해서는 다른 방향의 차량들이 비켜주어야 한다. 그렇지 않는다면 서로 원하는 방향으로 갈 수 없는 상황이 생기며, 신호등이 존재하는 것 보다 더 오랜 시간을 도로 위에서 보내야 한다.

 

CPU도 똑같다고 볼 수 있다. 클럭 신호가 존재하지 않는다면 성능이 허락하는 한, 최대한 많은 데이터를 CPU에서 접수하게 될 것이고 데이터마다 전달 받는 속도가 일정하지 않기 때문에 연산중에 새로운 데이터를 받게 된다면 CPU 내부의 버퍼가 덮어써진다거나, 처리되지 않은 데이터가 생길 수 있다. 

 

이러한 문제를 예방하고자, CPU는 클럭 신호를 사용하게 된다. 장치의 성능에 따라 정해진 속도는 성능을 올리는 것보다 저하가 쉽다. 그렇기 때문에 장치 중 가장 낮은 연산 속도의 장치에 타이밍을 맞춰서 데이터를 연산한다.

 

 

04. 폰 노이만

- 현대 컴퓨터 아키텍쳐의 설계자

현재 우리가 사용하는 컴퓨터는 프로그램이 내부에서 저장되는 구조로 이루어져 있다. 이러한 컴퓨터 구조를 처음으로 설계한 사람은 폰 노이만이다. 그 전까지는 컴퓨터의 외부에서 진공관 회로의 스위치를 변경하며 연산을 진행했었기에 불편함이 많았다.

 

폰 노이만이 제시한 컴퓨터 구조를 폰 노이만 아키텍쳐라는 이름으로 부르며, 또는 Stored Program Concept이라 부른다. 이러한 방식으로 만들어진 최초의 컴퓨터가 EDSAC이다.

 

- 프로그램 실행 과정

1. 전처리기에 의한 치환 작업

실행 파일 생성의 첫 단계는 '#include'나 '#define'과 같이 #으로 시작하는 지시자에 따라 코드를 변경하는 작업을 진행한다.

 

2. 컴파일러에 의한 번역

소스코드를 어셈블리 코드로 번역하는 단계다. 어셈블리 코드는 CPU 명령어를 조합한 프로그램 코드를 의미한다.

 

3. 어셈블러에 의한 바이너리 코드 생성

1과 0으로 구성되는 코드인 바이너리 코드를 생성한다. 컴퓨터는 0과 1로 이루어진 바이너리 코드만 이해하기 때문에 어셈블리 코드 또한, 바이너리 코드로 치환한다. 예시로 덧셈은 '0001' 뺄셈은 '1110'과 같은 바이너리 코드를 생성하며, 어셈블리 코드는 바이너리와 매칭되는 영문표라 볼 수 있다.

 

'0001'은 ADD

'1110'은 SUB

 

라고 설명을 한다면, ADD SUB로 덧셈과 뺄셈을 나타낼 수 있다. 이러한 방식으로 프로그램을 구현하는 것이 어셈블리 프로그래밍이다. 그리고 ADD SUB를 바이너리 코드, 2진수로 변경해주는 것이 어셈블러의 역할이다.

 

4. 링커에 의한 연결과 결합

링커는 프로그램 내에서 참조하는 함수나 라이브러리를 하나로 묶는 작업을 한다. 이 과정이 끝나면 실행 가능한 실행 파일이 생긴다.

 

- 프로그램 실행 과정과 Stored Program Concept

위 사진은 링커에 의한 연결과 결합이 된 모습을 나타냈다. 메모리 공간에 올라간 명령어들은 CPU에 의해 순차적으로 실행된다. 이 때, 명령어 A, B, C는 메모리 공간에서 바로 실행되는 것이 아니라 CPU 공간으로 이동 후 실행하게 된다.

 

1. Fetch 

메모리 공간에 존재하는 명령어를 CPU 공간으로 옮겨오는 작업이다.

2. Decode

CPU 공간에 이동한 명령어를 해석한다.

3. Execution

해석된 명령어를 실행하는 단계다.

 

05. 하드웨어 구성의 재접근

위 사진은 컴퓨터 구조에 해당하는 부분이다. 폰 노이만의 컴퓨터 구조와 오늘날의 컴퓨터 구조를 대조해보자.

 

명령어의 요구대로 실행하는 Execution의 주체가 누구인가?

형태는 매우 다양하다. 데이터의 이동이 될 수 있고 산술 및 논리 연산이 될 수 있다. 지금은 산술 및 논리 연산에 한정을 짓는다면 Execution의 주체는 ALU라고 말할 수 있다.

 

Decode은 무엇에 의해서 실행이 가능한가?

컨트롤 유닛에 의해서 실행된다.

 

메인 메모리의 명령어를 CPU로 이동하는 방법이 무엇인가?

레지스터를 통해서 이동시킬 수 있다. 더 정확하게 접근을 해보자면 레지스터 중에서 IR, Instruction Register이라고 불리는 레지스터에 저장된다.

* 추가적으로 PC, Program Counter 레지스터에 대해서 알아보자. 명령어 A가 처리되면 명령어 B를 가져와야 한다. PC 레지스터는 다음에 가져와야 할 명령어가 어디에 존재하는지 기억하기 위한 용도로 사용된다. 명령어를 하나씩 가져올 때 마다 PC 레지스터의 값은 유동적으로 변경된다.

 

- 데이터 이동의 기반이 되는 버스 시스템

Fetch를 위한 데이터 전송 경로에 대해서 알아보자. 데이터 이동에 사용되는 전송 경로를 버스 시스템Bus System이라고 한다. 위에서 말했듯이 버스의 종류에는 어드레스 버스, 데이터 버스, 컨트롤 버스가 있다.

 

CPU와 메인 메모리를 기준으로 버스 시스템을 설명하자면, 이 둘도 데이터를 주고 받기 위해서 버스로 연결되어 있다. 메인 메모리에 저장되어 있는 명령어를 가져오는 것이 Fetch라고만 설명되었지만, CPU의 레지스터에서 저장된 데이터를 메인 메모리에 저장하게 되는 반대의 경우도 있다.

 

 

데이터 버스

데이터를 이동하기 위한 버스.

 

어드레스 버스

주소값을 이동하기 위한 버스, CPU가 데이터를 읽기 위해서 메모리 주소에 접근을 할 때 필요로 한다.

 

컨트롤 버스

CPU와 메모리 사이의 특별한 사인Sign을 주고 받는 용도로 사용되는 버스

 

 

내부 메모리에 해당하는 램도 버스를 사용해서 CPU와 데이터를 주고 받는 것 처럼 느껴질 수 있으나, CPU에 따라서 다양해진다. 외부 디바이스(하드 디스크, CD-ROM, 등)는 하나의 버스를 통해서 데이터를 주고 받으나, 내부 메모리에 해당하는 램의 경우에는 다른 버스 시스템을 통하여 CPU와 데이터를 주고 받는다.

'독서 > 뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글

[스터디] 시스템 프로그래밍 - Chapter 5. 프로세스의 생성과 소멸  (0) 2023.10.02
[스터디] 시스템 프로그래밍 - Chapter 4. 컴퓨터 구조에 대한 두 번째 이야기  (1) 2023.09.19
[스터디] 시스템 프로그래밍 - Chapter 3. 64비트 기반 프로그래밍  (1) 2023.09.13
[스터디] 시스템 프로그래밍 - Chapter 2. 아스키코드 vs 유니코드  (1) 2023.09.11
[스터디] 시스템 프로그래밍 - 0  (0) 2023.09.11
  1. 01. 시스템 프로그래밍의 이해와 접근
  2. - 시스템 프로그래밍의 정의
  3. - 왜 우리는 시스템 프로그래밍을 공부해야 할까?
  4. 02. 컴퓨터 하드웨어의 구성
  5. 03. CPU의 내부를 살펴보기
  6. - 클럭 신호Clock Pulse
  7. 04. 폰 노이만
  8. - 현대 컴퓨터 아키텍쳐의 설계자
  9. - 프로그램 실행 과정
  10. - 프로그램 실행 과정과 Stored Program Concept
  11. 05. 하드웨어 구성의 재접근
  12. - 데이터 이동의 기반이 되는 버스 시스템
'독서/뇌를 자극하는 윈도우즈 시스템 프로그래밍' 카테고리의 다른 글
  • [스터디] 시스템 프로그래밍 - Chapter 4. 컴퓨터 구조에 대한 두 번째 이야기
  • [스터디] 시스템 프로그래밍 - Chapter 3. 64비트 기반 프로그래밍
  • [스터디] 시스템 프로그래밍 - Chapter 2. 아스키코드 vs 유니코드
  • [스터디] 시스템 프로그래밍 - 0
태역
태역
  • 태역
    RYULAB
    태역
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 언어
        • C
        • C++
        • C#
      • 엔진, 프레임워크
        • Unity
        • Unreal
        • Electron
      • 공부
        • 디자인 패턴
        • 수학
        • CS
        • Git
        • 알고리즘
        • 자료구조
      • 코테
        • 프로그래머스
        • 백준
      • 독서
        • Effective C#
        • CLR via C#
        • 뇌를 자극하는 윈도우즈 시스템 프로그래밍
        • 오브젝트
        • CSAPP
        • OSTEP
      • 프로젝트
        • Unity
      • 개발 일지
        • 퓨처리티
        • 골든타임
      • 활동
        • 게임잼 후기
        • 게임제작동아리 브릿지
        • 크래프톤 정글
        • 기타
      • 기타
  • 블로그 메뉴

    • 링크

    • 공지사항

      • 2024 04 17
    • 인기 글

    • 태그

      인프런 #인프런강의후기 #게임개발 #게임개발강의 #인강후기 #강의후기 #게임개발자 #인프런강의
      오블완
      티스토리챌린지
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    태역
    [스터디] 시스템 프로그래밍 - Chapter 1. 컴퓨터 구조에 대한 첫 번째 이야기
    상단으로

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.