Ch1.4 Processors Read and Interpret Instructions Stored in Memory

Park Choong Ho·2021년 8월 11일
0

1.4 Processors Read and Interpret Instructions Stored in Memory

현시점에서, hello.c 소스코드는 컴파일 시스템에 의해 디스크에 저장된 executable object file hello로 변환되었습니다. 유닉스 시스템에서 executable file을 돌리기 위해, 우리는 쉘에 해당 파일 이름을 입력합니다.

linux> ./hello
hello, world

쉘은 명령어 인터프리터로서 prompt를 프린트하고 명령어를 입력할때까지 기다리면서 명령을 실행시킵니다. 만약 명령어의 첫번째 단어가 미리 내장된 쉘 명령어와 일치하지 않으면, 쉘은 이를 로드하고 실행할 excutable file의 이름으로 간주합니다. 따라서 이경우에, 쉘은 hello 프로그램을 로드하고 실행하고 종료될때까지 기다립니다. hello 프로그램은 메시지를 화면에 프린트하고 종료됩니다. 쉘은 그다음 prompt를 프린트하고 다음 명령어 입력을 기다립니다.

1.4.1 Hardware Organization of a System

hello 프로그램을 실행할 때, 어떤 일이 발생하는지 이해하기 위해 전형적인 프로그램의 하드웨어 구조를 이해할 필요가 있습니다. 그 구조는 위 그림과 같습니다. 이 그림은 최근 Intel 시스템 구조 모델을 기반으로 하고 있습니다. 거의 대부분 시스템이 이와 유사하다고 생각하시면 됩니다.

Buses

버스들은 구성요소 사이를 오가며 바이트 단위의 정보들을 시스템 전체내에서 전당하는 전기회로 모음입니다. 버스들은 words라고 하는 고정된 바이트 모음들을 전달하게끔 디자인되어 있습니다. 한 워드 안에 있는 바이트 크기를 word size라 하는데 시스템에 따라 달라지는 근본적인 시스템 요소입니다. 오늘날 대부분 시스템들은 4 바이트 또는 8 바이트 크기의 word size를 가지고 있습니다. 여기서는 word size를 고정하지은 않고 대신, word를 특정 문맥에 따라 특정해서 사용하도록 하겠습니다.

I/O Devices

입출력(I/O) 장치들은 외부 세계로의 시스템 연결요소입니다. 위 그림에서는 크게 4가지 입출력 장치들을 가지고 있습니다.(키보드, 마우스, 디스플레이, 디스크 드라이브) excutable hello 프로그램은 디스크에 있습니다.

각 입출력 장치들은 controller 또는 adapter에 의해 I/O bus에 연결되어 있습니다. contolleradapter의 구분은 어떤 모음이냐에 따라 구분됩니다. 컨트롤러는 디바이스나 시스템 주요 printed circuit board(마더보드라 일컫는)에 있는 chip set입니다. 어댑터는 마더보드 슬롯에 삽입하는 카드입니다. 이런 차이점에도 불구하고, 이 둘의 목표는 입출력 버스와 입출력 장치사이에 정보를 전달하기 위함입니다.

6장에서는 디스크 같은 입출력 장치들이 어떻게 동작하는지 알아보도록 하겠습니다. 10장에서는, 유닉스 입출력 잍터페이스를 사용해서 어플리케이션 프로그램에서 입출력 디바이스들에 접근하는 방법을 배웁니다. 우리는 네트워크 같은 디바이스의 흥미로운 부분을 특히 살펴보겠지만, 다른 디바이스에도 이를 응용할 수 있습니다.

Main Memory

main memory는 프로세서가 프로그램을 실행하는 동안 프로그램과 프로그램이 조작하는 데이터를 가지고 있는 임시 저장 장치입니다. 물리적으로, 메인 메모리는 DRAM(dynamic random access memory)의 모음으로 구성되어 있습니다. 논리적으로는, 메모리는 일렬로 된 바이트 배열로 구성되어 있고 각 바이트는 고유한 주소를 0부터 시작해서 가지고 있습니다. 일반적으로, 프로그램을 이루고 있는 각 인스트럭션은 여러개의 바이트로 구성되어 있습니다. C 프로그램 변수에 상응하는 데이터 크기들은 각 타입에 따라서 달라집니다. 예를 들어, 리눅스 운영체제인 x86-64 컴퓨터에서는, short 타입 데이터는 2바이트이며 intfloat 타입은 4바이트, longdouble은 8바이트입니다.

6장에서 DRAM 칩이 어떻게 동작하는지, 그들이 어떻게 결합해서 메인 메모리를 구성하는지와 같은 메모리 기술들에 대해 더 알아보도록 하겠습니다.

Processor

CPU(central processing unit) 또는 프로세서는 메인메모리에 저장된 인스트럭션들을 실행하는 엔진입니다. CPU 핵심에는 PC(program counter)라 불리는 워드 크기의 저장소(레지스터) 가 있습니다. 언제든, PC는 메인 메모리에 있는 어떤 기계어 인스트럭션을 가리킵니다.

