안녕하세요. IT 엘도라도 에 오신 것을 환영합니다.
글을 쓰는 것은 귀찮지만 다시 찾아보는 것은 더 귀찮습니다.
완전한 나만의 것으로 만들기 위해 지식을 차곡차곡 저장해 보아요.   포스팅 둘러보기 ▼

컴퓨터 구조 (Architecture)/CSAPP (21)

[CSAPP] Virtual Memory

1. Introduction 1-1. 가상 메모리 (Virtual Memory) 몇몇 단순한 임베디드 마이크로컨트롤러와 같이 가상 메모리 기술을 사용하지 않는 시스템에서는 메모리 참조 방식이 아래 왼쪽 그림과 같다. 즉, CPU가 물리 주소를 메인 메모리에 바로 입력하여 메모리 참조를 진행하는 것이다. 반면 대부분의 현대 데스크탑, 서버, 노트북과 같이 가상 메모리 기술을 사용하는 시스템에서는 메모리 참조 방식이 아래 오른쪽 그림과 같다. 가상 메모리(Virtual Memory) 시스템에서는 각 프로그램이 가상의 주소를 사용하도록 하며, CPU가 메모리 참조를 시도할 때는 MMU(Memory Management Unit)라는 하드웨어 장치를 이용하여 해당 가상 주소(Virtual Address)를 실제 ..

[CSAPP] Exceptional Control Flow

1. Introduction 1-1. 예외적인 제어 흐름 (Exceptional Control Flow, ECF) 프로세서에 전력이 공급된 시점부터 전력 공급이 끊기는 시점까지, 프로그램 카운터(PC)는 다음과 같은 값들을 갖는다. a_k는 명령어 I_k의 시작 주소를 의미한다. 이와 같이 실행하는 명령어에 따라 PC의 값이 변해가는 흐름을 제어 흐름(Control Transfer)이라고 부른다. 제어 흐름의 양상은 크게 세 종류이다. 첫 번째는 메모리에 연속적으로 할당되어 있는 명령어들을 순차적으로 실행하는 경우이다. 이는 가장 기본적이면서 대부분의 시간을 차지하는 제어 흐름에 해당한다. 두 번째는 프로그램 변수로 표현되는 프로그램 상태의 변화에 반응하여 제어 흐름이 갑자기 바뀌는 경우이다. 대표적으로..

[CSAPP] Linking

※ 링킹은 워낙 복잡한 과정이어서 CSAPP 서적에서도 아주 세부적인 내용까지는 설명하지 않고 있다. 그래서 분명 필자처럼 책을 다 읽고도 찝찝한 감정이 사라지지 않는 사람들이 있을 것이다. 그러한 사람들을 위해 링킹의 전 과정을 최대한 자세히 설명해보고자 한다(그래서 이번 포스팅은 조금 길다). 다만 책에 등장하지 않는 세부적인 내용은 필자 나름대로 이해한 것을 기준으로 설명하기 때문에 다소 부정확할 수도 있다는 점 감안해주기 바란다. (잘못된 내용 발견 시 댓글로 정정 부탁드립니다!) 1. Introduction 1-1. 링킹 (Linking) 링킹(Linking)이란 프로그램 코드 및 데이터의 조각들을 결합하여 메모리에 로드되어 실행될 수 있는 하나의 실행 파일을 만드는 과정을 의미한다. 이는 컴파..

[CSAPP] Cache Memory

1. Cache Memory 1-1 기본 캐시 메모리(Cache Memory)는 DRAM보다 작지만 속도가 빠른 SRAM을 기반으로 만들어진 메모리 소자를 말한다. 메인 메모리의 데이터들은 블록이라는 단위로 나뉘며, 캐시 메모리는 메인 메모리에서 높은 빈도로 접근되는 블록들을 저장한다. 그리고 CPU는 메모리 참조가 필요할 때마다 메인 메모리보다 더 가깝고 접근 속도가 빠른 캐시 메모리를 먼저 확인한다. 이러한 원리로 CPU와 DRAM의 직접적인 통신을 최소화함으로써 메모리 참조의 효율을 높일 수 있다. 캐시 메모리는 DRAM과 SRAM으로 이뤄진 메모리 기술(Memory Technology)에 참조의 지역성(Locality)을 결합하여 탄생시킨 기술적 산물이라고 볼 수 있다. 참고로 캐시 메모리는 여러..

[CSAPP] Memory Hierarchy

1. 메모리 계층 (Memory Hierarchy) DRAM은 비트 당 가격이 저렴하지만 접근 속도가 매우 느리고, SRAM은 비트 당 가격이 비싸지만 접근 속도가 매우 빠르다. 이때 뒤에서 설명할 지역성(Locality)을 잘 활용하면, DRAM과 SRAM을 동시에 사용하여 비트 당 가격은 DRAM만큼 저렴하고 접근 속도는 SRAM만큼 빠른 메모리 소자가 있는 듯한 효과를 만들어낼 수 있다. SRAM으로 만들어지는 캐시 메모리가 DRAM에서 자주 참조되는 부분들을 저장하고, CPU는 접근 속도가 더 빠른 SRAM에 먼저 접근함으로써 메모리 참조의 성능을 엄청나게 향상시킬 수 있다. 이와 같이 메모리는 DRAM 하나로만 되어 있지 않고 메모리 참조의 성능을 개선시키기 위한 여러 계층으로 구성되어 있는데,..

