Computer Science/컴퓨터 구조

CS.APP Chap1 A tour of computer system - 1

sh1mj1 2023. 5. 18. 15:16

Chap 01. A tour of computer system.

먼저 computer system 은 Hardware 와 System Software 로 이루어져 있으며 이 두 개가 같이 작동하여 application program 을 실행시킵니다.

 

시스템 구현 방식은 계속해서 변화했지만 이러한 근본적인 개념은 변하지 않습니다. 이 책을 통해 code 최적화, 보안 문제 해결, error 해결, 동시성 문제 등을 배울 것입니다.

1.1 Information is Bits + Context

정보는 비트와 컨텍스트입니다.

텍스트 문자는 ASCII 표준을 사용하여 표현할 수 있습니다. 각 문자를 바이트 길이 값으로 표현하면 연속된 바이트 파일에 저장할 수 있지요.

 

ASCII 문자로 구성된 파일은 text files 이고 모든 다른 파일은 binary files 입니다. 0 과 1 로 이루어져 있기 때문입니다.

System 의 모든 정보는 bunch of bits 로 표현됩니다. 그리고 context 가 다른 data objects 들과 구별하도록 합니다. 여기서 context 는 Integer, Floating point number, character string 등의 우리가 흔히 말하는 type 과 , machine instruction 이 될 수 있습니다.

1.2 Programs are Translated by other program into Different forms

프로그램은 다른 프로그램에 의해 다른 형태로 번역됩니다.

 

아래와 같은 코드가 있다고 합시다.

#include <Stdio.h>

int main(){
        printf("hello, world\n");
        return 0;
}

 

hello.c 라는 code 을 실행하면

 

→ low-level machine language instruction 으로 번역됩니다.

→ 그리고 이것이 executable object program 으로 패키징되고 binary disk file 로 저장됩니다. (Unix system 에서는 compiler driver 가 source file 을 object file 로 번역합니다.)

 

아래는 Gcc compiler 의 예입니다.

 

하나씩 살펴봅시다.

  • Preprocessing phase

#include <stdio.h> 는 system.header file 이며 stdio.h 의 내용을 읽고 program text 에 넣습니다. 그렇게 hello.i 형태가 됩니다.

Preprocessor(cpp) 가 # 로 시작하는 지시문에 따라 기존 C program 을 수정합니다.

  • Compilation phase
  main:
      subq  $8, %rsp
      movl  $.LCO, %edi
      call  puts
      movl  $0, %eax
      addq  $8, %rsp
      ret

Assembly language 는 기계어와 1대 1로 매칭되어서 다양한 high-level language 에 대한 다양한 컴파일러에 같은 출력 언어를 제공하기 때문에 유용합니다.

compiler(cc1) 이 text file 인 hello.i 을 text file 인 hello.s 로 번역합니다. assembler 가 됩니다. 아래와 같은 모양이 되지요.

  • Assembly phase

hello.s 을 machine language instructions 으로 번역하여 relocatable object 형태로 packaging 합니다. 그리고 hello.o 파일 안에 저장하지요. 이 파일은 main 함수에 대한 지시어를 encoding 하는 binary file 입니다. 우리가 읽을 수 없는 형태가 됩니다.

  • Linking phase

hello program 은 printf 함수를 호출했었는데 이는 Standard C Library 에 있는 함수입니다. printf 는 미리 컴파일된 printf.o 라는 file 에 있는데 이를 hello.o program 에 merge 해야 합니다. 바로 linker(ld) 가 merge 을 해줍니다. 그렇게 executable object file 인 hello 가 되어 메모리에 로드되고 시스템이 실행할 수 있는 형태가 됩니다.

1.3 It pays to understand how compilation systems work

컴파일 시스템이 작동하는 방식을 이해하는 것은 중요합니다.

우리의 C Program 을 ‘잘’ 코딩하기 위해서는 기본적인 machine-level 의 코드를 이해할 필요가 있습니다. 예를 들면 아래와 같은 것들이 있죠.

 