시스템에 전원이 켜지고 꺼질때까지, 프로세서는 반복적으로 PC가 가리키고 있는 인스트럭션을 실행하면서 PC가 다음 인스트럭션을 가리키게끔 업데이트합니다. 프로세서는 instruction set architecture에 의해 정의된 굉장히 단순한 인스트럭션 실행 모델에 따라서 동작하는 것처럼보입니다. 이 모델에서, 인스트럭션들은 제한된 순서에 따라 실행됩니다. 하나의 인스트럭션을 실행하는 것은 여러 단계를 포함합니다. 프로세서는 PC가 가리키고 있는 메모리에 가서 인스트럭션을 읽어오고, 인스트럭션에 있는 비트를 해석한 후, 인스트럭션에 따른 간단한 동작을 수행한 후, PC가 다음 인스트럭션을 가리키게끔 합니다. 다음 인스트럭션은 그 전에 실행된 인스트럭션과 메모리상에서 연속되지 않을 수 있습니다.

몇몇 간단한 동작만 있으며, 이 동작들은 메인 메모리, register file, ALU(arithmetic/logical unit)을 돕니다. 레지스터 파일은 워드 크기의 각각 유일한 이름을 가진 레지스터 모음으로 구성된 작은 저장 장치입니다. ALU는 새로운 데이터와 주소 값을 계산합니다. 다음은 인스트럭션 요청에 따라 CPU가 수행하는 간단한 동작 예시들입니다.

  • Load: 메인 메모리에서 워드 또는 바이트를 레지스터로 복사합니다. 레지스터에 있는 내용을 덮어씌웁니다.
  • Store: 레지스터에서 워드 또는 바이트를 메인메모리에 복사합니다. 전에 있는 내용을 덮어씌웁니다.
  • Operate: 두 레지스터에 있는 내용을 ALU에 복사합니다. ALU는 이렇게 복사된 두 워드를 가지고 수학적 계산을 수행합니다. 그 결과를 하나의 레지스터에 저장합니다. 이때 해당 레지스터에 있는 내용을 덮어씌웁니다.
  • Jump: 인스트럭션 자체에서 워드를 추출해옵니다. 그리고 그 워드를 program counter에 복사합니다. 이때도 program counter에 있는 내용을 덮어씌웁니다.

프로세서는 자신의 instruction set architecture에 따라 단순히 실행되는 것처럼 보이지만, 사실 현대 프로세서들은 프로그램 실행을 빨리 하기위한 복잡한 매커니즘을 사용합니다. 따라서, 프로세서의 instruction set architecture(각 기계어 인스트럭션이 가져오는 영향을 묘사)와 microarchitecture(프로세서가 실제 동작하는 것을 묘사)을 이제 구별할 수 있습니다. 기계어는 3장에서 배우게됩니다. 이때, 컴퓨터의 instruction set architecture에 의해 제공되는 추상화를 고려해볼 생각입니다. 4장에서는 프로세서가 실질적으로 어떻게 동작하는지에 대해서 더 이야기를 하고 5장에서는 기계어 프로그램의 성능을 예측하고 최적화할 수 있게 어떻게 현대 프로세서 모델들이 동작하는지를 묘사하겠습니다.

1.4.2 Running the hello Program

주어진 시스템 하드웨어 구조와 동작을 간단히 살펴봄으로써, 예제 프로그램을 돌렸을때 어떤 일이 일어나는지 이해할 수 있기 되었습니다. 세부사항들은 다음에 살펴보기로 하고, 지금은 큰그림을 그려보도록 하겠습니다.

처음에, 쉘 프로그램은 인스트럭션을 실행하고 사용자가 명령어를 입력하기를 기다립니다. ./hello 명령어를 입력하면, 쉘 프로그램은 각각을 레지스터로 읽어오고 이를 메모리에 저장합니다.(아직 Enter key를 입력한 것은 아닙니다.) 그 동작을 아래 그림에서 확인할 수 있습니다.

그 다음 enter key를 누르면, 쉘은 우리가 명령어 입력을 완료했다는 것을 알게됩니다. 쉘은 디스크에 저장되어 있는 hello 오브젝트 파일에 있는 코드와 데이터를 메모리에 복사하고 인스트럭션을 실행함으로써 hello 파일을 로드합니다. 데이터는 프린트될 hello, world\n 문자를 포함하고 있습니다.

DMA(direct memory access) 기술을 활용하여 데이터는 프로세서를 거치지 않고 바로 디스크에서 메인메모리로 가게됩니다. 아래 그림과 같이 말이죠.

hello 오브젝트 파일에 있는 코드와 데이터가 메모리에 로드되고 나면, 프로세서는 hello 프로그램의 main 루틴에 있는 기계어 인스트럭션을 실행하기 시작합니다. 이 인스트럭션들은 hello world\n에 있는 바이트를 메모리에서 레지스터 파일로 복사하고 레지스터 파일에서 디스플레이 장치로 복사합니다. 그 과정은 아래 그림에서 확인할 수 있습니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글