CS TIL (20180809)

2019-02-16

.

study program : https://www.fastcampus.co.kr/dev_school_css

# generator

  • ilterator의 일종이다.

  • 사용하는 이유 : 프로그램의 성능향상 때문이다. 왜냐하면 메모리를 소비하지 않기 때문이다. 또한 속도도 빨라진다. lazy evaluation이 가능하기 때문이다.

  • 특정한 종류의 함수이다.

  • next로 실행한다.

  • yield를 순차적으로 실행한다. 예를 들어 내가 yield 1을 반환했다면 그다음에는 yield 2를 반환한다. yield 1을 반환하는게 아니라..

# class design 원칙

  • 같은 멤버와 같은 메서드 –> 부모클래스에 둔다.

  • 코드 재사용을 위해..

  • 부모가 추상 클래스인 경우를 제외, 베이스 클래스의 많은 부분을 오버라이딩하는 파생 클래스는 피한다.

# CPU

1

  • 구성요소 : ALU, CU, 레지스터

  • CU : 컨트롤 유닛, 명령어를 해석하고 실행하는 요소

  • ALU : Arithmetic logic unit, 산술논리장치, +,- 등 연산과 논리연산 등을 수행함

  • 레지스터 : CPU에 있는 메모리라고 생각하면 된다, 실제로 코딩할때 유의해햐할 부분

1) instruction 레지스터(IR)

  • 현재 실행중인 인스트럭션(머신(컴퓨터가)이 이해하는 010101 이런식으로 된 정보)가 될것이고 이놈을 인스트럭션이라고 한다) 을 담고 있다.

  • C = A + B 코드는 한 줄이지만 기계어로 번역하면 최소 네 개의 명령어로 변환됩니다. 변환된 명령어는 프로그램을 실행하면 메인 메모리에 올려지고 하나씩 실행되는데 이때 메모리에 있는 명령어를 CPU로 가져와 저장해 두는 곳이 IR입니다.

2) 프로그램 카운터

  • 다음에 실행할 인스트럭션이 저장된 메모리의 주소값을 가리키고 있다

3) general purpose 레지스터(범용 레지스터)

  • AX와 BX는 범용 레지스터라고 부릅니다. 주로 메모리에서 읽어 들인 데이터를 저장했다가 ALU가 연산할 때 피연산자로 전달하거나 연산 결과 값을 저장할 때 쓰입니다.

# 시스템버스

  • 어드레스 버스 +컨트롤 버스 + 데이터 버스 = 시스템 버스라고 한다.

  • 사용하는 컴퓨터가 32비트면 각각의 버스와이어가 32개이다.

  • 데이터 버스 : 제어 버스의 신호(signal)에 따라 데이터를 CPU에서 메모리로 전송하거나 반대로 메모리에서 CPU로 전송한다. 그러므로 데이터 버스는 양방향이어야 한다.

  • 컨트롤 버스 : 데이터를 레지스터로 읽어올지(READ) 아니면 메모리에 쓸지(WRITE) CPU가 메모리에 전달한다.

  • 어드레스 버스 : 메모리에서 레지스터로 혹은 레지스터에서 메모리로 데이터를 전송할 때 필요한 메모리 주소를 전달한다. CPU가 메모리에 알려 주는 형식이므로 단방향이다.

# 어셈블리어

  • 머신코드가 01010101 이런식으로 있으면 이게 사람이 보기 어려우니까 1:1 대응 명령어로 작성했는데 이런게 move, eax 이런 식으로 짠 것이 어셈블리어이다. 따라서 어셈블리어를 이해한다면 머신이 이해하는 언어를 이해할 수 있다고 하는 것이다.

# 특정 어셈블리 명령어 한개가 실행될때 CPU에서 수행되는 과정

step1) fetch : 프로그램 카운터가 가리키는 메모리에서 명령어를 IR로 옮기는 과정

세부과정 1) PC -> MAR(memory address register)

세부과정 2) instruction to MDR(memory data register)

세부과정 3) MDR -> IR

세부과정 4) PC increments(증가)

step2) decode : CU가 인스트럭션을 해석하는 과정

step3) execute : ALU가 실제로 연산하는 과정, ALU에서 연산하고 결과값은 eax에 쌓인다.

step4) 추가로 eax값을 메모리에 저장하는 과정

# 파이프라인

컴퓨터에서, 파이프라인이란 프로세서로 가는 명령어들의 움직임, 또는 명령어를 수행하기 위해 프로세서에 의해 취해진 산술적인 단계가 연속적이고, 다소 겹치는 것을 말한다. 파이프라인이 없다면 컴퓨터의 프로세서는 메모리에서 첫 번째 명령어를 가지고 와서, 그것이 요구하는 연산을 수행하고, 그리고 나서 다음번 명령어를 메모리로부터 가져오는 식으로 동작한다. 명령어를 가져오는 동안에, 프로세서의 산술연산부분은 다음 명령어가 도착되기를 기다리며 쉬어야만 한다. 파이프라인을 쓰면, 컴퓨터 구조는 프로세서가 산술연산을 수행하는 동안에 다음번 명령어를 가져올 수 있으며, 그것을 다음 명령어 연산이 수행될 수 있을 때까지 프로세서 근처의 버퍼에 가져다놓는다. 명령어를 가져오는 단계는 끊임없이 계속된다. 그 결과, 주어진 시간동안에 수행될 수 있는 명령어의 수가 증가한다.

