OS/Windows

[OS/Windows] 1. 컴퓨터 구조에 대한 첫 번째 이야기

nyanghee 2023. 8. 18. 23:11

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

5월부터 퇴근 후랑 주말 틈틈이 읽어 8월 초에 끝까지 읽었는데, 그때 초벌로 내용을 정리해 두었다.

이를 다시 블로그에 작성해 두면 필요할 때마다 읽기 좋을 것 같아서! 블로그에 글을 작성하기로 했다.

유튜브와 인프런에서 강의로도 책 내용을 접할 수 있다. (무료 강의이다!)

 

 

[무료] 뇌를 자극하는 윈도우즈 시스템 프로그래밍 - 인프런 | 강의

한빛미디어(주)에서 발간한 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 저자의 강좌 입니다., [사진] 1. 강좌 소개 한빛미디어(주) 에서 발간한 '뇌를 자극하는 윈도우즈 시스템 프로그래밍' 의

www.inflearn.com

 

 

뇌를 자극하는 윈도우즈 시스템 프로그래밍

 

www.youtube.com

 


 

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

시스템 프로그램

- 컴퓨터 시스템을 동작시키는 프로그램

- 대표적인 시스템 프로그램으로는 Windows, UNIX와 같은 운영체제들이 있다.

 

이러한 소프트웨어들은 하드웨어를 모르는 사용자들이 컴퓨터를 쉽게 사용할 수 있도록 도와준다.

따라서 운영체제는 시스템 프로그램의 범주에 속한다.

 

컴퓨터 시스템은 하드웨어만을 뜻하지 않고, 하드웨어가 실제 일을 하게끔 도와주는 운영체제를 포함한다.

 

Windows 시스템 프로그래밍이란?

- Windows 운영체제 기반의 컴퓨터에게 일을 시키기 위한 프로그램을 구현하는 것

- 이러한 프로그램 작성을 위한 라이브러리는 Windows 운영체제에 의해 제공된다.

 

컴퓨터 시스템의 주요 구성요소(Main Components)

[그림1-1] 컴퓨터 시스템의 주요 구성요소

 


 

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

[그림1-2] 컴퓨터 하드웨어의 구성

 

CPU(Central Processing Unit, 중앙처리장치)
- 컴퓨터 프로그램의 실행에 있어 핵심적인 역할을 담당한다.

 

메인 메모리(Main Memory)
- 램(RAM)이라는 저장장치로 구성된다.
컴파일이 완료된 프로그램 코드가 올라가서 실행되는 영역이다.
- 프로그램 실행을 위해 존재하는 메모리라고 할 수 있다.

 

입•출력 버스(Input/Output Bus)
- 컴퓨터를 구성하는 구성요소 사이에서 데이터를 주고 받기 위해 사용되는 경로이다.
- 주고 받는 데이터의 종류와 역할에 따라서 어드레스 버스(Address Bus), 데이터 버스(Data Bus), 컨트롤 버스(Control Bus)로 구분된다.
- 하드디스크, 메인 메모리, CPU 등등이 모두 버스에 연결되어 있다.
- 버스 시스템을 기반으로 하드디스크에 있는 데이터를 메인 메모리로, 메인 메모리에 있는데이터를 하드디스크로 전송하는 것이 가능하다.
   메인 메모리와 CPU 사이에서의 데이터 입•출력도 가능하다.

 


 

03. CPU에 대한 이해

[그림1-2] 컴퓨터 하드웨어의 구성 (CPU 부분만 잘라내었다.)

 

ALU(Arithmetic Logic Unit)

- CPU 내부의 실제 연산을 담당하는 블록

 

ALU가 처리하는 기본적인 연산은 크게 두 가지로 나뉜다.

ⓛ 덧셈이나 뺄셈과 같은 산술 연산

② AND나 OR와 같은 논리 연산

 

컨트롤 유닛(Control Unit)
- ALU를 대신해서 CPU가 처리해야 할 명령어들을 해석하고, 해석된 결과에 따라 적절한 신호를 CPU의 다른 블록에 보낸다.

 

CPU 내부에 존재하는 레지스터들(Register Set)
- CPU 내부에도 임시적으로 데이터를 저장하기 위한 작은 메모리 공간
- CPU 내부에 존재하는 2진 데이터(Binary Data) 저장을 위한 저장 장치

  (CPU에 따라서 16비트, 32비트, 64비트 정도의 데이터를 저장할 수 있는 크기로 구성된다.)
- 레지스터에 명령어 및 데이터들을 저장해두고 상황이 허락될 때 ALU과 컨트롤 유닛이 직접 데이터를 가져가도록 한다.
- 각각의 용도가 정해져 있는 것이 일반적이며, CPU가 연산을 하기 위해 반드시 필요하다.

 

[그림1-6] Bus Interface

버스 인터페이스(Bus Interface)

