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

전체 글 (168)

[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가 실행하고자 하는 하나의 명령어에 대응되며, 빨래를 위한 네 단계..

[CSAPP] Sequential Implementation

동일한 ISA를 탑재하는 CPU라고 할지라도 내부 구현 방식은 다양할 수 있다. 특히 '명령어를 해석하고 실행하는 방식'의 관점에서 구현 방식을 나눠보면, Sequential Implementation(이하 SEQ)과 Pipelined Implementation(이하 파이프라인)이 대표적이다. SEQ가 가장 단순하지만 정확한 구현 방식이라면, 파이프라인은 성능의 개선을 위해 새롭게 고안된 구현 방식이라고 할 수 있다. 우리는 앞서 x86-64의 단순한 버전으로서 공부한 Y86-64를 기준으로, SEQ와 파이프라인이 구체적으로 어떻게 구현되는 것인지 알아볼 것이다. 이번 포스팅에서는 먼저 SEQ 방식에 대해 알아보도록 하자. 1. SEQ Overview 1-1. 프로세스 상태 (Process State) ..

[CSAPP] Y86-64 - Logic Design

1. 데이터의 표현 : 비트의 세계로 컴퓨터는 내부적으로 모든 데이터를 0과 1로 처리한다. 이것이 구체적으로 무슨 말일까? 사실 전압이라는 것은 이산적인 값이 아니라 연속적인 값이다. 그래서 전압 값의 범위를 크게 세 범위로 나누게 된다. 하나는 0에 해당하는 영역, 다른 하나는 1에 해당하는 영역, 마지막 하나는 나머지 두 영역 사이에 존재하는 보호 범위(Guard Range)이다. 결국, 보호 범위에 해당하지 않는 전압을 가하면 이는 반드시 0 또는 1로 해석이 된다. 이러한 원리로 신호에 가해지는 작은 노이즈들은 데이터의 표현에 거의 영향을 주지 않게 되며, CPU 내부 회로를 더욱 단순하게 디자인할 수 있게 된다. 결국 컴퓨터의 데이터를 다루는 것에 있어서 연산을 수행한다는 것은 곧 0과 1로 ..