/ #기타

운영체제

운영체제(Operating System)란?

운영체제(Operating System)는 컴퓨터의 자원을 효율적으로 운영하기위해 필요한 소프트웨어입니다. 대표적으로 윈도우(Windows), 맥 OS(Mac OS), 안드로이드(Android), 우분투(Ubuntu) 등이 운영체제입니다.

모든 프로그램은 실행을 위해 자원을 필요로 합니다. 자원(Resource)이란 컴퓨터 시스템에서 작업을 수행하는 데 사용되는 모든 하드웨어 및 소프트웨어를 말하며, 앞서 설명했던 CPU, 메모리, 보조기억장치, 입출력장치 또한 자원입니다.

명령어를 통해 이러한 자원을 효율적으로 관리하는 것은 여간 힘든 일이 아닙니다. 이를 돕는 것이 운영체제 입니다. 운영체제는 실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 역할을 합니다.

컴퓨터가 켜지면 CPU는 ROM에 저장된 명령어를 읽습니다. ROM에는 POST(Power-On Self-Test)부트로더(Boot loader)가 저장되어 있습니다.

가장 먼저 실행되는 POST는 컴퓨터의 상태를 검사합니다. 요즘은 UEFI의 Fast boot 옵션으로 인해 생략되어 보기 힘들지만 예전에는 컴퓨터를 켜면 가장 먼저 보이는 화면이 POST를 실행하는 화면이었습니다.

img113

POST 작업이 끝나면 부트로더가 실행됩니다. 부트로더는 하드디스크에 있는 운영체제를 찾아 실행시키는 역할을 합니다.

실행되는 모든 프로그램은 메모리에 적재됩니다. 프로그램이 적재되는 공간은 크게 커널 영역사용자 영역으로 나눌 수 있는데, 운영체제 역시 특별한 프로그램이기 때문에 메모리의 커널 영역에 적재됩니다.

img110

운영체제의 기능

프로세스 관리

운영체제는 프로세스(process)프로세서(procesor)를 관리합니다. 실행중인 프로그램을 프로세스라고 하며, 프로세스 작업을 하는 CPU를 프로세서라고 합니다. 프로세스는 메모리에 적재되어 실행되며, 수많은 프로세스들이 동시에 실행되고 있습니다.

img112

프로세서는 한정된 자원을 가지기 때문에 여러 프로세스가 동시에 프로세서에 접근한다면 충돌이 발생할 수 있습니다. 그러므로 프로세스가 직접 프로세서에 접근하는 것이 아니라 운영체제가 프로세스를 관리하여 충돌 없이 프로세스가 실행될 수 있도록 합니다.

img111

또한 여러 프로세스를 빠르게 번갈아 실행시킴으로써 멀티테스킹을 하는 것처럼 보이도록 합니다.

메모리 관리

운영체제는 비어있는 메모리에 프로그램을 할당하고, 프로그램이 종료되면 메모리를 비워주는 등 메모리를 관리합니다.

프로그램을 실행하기 위해서는 데이터를 보조기억장치의 특정 주소에서 가져오고 이를 메모리의 특정 주소에 할당하는 등의 복잡한 과정이 필요합니다. 하지만 운영체제가 자원을 관리하여 이러한 복잡한 절차없이 프로그램을 실행시킬 수 있습니다.

파일 시스템 관리

운영체제는 보조기억장치의 데이터를 파일(file)디렉토리(directory) 형태로 관리합니다. 윈도우에서는 디렉토리를 폴더(folder)라고 합니다. 디렉토리를 통해 사용자는 보조기억장치의 데이터에 쉽게 접근할 수 있으며, 파일을 통해 프로그램을 쉽게 실행시킬 수 있습니다.

사용자 인터페이스 제공

운영체제는 사용자 인터페이스(User Interface)를 제공합니다. CLI를 통해 단순히 운영체제 명령어를 입력하는 것 만으로도 프로그램을 실행시킬 수 있습니다. 최근에는 GUI를 통해 아이콘을 클릭하거나 NUI를 통해 음성명령을 하는 것 만으로도 프로그램을 실행시킬 수 있습니다.

