201227 개발일지(20일차) - 컴퓨터 시스템 정리 : 1장 컴퓨터 시스템으로의 여행(1)

고재개발·2020년 12월 27일
0

Computer System

목록 보기
1/13

컴퓨터 시스템(Computer Systems: A Programmer's Perspective)이라는 책을 정리하고자 한다. 시간이 들겠지만(feat.로꼬) 길게 볼 책이라면, 내 언어로 정리해둬야 다시 볼 때 더 좋겠지 싶어서 원래의 나와는 다른 길로 가본다...

정리에 앞서, 초반에는 아마 용어 정리도 많이 나올 것 같다. 1장을 2번 다 읽은 상태인데.. 거의 소 입장에서 경 읽은 것 같다.

와 정리 쉽지 않다... 파이팅 !

hello.c 파일에 대한 이해

아래와 같은 "hello.c"인 파일의 코드를 프로그래머가 작성하면, 이를 실행시키려면 저급 기계어 인스트럭션들(????)로 번역되어야 한다. 이 인스트럭션들은 “실행가능 목적 프로그램(Executable object Program)”이라고 하는 바이너리 디스크 파일로 저장된다.

#include <studio.h>

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

여기서 GCC 컴파일러 드라이버는 소스파일 hello.c를 읽어서 실행파일인 hello로 번역하며, 번역은 아래 4단계를 거쳐 실행된다. 이 4단계를 실행하는 프로그램들을 컴파일 시스템이라 부른다.

컴파일 시스템이 어떻게 작동하는 지 이해하는 것이 중요

  • 프로그램 성능 최적화 하기 : 컴파일러가 어떻게 C문장들을 기계어 코드로 번역하는지 알아야 최적화를 할 수 있다.
  • 링크 에러 이해하기 : 보통 가장 당혹스러운 프로그래밍 에러는 링커의 동작과 관련돼 있다고 한다. 링커 관련 에러는 실행하기 전에는 나타나지 않는데, 이는 7장에서 잘 배워보자.
  • 보안 약점 피하기 : 안전한 프로그래밍의 첫 단계는 프로그램 스택에 데이터와 제어 정보가 저장되는 방식 때문에 생겨나는 영향을 이해하는 것이다.

시스템의 하드웨어 조직

아래는 전형적인 시스템에서의 하드웨어 조직도(?)이다.

  • CPU(=Central Processing Unit) : 주처리장치 혹은 프로세서라고 부른다.
    1. 메인 메모리에 저장된 인스트럭션들을 해독(실행)하는 엔진이다.
    1. 중심에는 워드 크기 저장장치인 프로그램 카운터(PC)가 있다.
    2. 전원이 켜있는 동안 내내 프카(PC)가 가리키는 곳의 인스트럭션을 반복 실행하고, 다음 인스트럭션 위치를 가리키도록 업데이트 한다.
    3. 즉, cpu는 아래와 같은 행동들을 반복하는 것이다.
      4-1. 적재(Load) : 메인 메모리에서 레지스터에 데이터를 복사(덮어쓰기)
      4-2. 저장(Store) : 레지스터에서 메인 메모리에 데이터를 복사(덮어쓰기)
      4-3. 작업(Operate) : 두 레지스터 값을 ALU로 복사, 두 개 워드로 수식연산, 레지스터에 결과값 덮어쓰기 저장
      4-4. 점프(Jump) : 인스트럭션 자신으로부터 한 개 워드 추출, 이 것을 프카(PC)에 덮어쓰기
    4. 최신 CPU들은 성능을 위해 위의 설명보다 훨씬 복잡한 방식으로 사용
  • 메인 메모리(Main Memory) : CPU가 프로그램 실행하는 동안 데이터, 프로그램을 모두 저장하는 임시 저장장치다.
    (0. DRAM계열의 RAM이라고 생각하면 된다.)
    1. 물리적으로는 DRAM 칩들로 구성되있다.
    2. 한 개의 프로그램을 구성하는 각 기계어 인스트럭션은 다양한 바이트 크기를 가진다.
  • 입출력 장치(Input/Output Unit) : 키보드, 마우스, 모니터, 디스크 드라이브 등 외부 세예와의 연결을 담당한다.
    1. 각 입출력 장치는 컨트롤러 OR 어댑터를 통해 입출력 버스와 연결된다.
      1-1. 컨트롤러 : 디바이스 자체가 칩셋 or 마더보드에 장착된다.
      1-2. 어댑터 : 마더보드의 슬롯에 장착되는 카드다.
  • 버스(Bus) : 시스템 내를 관통하는 전기적 배선군
    1. 각 구성요소들 간에 바이트 정보를 전송한다.
    2. 일반적으로 word라는 고정 크기의 바이트 단위로 데이터를 전송한다. 오늘날 대부분은 32비트 혹은 64비트를 사용한다.

오늘의 용어 정리

  • 바이트(byte) : 8비트(bit) 단위로 구성, 각 바이트는 프로그램의 텍스트 문자를 나타냄.
  • 아스키(ASCII) : 미국정보교환표준부호(American Standard Code for Information Interchange)는 영문 알파벳을 사용하는 대표적인 문자 인코딩. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 둠. → 아스키는 7비트 인코딩으로 2^7=128개의 문자로 이루어져 있음.
  • 텍스트 파일 : 오로지 아스키 문자들로만 이루어진 파일.
  • 바이너리 파일 : 텍스트 파일 외의 모든 텍스트 파일.
  • 컨텍스트 :
    • 그냥 텍스트(Text) 처럼 바로 이해되는 단순히 원본 정도가 아니라,
    • 어떤 해석이 가미되어 문맥 및 상황에 따라 이해되는 한 차원 높은 공간, 영역을 의미
    • 컨텍스트는 컴퓨터 내부에서 볼 때, 프로세서 안에 있는 레지스터, 플래그 등의 현재 값/상태들의 집합을 말함
  • 컴파일 시스템(Compile System) : 전처리기(Pre-processor=cpp), 컴파일러(Compiler=cc1), 어셈블러(Assembler=as), 링커(Linker=ld) 프로그램들을 합친 시스템

profile
고재개발

2개의 댓글

comment-user-thumbnail
2020년 12월 28일

우와 멋져!! 시간이 들어도 여보에게 분명 보상받는 날이 올거야 내사랑🧡 화이팅!!!

1개의 답글