Study/TIL(Today I Learned)

24.01.12 CSAPP, Python, Algorithm

에린_1 2024. 1. 12. 23:43
728x90

24.01.12

정보는 비트와 컨텍스트로 이루어진다.

  • 모든 시스템 내부의 정보 - 디스크 파일, 메모리상의 프로그램, 데이터, 네트워크를 통해 전송되는 데이터- 는 비트들로 표시된다.
  • 서로 다른 객체들을 구분하는 방법은 이를 바라보는 컨텍스트에 의해서다.
  • 다른 컨텍스트에서는 동일한 일련의 바이트가 정수, 부동소수, 문자열 또는 기계어 명령을 의미할 수 있다.

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

  • GCC 컴파일러 드라이버는 소스파일을 읽어서 실행파일로 번역한다. 번역은 4개의 단계를 거쳐서 실행된다. 이 네 단계를 실행하는 프로그램들(전처리기, 컴파일러 ,어셈블러, 링커)을 합쳐서 컴파일 시스템이라고 한다.
  • 전처리 단계 : 전처리기(cpp)는 본래의 C프로그램을 #문자로 시작하는 디렉티브(directive)에 따라 수정한다. 그 결과 일반적으로 .i로 끝나는 새로운 C 프로그램이 생성된다.
  • 컴파일 단계 : 컴파일러(ccl)는 텍스트파일 .i를 텍스트파일인 .s 로 번역하며, 이 파일에는 어셈블리어 프로그램이 저장된다.
  • 어셈블리 단계 : 어셈블러(as)가 .s를 기계어 인스트럭션으로 번역하고, 이들을 재배치가능 목적프로그램의 형태로 묶어서 .o라는 목적파일에 그 결과를 저장한다. 이 파일은 인스트럭션들을 인코딩하기 위한 17바이트를 포함하는 바이너리 파일이다.
  • 링크 단계 : hello 프로그램이 C컴파일러에서 제공하는 표준 C 라이브러리에 들어있는 함수를 호출하는 것에 주목할 필요가 있다. printf 함수는 이미 컴파일러 된 별도의 목적파일인 printf.o에 들어 있으며, 이 파일은 hello.o 파일과 어떤 형태로든 결합 되어야 한다. 링커 프로그램(ld)이 이 통합작업을 수행한다.

왜 컴파일 시스템이 어떻게 동작하는지 알아야 하는가.

  • 프로그램 성능 최적화
  • 링크 에러 이해
  • 보안 약점 피하기

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

버스(Buses)

  • 시스템 내를 관통하는 전기적 배선군을 버스라고 하며, 컴포넌트 간 바이트 정보들을 전송한다.
  • 버스는 일반적으로 워드 word라고 하는 고정 크기의 바이트 단위로 데이터를 전송하도록 설계된다.
  • 한 개의 워드를 구성하는 바이트 수는 시스템마다 봉하는 기본 시스템 변수다. 4바이트(32비트) 8바이트(64비트)

입출력 장치

  • 입출력 장치는 시스템과 외부 세계와의 연결을 담당한다.
  • 각 입출력 장치는 입출력 버스와 컨트롤러나 어댑터를 통해 연결된다. 이 두 장치의 차이는 패키징(packaging)에 있다. 컨트롤러는 디바이스 자체가 칩셋이거나 시스템의 머더보드에 장착된다. 어댑터는 머더보드의 슬롯에 장착되는 카드이다.

메인 메모리

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

프로세서

  • 주처리장치(CPU) 또는 간단히 프로세서는 메인 메모리에 저장된 인스트럭션들을 해독(실행) 하는 엔진이다.
  • 프로세서의 중심에는 워드 크기의 저장장치(또는 레지스터)인 프로그램 카운터(PC)가 있다.
  • 시스템에 전원이 공급되는 순간부터 전원이 끊어질 때까진 프로세서는 프로그램 카운터가 가리키는 곳의 인스트럭션을 반복적으로 실행하고 PC값이 다음 인스트럭션의 위치를 가리키도록 업데이트 한다. 프로세서는 자신의 인스트럭션 집합 구조(ISA)로 정의되는 매우 단순한 인스트럭션 실행 모델을 따라 작동하는 것 처럼 보인다.
  • 프로세서는 PC가 가리키는 메모리로부터 인스트럭션을 읽어오고, 이 인스트럭션에서 비트들을 해석하여 인스트럭션이 지정하는 간단한 동작을 실행하고, PC를 다음 인스트럭션 위치로 업데이트한다. 이 위치는 연속적일 수도 있고, 그렇지 않을 수도 있다.
  • 인스트럭션 요청에 의해 CPU가 실행하는 단순한 작업
    • 적재(Load) - 메인 메모리에서 레지스터에 한 바이트 또는 워드를 이전 값에 덮어쓰는 방식으로 복사한다.
    • 저장(Store) - 레지스터에서 메인 메모리로 한 바이트 또는 워드를 이전 값을 덮어쓰는 방식으로 복사.
    • 작업(Operate) - 두 레지스터의 값을 ALU로 복사하고 두 개의 워드로 수식연산을 수행한 뒤, 결과를 덮어쓰기 방식으로 레지스터에 저장
    • 점프(Jump) - 인스트럭션 자신으로부터 한 개의 워드를 추출하고, 이것을 PC에 덮어쓰기 방식으로 복사