파이프라인은 이따금, 한 제품을 이루는 각기 다른 부품들이 조립공정에서 동시에 만들어지는 것에 비유된다. 비록 거기에는 다소 순차적인 한계가 있지만, 전체 공정에 있어서는 동시에 진행될 수 있는 동작들의 장점을 취할 수 있다.

# ALU에서 가산기를 통해 연산이 어떻게 수행되는가

  • shifter adder 보수기 이 세개의 논리회로로 4칙연산을 수행한다

  • +는 그냥 가산기라 더해주면된다.

  • 연산

ex) 9-4는 9+(-4)로 연산이 된다.

4는 보수기를 통해 보수화가 되서 연산이 수행될 것이다.

9 = 00001001

4 = 00000100 -> 1의 보수화 ->11111011 -> 2의 보수화 ->11111100

가산기로 더함

결과 : 100000101

10000은 버리고

0101만 결과값을 출력

  • 곱셈연산

long multiplication을 수행한다. 2진수니까 가능한 기법이다.

만약에 1010과 10을 곱한다고 하면

3

  • 나누기 연산

long division 을 수행한다.

# CLOCK

  • 클럭사이클에 맞추어서 CPU는 연산을 수행한다. 다시말해 클럭사이클이라는 일정한 간격에 맞추어서 연산을 수행한다.

  • 인스트럭션 실행의 동기화를 수행한다고 보면된다. 메인보드의 클럭사이클과 cpu가 갖고 있는 클럭사이클을 동기화 시켜줌으로 인해서..

  • cpi : 한 인스트럭션이 실행되는데 걸리는 클럭 수

# 메모리

2

  • 계층구조에서 위로갈 수록 속도는 빠르나 용량크기는 아래로 갈 수록 커진다.

  • CPU 레지스터에 하드디스크에 있는 어떤 데이터를 가지고 오고 싶으면 반드시 메모리 계층 구조를 차례때로 거쳐서 가지고 오게 된다.

# 데이터를 가지고 오는데 걸리는 사이클 (cycles for data)

  • register : 1 cycle

  • cache : 3 cycles

  • memory : 20-100 cycles

  • hard disk :500000-5000000 cycles

# cache hit / cache miss

캐시는 램에서 데이터를 가져올때 특정 데이터만큼 가져오는게 아니라 캐시라인만큼 램에서 데이터가 저장되어 있는 데이터 주변의 데이터들까지 한꺼번에 퍼온다. 이렇게 한번에 퍼올 수 있는 량을 cache line이라고 하는데 64 bytes ~ 128 bytes 정도 된다.

  • cache hit = 이때 CPU가 처음에 요구한 특정 데이터 외에 CPU가 그럼 그 주변에 있는 특정 데이터가 있냐 라고 물어봤을때 그게 데이터가 캐시에 있을때

  • cache miss = 이때 CPU가 처음에 요구한 특정 데이터 외에 CPU가 그럼 그 주변에 있는 특정 데이터가 있냐 라고 물어봤을때 그게 데이터가 캐시에 없을때

# 지역성

지역성의 원리(principle of locality)란 개념이 있다. 데이터 접근이 같은 메모리 공간이나 인접한 메모리 공간에서 자주 일어난다는 의미다. 지역성에는 시간적 지역성과 공간적 지역성이 있다. 시간적 지역성(temporal locality)은 특정 데이터에 한 번 접근했을 때 곧 다시 그 데이터에 접근할 가능성이 높다는 말이고 공간적 지역성(spatial locality)은 이번에 접근할 데이터는 이전에 접근했던 데이터의 근처에 있을 확률이 높다는 말이다.

  • temporal locality : 한번 접근한 메모리에 자주 접근

  • spatial locality : 접근하는 메모리가 이전에 접근한 메모리의 근처일 확률이 높다

예를들어 이런 for문 같은 경우 temporal locality + spatial locality의 특징이 있다. 아까 가져왔던거의 근처에 있을 확률이 높기 때문에

li = [1, 2, 3, 4, 5]

res = 0

for e in li:

res += e

결론적으로 이런 로컬리티의 특성때문에 개발한 것이 캐시인 것이다. 이를 통해 성능 최적화를 달성했다.

# 프로그래밍을 예시로 한 VAS

c언어 ex)

#include<stdio>

int main(void){

   int local_x =30;
   int *ptr = (int*)malloc(sizeof(int)*3);

    *ptr = 50;
    
     free(ptr) // ## free 함수를 통해 동적할당 해제

    return 0;

}

4