Ch1.9 Important Themes

Park Choong Ho·2021년 8월 18일
0

1.9 Important Themes

첫장의 마지막 내용입니다. 이러한 논의에서 벗어난 하나의 중요한 개념은 시스템은 그저 하드웨어일 뿐이라는 점입니다. 하드웨어와 시스템 소프트웨어가 결합해서 프로그램을 동작하는 목표를 위해 협력할 뿐입니다. 책의 나머지 부분은 하드웨어와 소프트웨어의 상세사항에 대해서 다룰 것이며, 이러한 디테일에 대한 정보를 바탕으로, 더 빠르고 믿을만하고 안전한 프로그램을 만들 수 있음을 보여드릴 것입니다.

이 장을 마무리하면서, 컴퓨터 시스템 전반을 관통하는 중요한 몇가지 개념들을 소개하고자 합니다. 이 개념들은 책 전체에 걸쳐 나올 내용들이니 잘 봐두시기를 바랍니다.

1.9.1 Amdahl's Law

Gene Amdahl은 컴퓨터 시스템 특정 영역의 성능을 향상시키는데 있어 그 영향력에 대한 간단하고 통찰력있는 발견을 해냈습니다. 이 발견이 Amdahl's Law입니다. 핵심 아이디어는 우리가 시스템의 어느 부분을 빨리 만들면, 전체 시스템 성능에 끼치는 영향력은 그 영역이 시스템에서 얼만큼 중요하냐와 얼만큼 빨라졌느냐에 달려있다는 것입니다. 어떤 애플리케이션을 동작하는데 T(old) 시간 만큼 걸린 시스템을 가정해봅시다. 시스템의 어떤 영역은 이 시간의 분수 ⍺만큼의 시간을 필요로하고 k 비율만큼 성능을 향상 시켰다고 가정해봅시다. 이것은 해당 요소가 원래 ⍺T(old)만큼 시간을 요구했고 지금은 (⍺T(old))/k만큼 시간을 요구한다는 말입니다. 전체 식은

이렇게 되고 속도가 상승한 비율은 S= T(old)/T(new)가 되며 그 식은

