SW 사관학교 정글(Jungle)/컴퓨터 시스템(CSAPP)

[CSAPP]1-4 프로세서는 작동 원리

jinsang-2 2024. 8. 27. 16:59

프로세서는 메모리에 저장된 인스트럭션을 읽고 해석한다

실행가능한 목적파일로 번역되어 디스크에 저장된 hello 실행파일을 유닉스 시스템에서 실행하는 과정을 알아보자!

  • hello 실행파일을 유닉스 시스템에서 실행하기 위해 쉘이라는 응용프로그램에 그 이름을 입력한다.
linux> ./hello
hello, world
linux>
  1. 쉘은 커맨드라인 인터프리터로 프롬프트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행한다.
  2. 명령어 라인이 내장 쉘 명령어가 아니면, 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행해준다.
    → 쉘은 hello 프로그램을 로딩하고, 실행한 뒤에 종료를 기다린다.
  3. hello 프로그램은 메시지를 화면에 출력하고 종료한다.
  4. 쉘은 프롬프트를 출력해주고 다음 입력 명령어 라인을 기다린다.

시스템의 하드웨어 조직

전형적인 시스템의 하드웨어 구성

1. 버스(Buses)

  • 시스템 내를 관통하는 전기적 배선군을 버스라고 한다.
  • 컴포넌트들 간에 바이트 정보들을 전송한다.
  • 버스는 일반적으로 워드(word)라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계한다.
  • 시스템 내에서 바이트 단위 정보를 각 요소 간에 전송하는 역할

워드(word)
- 고정 크기의 바이트 단위로 데이터 전송하도록 설계된 것
- 한 개의 워드를 구성하는 바이트 수는 시스템마다 보유하는 기본 시스템 변수다

 

2. 입출력 장치(I/O Device)

  • 입출력 장치는 시스템과 외부세계와의 연결을 담당한다.
  • 위의 이미지에서는 네개의 입출력 장치를 가지고 있다
    → 입력용 키보드와 마우스, 출력용 디스플레이, 데이터와 프로그램의 장기 저장을 위한 디스크 드라이브
  • 처음에 실행하는 파일인 hello프로그램은 디스크에 저장되어 있다.
  • 각 입출력 장치는 입출력 버스와 컨트롤러어댑터를 통해 연결된다.

컨트롤러와 어댑터
- 둘 다 입출력 버스와 입출력 장치들 간에 정보를 주고받게 해준다.
- 두 장치의 차이는 패키징에 있다.
- 컨트롤러는 디바이스 자체가 칩셋이거나 시스템의 인쇄기판(종종 머더보드라고 한다)에 장착된다.
- 어댑터는 머더보드의 슬롯에 장착되는 카드이다.

입출력 장치
시스템과 외부 세계와의 연결을 담당
장치로 기입된 데이터들은 입출력 버스를 통해 시스템 내부 요소들로 전달된다.

 

3. 메인 메모리(Main Memory)

  • 메인 메모리는 프로세서가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치다.
  • 물리적으로 메인 메모리는 DRAM(Dynamic Random Access Memory) 칩들로 구성되어 있다.
  • 논리적으로 메모리는 연속적인 바이트들의 배열로, 각각 0부터 시작해서 고유의 주소(배열의 인덱스)를 가지고 있다.
  • 일반적으로 한 개의 프로그램을 구성하는 각 기계어 인스트럭션은 다양한 바이트 크기를 갖는다.
  • C 프로그램 변수들의 데이터 크기는 데이터 형에 따라 다르다.

현대의 프로세서는 메인 메모리에서 레지스터로 데이터를 옮겨와 데이터를 처리한 후 그 내용을 다시 레지스터에서 메인 메모리로 저장하는 로드-스토어 설계를 사용한다.

# 데이터 형에 따라 다른 C 변수의 데이터 크기 (리눅스가 동작하는 x86-64 컴퓨터에서)
* short 타입: 2byte
* int, float 타입: 4byte
* long, double 타입: 8byte

메인 메모리
프로세서(CPU)가 프로그램을 실행하는 동안 데이터와 프로그램을 모두 저장하는 임시 저장장치.
물리적으로 DRAM 칩으로 구성
논리적으로 연속적인 바이트의 배열로 프로그램 마다 각 기계어 인스트럭션은 다양한 바이트 크기를 가진다.


4. 프로세서(주처리장치, CPU)

