명령어는 연산부호, 피연산자로 이루어져있다.

연산부호(Operation Code)는 산술연산, 시프트, 논리연산, 보수 등의 연산을 정의한다.

ex) +, -, *, /, AND, OR, NOT 등...

피연산자(Operand)는 연산할 데이터를 저장한다. 보통 데이터보다는 데이터 주소를 저장한다.

 

A = B + C 

A는 목적지 피연산자이며 연산 결과를 저장할 목적지 주소를 가지고있다.

B와 C는 소스 피연산자로, 연산에 필요한 데이터 주소를 가지고 있다.

 

피연산자의 주소를 나타내는 방식에는 직접 주소(direct address), 간접 주소(indirect address) 등이 있다.

직접 주소는 피연산자에 데이터가 있는 메모리 주소를 지정한다.

R1 자체가 주소이기 때문에 한번에 데이터에 접근한다.

간접 주소는 피연산자에 데이터가 있는 메모리주소 정보를 지정한다.

R0가 데이터 주소 정보이고, 30H가 데이터 주소이다. 그림과 같이 두 번 메모리를 참조하게 된다.

이 둘의 차이점은 간접주소는 데이터 주소 정보를 통해 데이터 주소를 한번 읽고, 읽어낸 주소를 바탕으로 데이터를 읽어내 총 두 번 메모리를 참조하지만, 직접주소는 한번에 데이터를 읽을 수 있다는 점에 있다.

 

 

 

메모리의 종류에는 레지스터, 캐시, 메인 메모리, 보조기억장치 등이 있다.

메모리는 속도가 빠를 수록 비싸고 용량이 작기 때문에, 메모리간 계층구조를 구성하여 성능을 상호보완한다.

레지스터는 프로세서 내부에 존재한다. 프로세서가 사용할 데이터를 보관하는 가장 빠른 메모리이다.

캐시는 프로세서와 메인 메모리 간의 속도 차이를 보완하기 위한 고속 버퍼이다.

메인 메모리는 프로세서 외부에 존재하며, 프로세서에서 즉각적으로 수행할 프로그램과 데이터를 저장하거나, 프로세서에서 처리한 결과를 저장한다.

보조기억장치는 하드디스크(HDD)같이 접근시간은 느리지만 기억용량이 큰 기억장치를 말한다.

이러한 성능(속도, 용량, 비용)이 다른 기억장치를 효과적으로 사용해 시스템의 성능을 향상시키는것이 메모리 계층 구조의 목적이다

.

캐시(Cache)는 프로세서와 메인 메모리간의 처리 속도 차이를 보완하기 위한 고속 *버퍼이다.

(*버퍼 : 데이터를 한곳에서 다른 한곳으로 전송하는 동안, 일시적으로 그 데이터를 보관하는 메모리 영역)

캐시는 메인 메모리에서 데이터를 블록 단위(저속/낮은 대역폭)로 가져와 프로세서에 워드 단위(고속/높은 대역폭)로 전달한다.

프로세서에서 읽어들인 워드에 참조하려는 정보가 있는 경우를 캐시 적중(cache hit), 없는 경우는 캐시 실패(cache miss)라 한다.

 

Principle of locality

캐시에는 지역성이란것이 존재한다.

지역성이란 기억장치에 대해 특정 영역에만 참조가 집중적으로 이루어지는것으로, 공간적 지역성시간적 지역성 등이 존재한다. 

 

공간적 지역성이 발생하는 이유는 다음과 같다.

1)프로그램이 명령어를 순차적으로 실행하는 경향때문에 발생

2)대부분의 컴파일러를 메모리에 인접한 블록에 배열로 저장. 따라서 프로그램이 배열 원소에 순차적 접글을 시도하므로, 지역적 접근 경향 발생

 

시간적 지역성이 발생하는 이유는 다음과 같다.

1) 같은 주소를 반복해서 참조한 경우

ex) for문, while문...

 

CPU칩에는 여러개의 cache가 들어간다.

그리고 그 성능과 역할에 따라 L1, L2, L3 캐시 등으로 나눌 수 있다.

1) L1 cache : 프로세서와 가장 가까운 캐시이며, 속도를 위해 *Instruction cache와 *Data cache로 나눈다.

(Instruction cache : 메모리의 TEXT영역 데이터를다루는 캐시 / Data cache : TEXT영역을 제외한 모든 영역을 다루는 캐시)

2) L2 cache : L1 캐시보다 용량이 큰 캐시

3) L3 cache : 멀티코어 시스템에서 여러 코어가 공유하는 캐시