컴파일 시스템이 어떻게 작동하는지 이해해야 하는 이유

  • 프로그램 성능 최적화
    • 예) switch 문은 if-else 문을 연속해서 사용하는 것보다 효율적인가?예) pointer reference 가 array index 효율적인가?
    • 예) while loop 는 for loop 보다 효율적인가?

 

  • link-time 에러 이해
    • 예) linker 가 참조하지 못한다고 하는 것은 무슨 의미인가?
    • 예) 같은 이름으로 전역 변수를 다른 C 파일에 저장하면 어떻게 되는가?
    • 적지 않은 경우 알 수 없는 프로그래밍 오류는 linker 와 관련있을 때가 많습니다. 특히 큰 S/W system 을 빌드할 때 말이죠.

 

  • 보안 약점 피하기
    • 보안 프로그래밍의 첫 단계는 data 와 control 정보가 프로그램 스택에 저장되는 방식을 이해하는 것입니다.

 

1.4 Processors read and interpret instructions stored in memory

프로세서는 메모리에 저장된 명령을 읽고 해석합니다.

 

이전에 hello.c 소스 프로그램은 compilation system 에 의해 hello이라는 이름의 executable object file 로 disk 에 저장되었습니다. Unix 에서 이를 실행시키려면 shell 이나 터미널에서 ./hello 라고 입력해야 합니다.

hello 는 shell command 에 built-in 된 명령이 아니기 때문에 hello라는 executable file 을 실행시켜야 한다고 인식합니다.

 

1.4.1 Hardware Oragnization of a System

hello 프로그램 실행이 어떻게 실행되는지를 이해하려면 일반적인 system 의 hardware organization 을 이해해야 합니다.

 

아래 그림이 전체 구조도입니다.

  • Buses

바이트 단위의 정보를 component 사이에서 전달하는 버스라고 하는 도관 모음이 시스템 전체에서 실행됩니다. Buses 는 일반적으로 words(32bits or 64bits) 로 디자인됩니다. 이 책에서는 몇 비트인지를 정해놓지 않고 그냥 word 라고 설명하겠다고 하네요.

 

  • I/O Devices

I/O devices 는 외부 세계와 시스템의 연결입니다. user input 의 키보드와 마우스, user output 의 모니터, 그리고 disk drive 등이 있습니다.

각 I/O devices 는 controller 나 adapter 로 I/O bus 와 연결됩니다. 두 차이는 packaging 에 있습니다. controller 는 chipset 이나 motherboard 에 있고 adapter 는 motherboard 에 있는 slot 에 꽂는 card 에 있습니다. 하지만 공통점은 I/O devices 와 I/O bus 사이에 정보를 전달한다는 것입니다.

 

  • Main Memory

메인 메모리는 프로세서가 프로그램을 실행하는 동안 프로그램과 데이터를 들고있는 임시 저장 장치입니다. 물리적으로는 DRAM(Dynamic Random Access Memory) 의 모음으로 구성되어 있고 논리적으로는 각 주소를 가지는 바이트의 Linear 한 배열로 조직되어있습니다. machine instruction 도 여러 바이트 수로 구성될 수 있습니다.

 

  • Processor

CPU(Centraal Processing Unit) 는 메인 메모리에 있는 instructions 을 통역, 실행하는 엔진입니다. core 에는 PC(Program Counter)라고 하는 word 크기 저장 장치(register) 가 있습니다. PC 는 항상 메인 메모리에 있는 어떠한 machine-language instruction 을 가리키고 있습니다.

 