이됩니다. 예를 들어, 현재 전체 시스템에서 60%((⍺ = 0.6)만큼 시간을 소비하는 영역을 3배 빠르게 만들었다고 가정해봅시다. 그러면 우리는 1/(0.4 + 0.6/3) = 1.67x 정도의 속도 향상을 기대할 수 있습니다. 시스템 주요 영역을 상당히 발전 시켰으나, 순수 속도 향상은 그보다 덜 한것을 확인할 수 있습니다. 이것이 암달의 법칙의 중요한 부분입니다. 바로 전체 시스템의 속도를 올리고 싶으면 반드시 전체 시스템의 큰 부분을 차지하는 즉, 병목을 개선해야 한다는 것입니다.

암달의 법칙의 흥미로운 케이스는 k를 ⚯로 설정했을 때의 영향을 살펴보는 것입니다. 이렇게 되면

위와 같은 식을 얻게 됩니다. 예를 들어, 시스템의 60%에 해당하는 부분을 무제한으로 빠르게 했을 때(시간을 무시해도 될만큼), 시스템 상에서의 속도 향상은 겨우 1/0.4 = 2.5x라는 것입니다.

암달의 법칙은 우리가 어떤 프로세스를 개선하는데 있어 적용할 수 있는 보편적인 법칙을 설명합니다. 컴퓨터 시스템 속도를 높이는 데 적용하는 것 외에도 면도날 제조 비용을 줄이려는 회사나 평균 학점을 높이려는 학생에도 적용할 수 있습니다. 특히 반복적으로 2배 이상 성능을 향상시키려고 하는 컴퓨터 세계에서 의미가 더 커질 것입니다. 그러한 높은 성능 배율 향상은 시스템의 큰 부분을 최적화함으로써 얻을 수 있습니다.

Concurrency and Parallelism

컴퓨터 역사를 관통해서, 두가지 요구사항이 계속해서 컴퓨터를 진화시켰습니다. 하나는 컴퓨터가 더 많은 일을 하는 것, 다른 하나는 더 빨리 동작하게 하는 것입니다. 이 두가지 요구 사항은 프로세서가 한번에 더 많은 일을 할 때 개선되어 갔습니다. concurrency는 여러개의 일이 동시에 동작할 수 있도록 하는 시스템의 보편적인 개념입니다. parallelism은 concurrency를 활용해 시스템을 더 빨리 동작할 수 있게 합니다. Parallelism은 컴퓨터 시스템에서 여러 레벨의 추상화에서 활용됩니다. 여기서는 3단계를 살펴볼텐데, 시스템 계층구조상 높은 레벨에서 낮은 레벨을 순서로 하겠습니다.

Thread-Level Concurrency

프로세스 추상화 작업에 있어, 여러개의 프로그램이 동시에 실행됨으로써 concurrency가 수행되는 시스템을 생각할 수 있습니다. Thread를 활용하면 하나의 프로세스에서 여러개의 제어흐름을 가질 수 있습니다. 1960년대 초에 time-sharing의 출현하면서, concurrent 실행에 대한 지원이 컴퓨터 시스템에 나오기 시작했습니다. 공중에다 여러개의 공을 저글링 하듯, 전통적으로 이러한 concurrent execution은 오직 simulated됩니다. 이 말은 하나의 컴퓨터가 실행되고 있는 프로세스를 빠르게 바꿔가면서 동작한다는 의미입니다. 이러한 concurrency의 형태는 여러 사용자들이 하나의 시스템과 동시에 상호작용하는 것을 가능하게 합니다. 가령, 많은 사람들이 하나의 웹서버에 접근에 페이지를 받아올때 말이죠. 또한 한명의 유저가 여러개의 task에 concurrently하게 관여하는 것을 가능하게 합니다. 가령, 한쪽에는 브라우저, 한쪽에는 워드 프로세서, 다른 한쪽에는 스트리밍 음악을 동시에 돌리고 있는 것입니다. 최근까지, 대부분 실제 컴퓨팅은 하나의 프로세서에 의해 수행되어 왔습니다. 비록 해당 프로세서가 여러개의 task를 바꿔줘야 했지만 이것이 보편적이었습니다. 이러한 것을 uniprocessor system이라 합니다.

하나의 운영체제 시스템 커널의 제어를 받는 여러개의 프로세서들로 구성된 시스템을 구성할 때, 이를 multiprocessor system이라 합니다. 이러한 시스템들은 1980년대 큰 규모의 컴퓨팅에 상용화되기 시작했고, multi-core 프로세서와 hyperthreading이 등장하면서 최근에 보편화되었습니다. 아래 그림은 이러한 서로 다른 프로세서 타입에 따른 분류체계를 보여주고 있습니다.

Multi-core 프로세서는 하나의 통합 회로 칩에 통합된 여러개의 CPU를 가지고 있고 아래 그림과 같습니다.

해당 그림을 보면 칩이 4개의 CPU 코어를 가지고 있습니다. 그리고 그 코어 각각은 자신만의 L1, L2 캐시를 가지고 있으며 각각의 L1캐시는 최근에 fetching된 인스트럭션을 가지고 있는 부분과 데이터를 가지고 있는 부분으로 나뉘어 집니다. 코어는 높은 레벨의 캐시와 메인 메모리에 대한 인터페이스를 공유합니다. 산업 전문가들은 하나의 칩에 12개 단위의 더 나아가 100단위의 코어를 담게 될것이라고 예상하고 있습니다.

Hyperthreading 또는 종종 simultaneous multi-threading 이라 불리는 것은 하나의 칩이 여러개의 제어흐름을 실행할 수 있게 하는 기술입니다. 여기에는 CPU 하드웨어의 몇몇 부분 가령, program counter, 레지스터 파일등의 여러개의 복사본을 가지고 있는 것을 포함합니다. 반면에, floating-point 연산을 하는 유닛은 하나만 가지고 있는 것입니다. 원래의 프로세서들은 스레드 변경시 대략 20,000 clock cycle을 요구했던 반면에, hyperthreaded 프로세서는 어떤 스레드들이 실행될지 한 사이클마다 결정한다고 합니다. 이것은 CPU가 자신의 동작 자원을 더 잘 활용할 수 있게 해주었습니다. 예를 들어, 한 스레드가 캐시에 데이터가 로드 되기를 기다리고 있으면, CPU가 다른 스레드가 실행되게끔 합니다. Intel Core i7 프로세서는 한 코어가 2개의 스레드를 돌릴 수 있고, 4개의 코어라 하면 8개의 스레드가 parallel하게 실행된다는 의미입니다.

multiprocessing의 활용은 시스템 성능을 2가지 방식으로 향상시킵니다. 하나는 여러개의 task를 실행할 때, concurrency를 simulate할 필요가 줄어듭니다. 언급했듯이, 심지어 한명이 사용하는 개인 컴퓨터도 concurrent하게 여러개의 일을 수행하게끔 기대됩니다. 두번째는, 이것이 하나의 프로그램을 더 빠르게 동작하게 할 수 있다는 점입니다. 하지만 이경우는 해당 프로그램이 효율적으로 parallel하게 실행되는 여러개의 스레드로 실행되었을 경우입니다. 따라서, 비록 concurrency에 대한 원리가 50년 가까이 연구되었지만 멀티 코어와 hyperthreaded 시스템의 등장은 thread-level parallelism을 활용할 수 있는 프로그램을 만드는 방법을 찾는데 있어 도움이됩니다. 12장은 concurrency를 더 깊게 살펴보고 프로세싱 자원을 공유하고 프로그램 실행에 있어 parallelism을 가능하게하는 concurrency 활용을 더욱 살펴보도록 하겠습니다.

Instruction-Level Parallelism

더 낮은 단계의 추상화에서 현대 프로세서들은 한번에 여러개의 인스트럭션을 실행하는데, 이를 instruction-level parallelism이라 합니다. 예를 들어 초기 마이크로 프로세서들은 하나의 인스트럭션을 실행하는데 대략 3 ~ 10번의 clock cycle을 필요로 했습니다. 더 최근의 프로세서들은 한 clock cycle에 2-4번 정도의 인스트럭션이 실행가능합니다. 주어진 명령이 처음부터 끝까지 훨씬 더 긴 시간, 아마도 20사이클 또는 그 이상이 필요한 경우, 프로세서는 한 번에 최대 100개의 명령을 처리하기 위해 많은 영리한 트릭을 사용합니다. 4장에서는, pipelining이라는 개념을 활용함으로써 인스트럭션 하나를 실행하는데 필요한 동작들을 여러 단계로 나눈후, 프로세서 하드웨어가 그에 맞게 구성되면서, 각각 단계 하나하나를 실행하는 것을 볼 것 입니다. 해당 단계들은 parallel하게 동작하며, 다른 인스트럭션들의 다른 부분들에 적용됩니다. 다소 간단한 하드웨어 디자인이 한 clock cycle에 하나의 인스트럭션을 수행하는 것을 확인할 것입니다.

한 cycle에 1개이상의 인스트럭션 이상을 수행하는 프로세서들은 superscalar프로세서라고 합니다. 현대 프로세서들은 superscalar 기능을 지원합니다. 5장에서, 그런 프로세서들의 더 높은 레벨의 모델을 확인해볼 것입니다. 프로그래머가 이 모델을 활용하여 프로그램의 성능을 이해하는 것을 보게될 것입니다. 그리고 그렇게 생성된 코드가 더 높은 빈도의 instruction-level parallelism을 수행하고 결과적으로 더 빨라지는 것도 확인할 것입니다.

Single-Instruction, Multiple-Data (SIMD) Parallelism

가장 낮은 레벨에서, 많은 현대 프로세서들은 single-instruction, multiple-data(SIMD)라 알려진 특별한 하드웨어를 가지고 있습니다. 이 하드웨어는 하나의 인스트럭션이 parallel하게 수행되는 여러개의 동작을 야기할 수 있도록 합니다. 말이 조금 복잡한데 예를 들어, 최근 Intel과 AMD 프로세서들은 parallel하게 single-precision floating-point 숫자들(C에서 float type)을 8쌍 더할 수 있는 인스트럭션을 가지고 있습니다.

이 SIMD 인스트럭션들은 이미지, 소리, 비디오 데이터를 다루는 프로그램을 빠르게 하는데 주로 쓰입니다. 비록 몇 컴파일러들은 C 프로그램으로 부터 SIMD parallelism을 자동으로 추출하는 시도를 하고 있지만, 더 신뢰할 수 있는 방법은 프로그램을 특별한 vector 데이터 타입을 활용하여 작성하는 것입니다. vector데이터 타입은 GCC 같은 컴파일러에 의해 지원됩니다. 이러한 스타일의 프로그래밍을 Web Asied OPT:SIMD에서 살펴볼 것입니다. 해당 내용은 5장에서 프로그램 최적화 관련된 부분을 보충하는 내용입니다.

1.9.3 The Importance of Abstractions in Computer Systems

추상화라는 것은 컴퓨터 과학에 있어 가장 중요한 개념중 하나입니다. 좋은 프로그래밍 예시중 하나는 간단한 application program interface(API)를 만들어 함수로 제공함으로써 프로그래머들이 내부 동작에 대해 들여다볼 필요없이 해당 코드를 사용할 수 있게 하는 것입니다. 언어마다 다른 형태, 추상화 단계에 대한 다른 지원들(자바 클래스 선언, C 함수 프로토타입)을 제공합니다.

위 그림에서 볼 수 있듯이, 이미 컴퓨터 시스템에서 확인할 수 있는 몇몇 추상화를 공부했습니다. 프로세서에서는, instruction set architecture가 실제 프로세서 하드웨어에 대한 추상화를 제공합니다. 이러한 추상화로 인해, 기계 코드 프로그램은 마치 한번에 하나의 인스트럭션만 수행하는 프로세서에서 동작하는 것처럼 보입니다. 프로세서는 훨씬 더 정교학, parallel하게 여러개의 인스트럭션들을 간단하고 연속적인 모델의 형태로 수행합니다. 같은 실행 모델을 따르면서, 다른 프로세서 구현들은 같은 기계 코드를 실행하는데 비용과 성능에서 차이를 보입니다.

운영체제에서, 3개의 추상화를 확인했습니다.(입출력 장치 추상화로 써의 파일, 프로그램 메모리 추상화에 대한 가상메모리, 동작하는 프로그램 추상화에 대한 프로세스) 여기에 virtual machine이라는 추상화를 추가하겠습니다. virtual machine은 프로그램, 프로세서, 운영체제를 포함해서 전체 컴퓨터에 대한 추상화를 제공합니다. virtual machine에 대한 개념은 IBM에 의해 1960년대에 처음 소개되었습니다. Virtual machine은 같은 운영체제에서의 여러 버전 또는 여러개의 운영체제에 맞게 디자인된 프로그램을 돌릴수 있는 컴퓨터들을 관리하는데 있어 지배적인 역할을 하고 있습니다. 다음 섹션들에서 이러한 추상화를 하나하나 살펴볼 것입니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글