ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • "프로그래머가 몰랐던 멀티코어 CPU 이야기" #Story 02_프로세서의 언어 : 명령어 집합 구조
    Computer_Science/Computer_Design 2018. 12. 31. 18:41

    프로그래머가 몰랐던 멀티코어 CPU 이야기

    (김민장 (지은이) | 한빛미디어 | 2010-05-28)

    https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=7086498


    이 글은 위 책을 읽으며 공부한 내용을 정리한 글입니다.




    "프로그래머가 몰랐던 멀티코어 CPU 이야기" #Story 02_프로세서의 언어 : 명령어 집합 구조


    내용


    <프로그래머가 보는 프로세서>

    <프로세서의 언어 : 명령어 집합 구조>

    <RISC와 CISC로 알아보는 명령어 집합 구조>

    <간단한 코드로 보는 RISC와 CISC의 차이>

    <아직도 RISC vs CISC?>

    <결론>






    <프로그래머가 보는 프로세서>


    현재 프로세서의 상태

    ex)

    -레지스터의 상태 (gdb 명령 : info reg)

    -지금까지 어떤 경로로 함수들이 호출되었는지 알려주는 호출 스택(gdb 명령 : backtrace)

    -문자열이 담겨 있는 메모리 (gdb 명령 : x/s)


    와 같은 것들을

    컴퓨터 구조적 상태(architectual state)라고 부른다.


    프로세서는 구조적 상태를 하나씩 가지고 있으므로, 듀얼코어 혹은 쿼드코어 같은 멀티코어 프로세서는


    컴퓨터 구조적 상태를 코어 개수만큼 가지게 되는 셈이다.


    프로그래머가 프로세서에게 명령을 하면, 그 결과를 레지스터나 메모리에 반영해야 한다.






    프로그래머는 이러한 명령 수행이 순차적으로 일어나는 것으로 생각하고 있으나,


    프로세서는 여러 최적화를 통해 나름의 순서로 명령을 수행한다.


    하지만, 프로세서가 노출하는 구조적 상태는 프로그래머가 명령한 순서를 준수한 것이다.


    즉, 실제의 실행 순서는 프로그래머가 명령한 순서와 다를 수 있으나,


    노출되는 것은 프로그래머가 명령한 그대로의 순서를 따른다.








    <프로세서의 언어 : 명령어 집합 구조>

    프로세서가 이해하는 언어는 _ 기계어 (machine language) / 어셈블리어(assembly language)
     
    컴파일러는 고급어를 이러한 저급어로 바꿔준다.

    이러한 기계어를 명령어 집합 구조 (Instruction Set Architecture)라고 한다
    (ISA)

    프로세서를 설계할 때, 첫번째로 ISA를 결정해야한다.

    ISA는 프로그래머와 프로세서가 직접 소통할 수 있는 언어,

    프로그래밍 방법론 & 프로세서 구현의 많은 부분을 ISA가 결정한다

    (프로세서가 실행할 ISA에 맞춰서 효율적으로 실행할 구현을 해야하기 때문에 설계에 영향을 미친다.)


    인텔 & AMD 프로세서 _ x86 사용            (인텔은 노트북,PC에 주로 쓰임)

    프로세서의 구현이 조금씩 차이가 나지만, 같은 ISA상에서 설계되었기 때문에 호환이 가능하다.

    ISA가 다른 프로세서라면 x86 ISA로 만들어진 프로그램은 바로 작동할 수 없다.

    새롭게 컴파일을 하거나, 에뮬레이션을 거쳐야 한다.

    선(Sun)의 자바 가상머신(JVM)이나 마이크로소프트의 .NET 프레임 워크는 이러한 문제점을 해결

    =>ISA 대신, 가상적인 프로세서의 언어로 프로그램 기술, 운영체제와 독립적으로 프로그램이 작동하게 함


    프로세서가 이해하는 명령어 하나하나를 인스트럭션(instruction)이라고 부른다.

    명령어(instruction)의 종류 _
    1. 기본적인 사칙 연산과 논리 연산
    2. 메모리에 쓰고(store) 읽는(load) 명령
    3. 프로그램의 실행 흐름을 제어하는 분기 및 호출 명령(if/goto, call/return)
    others) 시스템 내부 제어 / 상태 관찰

    명령어의 구조 )
    명령어의 종류 / 피연산자 타입 / 레지스터 갯수 / 인코딩 방법 ...
    으로 구성 되어 있다

    어셈블리어            ->     2진수 기계어  : 인코딩
    어셈블리어         <-        2진수 기계어  : 디코딩


    실제로 프로그램이 돌아가기 위해 ISA위에 ABI(Application Binary Interface)라는

    응용프로그램과 운영체제 사이의 약속이 필요하다.

    ex) 함수호출규약(calling coventoins), 바이너리 포맷 ....


    <RISC와 CISC로 알아보는 명령어 집합 구조>


    프로세서의 초반 ( 1970년대)

    -컴파일러의 역할이 크지 못했음

    => 프로그래머가 직접 프로세서와 직접 대화해야 했다

    =>다양한 기능을 수행하는 ISA를 제공함


    -메모리가 비쌌음

    =>명령어의 크기를 줄여야 했다

    =>짧은 길이의 명령어많은 뜻을 함축하도록 설계


    =>복잡하고 기능이 많은 ISA를 만듦. 이것이 CISC(Complex Instruction Set Computer) ISA

    ex) 인텔의 x86, DEC의 VAX(virtual Address Extension)



    x86 ISA에 대해)

    x86 ISA는 1986년에 출시된 인텔 80386의 명령어 집합 구조.

    정확한 명칭은 IA-32(Intel Architecture 32bit). 16비트 코드도 실행할 수 있는 하위 호환성을 갖는다.

    그후, AMD가 제안한 x86의 64비트 확장, AMD64,x86-64.


    CISC의 주요 특징)

    -명령어의 길이가 주로 가변적

    -여러 복잡한 형태주소 모드를 지원

    -범용 레지스터(General Purpose Register, GPR)의 개수가 적다

    (x86 32비트는 8개, x86-64는 16개)






    -RISC 등장 배경

    -대표적인 RISC, MIPS의 구조

    -CISC와 RISC 설계 차이(차이점)

    <간단한 코드로 보는 RISC와 CISC의 차이>

    <아직도 RISC vs CISC?(상호 호환)>

    <결론>



    댓글

Designed by Tistory.