정체불명의 모모

[뇌를 자극하는] 1장. 컴퓨터 구조에 대한 첫 번째 이야기 - 2 본문

윈도우즈 시스템 프로그래밍

[뇌를 자극하는] 1장. 컴퓨터 구조에 대한 첫 번째 이야기 - 2

정체불명의 모모 2021. 6. 5. 00:45
본 글은 뇌를자극하는 윈도우즈 시스템 프로그래밍책을 바탕으로 작성 하였습니다.

 

Section 04. 프로그램의 실행과정

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

: 오늘날 우리가 사용하고 있는 컴퓨터의 기본 모델을 제시한 사람이다.

위 그림에서 중요하게 봐야 할 요소는 메모리와 프로그램이다.

폰 노이만은 프로그램이 컴퓨터 내부에 저장되는 구조를 생각해 낸 것이다.

따라서 많은 사람들이 오늘날의 컴퓨터에 대한 개념을 만든 사람이 폰 노이만이라고 한것이다.

 

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

 

폰 노이만이 생각해낸 컴퓨터 구조는 "폰 노이만 아키텍쳐"라는 이름으로 불리기 시작하였으며,

이를 바탕으로 한 최초의 컴퓨터가 EDSAC라는 이름으로 약 7년 후에 탄생하였다.

폰 노이만 아키텍처의 가장 큰 특징은 실행되어야 할 프로그램이 컴퓨터 내부에 저장된다는 것이다.

그래서 폰 노이만 아키텍처는 "Stored PRogram Concept"라고 불린다.

 

프로그램의 실행 과정

단계 1 : 전처리기에 의한 치환 작업

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

 

단계 2 : 컴파일러에 의한 번역

= 단계 1에 의해서 변경된 소스코드는 여전히 C 언어로 구성되어 있어서 우리가 눈으로 봐도 이해할 수 있는 내용이다.

   이제 이 소스코드는 컴파일러에 의해서 어셈블리 코드로 번역 된다.

    ( 어셈블리 코드 : CPU가 디자인될 때  CPU에게 일을 시키기 위한 명령어도 함께 디자인 되는데, 어셈블리 코드란 이런한 명령어를 

      조합해서 만들어진 프로그램 코드를 의미한다. )

 

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

= 보통 바이너리 코드라고 하면 어렵게 생각한다.

   그러나 텍스트 코드에 상대되는 뜻이라고 생각하면 쉽다. 

   즉, 1과 0 으로만 구성되는 코드를 말한다. 컴파일러에 의해 번역된 어셈블리 코드는 컴퓨터에 의해 실행되기에 앞서서 바이너리 코드로 

   번역 되어야 한다.

   왜냐 하면 컴퓨터는 오로지 1과 0 만을 이해하기 때문이다.

   CPU가 이해할 수 있는 바이너리 코드로 바꾸어 주는 프로그램이 필요한데, 이것이 바로 어셈블러이다.

 

단계 4 : 링커에 의한 연결과 결합

= 프로그램 내에서 참조하는 함수나 라이브러리들을 하나로 묶는(혹은 연결시켜 주는) 작업을 한다고 설명할 수 있다.

   이 과정이 끝나면 실제로 실행 가능한 실행파일이 생성된다.

   물론 이 실행파일은 컴퓨터가 실행해야 하는 바이너리 코드로 구성된다.

 

" 실행파일 안에는 컴퓨터가 실행해야 할 바이너리 코드가 존재한다. "

 

 

< 이제 바이너리 코드와 폰 노이만의 "Stored Program Concept"을 하나로 묶어서 프로그램의 실행 과정을 얘기해 보자 >

 

프로그램의 실행과정

위 그림에 대한 설명을 하겠다.

우선 실행파일을 보도록 하자. 이것은 링커에 의해서 최종적으로 만들어진 파일로서 , 이 안에는 컴퓨터에게 일을 시키기 위한 명령어(바이너리 코드 형식의 명령어)가 들어 있다.

이것이 메모리 공간에 올라가고 난 다음 CPU에 의해서 실행되기 시작한다.

 메모리 공간에 올라간 명렁어들은 CPU에 의해서 순차적으로 실행된다.

 메모리 상에서 실행되는 것이 아니라 CPU 내부로 하나씩 이동한 다음 실행하게 된다.

 

※ 이 과정을 3단계로 나눠서  살펴보자

 

  ㆍ단계 1. Fetch : 메모리상에 존재하는 명령어를 CPU로 가져오는 작업이다.

  ㆍ단계 2. Decode : 가져다 놓은 명령어를 CPU가 해석하는 단계이다. 

                                       다시 말해서 무슨 일을 하는 명령어인지 분석하는 단계이다.

  ㆍ단계 3. Execution : 해석된 명령어의 명령대로 CPU가 실행하는 단계이다.

                                           

