[CS] 운영체제 전체 구조

박상혁·2023년 3월 16일
0

CS

목록 보기
2/10

서론

개발자가 꼭 알아야 하는 몇몇 개념들을 쉽게 이해하기 위해 운영체제의 큰 그림과 필수적인 개념들을 설명합니다.

개요

운영체제란, Application 계층의 Process들이 잘 작동하도록 도와주고, H/W 계층을 제어 및 관리합니다.

이때, Application 계층을 논리적(Logical), H/W 계층을 물리적 계층이라 불립니다.
논리적이란 단어는 가상화(Virtual)라고 이해하면 됩니다.

목차

  1. 운영체제란
  2. 커널
  3. 커널 구조
  4. CPU 모드
  5. 시스템 콜
  6. 시스템 콜 내부 동작 과정
  7. 장치 드라이버
  8. 인터럽트
  9. 프로세스와의 통신

본론

📁 운영체제란

🗣️ 운영체제는 인터럽트에 의해 구동되는 프로그램입니다.

타이머 인터럽트(CPU 스케쥴링)와 시스템 콜, I/O 인터럽트에 의해 구동되며
특히 운영체제를 통해서만 할 수 있는 일들을 응용 프로그램은 시스템 콜 함수들을 통해 호출하여 운영체제가 수행합니다.

운영체제는 다음과 같은 중요 기능을 수행합니다.

  • 프로세스 관리
  • 메모리 관리
  • 저장장치 관리
  • 파일 시스템
  • 입출력장치 관리
  • 네트워크 통신
  • 보호/보안

📁 커널

컴퓨터가 부팅되면 항상 메모리에 상주하고 있는 프로그램으로써,
프로세스들이 잘 작동하도록 도와주고, H/W를 제어하고 관리하는 기능을 수행하는 명령어의 모임입니다.
프로세스들과 하드웨어의 안전한 중개 역할을 담당합니다.

📁 커널 구조

  • 단일 커널 구조

운영체제의 모든 기능(파일 시스템, CPU 스케쥴링, 메모리 관리 ...)이 한 프로그램으로 구현됩니다.

  • 마이크로 커널 구조

중요 기능만 커널로 구현, 나머지 기능은 User Mode에서 서버들로 구현됩니다.
User mode에서 응용프로그램처럼 실행된다고 보면 됩니다.

기존 단일 커널 구조와 비교했을 때 장점은 다음과 같습니다.

👉 커널모드에서 실행하는 코드가 적어지기 때문에 코드의 수가 적은 만큼 버그의 수도 줄어들어 신뢰성이 좋아집니다.

👉 또한 커널에 프로그램을 추가하면 커널 전체를 컴파일, 디버깅 등을 진행해야 하지만, 사용자 모드에서 응용 프로그램으로 추가하게 된다면, 그 프로그램만 동작하면 되기 때문에 확장성이 좋아집니다.

👉 하드웨어 드라이버 등도 커널 밖 응용 프로그램으로 설계되어 하드웨어를 이식할 때 해당 프로그램만 수정하면 되므로 이식이 쉬워집니다.

⚠️ 하지만 User mode와 Kernel mode간의 통신 비용이 상대적으로 더 많이 들기 때문에 성능이 떨어질 수 있습니다.

  • 모듈 구조

모듈과 커널로 분리되는 구조입니다.
마이크로 커널의 분리 구조와 단일 커널의 속도감을 합쳐놓았습니다.

모듈이 응용프로그램처럼 진행되는것이 아닌, 커널안에 포함이 되는 것 처럼 수행됩니다.
해당 모듈을 커널에 링크했다가 제거할 수도 있어 동적으로 커널 기능을 사용할 수 있습니다.
마이크로 커널에서는 메세지로 통신을 해야하지만, 모듈에서는 함수 호출로만 이루어지기 때문에 속도가 훨씬 빨라지게 됩니다.

최근 대부분의 운영체제는 해당 구조를 지원합니다.

  • Linux module


모듈 안의 init_module()을 사용하면, kernel의 register_capability()에 의해 함수들의 주소를 등록합니다.
등록된 함수 배열은 Module에서 바로 쓸 수 있으며 모듈에서 함수 주소를 바로 호출하면 됩니다.
이후 cleanup_module()을 통해서 함수 배열을 삭제합니다.

해당 모듈의 init, cleanup 인터페이스를 어떻게 구현하느냐에 따라
kernel로부터 불러오는 함수들이 달라지게 됩니다.

📁 CPU 모드

운영체제는 user mode, kernel mode 2가지 모드를 제공합니다.
특정 명령어는 커널 모드에서만 실행될 수 있도록 privileged(특권) 명령어로 지정되어 있습니다.

이 둘 mode간의 통신은 System Call을 호출함으로써 이루어집니다.
OS가 지원하는 여러 기능들은 메모리 한켠에 따로 저장되어 응용 프로그램 코드들과 구역이 나누어져 있습니다.

만일 Kernel이 없다면,
process가 직접 하드웨어에 접근하게 되는데 각 하드웨어마다 적용되는 driver가 달라 접근이 용이하지 못하고, 다른 process의 자원에 접근해야 할 경우에 동기화 문제 등 여러 문제가 발생하여 자원이 무질서하게 관리될 것입니다.

kernel mode를 두어 2중으로 관리 될 경우
kernel에서 프로세스 제어 및 관리, 하드웨어 접근을 훨씬 안전하게 관리할 수 있습니다.

📁 시스템 콜

🗣️ 운영체제가 응용 프로그램에게 시스템 함수를 제공하여 운영체제만이 할 수 있는 일들을 응용 프로그램이 수행할 수 있도록 해줍니다.

인터럽트에 의해서 동작하며, 일반적으로 다음과 같은 호출을 제공합니다.

  • 프로세스 제어
  • 파일 조작
  • 장치 관리
  • 정보 유지관리
  • 통신

예시로 응용 프로그램이 시스템 콜을 통해 운영체제에게 하고싶은 것

  • 화면에 출력하고 싶을 때 (print)
  • 키보드로 입력받은 문자를 받고 싶을 때 (input)
  • 프로세스 처리 순서
  • 프로세스 간 통신
  • 네트워크 통신 (NIC)
    ..

📁 시스템 콜 내부 동작 과정

C언어의 출력 함수인 printf("Hello World!");를 실행시킬 때
Console에 출력되기 까지의 내부 흐름입니다.

  1. print API Call
  2. 장치를 추상화한 File interface가 process로부터 API 호출을 받고난후, System Call을 함으로써 kernel모드 write()함수 코드 실행.
  3. write() 함수를 실행시켜줄 Driver를 Call
  4. Driver 내부에서 Interrupt 요청, CPU는 하던 행동을 멈춤
  5. Video Device와 통신, "Hello World"라는 정보를 받고 모니터 제어
  6. 모니터 Console에 출력 후 Device는 끝마쳤다는 Interrupt를 Device Driver에게 보냄
  7. kernel 요소에 할 일을 끝냈다는 메세지를 보내고 최종적으로 Process에게 다했다고 리턴.

User Interface(System Call), Kernel, Device과의 통신이 중요하다는 점을 알 수 있습니다.

📁 인터럽트

🗣️ CPU 동작을 방해하는 신호입니다.
인터럽트에 대한 자세한 정보는 해당 포스팅을 참조해주세요.
[CS] Interrupt의 처리 과정과 분류 기준, 그리고 Exception과의 오해

참조

Operating System Concepts, 10/E - Avraham Silberschatz
대학교 운영체제 강의
운영체제와 시스템 프로그래밍

profile
개발 노트

0개의 댓글