processor 는 ISA(Instruction Set Architecture) 라는 간단한 명령 실행 모델에 따라 동작합니다. processor 는 PC 가 가리키는 명령어를 읽고 번역하여 실행하고 PC 가 다음 명령어를 가리키도록 업데이트합니다. 그리고 또 명령어를 읽고, 번역, 실행하고 반복하겠죠. 이렇게 간단한 작업을 하며 메인 메모리, 레지스터 파일 및 ALU(Arithmetic/Logic Unit) 중심으로 회전합니다. 레지스터 파일은 word 크기 레지스터 모음으로 구성된 작은 저장 장치입니다. ALU 는 새 데이터와 주소값을 계산합니다.

  • Load:, 레지스터의 이전 내용을 덮어쓰며 메인 메모리에서 register 로 word나 byte 복사
  • Store: 해당 위치의 이전 내용을 덮어 쓰며 레지스터에서 메인 메모리로 word 나 byte 복사.
  • Operate: ALU 로 두 레지스터의 내용을 복사. 두 word 에서 산술 연산을 하고 결과를 register 에 덮어쓰며 저장
  • Jump: instruction 으로부터 word 을 추출하여 PC 에 그 word 을 덮어쓰면서 복사,

 

바로 전에 processor 가 ISA 에 따라 매우 간단히 동작한다고 했지만 사실 현대 컴퓨터는 훨씬 복잡하게 동작합니다. 실제로는 microarchitecture 을 따릅니다.

 

1.4.2 Running the hello Program

디테일은 생략하고 hello 프로그램이 어떻게 동작하는지 알아봅시다.

 

→ 먼저 shell program 은 우리가 type 하길 기다리며 그의 instruction을 실행합니다.

→ 우리가 키보드로 ./hello 을 입력하면 shell program 은 그를 읽고 register 로 읽고 메모리에 저장합니다.

→ keyboard로 Enter 을 치면 shell 은 command 입력을 끝냈다는 것을 알고 disk 에서 메인 메모리로 파일로 hello 안의 code 을 복사하여 instruction 순서에 맞게 실행합니다.

→ hello.world\n 라는 문자열 데이터가 마침내 출력될 것입니다.

 

DMA(Direct Memory Access) 라는 기술을 사용하여 데이터가 disk 에서 CPU 을 통하지 않고 바로 메인 메모리로 이동할 수도 있습니다.

→ 메인 메모리에 코드, 데이터가 로드되면 processor 는 machine-launguate instructions 을 실행하기 시작합니다.

→ 이 명령어들은 hello, world\n bytes 을 메모리에서 레지스터로 복사하고 display 로 표시합니다.

 

 

1.5 Cache matters

시스템은 정보를 옮기는 데 시간을 많이 씁니다.

→ machine instruction 이 disk 에 저장됨.

→ program 이 load 되면 메인 메모리에 이동.

→ program 을 실행시키면 processor 로 instruction 이 복사됨.

 

이런 과정에서 이동시키고 copy 하는 overhead 가 발생합니다.

 

processor 가 금방 필요로 할 정보를 일시 저장하는 Cache Memory 을 도입해서 해결할 수 있습니다.

 

 

processor chip 에 있는 L1 캐시는 거의 register 만큼 빠르고 processor 와 특별한 bus 로 연결된 L2 캐시는 L1 의 다섯 배의 시간이 들지만 main memory 보다 1/5 ~1/10 의 시간이 듭니다.

이는 SRAM(Static Random Access Memory) 라는 하드웨어 기술로 구현됩니다.

 

Caching 의 핵심은 locality 을 이용하여 큰 메모리를 사용하는 이점과 빠르게 사용할 수 있는 이점을 모두 가져가는 것입니다. 자주 사용하는 데이터를 cache 가 들고 있어 대부분의 동작은 fast caches 을 사용하여 동작됩니다.

1.6 Storage Devices From a Hierarchy

실제로는 많은 computer systems 의 저장 장치는 Memory hierarchy(메모리 계층 구조) 로 구성되어 있습니다.

 

 

성능을 향상시키기 위해 여러 cache 을 활용하는 것처럼 전체 메모리 구조의 대한 이해를 활용할 수 있습니다.

'Computer Science > 컴퓨터 구조' 카테고리의 다른 글

CS.APP Chap1 A tour of computer system - 2  (1) 2023.05.22