Computer Science/컴퓨터 구조

CS.APP Chap1 A tour of computer system - 2

sh1mj1 2023. 5. 22. 13:07

1.6 Storage Devices From a Hierarchy

실제로는 많은 computer systems 의 저장 장치는 Memory hierarchy(메모리 계층 구조) 로 구성되어 있습니다.

 

 

성능을 향상시키기 위해 여러 cache 을 활용하는 것처럼 전체 메모리 구조의 대한 이해를 활용할 수 있습니다.

1.7 The OS(Operating System) Manages the Hardware

운영체제는 하드웨어를 관리합니다.

이전의 hello 프로그램을 예로 들어보면 shell 에서 키보드로 입력하면 알아서 disk → 메인 메모리 → display 로 접근하여 출력을 수행합니다. 우리가 직접 키보드, disk, 메인 메모리에 접근하지 않았는데도 말이죠. 이러한 기능들은 OS 에서 제공되는 서비스로 수행됩니다.

OS 는 application program 과 Hardware 사이에 잇는 SoftWare 계층입니다.

 

 

App. 이 H/W 을 접근하려는 모든 시도는 OS 을 통해야 합니다.

컴퓨터 구조 관점에서 OS 의 주 사용 목적은 아래와 같습니다.

  1. 실행되는 app. 에 의한 잘못된 사용으로부터 H/W 을 보호한다.
  2. app. 을 복잡하고 균일하지 않은 low-level H/W 디바이스에 비해 간단하고 균일한 매커니즘으로 제공한다.

 

또한 컴퓨터 시스템은 아래 그림과 같은 추상화를 제공합니다.

하나씩 알아봅시다.

 

1.7.1 Processes

hello 을 실행할 때 OS 는 프로그램이 오직 하나만 실행하고 있다고 System을 착각시킵니다. 마치 모든 process들이 각각 모두 H/W 을 독점으로 사용하는 것처럼 보입니다. Process 의 instruction 이 다른 Process 의 instruction 과 interleave(상호 배치) 되어 있습니다.

전통적인 system 에서는 한 번에 하나의 프로그램만 실행됩니다. 하지만 새로운 multicore processors 는 context switching(process 들 간에 processor 을 switch 하면서 동작)을 통해 CPU 가 여러 process 들을 동시에 실행할 수 있습니다. 일단 지금은 설명을 위해 하나의 CPU 만을 가진 uniprocessor system 으로 가정하여 설명하겠습니다.

OS 는 process 가 실행되기 위한 모든 Context(상태 정보) 을 추적합니다. context 에는 PC, register file, 메인 메모리 정보와 같은 정보들을 포함합니다.

 

Uniprocessor system 에서는 OS 가 현재 processor 에서 다른 process 로 옮기기로 하면

 

→ 현재 process 의 context 저장

→ context switch 수행

→ 새 process 의 context 을 복구함.

→ control 을 새 process 로 전달

→ 새 process 는 이전에 중단되었던 위치에서부터 insturction 실행.

 

하는 과정을 밟습니다. 아래 그림와 같이 동작합니다.

 

 

Kernel 은 항상 메모리에 상주하는 OS 의 code 부분입니다. app 이 OS 로의 어떤 actioin(read/write file 같은)을 요청하면 kernel 은 동작을 수행하고 app 으로 리턴합니다.

 

“Kernel 은 분리된 process 가 아니라 모든 process 을 관리하기 위해 system 이 사용하는 code, data structure 들의 모음입니다.”

 

process 추상화는 low-level H/W 와 OS S/W 사이의 협력으로 수행됩니다.

 

1.7.2 Threads

일반적으로 process 가 단일 control flow 을 가진다고 생각하지만 현재 system 에서는 여러 실행 unit 을 가질 수 있습니다. Thread 을 사용해서 말이죠.

 