[CSAPP] Pipelining - Performance

1. 성능 평가 1-1. 서론 (Introduction) CPU의 성능은 크게 두 가지 측면에서 평가할 수 있다. 하나는 서버(Server)의 입장에서 평가하는 것이고, 다른 하나는 클라이언트(Client)의 입장에서 평가하는 것이다. 예를 하나 들어 보자. 서울에서 부산까지 1시간 만에 가는 자동차 A가 있고, 30분 만에 가는 자동차 B가 있다고 해보자. 그런데 자동차 A는 20명을 태울 수 있고, 자동차 B는 5명만 태울 수 있다고 해보자. 그러면 탑승자 각각의 입장에서는 당연히 30분 만에 갈 수 있는 자동차 B가 더 좋다. 그러나 운전자의 입장에서는 1시간 동안 20명을 태워다 줄 수 있는 자동차 A가 1시간 동안 10명만 태워다 줄 수 있는 자동차 B보다 더 좋다. 이러한 측면에서 파이프라인 ..

[CSAPP] Pipelining - Wrap up

1. Exception Handling 1-1. 기본 CPU가 정상적으로 명령어 실행을 계속할 수 없는(계속하면 안 되는) 상황에 부딪혔을 때, 예외가 발생했다고 표현한다. 우리의 Y86-64 파이프라인 CPU에서 발생할 수 있는 예외의 종류는 크게 세 가지이다. Halt 명령어를 실행했을 때, 명령어/데이터 메모리에 잘못된 주소로 접근했을 때, 유효하지 않은 명령어를 실행했을 때이다. 이러한 예외가 발생했을 때 처리하는 방법은 여러 가지가 있을 수 있다. 무슨 방법을 채택하든, 중요한 것은 예외가 발생한 명령어부터 그 이후의 명령어들은 전혀 실행되지 않은 것처럼(아무런 프로세스 상태가 변하지 않도록) 처리해야 한다는 것이다. Sequential Implementation과 동일해야 Correctness..

[CSAPP] Pipelining - Part 2

1. 파이프라인 컨트롤 로직 파이프라인 방식으로 구현된 CPU에는 위와 같은 커다란 컨트롤 로직이 존재한다. 해당 컨트롤 로직은 각 단계의 레지스터에 저장된 값들(S_Field)과 각 단계에서 새로 계산되는 값들(s_Field)을 입력으로 받아서, 각종 컨트롤 신호와 각 단계의 레지스터 모드를 결정짓는다. 컨트롤 신호의 예로는 컨디션 코드 레지스터의 값을 변경할지 여부를 나타내는 set_cc가 있다. 그렇다면 레지스터 모드란 무엇을 의미할까? 레지스터 모드로는 Normal, Stall, Bubble이 있다. 특별한 일이 발생하지 않는 이상, 각 단계의 레지스터는 모드는 Normal이다(Stall 신호와 Bubble 신호가 모두 0). 즉, 이전 단계로부터 전달받은 값을 클락의 Rising-edge 때 저..

[CSAPP] Pipelining - Part 1

1. 파이프라인 동작 방식 1-1. 기본 파이프라인 방식으로 구현된 CPU는 위의 그림과 같은 구조를 가진다. 명령어 실행을 위한 과정을 독립적인 N개의 단계로 나누고, 그러한 단계들을 차례차례 거치면서 명령어의 실행이 처리되도록 한다. SEQ 방식은 한 명령어의 실행이 완전히 마무리되어야 다음 명령어를 실행하는 반면, 파이프라인 방식은 한 명령어의 첫 번째 단계 실행만 마무리되면 바로 다음부터 그다음 명령어를 실행하게 된다. 따라서 N개의 단계를 가진 파이프라인 방식에서는 한 순간에 N개의 명령어가 동시에 처리되므로, 처리 속도 측면에서 성능이 상당히 우수하다고 볼 수 있다. 1-2. 파이프라인 레지스터 파이프라인 방식을 구현하는 핵심 원리는 바로 단계별로 존재하는 파이프라인 레지스터이다. 특정 단계의..

[CSAPP] Pipelining - Introduction

지금까지 CPU가 명령어를 해석하고 실행하는 방식의 단순한 구현으로서 Sequential Implementation(이하 SEQ)를 알아보았다. 이번에는 SEQ보다 훨씬 복잡하지만 성능은 월등히 좋은 Pipelined Implementation(이하 파이프라인) 방식을 살펴보자. 이것 역시 x86-64의 단순한 버전인 Y86-64를 기준으로 한다는 것을 기억하도록 하자. 1. SEQ vs 파이프라인 한 뭉텅이의 옷감을 빨래하는 과정을 상상해 보자. 그 과정이 네 단계로 이뤄져 있다고 가정하면, SEQ 방식과 파이프라인 방식은 다음 그림과 같이 비교해볼 수 있다. 왼쪽이 SEQ 방식, 오른쪽이 파이프라인 방식이다. 한 뭉텅이의 옷감은 CPU가 실행하고자 하는 하나의 명령어에 대응되며, 빨래를 위한 네 단계..