캐시의 용량은 L1 < L2 < L3 순이다.

뒤에 붙은 숫자가 늘어날 수록 비교적 코어에서 멀고, 속도가 느리다.

CPU (Central Processing Unit)는 컴퓨터 하드웨어에 부착된 모든 장치의 동작을 제어하고 명령을 실행한다. (프로세서라고도 한다)

프로세서는 연산장치, 제어장치, 레지스터 세 부분으로 구성되며, 각 장치는 내부 버스로 연결되어있다.

연산장치는 산술/논리 연산 등의 기능을 수행한다.

제어장치는 입출력장치간 통신 및 조율을 제어한다.

레지스터는 프로세서 내에 자료를 저장하는 가장 빠른 기억장치이다.

위 사진이 CPU이다.

CPU마다 구성에 있어 차이는 있을 수 있다.

(*I/O - Input Output Processer / QPI - Quick Path Interconnect) 

캐시(Cache)는 속도가 빠른 프로세서와 프로세서에 비해 비교적 느린 메인 메모리간의 처리 속도 격차를 보완하기 위한 고속 버퍼이다.

캐시에 대해서는 다른 글에서 자세히 다룰 예정이다.

sort 함수는 배열을 오름차순으로 정렬하는 함수이다.

사용 예는 다음과 같다.

1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <algorithm>
 
using namespace std;
 
void main(){
    int arr[5= {21453};
    sort(arr,arr+5);
}
 
cs

위 코드를 실행할 경우, 배열이 오름차순으로 정렬된다.

{2, 1, 4, 5, 3} -> {1, 2, 3, 4, 5}

함수 사용시, sort(시작 주소, 마지막 주소)의 형태로 입력하면 된다.

이를 이용해 한가지 간단한 프로그램을 만들어보았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <algorithm>
#include <string>
#include <time.h>
 
using namespace std;
#define MAX 30000
#define MIN 60000
//유저를 점수에 맞추어 나열하자.
 
class player {
private:
    int score;
    string userName;
public:
    player(int inputScore, string inputName) {
        this->score = inputScore;
        this->userName = inputName;
    }
 
    bool operator< (player &player) {
        return this->score < player.score;
    }
    string printUserName() {
        return this->userName;
    }
    void print() {
        cout << this->userName << "의 점수는 " << this->score << "입니다." << endl;
    }
};
 
void main() {
 
    srand((unsigned int)time(NULL));
    player user[] = {
        player(MIN + rand() % MAX, "젤리곰"), 
        player(MIN + rand() % MAX, "연어훈제하는불곰"),
        player(MIN + rand() % MAX, "렌"), 
        player(MIN + rand() % MAX,"마메"), 
        player(MIN + rand() % MAX, "하길")
    };
 
    for(int i=0;i<5;i++){
            user[i].print();
    }
 
    sort(user, user + 5);
 
    cout << "========== 순위표 ==========" << endl;
 
    for (int i = 0; i <5; i++) {
        cout << i + 1 << "위는 " << user[i].printUserName() << endl;
    }
    cout << "이번 달 클랜장은 " << user[0].printUserName() << "입니다." << endl;
    system("pause");
}
cs
 

점수와 유저네임을 메소드로 가지고있는 클래스를 생성하고, 각 유저들의 점수에 따라 순위를 출력하도록 했다.

bool operator< (player &player) {

        return this->score < player.score;

    }

연산자 오버라이딩을 사용해 "<" 연산자를 다음과 같이 처리하겠다는 의미를 가지게 했다.

 

 

 

저번 포스팅에서 언급했듯이, Update는 한번만 호출되는 Start와 달리 매 프레임마다 호출된다.

그렇다면 FixedUpdate는 Update와 어떤 차이점이 있을까?

Update가 매 프레임마다 호출된다면,

FixedUpdate는 일정 시간마다 호출된다.

이와 같은 특성때문에, FixedUpdate는 프레임 속도와 무관하게 업데이트되어야하는  physics와 관련된 메소드 등을 호출하는데 사용한다.

 

 

유니티 라이프 사이클 플로우차트 링크

https://docs.unity3d.com/kr/530/Manual/ExecutionOrder.html

'Unity > C#' 카테고리의 다른 글

C#에서 구조체, value type  (0) 2021.09.13
[Unity/C#] Ray&Raycast  (0) 2019.06.11
-C#- Awake/Start/Update  (0) 2019.06.03
-C#- 대리자(delegate)  (0) 2019.05.28
C# - Vector3  (0) 2019.04.03

+ Recent posts