작성일
20231108, 20231109
운영체제는 쉘(shell)과 커널(kernel)로 구성되어 있다고 해도 과언이 아닐 정도로 쉘과 커널은 운영체제의핵심적인 기능을 담당하고 있다. 쉘은 사용자 인터페이스 역할을 하고 커널은 응용프로그램과 하드웨어를 중재해주는 하드웨어 관리자 역할을 한다.
(내용 보충 예정)
컴퓨터 전체에 영향을 끼치는 작업을 따로 분리하기 위해 메모리를 커널 영역
과 사용자 영역(유저 영역, user space)
으로 나누었다.
(내용 보충 예정)
우선 운영체제의 동작원리를 이해하기 위한 배경지식을 하나 씩 공부해보자.
잘 와닿지 않을 수 있지만 운영체제도 프로그램이며, 실행중인 모든 프로그램은 메모리에 저장된다. 따라서 컴퓨터를 조작하고 있다면 즉, 부팅 이후 운영체제라는 프로그램이 실행 중인 상태가 되므로 운영체제는 메모리(RAM)에 적재되어 저장된다. RAM은 휘발성 메모리로 컴퓨터 부팅 때마다 메모리 내에서도 커널 영역(kernel space)
라는 공간에 따로 적재되어 실행된다는 특징이 있다. 참고로 운영체제가 RAM에 적재될 때마다 이용되는 부트로더, post, bios와 같은 프로그램은 비휘발성인 ROM에 저장된다고 한다. 참고로 컴퓨터의 전원이 나가면 CPU는 이 ROM에 저장되어 있는 내용을 읽게 된다.
현대의 컴퓨터 시스템은 보통 공유 메모리 접근을 지원하는 공용버스(common bus)로 연결된 하나 이상의 프로세서(CPU)와 장치 제어기(Device Control)로 구성되며, 이때 프로세서 장치 제어기는 메모리 사이클을 얻기 위해 경쟁하며 병행 실행될 수 있다고 한다. 하드웨어 인터럽트는 말그대로 하드웨어인 CPU, RAM, I/O와 관련된 인터럽트이고, 시스템 버스를 통해서 프로세서로 신호를 보내 인터럽트를 발생시킬 수 있다. 운영체제는 event(interrupt)-driven 방식을 따르며, 참고로 interrupt는 크게 하드웨어 인터럽트(H/W interrupt)
와 trap(exception)이라고도 하는 소프트웨어 인터럽트(S/W interrupt)
로 나눌 수 있다.
소프트웨어 인터럽트에는 프로그램 실행 중에 발생하는 에러(error)
나 운영체제 서비스 요청인 시스템 콜(system call)
가 있다. 특히 소프트웨어 인터럽트의 경우 처리에 따라 컴퓨터의 동작을 크게 저해시킬 수 있기 때문에 예방이 중요하다.
인터럽트 발생 시 만약 프로세서의 레지스터 정보를 변경해야 할 필요가 있는 경우, 인터럽트 루틴은 반드시 어딘가에 현 상태를 저장해두었다가 인터럽트 종료 후 인터럽트 발생 전 상태로 복원되어야 한다.
다시 본 주제로
메모리에 로드된 운영체제는 이벤트(event)를 기다리는 대기 상태
가 된 지점으로 돌아가 이야기해보자.
이때, 사용자가 입력장치를 통해 행하는 클릭, 타이핑 등의 모든 행위를 하는 것을 이벤트 혹은 인터럽트(interrupt)
라고 부른다. 운영체제는 이 인터럽트가 발생하면 대기상태에서 벗어나 이벤트에 해당하는 명령어의 주소를 저장하는 등등 동작하기 시작한다. 이러한 운영체제의 방식을 event(interrupt)-driven라고 한다.
운영체제 로드가 끝나면 운영체제는 사용자에게 응용 프로그램을 사용할 수 있는 인터페이스를 제공하고, 입력 장치를 통해 응용 프로그램을 실행하고 이용한다. 응용 프로그램이 실행시키면 운영체제는 각 실행 및 동작에 쓰이는 프로세스(작업 단위)에게 자원을 할당하고 메모리 공강을 각 프로세스에 배분해준다. 운영체제는 프로세스의 메모리 사용 영역 등의 정보도 가지고 있어 이를 토대로 추후 동작에서 메모리 공간을 추가로 할당하는 작업을 보다 효율적으로 수행할 수 있다. 이때, 프로세스 즉, 작업의 운선순위를 정하며 응용 프로그램을 종료하면 해당하는 프로세스를 삭제해주기도 한다.
원리를 파악하기 앞서, 사용자가 컴퓨터 전원을 켜고 운영체제가 언제 실행되는지를 컴퓨터 부팅부터 차근차근 살펴보고 시작하려고 한다.
1) 사용자 전원을 켜면 컴퓨터 부팅
이 시작된다. 부팅이 시작되면 메인보드에 부착된 하드웨어에 전기가 공급된다.
부팅의 어원
무슨 일을 시작하려면 부츠(신발)부터 신어야 한다는 의미에서 부팅이라는 단어가 만들어졌다.
2) CPU가 ROM에 저장된 펌웨어가 BIOS(Basic Input/Output System)
를 실행시킨다.
ROM과 BIOS에 대해
작은 꽃게처럼 생긴 ROM(Read Only Memory, 비휘발성 메인메모리)에는 BIOS라는 프로그램 즉, 펌웨어(firmware) 들어있다. 컴퓨터 부품의 입력과 출력을 조절하는 펌웨어이다. 메인보드에는 M_BIOS(Main Bios)가 저장된 ROM과 B_BIOS(Backupt Bios)가 저장된 ROM 이렇게 두 가지 종류가 부착되어 있다. 평상시에 실제 사용하는 ROM은 M_Bios-ROM이며 B_BIOS-ROM은 말그대로 메인에 문제가 생겼을 때 백업하는 용도이다.
3) 실행된 BIOS 펌웨어는 메모리를 포함 주변의 하드웨어 즉, 보조기억장치 및 외부 장치와의 연결을 확인인하는데 이를 POST(Power On Self Test)
라고 한다.
4) BIOS는 부팅 우선순위(BOOT ORDER Priorities)에 따라 부팅매체(booting media)를 선택하여 부팅매체의 MBR에 저장된 부팅정보를 읽어오는 부트스트랩(bootstrap)
이라는 프로그램이 실행한다.
부트스트랩(=부트스트랩 로더)이란?
신발끈에 해당하는 단어로 부팅을 도와주는 역할이라는 의미에서 명명된 것으로 보인다. 부트스트랩 로더라고도 부르며 운영체제를 켜는 부팅 과정을 도와주는 BIOS(ROM)에 들어있는 코드 즉, 프로그램을 말한다. 부트스트랩은시스템을 초기화
하고부트로더를 메모리에 올려, 부트로더가 운영체제를 로딩(운영체제가 메모리에 실리는 과정)하는 것을 돕는다
.
부팅매체란?
예를들어 USB, SSD, HDD 등이 있는데, 컴퓨터가 켜지면 우선순위에 따라 제일 먼저 USB가 입력되어 있는지 확인하고, USB 내에 부팅과 관련된 데이터가 있다면 먼저 읽게 된다. 즉, 부팅매체라함은 부팅과 관련된 데이터가 저장되어 있는 하드웨어라고 이해하면 된다.
MBR(Mater Boot Record)란?
MBR이란 USB, SSD, HDD 등등 모든 저장장치(기억장치)에는 첫 번째 섹터에 MBR 영역을 가지고 있다. 해당 섹터에는 리눅스 마운트 포스터에서 파티션을 만들 때 나온 Promary Partition(주 파티션)에 대한 정보를 기억할 수 있는 공간과 부트로더가 저장되어 있다.
(잘 모르는 내용)
5) 실행된 부트스트랩은 RAM에 부트로더(Bootloader)
를 올리고, 이 부트로더는 디스크에 있는 운영체제(커널) 코드를 복사하여 메모리에 저장한다. 즉, 운영체제가 로딩(실행)
되고 컴퓨터 시스템의 제어권은 운영체제에게 넘어가게 된다.
Q. 커널이란?
컴퓨터를 작동시킴에 있어서 운영체제는 핵심이라고 할 수 있는데, 이 운영체제의 또 핵심되는 구성요소가 커널입니다. 커널은 운영체제에 포함되어 있는 프로그램으로 응용 프로그램과 하드웨어를 중재해주는 역할을 합니다.
대표적으로 자원관리, 추상화, 보안이 이에 해당합니다. 이 중에서 추상화에 대해 좀더 설명을 하고자 하는데, 커널은 운영체제의 복잡한 내부를 하드웨어가 굳이 알 필요없이 하드웨어에 제공하기 위해, 같은 종류의 하드웨어를 공통 명령어 집합으로 구현합니다. 이를 하드웨어 추상화라고 합니다. 커널은 이 하드웨어 추상화를 통해 하드웨어를 간결하게 코드 상으로 구현하여 사용자가 보다 간편하게 많은 하드웨어를 사용할 수 있게끔 돕습니다.
Q. 커널모드와 유저모드에 대해 설명해주세요.
운영체제에는 커널 모드와 사용자 모드가 존재하는데, 커널 모드(또는 슈퍼바이저 모드)는 하드웨어를 직접 제어할 수 있는 CPU 명령어를 사용할 수 있는 모드를 뜻합니다. 운영체제와 하드웨어 간의 작업에서 이 커널 모드가 유지되며, 운영체제의 커널이 동작하는 모드입니다. 반면, 사용자 모드(또는 보호 모드)는 하드웨어를 직접 제어할 수 있는 CPU 명령어를 사용할 수 없는 모드를 뜻합니다. 응용 프로그램와 운영체제 간의 작업이 생길 경우 해당하고 응용 프로그램이 동작하는 모드라고 할 수 있습니다.
Q. 인터럽트에 대해 설명해주세요.
인터럽트는 말그대로 방해라고 이해할 수 있습니다. 좀더 자세히 말하자면, 이벤트라고도 표현가능한데 CPU가 프로그램을 실행하고 있는 와중에 발생하는 하드웨어의 예외상황을 가리킵니다. 여기서 예외상황이라함은 입력, 출력, 에러 모두를 말합니다. 참고로 운영체제 또한 프로그램이기 때문에 운영체제 실행 중에 발생하는 이벤트도 당연히 인터럽트에 해당합니다. 즉, 컴퓨터를 전원을 켜면 부팅이 시작되고 이후 운영체제가 실행되고, 운영체제는 사용자의 동작이 발생할 때까지 대기 상태에 들어서는데 이때의 사용자 동작 또한 인터럽트라고 부르는 것입니다. 이런 인터럽트가 발생하게 되면 CPU가 발생한 인터럽트를 처리할 수 있도록 일단 프로그램 실행을 중간에 멈추게 합니다. CPU가 수행중이던 작업은 따로 저장하게 되고(CPU 내부 레지스터나 메인 메모리 등), 인터럽트가 발생한 작업을 먼저 수행합니다.
Q. 시스템 콜은 무엇인가요?
시스템 호출 또는 시스콜(syscall)이라고도 불린다고 알고 있습니다. 하드웨어와 관련된 작업, 프로세스나 파일 또는 메모리 관리 작업, 그리고 네트워크 및 프로세스 간의 통신 작업같은 경우, 프로그램이 직접 제어할 수 없기 때문에 이 시스템 콜을 통해 운영체제에 요청합니다. 뿐만 아니라 하드웨어와 관련된 복잡한 작업을 추상화하여 사용자가 보다 쉽게 프로그램을 작성할 수 있게 하기도 합니다. 정리하면, 시스템 콜은 프로그램과 운영체제 사이의 인터페이스이고, 프로그램이 운영체제의 서비스를 이용할 수 있게 하는 역할을 수행합니다.
Q. 시스템 콜은 왜 필요할까요?
운영체제는 보안과 안정성을 위해 이중 모드 동작(dual-mode operation)이라고 해서 사용자 모드(user mode)와 커널 모드(kernel mode)를 가지고 있는데, 시스템 콜은 사용자 모드에서 실행되는 응용 프로그램이 커널 모드에서만 수행할 수 있는 특정 작업들을 요청하기 위해 필요로 합니다.
이는 시스템의 보안 유지를 위해 시스템 콜을 통해 프로그램이 직접적으로 하드웨어 자원에 접근하는 것을 제한하는 것이기도 합니다.
참고로 이러한 시스템 콜의 요청은 사용자 모드에서 이루지긴 하지만, 실제로 시스템 콜이 처리되는 것은 커널 모드에서 이루어집니다. 즉, 시스템 콜 요청이 발생하면 운영체제가 프로세서를 사용자 모드에서 커널 모드로 전환하고, 그리고나서 해당 시스템 콜을 처리하는 것입니다. 시스템 콜 처리 이후에는 처리 결과를 프로그램에 반환하고 다시 사용자 모드로 전환됩니다.
Q. 폴링에 대해 설명해주세요.
하나의 장치(혹은 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치 (또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말합니다. 즉, 리얼타임 웹을 위한 기법으로, 웹이 태생 자체부터 실시간을 위해 필수적인 지속 연결(persistent connection)이 불가능하기 때문에 이러한 통신 방식을 사용하곤 합니다.
Q. (추가 공부 필요) DMA에 대해 설명해주세요.
입출력 제어 방식은 크게 4가지가 있는데, 프로그램에 의한 I/O, 인터럽트에 의한 I/O, DMA에 의한 I/O, 채널에 의한 I/O이 있습니다. 참고로 프로그램과 인터럽트에 의한 I/O는 CPU 개입이 있고, DMA와 채널에 의한 I/O는 CPU 개입이 없습니다.
질문한 DMA 입출력 제어 방식은 Direct Memory Access 즉, 메모리에 직접 접근하여 읽거나 쓸 수 있는 제어 방식을 말합니다. CPU의 개입 없이 I/O 장치와 기억장치 사이의 데이터를 전송하는 접근 방식입니다. 이것은 CPU가 해야 할 주변 장치와의 데이터 전송을 DMA 장치가 대신 해준다는 것을 의미하며 CPU 효율을 높일 수 있다는 장점이 있습니다. 또한 고속 I/O는 인터럽트가 짧은 주기로 올 수밖에 없는데 이때 DMA를 사용하면 프로그램 수행 중에 인터럽트 발생 횟수를 최소화할 수 있기도 합니다.
[운영체제의 구조]
컴퓨터의 구성 요소 및 작동 원리
https://velog.io/@2seunghye/%EC%BB%B4%ED%93%A8%ED%84%B0%EC%9D%98%EC%9E%91%EB%8F%99%EC%9B%90%EB%A6%AC
[운영체제의 커널 모드와 유저 모드]
운영체제 커널모드와 사용자 모드 및 시스템 호출
https://medium.com/@su_bak/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%A4%EB%84%90%EB%AA%A8%EB%93%9C%EC%99%80-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%AA%A8%EB%93%9C-%EB%B0%8F-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%98%B8%EC%B6%9C-3631d24636a6
[메모리의 커널 영역과 유저 영역]
https://webstone.tistory.com/96
https://velog.io/@0mi/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%A4%EB%84%90-%EB%AA%A8%EB%93%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-%EB%AA%A8%EB%93%9C
https://www.google.com/search?q=%EC%BB%A4%EB%84%90%EC%98%81%EC%97%AD%EA%B3%BC+%EC%9C%A0%EC%A0%80%EC%98%81%EC%97%AD&sca_esv=580462557&tbm=isch&source=lnms&sa=X&ved=2ahUKEwign6vCzbSCAxUce_UHHU7cCcoQ_AUoAXoECAEQAw&biw=1011&bih=1015&dpr=0.9#imgrc=zGYMJmtKiq4gpM&imgdii=kIn7KyzWCYhP_M
https://hongong.hanbit.co.kr/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%9E%80-%EC%BB%A4%EB%84%90%EC%9D%98-%EA%B0%9C%EB%85%90-%EC%9D%91%EC%9A%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EC%8B%A4%ED%96%89%EC%9D%84-%EC%9C%84%ED%95%9C/
[부팅]
[OS] 운영체제 구조와 원리
https://velog.io/@brian_kim/OS-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B5%AC%EC%A1%B0%EC%99%80-%EC%9B%90%EB%A6%AC
운영체제 01 : 운영체제 과목 전체 개요 - 1
https://luckyyowu.tistory.com/128
운영체제 - 운영체제의 정의, 부트로더, bios, 컴퓨터 부팅 https://velog.io/@yeunjoo121/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EC%9D%98-%EC%A0%95%EC%9D%98-%EB%B6%80%ED%8C%85
부트로더 부트스트랩, 부팅 과정, 펌웨어, BIOS, POST, MBR 자세히!
https://mamu2830.blogspot.com/2020/04/bios-post-mbr.html
부팅 1단계 : ROM-BIOS 실행
https://www.linux.co.kr/bbs/board.php?bo_table=lecture&wr_id=4427