CPU는 I/O 버스에 접근이 가능하다. 이 버스에 접근해서 데이터를 전송하기도 하고, 입력 받기도 한다.

교통 수단의 이용 방법을 알아야 탑승이 가능한 것처럼, CPU 내에는 I/O 버스의 통신 방식을 이해하고 있는 무엇인가가 필요하다.

이 역할을 하는 것이 바로 버스 인터페이스(Bus Interface)이다.


- 버스 인터페이스가 있기 때문에 명령어와 데이터들이 CPU 안으로 잘 흘러들어갈 수 있다.
- I/O 버스의 통신 방식을 이해하여 CPU 내부(레지스터)에 저장되어 있는 데이터를 I/O 버스에 실어 보내기도 하고, 

  I/O 버스를 통해 전송되어 오는 데이터들을 수신하기도 한다.

 

* I/O 버스와 CPU와의 연결을 위해 인터페이스가 필요한 것처럼, 하드디스크와 그래픽 카드도 I/O 버스와 연결을 하기 위해서는 인터페이스가 필요하다.
  즉 I/O 버스에 연결되는 장치들은 모두 인터페이스가 필요하다.
  인터페이스는 연결되는 장치에 따라 컨트롤러, 어댑터라고도 불린다.

 

클럭 신호(Clock Pulse)
- CPU를 구성하는 구성 요소에 제공되어야 하는 신호로서, 아주 중요한 의미를 지닌다.
- 타이밍을 제공하기 위해서 필요하다.
- CPU의 클럭 속도가 높으면 초당 처리하는 명령어의 개수가 많아지므로 컴퓨터의 전체적인 성능이 좋아진다.
- 클럭 발생기에 의해 발생되는 클럭신호는 CPU를 구성하는 요소에 제공되며, 이 신호에 맞추어 CPU가 일을 한다.
- 장치 간의 속도가 일치하지 않으므로, 클럭 신호를 속도가 더 느린 장치에 맞추어 발생시킨다. 
  ex) 장치가 이미 출력한 데이터를 다시 출력하거나, 출력되지 않은 값을 덮어씌우지 않도록 한다.

 

CPU는 왜 클럭 신호에 맞춰 일을 해야만 하는가?

[그림 1-7] 동기화의 필요성(1)

위와 같은 장비가 있다고 가정하자.

입력된 두 개의 정수 값을 더해서 그 결과를 버퍼에 저장하고, 저장된 결과를 출력하는 장치이다.

 

input 1과 input 2를 통해 계속해서 데이터가 들어오면, + 연산 장치는 계속해서 + 연산을 처리해야 한다.

출력 장치는 BUFFER에 존재하는 데이터를 계속해서 가져와 출력해야 한다.

이때 출력 장치가 연산 장치보다 더 빠르다면, 출력 장치는 이미 한번 가져간 데이터를 다시 출력하게 된다.

연산 장치가 출력 장치보다 더 빠르다면,  연산 장치가 미처 출력되지 못한 BUFFER의 값을 덮어쓰게 되어 연산 결과의 일부가 출력되지 않는 문제점이 발생한다.

이 문제를 해결하기 위해 속도가 더 느린 장치에 맞추어 클럭 신호를 발생시키는 것이다.

 


 

04. 프로그램의 실행 과정

위대한 수학자 폰 노이만(J.von Neumann)!

[그림 1-9] 폰 노이만(J.von Neumann)의 컴퓨터 구조

이전까지 프로그램이란 단순히 진공관 회로의 스위치 구성을 의미하는 것이었다.
그러나 폰 노이만은 프로그램이 컴퓨터 내부에 저장되는 구조를 생각해 냈다.

프로그램이라는 것이 존재하고, 이 프로그램은 컴퓨터 내부에 저장되어서 순차적으로 실행되어야 한다.

폰 노이만이 생각해낸 컴퓨터 구조는 폰 노이만 아키텍처라는 이름으로 불린다.
폰 노이만 아키텍처의 가장 큰 특징은 실행되어야 할 프로그램이 컴퓨터 내부에 저장된다는 것이다.

그래서 Stored Program Concept 라고도 불린다.

 

프로그램의 실행 과정

[그림 1-10] 실행 파일의 생성 단계

1. 전처리기에 의한 치환작업
- 전처리기는 #include, #define과 같이 #으로 시작하는 지시자의 지시에 따라 소스코드를 적절히 변경하는 작업을 한다.

 

2. 컴파일러에 의한 번역
- 1에 의해 변경된 소스코드는 여전히 C언어로 구성되어 있어, 우리가 눈으로 봐도 이해할 수 있는 내용이다.
  이 소스코드는 컴파일러에 의해 어셈블리 코드로 번역된다.

* 어셈블리 코드: CPU에게 일을 시키기 위한 명령어를 조합해서 만들어진 프로그램 코드

 