커널(Kernel)과 쉘(Shell)

운영체제는 크게 커널(Kernel)쉘(Shell)로 나눌 수 있습니다.

img114

커널(Kernel)은 운영체제의 핵심 서비스를 담당하는 한 부분입니다. 운영체제는 종류에 따라 다른 기능을 제공하지만 운영체제의 핵심 서비스는 자원을 관리하는 것입니다.

위에서 설명한 운영체제의 기능은 대부분 커널의 기능에 속하며, 사용자를 위한 프로그램이 아닌 시스템을 위한 프로그램 입니다. 즉, 커널은 하드웨어와 소프트웨어를 연결하는 인터페이스 입니다.

대표적으로 리눅스 커널(Linux Kernel)이 있습니다. 안드로이드(Android)나 우분투(Ubuntu) 등은 오픈소스인 리눅스 커널을 기반으로 하는 운영체제 입니다.

쉘(Shell)은 사용자와 커널을 연결하는 인터페이스 입니다. 커널은 시스템을 위한 프로그램이기 때문에 커널을 통해 직접 자원을 관리하는 것은 어렵습니다. 쉘은 커널의 복잡한 동작 방식을 알 필요 없이 간단한 명령어를 통해 사용자가 자원을 관리할 수 있도록 돕는 역할을 합니다.

예를 들어 윈도우의 명령어 프롬프트(Command Prompt), 우분투의 배쉬 쉘(Bash Sehll) 등이 쉘입니다.

이중 모드(Dual Mode)

이중 모드(Dual Mode)는 다중 프로그래밍 환경에서 자원에 대한 접근을 사용자 모드(User Mode)커널 모드(Kernel Mode)로 분리하여 운영체제를 보호하는 기법입니다.

사용자와 운영체제는 시스템 자원을 공유합니다. 만약 사용자가 시스템 자원에 직접적으로 접근할 수 있다면 운영체제와 충돌하여 컴퓨터 시스템에 악영향을 미칠 수 있습니다. 그러므로 커널은 자신을 통해서만 자원에 접근할 수 있도록 제한합니다. 이때 CPU는 상태 레지스터의 슈퍼바이저 플래그를 통해 응용 프로그램의 명령어는 사용자 모드로, 커널의 명령어는 커널 모드로 구분하여 실행합니다.

사용자 모드는 운영체제 서비스를 제공받을 수 없는 실행 모드입니다. 즉, 커널 영역에 있는 운영체제 코드를 실행시킬 수 없습니다. 일반적으로 응용 프로그램은 사용자 모드로 실행되어 입출력 명령어 같은 자원에 접근하는 명령어를 실행 할 수 없습니다.

커널 모드는 운영체제 서비스를 제공받을 수 있는 실행 모드입니다. 즉, 커널 영역에 있는 운영체제 코드를 실행시킬 수 있습니다. 운영체제는 커널 모드로 실행되기 때문에 자원에 접근할 수 있게 됩니다.

시스템 호출(System Call)

사용자 모드로 실행되는 응용 프로그램이 자원에 접근하기 위해서는 운영체제에 요청을 보내어 커널 모드로 전환되어야 하는데, 이 요청을 시스템 호출(System Call)이라고 합니다. 즉, 응용 프로그램은 시스템 호출을 통해 운영체제 서비스를 제공받을 수 있습니다.

img115

시스템 호출은 일종의 인터럽트로, 소프트웨어 인터럽트 입니다. 하드웨어 인터럽트와 같이 시스템 호출을 하면 CPU는 기존 작업을 백업하고 인터럽트 서비스 루틴을 수행한 후 기존 작업을 이어서 수행하게 됩니다.

img116

오픈소스인 리눅스 커널의 시스템 콜은 다음 사이트에서 확인할 수 있습니다.

Linux System Call Table

우분투에서는 strace 라는 도구를 통해 시스템 호출을 추적할 수 있습니다. 다음과 같이 간단한 코드를 작성해봅시다.

img117

gcc로 컴파일 후 strace를 통해 해당 코드의 시스템 콜을 추적할 수 있습니다.

img118