Thread 는 process 의 context 에서 동작하는 같은 코드와 global data 을 공유합니다. Threads 는 network 서버에서 동시성 요청 때문에 점점 중요해지고 있습니다. 여러 스레드 사이에서 자원 공유가 여러 프로세스 사이에서보다 더 쉬울 뿐 아니라 스레드를 사용하는 것 자체가 더 효율적이기 때문입니다.

 

1.7.3 Virtual Memory

가상 메모리는 각 processot 가 메인 메모리를 독점으로 사용한다는 착각을 주는 추상화입니다. 각 process 는 virtual memory address space 라는 것으로 균일하게 메모리를 바라봅니다.

 

 

process virtual address space 는 각각 목적이 명확한 여러 영역으로 나뉩니다.

 

  • program code & data

모든 process 에 대한 같은 고정 주소로 시작합니다. global C 변수에 해당하는 data 가 바로 뒤에 따릅니다. program code 와 data 영역은 executable 파일에서 직접 초기화됩니다.

 

  • Heap

정적으로 크기가 고정된 code & data 영역과 달리 런타임에서 malloc & free (C standard Lib. 함수)로 동적으로 확장/축소합니다.

 

  • Shared Libarary

C Standard Library 나 math Library 같은 공유 라이브러리를 위한 code & data 가 있습니다.

 

  • Stack

User virtual address 의 최 상단에 함수 호출 구현을 위해 compiler 가 사용할 user stack 이 있습니다. Heap 처럼 범위가 확장/축소할 수 있씁니다.

특히 함수를 call 할 때 stack 이 확장하고 함수가 return 될 때 축소합니다.

 

  • Kernel virtual memory

Virtual address 공간의 최상단에는 kernel virtual memory 가 있습니다. Application 에서는 이 공간의 내용을 read/write 할 수 없고 이 공간의 함수를 직접 call 할 수 없습니다. 커널을 호출해서 이러한 동작이 가능합니다.

Virtual memory 에서의 기본 아이디어는 “process 의 가상 메모리를 disk 에 저장하고, disk 에 대한 캐시로 main memory 을 사용하는 것”입니다.

 

1.7.4 Files

file 은 bytes 의 연속체 그 이상도 이하도 아닙니다.

모든 I/O 장치(심지어 networks 까지)는 파일로 모델링됩니다. 모든 Input/output 은 Unix I/O system call 을 사용하여 파일을 읽거나 쓰는 것으로 수행됩니다.

File 개념을 통해 application 에서 여러 I/O 장치에 대해 동일하게 바라볼 수 있도록 합니다!!!

 

1.8 Systems Communicate with Other Systems Using Networks

시스템은 네트워크를 사용해서 다른 시스템과 통신한다.

system main memory 로부터 network adapter 로 byte 을 copy 하면 data 가 network 을 통해 local disk 대신에 또 다른 machine 으로 흘러갑니다.

Internet 같은 global network 의 발전으로 한 machine 에서 다른 machine 으로 정보를 copy 하는 것은 매우 중요해졌습니다. 예를 들어서 email, instant messaging, www, FTP, telnet 또한 network 로 정보를 복사하는 것이죠.

그런 의미로 network 도 하나의 I/O 장치라고 할 수 있습니다.

 

 

우리가 telnet 을 사용한다고 가정해봅시다. client 는 local machine 이고 server 는 remote machine 이라고 하고 hello 프로그램을 실행한다고 합시다. 그렇다면 아래와 같은 순서로 진행될 것입니다.

 

1.9 Important Themes

중요한 주제들

시스템은 단순 하드웨어가 아니라 app. program 을 실행하기 위해 서로 협력하는 hardware 와 system software 의 모음이라는 것이 중요합니다.

1.9.1 Amdahl’s Law

암달의 법칙

Gene Amdahl 은 computing 의 선구자입니다.

Amdal’s Law 의 주 아이디어는 ‘시스템의 한 부분을 가속화할 때 전체 시스템 성능에 미치는 영향은 이 부분이 얼마나 중요한지와 얼마나 빨라졌는지에 달려있다는 것’ 입니다.

 

