1.3 Runtime System & 하드웨어 & 추상화

김영우 (AvocadoSmasher)·2022년 11월 8일
0

System Programming

목록 보기
6/6

Runtime System

System Prorgram의 3번째 Runtime System이다. 이러한 런타임 시스템에는 다음과 같은 시스템 프로그램들이 존재한다.

  • Command

    • file 관련 : ls, cat, cp, more, mkdir, cd 등…
    • task 관련 : ps, kill, jobs.
    • utility 관련 : vi, gcc, make 등…
    • 시스템 관리 : adduser, passwd, ifconfig, mount, fsck 등…
    • 기타 : man, file, grep 등…
  • Shell

    • 명령어 해석기로 사용자가 입력한 명령어를 해석해서 처리해준다.
    • pipe, redirection, background processing과 같은 기능도 제공한다.
    • shell script programming 기능을 제공한다.
  • library

    • 함수들의 집합으로 많은 사용자들이 자주 사용한다.
    • 재배지 가능한 오브젝트 파일의 형태이다.
    • 기본적으로 표준 라이브러리들도 있고 프로그래머들이 자신만의 라이브러리를 만들어서 사용하는 것도 가능하다.
    • 정적 라이브러리와 공유 라이브러리로 나뉜다.
    • library는 User mode에서 동작하는 API 이다. (Kernel mode에서 동작하는 System call과는 이러한 차이가 있다.)
  • Static library & Shared library

    Static libray

    1. compile time에 정적으로 링크된다.

    2. 파일명이 .a 로 끝난다.

    3. 간단하지만 메모리 낭비가 있다.

      Shared library

    4. runtime에 동적으로 링크된다.

    5. 파일명이 .so로 끝나며

    6. 메모리의 사용이 효율적이다.

  • Framework

    • Platform이라고도 불리며 대규모 소프트웨어의 개발을 위한 기능들의 집합이다.
  • Virtual machine

    • Hypervisor 혹은 Host OS로 부터 가상 디바이스를 만들어서 그 위에 Guest OS를 동작시킨다.
  • Docker

    • namespace 와 cgroup을 사용하여 container라는 독립된 가상화 환경을 제공한다.
  • Key-Value Store

    • 비정형 데이터를 저장하기 위한 새로운 형태의 데이터 베이스이다.
    • 빅데이터를 관리하기 위해서 주로 사용된다.
    • Key 데이터 구조를 위해 LSM-tree, Skipped-list, Bloom filer등이 사용된다.

H/W 고려사항.

시스템 프로그램은 하드웨어와 밀접하게 관련이 되어있어서 시스템 프로그램을 이해하기 위해서는 하드웨어의 구조를 이해할 필요가 있다. 그 구조는 아래와 같다.

  • CPU
    • PC(program counter) : 다음에 수행해야할 명령어가 저장된 메모리의 주소를 가지고 있다.
    • Register : CPU 내부에 있는 일종의 메모리. CPU 내부에 있기 때문에 굉장히 빠르게 접근 가능하다.
    • ALU(Arithmetic Logic Unit) : 산술, 논리 연산을 위한 장치.
  • Memory
    • 주소-데이터 쌍으로 이루어져있다.
  • Device
    • 장치 자체와 장치를 제어하는 controller로 이루어져 있다.
    • controller에는 로직이나 작은 cpu같은 것이 존재한다. 이들이 이를 구동한다.
  • Bus
    • 계층구조로 빠른 버스와 느린 버스가 bridge로 이루어져 있다.

이러한 하드웨어 구조에서 상황별로 어떤식으로 동작하는지 알아보면 다음과 같다.

상황 1 ) 프로그램이 Load 될때.

  1. Disk에 있던 Binary파일(프로그램)이 bus를 통해 Main memory에 로드된다.
  2. Main memory위의 task(process)가 실행될 때 CPU에 올라가서 동작한다.

상황 2 ) printf(”Hello World\n”)을 수행할때.

  1. CPU에서 해당 명령어를 수행하면 bus를 통해서 Main Memory에 “Hello World\n” String이 저장된 위치를 찾는다.
  2. 해당 String을 Bus를 통해 Graphics adapter에 전달하고 출력한다.

더 좋은 프로그래머가 되기 위해 필요한 하드웨어 고려사항!

시스템 프로그래밍을 위해서는 하드웨어에 대해 이해할 필요가 있다고 하였는데 그 이유에 대해 간단한 예시를 통해 알아보도록 하자.

  • 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에 대한 이해를 하고 있어야 알 수 있는 내용들이었다. 이 처럼 하드웨어에 대한 이해를 하고 있다면 더 좋은 프로그래머가 될 수 있을 것이다.

Abstraction : 추상화.

시스템 프로그램에서 중요한 특징 중 하나인 추상화이다. 컴퓨터 과학에서 추상화란 내부의 상세 내용을 가리고 실제로 프로그래머가 필요로 하는 내용만을 보여주는 것이 추상화라고 표현된다.

