운영체제의 구조 & QnA

kakasoo·2021년 9월 10일
0

운영체제

목록 보기
3/3
post-thumbnail

운영체제의 구조를 이야기하기 위해서는 가장 먼저 시스템 호출에 대해서 이야기해야 한다. Windows, Linux, Unix 뿐만 아니라 모바일 운영체제 모두가, 시스템 호출을 기준으로 구조를 설명할 수 있기 때문이다.

마지막에는 나는 전혀 몰랐던 내용들에 대한 답변들을 찾아 적어놨다. 운영체제를 이미 알더라도, 마지막 내용 쯤은 흥미로운 정보 겸 봐도 좋을 것이다.


시스템 호출 (System Call)


사용자 모드와 커널 모드
커널은 운영체제의 명령어 집합이다. 따라서 커널을 함부로 다뤄서는 안 된다. 운영체제에서는 아예 이런 커널을 다루지 못하게 막고, 시스템 호출이라고 하는 인터페이스 함수들을 만들었다. 자원에 접근하는 일이 있을 때 미리 안전하게 구현된 시스템 호출 함수만을 거쳐서 접근하면, 응용 프로그램이 공유 자원을 사용하면서 다른 응용 프로그램의 영역을 침범, 침해하는 일을 방지할 수 있다.

이 때, 이런 구분 탓에 사용자의 프로세스가 동작하는 영역은 사용자 모드라고 하고, 시스템 호출 이후는 커널 모드라고 구분 짓게 되었다.


부팅 서비스


부팅 Booting : 운영체제가 메모리로 적재되는 과정을 부팅이라고 한다.
부트 스트랩 로더 : 디스크 0트랙에 위치하며, 운영체제를 메모리로 로딩하는 프로그램.

부팅을 하려면 일단 전원을 켜야 한다. 전원을 켤 때 무슨 일이 일어날까?

CPU는 자동으로 주소를 생성한다. 이 주소가 ROM에 있는 시작 주소 값이다. 이 시작 주소 값으로 컨트롤이 넘어가면 하나의 파일이 있는데, 이게 바로 부트 스트랩 로더다. 부트 스트랩 로더는 운영체제를 메모리에 로딩하는 프로그램으로, 동작하게 되면 가장 먼저 하드웨어부터 체크한다. 메모리에 오류난 게 있는지, 저장 장치나 입출력 장치는 제대로 연결되어 있는지, 정상적인 컴퓨터가 부팅될 수 있는지 여부를 확인한다. 사용자가 사용할 수 없을 수준의 문제라면 부팅을 해도 의미가 없으니 종료되고, 사용이 가능하다면 부팅 단계로 넘어간다.

컴퓨터는 파워가 꺼질 때 메모리가 항상 빈 상태로 돌아가게 된다. 따라서 컴퓨터 실행 시 가장 먼저 실행되는 프로그램, 또는 프로세스는 운영체제라고 할 수 있다.

Bootstrapping Service
1. Power up
2. BIOS (Basic Input/Output System) loader execution
3. HW check up
4. loading kernel OS into memory
5. execution OS

운영체제의 구조

운영체제의 구조는 대칭적이다. 운영체제의 구조를 세로로 펼쳐놓고 볼 때, 시스템 호출을 기준으로 위는 사용자 모드인 시점, 아래는 커널 모드인 시점으로 구분할 수 있을 것이다. 물론 운영체제가 모드로 구성된 것은 아니니, 양측 모드 영역은 서비스나 매니저, 프로세서, 하드웨어 등으로 이루어져 있을 것이다.

사용자 모드와 커널 모드는 그저 시점에 불과하다. 또한 내부는 일단 양 극단에 프로세스와 하드웨어가 있을 것이다. 프로세스는 여러 개일 수 있고, 하드웨어 역시 마찬가지다. 프로세스는 모종의 단계를 거쳐서 자원을 요청해야 한다. 그 모종의 단계 중에는 반드시 시스템 호출이 있을 것이고, 이 때 커널 모드로 시점이 변환되며 하드웨어에서 자원을 가져올 수 있게 된다.

위는 Windows를 기준으로 그려졌다. 운영체제마다 라이브러리나 시스템이 다른 만큼 내부의 구성도 다르겠지만, 어쨌거나 시스템 호출을 기준으로 대칭 구조이며, 프로세스와, 커널, 하드웨어 등 항상 동일한 구조를 띈다.

보다시피 결국 계층 구조를 띄게 되는데, (사실 이 부분은 운영체제만 그런 게 아니라 OSI 7계층처럼 다른 환경에서도 마찬가지다.) 계층이 성능 저하를 부른다고 하더라도, 유사한 기능끼리 그룹으로 묶고 관리하는 게 검증과 오류 수정에 용이하기 때문이다.

예컨대 하드웨어가 추가, 삭제 되는 일이 운영체제 전체에 영향을 줄 수 있는 일이라면 다루기가 매우 힘들었을 것이다. 반대 영역, 사용자 모드에서도 프로세스의 실행이 운영체제 전체에 영향을 줄 수 있다고 한다면 이 역시도 다루는 것을 힘들게 한다.

궁금했던 사항 및 결론

커널 구조에 따른 분류
위에서는 일단 단일 커널(Monolithic Kernel)을 예시로 설명한 건데, 최근에 나오는 방식은 마이크로 커널(Micro Kernel)이라고 하여, 운영체제의 기능 몇 부분을 사용자 모드로 빼버렸다. 응용 프로그램, 파일 시스템, 하드웨어 드라이버 등이 그러하다.

마이크로 커널을 씀으로서 어떤 장점이 있을까?
마이크로 커널을 쓰면 일단 속도가 느려진다. 당연히 커널 내부에서 통신을 할 때보다, 프로세스를 통해 통신을 하는 게 더 느릴 수 밖에 없다. 하지만 이를 상쇄할 만큼의 장점이 있는데, 운영체제의 기능 중 일부가 마비되더라도 일부분만 재실행하거나 업데이트 하는 등 수정 작업을 거칠 수 있다는 점과, 서버 개발이 더 용이해진다는 점이다.

서버 개발이 왜 용이해진다는 건가?
여기는 입출력과 데이터베이스의 영향이 크다. 운영체제의 업데이트로 인해 입출력, 데이터베이스를 다루는 방식 또한 바뀌게 된다면, 이미 개발된 서버도 함께 업데이트를 해야 한다. 그렇지만 이를 다루는 커널들이 사용자 모드에게 맡겨지게 된다면, 운영체제에 종속될 필요가 없다. 엄밀히 말하면 개발 중에서도 유지보수가 편해진다고 할 수 있겠다.

부트스트랩 로더도 OS의 일부로 봐야 하는가?
프로그램이다. 부트스트랩은 ROM (Read Only Memory)에 저장되어 있을 뿐인 프로그램이다.

ROM에 저장되어 있다면 운영체제는 바꾸거나, 수정할 수 없지 않나?
맥북에 Windows를 설치하거나 운영체제 자체를 업데이트해야 하는 경우를 생각해볼 수 있는데, 이런 문제를 해결하기 위해서 부트스트랩 로더가 가리키는 경로에, 제 2의 부트스트랩 로더 프로그램을 배치해놓을 수 있다. ROM의 부트스트랩 로더가 가리키는 위치는 일반적으로는 수정할 수 없기 때문에, 해당 위치에 제 2의 부트스트랩 로더를 배치하고, 그 부트스트랩 로더가 실행될 때 다시 운영체제를 선택, 관리하게 하면 된다.

profile
자바스크립트를 좋아하는 "백엔드" 개발자

0개의 댓글