캐시가 중요하다

  • 시스템이 정보를 한 곳에서 다른곳으로 이동시키는 일에 많은 시간을 보낸다. 그래서 시스템 설계자들의 주요 목적은 이러한 복사과정들을 가능한 한 빠르게 동작하도록 하는 것이다.
  • 프로세서 - 메모리 간 격차에 대응하기 위해 시스템 설계자는 보다 작고 빠른 캐시 메모리라고 부르는 저장장치를 고안하여 프로세서가 단기간에 필요로 할 가능성이 높은 정보를 임시로 저장할 목적으로 사용한다.
  • L1,L2 캐시는 SRAM이라는 하드웨어 기술을 이용해 구현한다.
  • 캐시 시스템의 이면에 깔려 있는 아이디어는 프로그램이 지엽적인 영역의 코드와 데이터를 액세스 하는 경향인 지역성 (locality)을 활용하여 시스템이 매우 크고 빠른 메모리 효과를 얻을 수 있다.

저장장치들은 계층구조를 이룬다

  • 계층의 꼭대기에서부터 맨 밑바닥까지 이동할수록 저장장치들은 더 느리고, 더 크고, 바이트당 가격이 싸진다.
  • 메모리 계층 구조의 중 아이디어 - 한 레벨의 저장장치가 다음 하위 레벨 저장장치의 캐시역할을 한다

Python

  • 한 문장씩 순서대로 처리되는 구조를 순차구조(Sequential structure)라고 한다.
  • 조건식으로 평가한 결과에 따라 프로그램의 실행 흐름이 변경되는데 이런 구조를 선택구조(Select Structure)라고 한다.
  • input() 함수는 키보드 문자열을 입력 받아 반환한다.
  • 문자열형을 정수형으로 변환하는 과정을 형변환(type conversion) 이라고 한다.
  • float는 부동소수점 방식을 사용한다.
  • if, while 등 복합문의 첫부분은 키워드로 시작해 콜론(:)으로 끝난다. 이 부분을 헤더(header)라고 한다.
  • 알고리즘 - 어떠한 문제를 해결하기 위해 정해놓은 일련의 절차
  • 들여쓰기 < ☆★☆ 중요하다.
  • 중앙값(median)은 주어진 값을 크기순으로 나열했을 때 가장 중앙에 위치하는 값을 의미한다.
  • while - 어떤 조건이 성립하는 동안 반복해서 처리하는 것을 반복구조 (repetition structure) 일반적으로 loop라고 한다. while문의 경우 반복 전 반복을 계속할 것인지 판단하는데 이런 구조를 사전 판단 반복구조 라고 한다.

a,b = b,a # a와 b값을 교환(단일 대입문)

  • 입력과 출력으로 이루어진 구성요소를 계층으로 배치하여 프로그램을 구성하는 방법 - 구조적 프로그래밍(Structured Programming) 순차, 선택, 반복의 세 제어흐름을 사용한다.
  • 파이썬에서 데이터, 함수, 클래스, 모듈, 패키지 등을 모두 객체 Object 취급한다.
  • 객체는 자료형을 가지고 메모리를 차지한다. 파이썬은 이런 특징 때문에 파이썬 변수는 값을 가지지 않는다는 특징이 있다.
  • 변수는 객체를 참조하는 객체에 연결된 이름에 불과하다.
  • 모든 객체는 메모리를 차지하고, 자료형 뿐만 아니라 식별번호(identity)를 가진다.

알고리즘

  • 알고리즘은 값이나 값의 집합을 입력으로 받아 또 다른 값이나 값의 집합을 출력하는 잘 정의 된 계산절차, 잘 정의된 계산 문제를 풀기 위한 도구
  • 알고리즘이 모든 입력 사례에 대해 항상 올바른 출력을 내고, 종료할 경우 이를 타당(Correct)고 하며, 그 타당한 알고리즘이 주어진 계산문제를 푼다(solve)고 말한다.
  • 자료구조는 자료를 편리하게 접근하고 변경하기 위해 자료를 저장하거나 조직하는 방법을 말한다. 각 자료구조의 장점과 한계를 잘 아는게 중요하다.
728x90