Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- #MoveToEarn
- 다이어트
- 달리기채굴
- nft
- 초미세먼지
- M2E
- 달리기
- 습관
- 메나테크
- @theSNKRZ
- 달리기어플
- 오운완
- 비트코인시세
- 트루헬스마스터챌린지
- 건강식품
- 스니커즈
- 매나테크
- movetoearn
- 달리기앱
- snkrz
- 암호화폐
- 스테픈
- 트루헬스
- 트루헬스걷기
- 무브투언
- GINMAX
- 미리아노드
- 건강
- 채굴
- 진맥스
Archives
- Today
- Total
애옹이
2. 프로그램의 실행 과정 및 CPU 구조와 원리 본문
- 프로그램 실행 과정 및 CPU 구조와 원리
목차
0. 파일 생성 흐름
1. 명령 주기
2. 구성
3. 설명
0. 파일 생성 흐름
실행파일 생성 흐름
- 전처리기 → 컴파일러 1 2→ 어셈블러 3→ 링커 4
프로그램의 실행 과정
↓ cpu 부분의 처리, 상세.
1. 명령 주기
예외 처리를 추가한 간단한 CPU Instruction Cycle(명령주기)
2. 구성
기본 구성으로는
등이 있다.
이 외에도 캐시 같은 부가 장치도 들어가 있는 경우가 대다수.
3. 설명
거의 모든 종류의 CPU가 하는 일은 요약해 보면 대부분 아래 4가지 기능이 전부다.
- Fetch (인출)
- 메모리 상의 프로그램 카운터가 가르키는 명령어를 CPU로 인출하여 적재. - Decode (해석)
- 명령어의 해석. 이 단계에서 명령어의 종류와 타겟 등을 판단한다. - Execute (실행)
- 해석된 명령어에 따라 데이터에 대한 연산을 수행한다. - Writeback (쓰기)
- 명령어대로 처리 완료된 데이터를 메모리에 기록한다.
위의 CPU 는 아주 초급적인 설명에 기반하며, 상용 CPU는 이런 간단한 구조만을 갖지는 않는다.
그나마 명령어의 실행 순서를 섞을 수 없는 Inorder CPU 12 를 엄청 단순화시키면 이 기능이 전부라고 우길수는 있을지도..?
아무튼,
명령어의 실행 순서를 섞을 수 있는 현대의 Out-of-order CPU 들은 아래와 같은 순서를 거쳐 명령어를 실행한다.
그리고, Out-of-order CPU 를 만들기 위해서는, 위의 명령어 처리 과정 외에도 몇몇 핵심 기술들이 요구된다.
- Cache
- 주 메모리 값을 임시 저장하는 작고 빠른 메모리.
주 메모리 접근은 CPU입장에서 100사이클 정도 놀게 만드는 엄청나게 느린 동작이므로 Cache가 없으면 명령어를
빠르게 실행하고 싶어도 값이 준비가 안 돼서 불가능하다.
캐시 메모리도 한 개만 존재하는 것이 아니라, 보통 중요도와 접근 빈도에 따라 L1~L3의 3개 캐시 메모리를 사용하며,
숫자가 작을수록 용량이 더 작고, 더 빠르다.
또한 캐시 메모리만을 위한 색인 제조 방법과 구동방식은 해당 항목에서 확인 바람. - Brabch predicition
- Fetch를 매 사이클마다 하기 위해선 다음에 실행할 명령어 주소를 알아야 하는데, branch 명령의 결과가 나오려면
꽤나 시간이 걸린다 (게다가 프로그램마다 차이는 있지만, 명령어의 약 30%정도는 branch이다.)
그러니 branch 명령의 결과를 과거의 기록을 기반으로 예측하는 기술이 필요하다 - Speculative memory disambiguation
- 메모리 접근 명령어들은 메모리 접근 전에 접근할 메모리 주소를 먼저 구해야 한다.
이 때문에 만약 LSQ에 Store 명령이 접근할 메모리 주소를 계산하기 위해 대기중이면,
이후 모든 Load 명령어는 접근할 메모리 주소가 준비되었다 하더라도 메모리 접근을 할 수 없다.
혹시라도 그 Store가 접근하는 주소가 Load가 접근하는 주소랑 같으면 가장 신선한 값은 메모리가 아니라
그 Store 명령어가 가지고 있기 때문이다.
하지만 할 수 없는 걸 그냥 해버리면? (즉, Speculative memory disambiguation)역시 Out-of-order CPU! Inorder CPU가 못하는 걸 태연하게 해버려! 거기에 동경하게 돼
대부분의 경우 접근하는 메모리 주소는 다르기 때문에 문제가 없으며, 문제가 있더라도 그 Store가 접근하는 메모리 주소를
계산하기 전까진 Load들을 Commit을 하지 않는 것으로 실행 취소가 가능하다.
- #로 시작하는 지시자의 지시에 따라 소스코드를 변경하는 작업 수행 [본문으로]
- 소스코드를 어셈블리 코드로 번역하는 작업수행 [본문으로]
- 어셈블리 코드를 Binary Code 로 변경하는 작업 수행 [본문으로]
- 프로그램 내에서 참조하는 함수, 라이브러리들을 연결시켜주는 작업을 수행. tip. 컴파일 중에 LNKXXX 에러가 뜨며, 함수를 찾을 수 없다는 에러를 본 적이 있을 것이다 [본문으로]
- CPU 에게 작업을 시키기 위한 명령어 [본문으로]
- Register(REG or R) : 연산유닛과 연결된 액세스속도가 가장 빠른 기억장치. 임시적으로 데이터 저장을 위한 아주 작은 메모리로 2진 데이터 저장. [본문으로]
- Program Counter(PC) : 다음에 인출할명령어의 주소를 가지고 있는 레지스터, 각 명령어가 인출된 후에는 명령어 길이만큼 주소를 증가시킴으로써 주소를 포인팅함. 분기(jump) 명령어가 실행되는 경우에는 목적지주소로 갱신한다 [본문으로]
- Instruction Register(IR) : 현재 실행중인 명령의 내용을 기억하고 있는 레지스터 [본문으로]
- 각종 산술연산(덧셈, 뺄셈, 곱셈, 나눗셈)과 논리연산(AND, OR, NOT, XOR 등)들을 수행하는 회로들로 이루어진 회로. [본문으로]
- Control Unit : 명령어를 해석하고, (프로그램을 컴파일 하면 실행파일이 생성되고 그 파일 안에 명령어들이 존재) 그것을 실행하기 위한 제어 신호들(control signals)을 순차적으로 발생하는 회로. [본문으로]
- 명령어 및 데이터를 CPU 로 이동. 각 디바이스들이 서로 데이터를 주고 받기 위해 있는 매개체로 버스가 어떻게 데이터를 전송하는지, 그에 대한 프로토콜 혹은 통신 방식을 알고 있음. [본문으로]
- 많은 저전력 CPU가 이러한 구조이다. 가령 예전의 Atom CPU가 그러하다. [본문으로]
- 실행할 명령어들을 가져온다. 이후 단계들도 그렇지만, 한 번에 보통 4개 정도를 처리하는데, Superscalar라고 불리는 기술은 이렇게 한 사이클에 여러 명령어를 처리하는 것을 말한다. [본문으로]
- 이후 처리를 돕기 위해 명령어의 종류를 구분한다. Intel의 x86 ISA같이 복잡한 명령어를 쓰는 CISC의 경우, 내부적으로 RISC 명령어들로 쪼개지는 과정이 여기서 수행된다. 옛날 프로그램을 짜기 어려웠던 이유는 바로 이 디코드 동작시 불러오는 CPU 명령함수들이 CPU마다 전부 다 다르다는 것 때문이었다. 현재는 몇 개 회사가 CPU 공급을 독점하면서 그나마 단순화되었다. (같은 회사는 추가 기능이 없다면 같은 명령함수를 쓰는 게 일반적) [본문으로]
- 명령어가 가리키는 레지스터(CPU에서 값을 저장하는 x86 ISA의 eax나 ebx등의 이름있는 공간들)를, 내부에 숨어있는 물리적 레지스터로 매핑한다. 이러한 과정은 Out-of-order CPU에서 발생하는 False-dependency 문제를 해결하기 위해 필수적이다. [본문으로]
- 명령어가 실행하기 위해 기다리는 대기열 (ROB, IQ, LSQ)에 명령어를 넣는다. [본문으로]
- 대기열에 있는 명령어가 실행될 수 있으면 실행하기 위한 장치(가령 계산 명령어는 ALU, 메모리 명령어는 Cache)로 보낸다. 참고로 프로그램에서 시간상 뒤의 명령어가 앞의 명령어보다 먼저 Issue될 수 있다. 이것이 바로 Out-of-order CPU의 핵심 동작 중 하나다. [본문으로]
- 실행한다 [본문으로]
- 결과값을 레지스터에 써야 한다면 쓴다. 결과값을 기다리고 있던 명령어가 있다면 결과가 생겼다고 알려준다. [본문으로]
- 명령어 수행을 완료하고, 명령어 실행을 위해 할당받은 자원을 모두 토해낸다. 명령어의 실행 결과를 사용자에게 노출시키며 (이거 전에는 노출이 안 된다), 이후로는 명령어의 실행을 취소할 수 없다. [본문으로]
'Programming > System' 카테고리의 다른 글
코딩하기 전 순서 (0) | 2017.04.04 |
---|---|
3. 문자 표현 방법(encoding) (0) | 2016.05.20 |
1. 컴퓨터 하드웨어의 구성 (0) | 2016.05.20 |