[CS:APP] 1-4) 프로세서의 작동 원리

2023. 3. 6. 23:06Computer Science

728x90
반응형

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

[1-2) 컴파일 시스템]에 의해
실행가능한 목적파일로 번역되어 디스크에 저장hello 실행파일을 유닉스 시스템에서 실행하는 과정을 알아보자!

  • hello 실행파일을 유닉스 시스템에서 실행하기 위해서 이라는 응용프로그램에 그 이름을 입력한다.
linux> ./hello
hello, world
linux>

1) 쉘은 커맨드라인 인터프리터로, 프롬프트를 출력하고 명령어 라인을 입력 받아 그 명령을 실행한다.

2) 명령어 라인이 내장 쉘 명령어가 아니면, 쉘은 실행파일의 이름으로 판단하고 그 파일을 로딩해서 실행해준다.
👉🏻 위 경우, 쉘은 hello 프로그램을 로딩하고, 실행한 뒤에 종료를 기다린다.

3) hello 프로그램은 메시지를 화면에 출력하고 종료한다.

4) 쉘은 프롬프트를 출력해주고 다음 입력 명령어 라인을 기다린다.

 

시스템의 하드웨어 조직

1. Buses : 버스

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

워드 (word)

  • 고정 크기의 바이트 단위
  • 한 개의 워드를 구성하는 바이트 수는 시스템마다 보유하는 기본 시스템 변수다.
  • 오늘날 대부분의 컴퓨터들은 4바이트(32비트) 또는 8바이트(64비트) 워드 크기를 갖는다.

 

2. 입출력 장치

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

컨트롤러와 어댑터

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

 

3. 메인 메모리

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

 

4. CPU = 프로세서 = 주처리장치

Central Processing Unit

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

프로세서의 동작

1) 프로세서는 PC가 가리키는 메모리로부터 인스트럭션을 읽어온다.
2) 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행한다.
3) PC를 다음 인스트럭션 위치로 업데이트 한다.
👉🏻 이 새로운 위치는 방금 수행한 인스트럭션과 메모리 상에서 연속적일 수도 있고, 그렇지 않을 수도 있다.

  • 이와 같은 몇 개의 단순한 동작만이 있을 뿐이며,
    이들은 메모리, 레지스터 파일, 수식/논리 처리기(ALU) 주위를 순환한다.
* 레지스터 파일
레지스터 파일은 각각 고유의 이름을 갖는 워드 크기의 레지스터 집합으로 구성되어 있다.

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

CPU의 작업

다음은 인스트럭션의 요청에 의해 CPU가 실행하는 단순한 작업의 예이다.

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

 

프로그램의 실행 과정

1. 명령 대기

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

2. 명령 입력

  • :\hello를 입력하면 쉘 프로그램은 각각의 문자를 레지스터에 읽어들인 후 메모리에 저장한다.
  • 키보드에서 엔터키를 누르면 쉘은 명령 입력을 끝마쳤다는 것을 알게 된다.

3. 실행파일 로딩

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

4. 프로그램 실행

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