3. 어셈블러에 의한 바이너리 코드 생성
- 컴퓨터는 오로지 1과 0만을 이해하기 때문에 컴파일러에 의해 번역된 어셈블리 코드는 컴퓨터에 의해 실행되기에 앞서 바이너리 코드로 번역되어야 한다.

* 어셈블러: 어셈블리 코드를 CPU가 이해할 수 있는 바이너리 코드로 바꾸어주는 프로그램

* 바이너리 코드: 텍스트 코드에 상대되는 코드. 즉, 1과 0으로만 구성되는 코드

 

4. 링커에 의한 연결과 결합
- 링커는 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는(혹은 연결시켜 주는) 작업을 한다.
  이 과정이 끝나면 실제로 실행 가능한 실행 파일이 생성된다.
  생성된 실행 파일은 컴퓨터가 실행해야 하는 바이너리 코드로 구성된다.

 

실행파일은 링커에 의해 최종적으로 만들어진 파일로서, 컴퓨터에게 일을 시키기 위한 바이너리 코드 형식의 명령어가 들어 있다.
이 명령어들이 메모리 공간에 올라가고 난 다음 CPU에 의해 순차적으로 실행된다.
명령어들은 메모리상에서 실행되는 것이 아니라, 다음 과정을 통해 CPU 내부로 하나씩 이동한 다음 실행하게 된다.

 

1. Fetch
- 메모리상에 존재하는 명령어들을 CPU로 가져오는 작업이다.
2. Decode
- 가져온 명령어를 CPU가 해석하는 단계이다.
3. Execution
- 해석된 명령어대로 CPU가 명령어를 실행하는 단계이다.

프로그램의 기본 실행은 Fetch, Decode, Execution 단계를 거친다고 말할 수 있다.

 


 

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

프로그램의 기본 실행 단계 중 마지막 단계인 Execution은 누구에 의해서 진행되는가?
- 명령어를 통해 요구하는 것은 형태가 아주 다양하다. 데이터의 이동이 될 수도 있고, 산술 및 논리 연산이 될 수도 있다.
  명령어의 내용을 산술 및 논리 연산으로 한정 지어 설명하자면, 산술 및 논리 연산을 하는 Execution의 주체는 ALU(Arithmetic Logic Unit)이다.

 

Decode 단계는 CPU 안에 존재하는 누구에 의해서 진행되는 것인가?
- Decode 단계를 진행하는 요소는 컨트롤 유닛(Control Unit)이다.

 

명령어를 CPU 안에 가져다 놓을 때 어디에 저장하는 것인가?
- 메인 메모리에 저장되어 있는 명령어의 실행을 위해서는 명령어를 CPU로 이동시켜야 하는데, 이렇게 이동된 명령어를 저장하기 위해 사용되는 것이 레지스터이다.
  * 더 정확하게는, 레지스터 중에서도 IR(Instruction Register)이라 불리는 레지스터에 저장된다.

 

[그림 1-13] 폰 노이만의 컴퓨터 구조 구체화 1단계

 

명령어 실행을 위해 제일 먼저하는 Fetch는 어떠한 이동 경로를 통해서 진행되는가?

- 이 문제는 데이터 이동의 기반이 되는 버스(BUS) 시스템을 살펴보자!

 

[그림 1-14] 버스 시스템의 구성


데이터 버스(Data Bus)
- 데이터를 이동하기 위해 필요한 버스이다. 여기서 데이터란, 명령어가 될 수도 있고 연산에 필요한 피연산자(Operand)가 될 수도 있다.

 

어드레스 버스(Address Bus)
- 주소값을 이동하기 위해 필요한 버스이다.

CPU가 0x1024번지에 저장되어 있는 데이터 4바이트를 읽으려면, 메모리 영역에 주소값 0x1024를 먼저 전달해야 한다.

(메모리에 주소가 전달되면 해당 주소의 데이터를 전송하는 컨트롤러가 포함되어 있다고 생각하자.)

이때 사용되는 것이 어드레스 버스이다.

메모리 영역에 주소값을 전달하면 해당 주소에 존재하는 데이터를 데이터 버스를 통해 전달 받게 된다.

 

컨트롤 버스(Control Bus)
- CPU가 원하는 바를 메모리에 전달할 때 사용된다.
- CPU와 메모리가 서로 특별한 사인을 주고받는 용도로 사용된다.

 

무엇 때문에 컨트롤 버스를 이용해서 CPU가 메모리에 사인을 전달해야 하는가?

CPU는 메모리로부터 데이터를 가져오기도 하지만, 반대로 메모리에 데이터를 저장하기도 한다.

그러므로 CPU와 메모리 사이에 데이터를 보낼 것인지, 받을 것인지에 대한 적절한 사인이 오가야 한다.

 

이미지 출처: 도서 뇌를 자극하는 윈도우즈 시스템 프로그래밍 (윤성우 저)