어떤 작업의 시간 효율을 개선할 때 전체 작업시간에 대해 ⍺ 만큼의 작업시간을 차지하는 작업의 효율을 k 배만큼 향상시켰다고 하면 전체 작업 효율은 아래와 같이 향상 됩니다.

 

 

만약 전체 작업 시간중에서 10% 을 차지하는 작업의 속도를 2배 증가시켰다면 전체 작업속도는 약 1.05 배정도 증가하는 것이다.

그리고 이것은 병목현상을 설명하는 이론이기도 합니다.

전체의 40% 부분의 성능이 2배로 향상되었을 떄 전체 성능은 1.25배 증가합니다. 그런데 40% 부분의 성능이 무한히 증가한다고 해도 전체 성능의 증가폭은 1.66 배를 넘지 못합니다. 40% 부분이 아무리 빨리 일을 처리한다고 해도 원래 성능을 유지하는 나머지 60% 부분이 발목을 잡아서 전체 작업 속도의 증가폭의 한계가 뚜렷한 것이지요.

만일 90% 부분이 무한히 빨라진다고 하더라도 남은 10% 부분이 발목을 잡아서 성능 증가폭은 10배를 넘지 못하게 되지요. 실제로 cpu 나 gpu 중 하나가 다른 하나에 비해 과도하게 세대나 급 차이가 날 떄 체감할 수 있습니다.

즉, Amdahl 의 법칙에 따라서

  1. 전체 작업의 효율을 최대한 증가시키고 싶다면 그 중에서 가장 비중이 큰 작업부터 초점을 맞추는 것이 좋습니다.
  2. 일부 작업들이 더 이상 개선의 여지가 없을 경우 전체 작업이 최대 어느정도의 개선 효율을 보일 수 있을지에 대해 예측이 가능합니다.

 

1.9.2 Concurrency and Parallelism

컴퓨터가 더 많은 것들을 처리하고 더 빠르게 동작하도록 발전하였고 이런 발전이 한번에 더 많은 동작을 할 수 있도록 만들었습니다.

Concurrency : 여러 개의 동시 동작.

Parallelism: system 을 더 빠르게 동작하도록 concurrency 을 사용하는 것. 컴퓨터 시스템에서의 여러 레벨의 추상화로 사용할 수 있습니다. 세 가지 레벨의 Concurrency, Parallelism 을 살펴봅시다.

 

 

Thread-Level Concurrency

thread 을 사용하면 단일 프로세스 내에서 실행되는 여러 control 흐름을 가질 수 있습니다.

1960 년대 초반에는 time-sharing 기술을 사용하여 한 컴퓨터가 각 실행 프로세스 사이를 빠르게 switch 하여 concurrency 을 가져갔습니다. 마치 여러 공을 저글링하는 것처럼 말이죠. 이 방법으로 여러 user 가 동시에 system 과 상호작용할 수 있도록 했습니다. 여러 사람이 하나의 web browser 을 사용하는 것, 그리고 한 user 가 web 을 띄우고 word 을 실행하고, 음악 스트리밍을 동시에 하는 것처럼 동시j에 여러 일을 할 수 있죠. 최근까지 실제 computing 은 single processor 가 time-sharing 하는 것으로 구현되었습니다. 이 system 을 uniprocessor system 이라고 합니다.

 

하나의 OS kernel 의 control 에서 여러 프로세서들이 system 을 구성하는 multiprocessor system 을 만들었습니다. 그런 system 은 대규모 컴퓨팅에서 사용되었지만 multi-core processorshyperthreading 이 흔해지면서 1980 년대부터 활발하게 사용되었습니다.

Multi-core processors 는 하나의 칩에 여러 cpu(core)을 가집니다.

 

 

아래 그림은 전형적인 multi-core processor 그림입니다. L1, L2 cache 을 가지는 core 가 있고 이 코어들은 main memory 의 interface 인 high level cache 와 연결되어 있습니다.

 

 

