System Prorgram의 3번째 Runtime System이다. 이러한 런타임 시스템에는 다음과 같은 시스템 프로그램들이 존재한다.
Command
Shell
library
Static library & Shared library
Static libray
compile time에 정적으로 링크된다.
파일명이 .a 로 끝난다.
간단하지만 메모리 낭비가 있다.
Shared library
runtime에 동적으로 링크된다.
파일명이 .so로 끝나며
메모리의 사용이 효율적이다.
Framework
Virtual machine
Docker
Key-Value Store
시스템 프로그램은 하드웨어와 밀접하게 관련이 되어있어서 시스템 프로그램을 이해하기 위해서는 하드웨어의 구조를 이해할 필요가 있다. 그 구조는 아래와 같다.

이러한 하드웨어 구조에서 상황별로 어떤식으로 동작하는지 알아보면 다음과 같다.
상황 1 ) 프로그램이 Load 될때.
상황 2 ) printf(”Hello World\n”)을 수행할때.
시스템 프로그래밍을 위해서는 하드웨어에 대해 이해할 필요가 있다고 하였는데 그 이유에 대해 간단한 예시를 통해 알아보도록 하자.
Memory 이슈.
다음과 같은 2개의 프로그램을 비교해보자.

위의 프로그램 A와 프로그램 B은 loop에서 배열에 접근할때 방식에 차이가 있다. 프로그램 A는 배열의 처음부분부터 순차적으로 접근하고 B는 띄엄띄엄 접근하는 것을 볼 수 있는데 이를 그림으로 표현하면 다음과 같다.

A는 반복문을 통해 배열에 접근할때 linear 하게 접근하고 B는 띄엄띄엄 접근한다. 하지만 이러한 차이는 DRAM이 메모리 공간에 접근하는데 속도 차이를 야기하지는 않는다(DRAM은 Dynamic Random Access Memory의 이름에서 알 수 있듯이 랜덤한 메모리 주소에 접근할 때 속도에 차이가 없다). 그렇다면 성능이 똑같은가? 그것은 또 상황에 따라 갈린다. 메모리의 공간이 충분하다면 큰 차이는 없겠지만 만약에 메모리에 공간이 충분하지 않다면 두 프로그램 사이에 성능의 차이가 생긴다.
프로그램이 Memory에 올라가서 동작할때 Main Memory에 공간이 충분하지 않다면 모든 내용을 올리지 않는다. 메모리에서 가용한 만큼만 올리고 나머지는 Disk의 Swap이라는 공간에 남기게 되는데 우선 메모리에 올린 데이터로 사용하다가 만약 Swap 공간에 저장된 내용이 필요하다면 기존에 Main Memory에 올라가있던 내용들을 Swap-out 시켜 Swap 공간으로 내리고 Swap공간에 있던 내용들을 Main Memory에 Swap-in 시킨다. 이러한 Swap 과정은 Disk에 접근하는 것이기에 당연히 속도가 Main Memory에 접근하는 것보다 느리고 Swap 이 자주 일어난다면 프로그램의 성능이 저하된다.
여기까지 이해했다면 제한된 메모리 공간이 주어졌을때 Program A와 Program B 사이에 어떤 차이가 있을지 예상할 수 있을 것이다. 당연히 A 보다 B가 Swap이 더 자주 일어날 것이고(Disk에서 Sector 단위로 데이터를 Main Memory로 올리니까 연속된 데이터의 접근이 일어나는게 Swap이 덜 발생함.) B보다는 A가 성능이 더 좋을 것이다.
CPU 이슈.
다음과 같은 예시를 보자.

두 함수 모두 배열에 있는 값들을 더해주는 함수인데 어떤 함수가 더 빨리 동작하겠는가?
ALU가 하나인 컴퓨터라면 모를까 일반적인 컴퓨터에는 ALU가 하나만 있지 않고 여러개 존재한다. 그렇다면 다시 물어보겠다 일반적인 컴퓨터에서 어떤 함수가 더 빠르게 동작하겠는가?
정답은 combine5 가 더 빠르게 동작한다. combine5에서는 배열내의 데이터를 접근할때 한번에 3개씩 접근해서 더해주는데 이러한 방식을 loop unrolling 이라고 한다. 여러개의 ALU가 놀지 않고 다 일하도록 만들어 주는 방법으로 분산처리를 하도록 해주는 느낌이다.
위의 이슈들에서 첫 번째 이슈는 메모리에 대한 이해, 두 번째 이슈는 CPU에 대한 이해를 하고 있어야 알 수 있는 내용들이었다. 이 처럼 하드웨어에 대한 이해를 하고 있다면 더 좋은 프로그래머가 될 수 있을 것이다.
시스템 프로그램에서 중요한 특징 중 하나인 추상화이다. 컴퓨터 과학에서 추상화란 내부의 상세 내용을 가리고 실제로 프로그래머가 필요로 하는 내용만을 보여주는 것이 추상화라고 표현된다.
일상생활에서 잘 추상화 된 모델을 보자면 자동차가 있다. 자동차가 내부적으로 어떻게 구성되어있는지 몰라도 운전자들은 그 사용법만 알면 운전이 가능하지 않은가? 따라서 자동차는 매우 잘 추상화된 모델이다.
그렇다면 이제 컴퓨터가 어떻게 추상화 되어있는지 살펴보도록 하자.
이러한 추상화는 보통 계층 구조로 표현되는데 그 구조는 다음과 같다.
응용 프로그램 하나 돌리는데 위의 모든 과정을 알아야지 동작시킬 수 있는가? 아니다! 우리는 그냥 프로그램 실행 버튼 하나면 해결된다. 하지만 실제로 그 내부의 과정은 위의 계층 구조가 일반적이라는 것이다.
이번에는 System Program의 3번째 Runtime System에 대해 알아보았다. 그 후에 시스템 프로그래밍을 공부하기 위해, 더 나은 프로그래머가 되기 위해 하드웨어의 여러 이슈들에 대해 알아야 한다는 것을 몇가지 예시를 통해서 이를 가볍게 알아보았다. 그리고 마지막으로 시스템 프로그래밍의 꽃인 추상화에 대해서도 알아보았다.
여기까지 알아보는데 있어서 사실 잘 이해가 가지 않아도 되며 오히려 이해하지 못하는 것이 정상일 수 있다. 원래 모든 배움에 있어서 인트로가 가장 어렵다.(앞으로 배울 내용들을 나열하기에 자세한 내용은 모른채로 그냥 이런게 있다 정도만 알고 넘어가니까…) 이제까지 살펴본 내용들은 앞으로 조금씩 더 깊게 알아볼 내용들임으로 숙지정도만 하고 넘어가도록 하자.