지난번 내용
지난번에 마지막에 다루었던 프로그램의 작성부터 실행까지의 과정중 몇가지 추가적인 내용을 정리 하겠습니다.
우선 하단의 그림에서 동그라미로 표시된 것들이 객체들이고 네모로 표현된 것들이 그 객체들이 파일을 처리한 결과 입니다. 그리고 상단의 그림은 고급언어, 어셈블리언어, 기계어를 표현하고 있고 우측 그림의 각각의 객체들은 상단의 그림의 고급언어, 어셈블리언어, 기계어에 매칭이 될 수 있죠, 그렇다면 여기서 하단의 결과물들(네모표시된 것들) 중 각 파일들이 어떤 언어단계인지 에 대한 의문이 들 수 있습니다. 그 궁금증을 해결해 보도록하죠.
- 고급 언어 : C File
- 어셈블리 언어 : ASM File
- 기계어 : Relocatable Object File, Other Object File & library, Executable Object.
이런 구성인데 여기서 “Linker가 재배치 가능한 오브젝트 파일을 다른 오브젝트 파일들이랑 라이브러리랑 링크를 해서 실행 가능한 오브젝트 파일이 생긴다는 것 까지는 오케이 그런데 둘 사이에 어떤 차이가 있는걸까?” 라는 궁금증이 생길 수 있습니다. 그 답은 아래와 같습니다.
Relocatable Object File VS Executable Object File
이 둘 모두 binary즉 2진수로 구성되어 있다는 것은 똑같다. 하지만 재배치 가능한 오브젝트 파일은 주소의 확정, 외부참조의 확정 이 되지 않은 상태입니다. 즉, 혼자서는 실행되지 못하는 상태라는 것이지요.
반대로 실행가능한 오브젝트 파일은 혼자서도 실행이 가능한 상태의 2진수 파일이라는 것입니다.
컴퓨터의 내부 흐름.

위의 그림은 리눅스의 OS의 전체적인 구조를 표현한 그림입니다. OS란 자원 관리자를 의미하며 하드웨어의 물리적 자원(CPU, DRAM, Secondary stroage, Devices, Network Devices)을 논리적 자원(Process, Virtual Memory, File System, Device Driver, Network Manager)으로 추상화 시킨다.
이렇게 말하고 보니 상당히 난해한데 간단하게 이야기하면 물리자원들이 있고 이를 관리하는 관리자들(논리적 자원)을 배치한 느낌입니다. 위에서부터 하나씩 차근차근 알아보도록 하죠.
위의 그림을 보면 우선 크게 보았을 때 3가지 계층으로 나뉩니다.
- User space 여러 Process들이 동작하고 있는 부분입니다. 유저가 실행시킨 다양한 어플리케이션이 이 계층에서 동작하고 있습니다.
- Kernel Space 리눅스의 환경에서는 실질적으로 OS에 해당하는 부분입니다. Window나 Mac의 경우에는 OS와 Kernel간의 구분이 존재하는데 자세히 들어가면 복잡하니 OS와 Kernel은 비슷한 개념이다 라고 보도록 합시다. (좀더 정확히는 OS에서 핵심적인, 항상 메모리에 상수해야 하는 부분을 Kernel이라고 한다. OS가 더 넓은 범위.)
- Hardware Space 여러 Device들이 해당하는 부분입니다. 모니터, 키보드, 프린터와 같은 것들이 이에 해당합니다.
이와 같은 3개의 계층들 사이사이에 보면 하늘색 부분이 있는데 이 부분들은 각 계층간의 소통을 담당하는 Interface들입니다. 이들에 대한 간단한 정보는 다음과 같습니다.
- System call Interface 시스템 콜 interface는 사용자가 OS에게 필요로 하는 서비스를 제공하기 위한 잘 정의된 interface입니다. OS에 있는 소프트웨어들은 다른 소프트웨어들의 동작을 위해서 매우매우 중요한 소프트웨어입니다. 이 소프트들에게 문제가 생기면 당연히 여러가지로 문제를 일으키겠죠? 그렇기에 일반 사용자들이 생각없이 건드리지 못하도록 분리되어 관리되어야 합니다. 하지만 종종 OS쪽에서 관리하는 소프트들에 대한 접근이 필요할 때가 있습니다. 이럴때 System Call Interface를 통해서 요청을 하는 것이지요. (은행에서 돈 뽑는다고 금고가서 손님이 가져오진 않죠? 그런 느낌입니다.)
- Hardware Abstraction Layer(HAL) CPU 나 Device에 종속적인 부분들이 존재하는 영역이다.
위에서 OS 가 물리적 자원을 논리적 자원으로 추상화 하였다고 언급을 했었죠? 각각의 물리적 자원과 추상화된 논리적 자원의 매칭을 해보면 아래와 같습니다.
CPU → Process, Thread
DRAM → Virtual Memory
Secondary Memory → File System
Devices → Device Driver
Communication Device → Network Manager / TCP, IP
운영체제의 동작 순서.
간단한 C 파일의 작성부터 실행까지의 과정을 통해서 OS가 어떻게 동작하는지 알아보도록 합시다.

- test.c 파일 작성
- Disk 상에 저장
- Disk는 시스템 프로그램의 입장에서는 여러 block들의 집합이다.
- 즉 새로운 파일이 생성되었음으로 Disk Block(Disk내의 녹색 네모박스)에 저장된다.
- Block(4KB 크기, 4096byte)에 저장할 때는 우리가 작성한 파일의 내용들이 ASCII 코드(10진수)를 참조하여 16진수의 수로 표현되어 저장된다.
- inode : 파일에 대한 정보(작성자, 생성 날짜, 크기, 접근권한 등…)가 담겨있다.
- Compiler를 통해 test.c를 Compile을 한다.
- 새로운 파일의 저장을 위해서 새로운 inode가 생성된다.
- 컴파일 되면서 파일의 크기가 살짝 늘어서 Block이 하나 더 필요하여 2개의 Disk Block에 나눠서 저장하였다.
- a.out 파일의 실행.(45출력)
- 수행을 위해 Disk내의 a.out의 내용을 OS가 Memory로 Load한다. 이때 메모리에 load된 객체를 page라고 표현한다.
- OS는 새로운 프로세스(살아움직이는 객체)를 생성한다.
- Process와 Memory위의 page들간의 연결은 page table을 통해 이루어진다.(Disk의 inode와 비슷한 역할. 프로세스의 내용이 Memory상의 어느 위치에 있는지 알려준다.)
- 최종적으로 CPU에 할당된다.(Scheduling 된다.)
- 실제로는 여러 프로그램들이 동작하고 있기에 a.out의 실행을 위해 CPU를 독점적으로 사용하는데에는 무리가 있다. 여러 프로그램들이 동시에 작동하는 것 처럼 보이기 위해서 OS에서는 Time-sharing system을 사용하는데 이는 CPU의 할당을 일정 시간(100ms)만큼 해주고 시간이 끝나고 나면 잠시 멈춘 뒤 다른 프로세스에게 할당해주는 방법이다.
운영체제 시스템 : Summary
자원 관리자인 Operating System 즉, OS는 컴퓨터의 물리적 자원을 추상화한 여러 논리적 자원들을 관리하는 System이며 이들에 대한 자세한 내용은 앞으로 알아보도록 하자!.
(각각의 추상화는 아래와 같다.)
- Process manager : CPU
- Virtual Memory : Main Memory
- File system : Storage
- Device driver : Device
- Network protocol : Network