" 결국, 프로그램의 기본 실행은 Fetch , Decode, Execution 단계를 거친다고 말할 수 있다. " - 중요!

 

 

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

폰 노이만의 컴퓨터 구조 VS 오늘날의 컴퓨터 구조

질문 1 : "명령어 실행을 위해서 제일 먼저 하는 일이 Fetch인데 어떠한 이동 경로를 통해서 명령어의 Fetch가 진행되는 것인가?

답변 : 입출력 버스를 통해서 명령어의 이동이 된다.

 

질문 2 : "명령어를 CPU 안에 가져다 놓을 때 어디에 저장하는 것인가?"

답변 : 메인메모리에 저장되어 있는 명령어의 실행을 위해서는 명령어를 CPU로 이동시켜야 하는데, 이렇게 이동된 명령어를 저장하기 위해 사용되는

            것이 레지스터이다. 조금 더 정확히 설명 한다면, 레지스터 중에서도 IR이라는 레지터에 저장된다.

 

질문 3 : "CPU안에 가져 다 놓은 명령어는 Decode 단계에서 해석되는데 , 이는 CPU 안에 존재하는 누구에 의해서 진행 되는 것인가?

답변 : Decode는 명령어의 해석이다. 이것을 진행하는 요소는 컨트롤 유닛(Control Unit)이다.

 

질문 4 : "마지막 단계인 Execution은 누구에 의해서 진행 되는가?

답변 : 산술 및 논리 연산을 하는 Execution의 주체는 ALU(Arithmetic Logic Unit)이다.

 

데이터 이동의 기반이 되는 버스(BUS) 시스템

: 데이터를 이동하는 데 있어서 사용되는 전송 경로를 가리켜 버스 시스템(Bus System)이라 한다.

  버스 시스템은 주고 받는 데이터의 종류에 따라서 어드레스 버스(Address Bus) , 데이터 버스(Data Bus),

  그리고 컨트롤 버스(Control Bus) 이렇게 3가지 요소로 구성된다.

 

 I/O 버스를 통해서 내ㆍ외부에 존재하는 주변 장치들이을 통해 데이터를 주고 받기 위한 통로 역할을 한다.

 

버스 시스템의 구성

ㆍ 데이터 버스(Data Bus) : 데이터를 이동하기 위해 필요한 버스이다.

      여기서 말하는 데이터란 명령어가 될 수 있고, 연산에 필요한 피연산자(Operand)가 될 수도 있다.

 

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

      주소가 전달되면 해당 주소의 데이터를 전송하는 컨트롤러가 포함되어 있는 것으로 생각하자. 

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

 

ㆍ 컨트롤 버스(Control Bus) : CPU가 원하는 바를 메모리에 전달할 때 사용된다.

      쉽게 말해 CPU와 메모리가 서로 특별한 사인(Sign)을 주고 받는 용도로 사용되는 버스이다.

 


    #_이것만은 알고 갑시다.                                                 

    1. ALU와 컨트롤 유닛의 기능적 역할

      : 명령어가 CPU로 입력되었을 때 ALU와 컨트롤 유닛(Control Unit)의 역할을 기억하자.

        명령어의 내용대로 연산을 하는 주 요소는 ALU이지만, 명령어를 분석해서 해야 할 일을 결정하는 요소는 컨트롤 유닛이다.

 

    2. 레지스터(Register)의 필요성

      : 레지스터의 역할은 앞으로 조금 더 깊이 알게 된다.

        그러나 기본적으로 레지스터는 CPU 내에 존재하는 저장장치임을 알 필요가 있다.

 

   3. 클럭 펄스(Clock Pulse)의 필요성

      :  클럭은 동기화를 위해서 필요한 장치이다. CPU는  인가되는 클럭 펄스에 맞춰서 일을 한다.

 

   4. Fetch , Decode , Excution

     : "Stored program concept" 의 명령어 실행단계는 Fetch, Decode , Execution이다. 

        메인 메모리에 저장되어 있는 명령어를 CPU 내부로 가져오고(Fetch), 컨트롤 유닛에 의해 분석된 다음(Decode),

        ALU에 의해 연산이 이뤄진다(Exection).

 

 5. 버스 인터페이스(BUS Interface)

   : CPU 내부 및 외부에 있는 요소들은 서로 I/O BUS 를 통해서 데이터를 주고 받는다.

     BUS를 통해서 데이터를 주고 받기 위해서는 BUS의 통신방식에 맞게 데이터 입ㆍ출력을 돕는 인터페이스 장치가 있어야 하며,

     이 인터페이스 장치를 가리켜 컨트롤러 혹은 어댑터(Adapter)라고 부른다.

 

 

Comments