Central Processing Unit

  • 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행) 하는 엔진이다.
  • 프로세서의 중심에는 워드 크기의 저장장치(또는 레지스터)인 프로그램 카운터(PC) 가 있다.
  • 어느 한순간에 PC는 메인 메모리의 기계어 인스트럭션을 가리킨다.
  • 시스템에 전원이 공급되는 순간부터 전원이 끊어질 때까지 프로세서는 프로그램 카운터가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 한다.
  • 프로세서는 자신의 인스트럭션 집합 구조(Instruction set architecture) 로 정의되는 매우 단순한 인스트럭션 실행 모델을 따라 작동하는 것처럼 보인다.
  • 최신 프로세서들은 프로그램의 실행 속도를 높이기 위해 훨씬 더 복잡한 방식을 사용하는 것 같다. 
  • 이 모델에서 인스트럭션들은 규칙적인 순서로 실행되고, 한 개의 인스트럭션을 실행하는 것은 여러 단계를 수행함으로써 이루어진다.

* 레지스터(Register)
CPU 내에서 자료를 보관하는 아주 빠른 저장소. 일반적으로 계산을 수행중인 값을 저장하는 데 사용된다

* 프로그램 카운터(PC, Program Counter)
CPU 내부에 있는 레지스터 중의 하나로서
, 다음에 실행될 명령어의 주소를 가지고 있어 실행할 기계어 코드의 위치를 지정한다. 때문에 명령어 포인터라고도 합니다.
시스템에 전원이 공급되는 순간부터 전원이 끊어질 때까지 프로세서는 프로그램 카운터가 가르키는 곳의 인스턱션을 반복적으로 실행한다. → 프로그램 카운터 값이 다음 인스트럭션을 가리키도록 업데이트 한다

* 수식/논리 처리기(ALU, Arithmetic logic unit)
산술연산논리연산을 하는 디지털 회로


4-1 프로세서의 동작

  1. 프로세서는 PC가 가리키는 메모리로부터 인스트럭션을 읽어온다.
  2. 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행한다.
  3. PC를 다음 인스트럭션 위치로 업데이트 한다.
    👉🏻 이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고, 그렇지 않을 수도 있다.
    이와 같은 몇 개의 단순한 동작있고, 이들은 메모리, 레지스터 파일, 수식/논리 처리기(ALU) 주위를 순환한다.

* 레지스터 파일
레지스터 파일은 각각 고유의 이름을 갖는 워드 크기의 레지스터 집합으로 구성되어 있다.

* ALU : Aritmetic/Logic Unit
ALU는 새 데이터와 주소 값을 계산한다


4-2 CPU의 작업

  • 적재(Load)
    메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사한다.
  • 저장(Store)
    레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사한다.
  • 작업(Operate)
    두 레지스터의 값을 ALU로 복사하고 두 개의 워드로 수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장된다.
  • 점프(Jump)
    인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사한다.

CPU
주처리장치로 메인 메모리에 저장된 인스트럭션들을 해독(실행)하는 엔진이다.
구성 - 레지스터(워드 크기의 저장장치), PC(프로그램 카운터)

 

hello 프로그램의 실행과정

1. 명령 대기

  • 처음에 쉘 프로그램은 자신의 인스트럭션을 실행하면서 사용자가 명령을 입력하기를 기다린다.

2. 명령 입력

  • 쉘 프로그램에 hello 를 입력하면, 쉘 프로그램은 각각의 문자를 레지스터에 읽어들인 후 메모리에 저장한다.
linux> .\hello

Reading the hello command from the keyboard

  • 키보드에서 엔터를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알게된다.

3. 실행파일 로딩

  • 쉘은 파일 내의 코드와 데이터를 복사하는 일련의 인스트럭션을 실행하여 실행 파일인 hello 를 디스크에서 메인 메모리로 로딩한다.
  • 직접 메모리 접근 기법(DMA)을 이용하여 데이터는 프로세서를 거치지 않고 디스크에서 메인 메모리로 직접 이동한다.

Loading the executable from disk into main memory

4. 프로그램 실행

  • hello 목적파일의 코드와 데이터가 메모리에 적재된 후, 프로세서는 hello 프로그램의 main 루틴의 기계어 인스트럭션을 실행하기 시작한다.
  • 이 인스트럭션들은 hello, world\n 스트링을 메모리로부터 레지스터 파일로 복사하고, 거기부터 디스플레이 장치로 전송하여 화면에 글자들이 표시된다.
    writing the output string from memory to the display