HyperThreading(simultaneous multi-threading) 은 하나의 CPU 가 여러 control flow 을 실행하도록 합니다. 여기에는 PC(Program Counter) 및 register 파일과 같은 일부 CPU 하드웨어의 여러 복사본이 포함됩니다. 기존 프로세서는 thread-switching 을 위해 20,000 클럭 사이클이 필요하지만 HyperThreading 프로세서는 사이클 단위로 실행할 스레드를 결정하여 CPU 가 processing 자원을 더 잘 활용할 수 있습니다.

 

multiprocessing 의 사용으로 크게 두가지 성능 향상을 얻을 수 있습니다.

  • 여러 작업을 수행할 때 concurrency 을 simulate 할 필요가 없어집니다.
  • 단일 application program 을 더 빠르게 실행할 수 있습니다. (해당 프로그램이 병렬로 효과적으로 실행할 수 있는 여러 스레드로 표현되는 경우)

 

multi-core 와 hyperthreaded systems 의 출현으로 hardware 로 가능한 thread-level parallelism 을 활용할 수 있는 application program 을 작성하는 방법을 찾고자 하는 시도가 많아졌습니다.

 

Instruction-Level Parallelism

 

훨씬 low-level 추상화에서 현대 processors 는 한 번에 여러 instruction 을 실행할 수 있습니다. 이를 Instruction-Level Parallelism 이라고 합니다. 이 기술은 pipelining 이라고 합니다. Instruction 을 실행하는데 필요한 동작이 여러 단계로 분할되고 프로세서 H/W 가 일련의 stage 로 구성되어 이러한 단계 중 하나를 수행하는 것입니다. stage 들은 병렬적으로 동작할 수 있고 다른 instructions 들과는 다른 부분에서 동작합니다.

한 cycle 에 한 instruction 보다 더 빠르게 실행율을 유지하는 Processor 들을 superscalar processor 라고 합니다. 대부분의 현대 processor 들이 그렇지요.

 

Single-Instruction, Multiple-Data(SIMD) Parallelism

 

lowest level 에서 많은 최신 processor 들이 단일 instruction 이 여러 동작이 병렬적으로 수행되도록 하는 특별한 H/W 을 가지고 있습니다. 이 H/W 을 SIMD(Single-Instruction, Multiple-Data) 라고 합니다.

이러한 SIMD instruction 은 이미지, 소리, 비디오 데이터를 처리하는 app. 을 가속하기 위해 제공됩니다. 일부 compiler 는 자동으로 하지만 C 프로그램에서 SIMD 병렬 처리를 선택적으로 추출하는 더 안정적인 방법은 GCC 같은 compiler 에서 지원하는 특수한 vector 데이터 타입을 사용하여 프로그램을 작성하는 것입니다.

 

1.9.3 The Importance of Abstractions in Computer Systems

CS 에서 추상화의 중요성

 

CS 에서 추상화는 가장 중요한 개념입니다. 좋은 프로그래밍 관행 중 하나는 간단한 API 을 만들어서 프로그래머들이 API 의 깊은 곳까지 파고들어갈 필요없이 이를 구현하도록 하는 것입니다. 물론 언어에 따라 형태나 추상화 지원 레벨은 다르겠죠.

 

 

Processor 딴에서 ISA(Instruction Set Architecture) 는 실제 processor H/W 의 추상화를 제공합니다.이로서 H/W 는 더 정교하고, 여러 instruction 을 병렬로 실행합니다. 추상화로써 항상 일관적이로 간단한 model 로 말이죠. 다른 processor 구현도 같은 model 에서 machine code 을 실행합니다.

 

OS 딴에서는 I/O devices 을 file 로 보는 추상화를 합니다. 또, program memory 의 추상화로 virtual memory, 실행 중인 program 을 process 로 보는 추상화를 합니다. 또 OS, processor, 을 포함한 전체 컴퓨터의 추상화를 제공하는 가상머신이라는 추상화도 존재합니다.

'Computer Science > 컴퓨터 구조' 카테고리의 다른 글

CS.APP Chap1 A tour of computer system - 1  (0) 2023.05.18