일상생활에서 잘 추상화 된 모델을 보자면 자동차가 있다. 자동차가 내부적으로 어떻게 구성되어있는지 몰라도 운전자들은 그 사용법만 알면 운전이 가능하지 않은가? 따라서 자동차는 매우 잘 추상화된 모델이다.

그렇다면 이제 컴퓨터가 어떻게 추상화 되어있는지 살펴보도록 하자.

  • CPU compilation system을 통해서 CPU내부에 ALU가 어떻게 동작하고 내부 논리 회로가 어떻고 하는 내용들을 다 알고 이를 사용해서 코딩을 하는가? 아니다. 우리는 프로그래밍을 할 때 고급 언어를 사용해서 코딩을 하고 compilation system이 이를 기계어로 바꿔 컴퓨터가 이해할 수 있게 하여 프로그램이 동작한다.
  • Multitasking 컴퓨터 할때 하나의 프로그램만이 동작하는가? 아니다 이 글을 쓰고있는 필자도 ppt를 틀어놓고 notion을 틀고 카카오톡을 하며 chrome을 통해 자료를 수집하고 있다. 이렇게 여러 프로그램이 동시에 동작하는것 처럼 보이기 위해 Scheduler라는 것을 통해서 물리적 자원인 CPU를 시분할 시스템을 통해 OS가 할당해주며 동시에 동작하는 것처럼 보이는 것이다. 여러분은 이러한 복잡한 과정을 몰라도 지금 Scheduler 덕분에 여러 응용 프로그램을 띄워놓고 사용하는 것이다.
  • Memory Management 혹시 컴퓨터 사용하면서 메모리 사용량에 대해서 걱정하면서 사용하고 있는가? 아니다. 메모리 공간은 물리적 자원이라 한정적이지만 우리는 게임도 하고 더블 모니터로 한쪽에는 유튜브도 틀어놓고 하면서 여러 프로그램을 돌리는데 메모리 부족에 대한 걱정을 전혀 하지 않는다. 이렇게 메모리 공간은 한정적이지만 무한한 메모리가 존재하는 것처럼 해주는 것이 Virtual Memory이고 이는 Memory를 추상화 한 모델인 것이다.
  • File system 자료를 저장하고 여러 프로그램들을 저장하고 불러올때 하드디스크의 어느 위치에 저장할지 불러올지 하는 이슈에 대해 고민해본적 있는가? 아마 없을 것이다. File System은 우리의 이러한 고민을 덜어주기 위한 존재이며 하드디스크가 잘 추상화 된 모델이라고 볼 수 있다.
  • Device driver 디바이스 드라이버는 우리가 컴퓨터를 사용할 때 볼 수 있는 여러 디바이스들에 접근할 때 open, close, read, write 와 같은 과정들을 모르더라도 접근하여 사용할 수 있도록 해주는 잘 추상화된 모델이다.
  • Data representation 프로그래밍을 하면서 데이터 자료형을 고를때 어느 자료형이 몇 비트인지 알고 이를 고려하며 프로그래밍 하는가? 그럴 수 있지만 매 순간 우리가 이를 고려하면서 프로그래밍 하기란 쉽지 않다. 이를 위해 여러 자료형을 통해서 데이터를 표현할 수 있도록 추상화 해주는 것이 data manipulation이다.

이러한 추상화는 보통 계층 구조로 표현되는데 그 구조는 다음과 같다.

업로드중..

응용 프로그램 하나 돌리는데 위의 모든 과정을 알아야지 동작시킬 수 있는가? 아니다! 우리는 그냥 프로그램 실행 버튼 하나면 해결된다. 하지만 실제로 그 내부의 과정은 위의 계층 구조가 일반적이라는 것이다.

Summary

이번에는 System Program의 3번째 Runtime System에 대해 알아보았다. 그 후에 시스템 프로그래밍을 공부하기 위해, 더 나은 프로그래머가 되기 위해 하드웨어의 여러 이슈들에 대해 알아야 한다는 것을 몇가지 예시를 통해서 이를 가볍게 알아보았다. 그리고 마지막으로 시스템 프로그래밍의 꽃인 추상화에 대해서도 알아보았다.

여기까지 알아보는데 있어서 사실 잘 이해가 가지 않아도 되며 오히려 이해하지 못하는 것이 정상일 수 있다. 원래 모든 배움에 있어서 인트로가 가장 어렵다.(앞으로 배울 내용들을 나열하기에 자세한 내용은 모른채로 그냥 이런게 있다 정도만 알고 넘어가니까…) 이제까지 살펴본 내용들은 앞으로 조금씩 더 깊게 알아볼 내용들임으로 숙지정도만 하고 넘어가도록 하자.

profile
Android Studio 공부 중

0개의 댓글