Home Kernel Labs - Some Terminology
Post
Cancel

Kernel Labs - Some Terminology

이 게시글은 다음 페이지, 리눅스 커널 학습 lab의 일부를 번역한 것을 기초로 작성되었다.

https://linux-kernel-labs.github.io/refs/heads/master/lectures/intro.html

이에 덧붙여, 추가적인 개념 및 설명과 레퍼런스를 조금 추가하였다.

Goals

  • 기본 운영체제 용어 및 개념 학습
  • Linux 커널 개요에 대해 학습

User vs Kernel

사용자와 커널은 운영체제에서 자주 사용되는 용어이다. 이 용어의 정의는 매우 간단하다. 커널은 더 높은 권한으로 실행되는 운영체제의 일부이고, 사용자(공간)는 일반적으로 낮은 권한으로 실행되는 응용 프로그램을 의미한다.

그러나 이 용어는 매우 다양하게 사용되며 특정 문맥에서는 매우 구체적인 의미를 가질 수 있다.

In processor mode (CPU)

사용자 모드와 커널 모드는 특히 프로세서 실행 모드를 나타내는 용어일 수 있다. 커널 모드에서 실행되는 코드는 CPU를 완전히 제어할 수 있는 반면, 사용자 모드에서 실행되는 코드에는 특정 제한이 있다. 예를 들어, 로컬 CPU 인터럽트는 커널 모드에서 실행되는 동안에만 비활성화하거나 활성화할 수 있다. 사용자 모드에서 실행되는 동안 이러한 작업을 시도하면 예외가 발생하고 커널이 이를 처리한다.

In Memory Space

사용자 공간과 커널 공간은 특히 메모리 보호 또는 커널이나 사용자 응용 프로그램과 관련된 가상 주소 공간을 나타낼 수 있다.

간단히 말해서, 커널 공간은 커널 전용으로 예약된 메모리 영역이고, 사용자 공간은 특정 사용자 프로세스 전용으로 예약된 메모리 영역이다. 커널 공간은 사용자 응용 프로그램이 직접 접근할 수 없도록 보호되지만, 사용자 공간은 커널 모드에서 실행되는 코드에서 직접 접근할 수 있다.

일반적인 운영체제 아키텍처

일반적인 운영체제 아키텍처(아래 그림 참조)에서 운영체제 커널은 여러 응용 프로그램과 하드웨어를 안전하고 공정하게 접근하고 공유하는 역할을 담당한다.

커널은 응용 프로그램 (User program)에게 “시스템 호출”이라고 하는 API 집합을 제공한다. 이러한 API는 운영 체제의 실행 모드가 사용자 모드에서 커널 모드로 전환되는 경계이기 때문에 일반적인 API와는 다르다.

image

응용 프로그램 호환성을 유지하기 위해 시스템 호출의 규격은 거의 변경되지 않는다. 특히, Linux는 더욱 이를 강제한다. (필요에 따라 변경될 수 있는 커널 내 API와 달리)

커널 코드 자체는 논리적으로 코어 커널 코드와 장치 드라이버 코드로 분리될 수 있다. 장치 드라이버 코드 (Device driver code)는 특정 장치에 접근하는 역할을 담당하며, 코어 커널 코드 (Core Kernel code)는 일반적인 기능을 담당한다. 코어 커널은 파일 접근, 네트워킹, 프로세스 관리 등 여러 논리적 하위 시스템으로 더 세분화될 수 있다.

모놀리식 커널 (Monolithic Kernel)

모놀리식 커널은 다양한 커널 하위 시스템 간에 접근 보호가 없고 커널 공용 함수를 다양한 하위 시스템에서 직접 호출할 수 있는 커널이다. image

그러나 대부분의 모놀리식 커널은 하위 시스템 간, 특히 코어 커널과 장치 드라이버 간에 논리적 분리를 시행하며, 한 하위 시스템 또는 장치 드라이버에서 제공하는 서비스에 접근하기 위해 사용해야 하는 비교적 엄격한 API(반드시 고정되지는 않음)를 사용한다. 물론 이는 특정 커널 구현 및 커널 아키텍처에 따라 다르다.

마이크로 커널 (Micro Kernel)

마이크로 커널은 커널의 많은 부분이 서로 보호되고, 일반적으로 사용자 공간에서 서비스로 실행되는 커널이다. 커널의 상당 부분이 사용자 모드에서 실행되기 때문에 커널 모드에서 실행되는 나머지 코드는 훨씬 작아지므로 마이크로 커널이라는 용어가 사용된다. image 마이크로 커널 아키텍처에서 커널은 서로 다른 실행 프로세스 간의 메시지 전달을 허용하는 데 필요한 최소한의 코드만 포함한다. 즉, 커널은 스케줄러와 IPC 메커니즘, 응용 프로그램과 서비스 간의 보호를 설정하기 위한 기본 메모리 관리 코드 정도만이 필요한 것이다.

이 아키텍처의 장점 중 하나는 서비스가 격리되어 있으므로 한 서비스의 버그가 다른 서비스에 영향을 미치지 않는다는 점이다. 따라서 서비스가 다운되면 전체 시스템에 영향을 주지 않고 다시 시작할 수 있다.

그러나 실제로는 서비스를 다시 시작하면 해당 서비스에 의존하는 모든 응용 프로그램에 영향을 미칠 수 있으므로(예: 파일 서버가 다운되면 열려 있는 파일 디스크립터 (File Descriptor)가 있는 모든 응용 프로그램이 파일에 접근할 때 오류 발생) 이를 달성하기는 어렵다.

이 아키텍처는 커널에 모듈식 접근 방식을 적용하고 서비스 간 메모리 보호 기능을 제공하지만 성능 저하라는 대가를 치러야 한다. 모놀리식 커널에서 두 서비스 간의 간단한 함수 호출이 마이크로커널에서는 IPC 및 스케줄링을 거쳐야 하므로 성능 저하가 발생한다.

마이크로 커널 vs 모놀리식 커널

마이크로 커널 옹호론자들은 마이크로 커널이 모듈식 설계를 강제하기 때문에 우수하다고 주장하는 경우가 많다. 그러나 모놀리식 커널도 모듈식이 될 수 있으며, 최신 모놀리식 커널은 이러한 목표를 달성하기 위해 몇 가지 접근 방식을 사용한다.

  • 컴파일 시 (빌드 타임) 구성 요소를 활성화하거나 비활성화할 수 있다.
  • 로드 가능한 커널 모듈 지원 (런타임 도중에)
  • 커널을 논리적으로 독립적인 하위 시스템으로 구성
  • 엄격한 인터페이스지만 낮은 성능 오버헤드: 매크로, 인라인 함수, 함수 포인터

모놀리식 커널과 마이크로 커널의 중간에 해당하는 하이브리드 커널이라고 “주장”하는 운영체제(예: Windows, Darwin (macOS,iOS..))도 있다. 그러나 이러한 운영체제에서는 모든 일반적인 모놀리식 서비스가 커널 모드에서 실행되므로 모놀리식 커널 이외에 다른 용어로 분류할 이점은 거의 없다.

많은 운영체제 및 커널 전문가들은 이러한 분류는 무의미하며 단지 마케팅 용어일 뿐이라고 일축했다. 리누스 토발즈는 이 문제에 대해 다음과 같이 말했다.

‘하이브리드 커널’이라는 용어는 마케팅 용어일 뿐이다. 이것은 단지 “마이크로커널은 좋은 평판을 얻었는데, 우리 커널에 대한 좋은 평판을 얻으려면 어떻게 해야 할까? 아! 그냥 멋진 이름을 사용하고 우리 시스템이 다른 시스템이 가진 모든 이점을 가지고 있다고 암시하자!” 는 것이다.

“As to the whole ‘hybrid kernel’ thing - it’s just marketing. It’s ‘oh, those microkernels had good PR, how can we try to get good PR for our working kernel? Oh, I know, let’s use a cool name and try to imply that it has all the PR advantages that that other system has’.” -Torvalds-

** CISC와 RISC의 의미 없는 구분 논쟁을 생각하면 편할 것 같다.

주소 공간 (Memory Space)

주소 공간이라는 용어는 문맥에 따라 다른 의미를 가질 수 있는 용어이다.

물리적 주소 공간 (Physical Address Space)

물리적 주소 공간은 RAM 및 장치 메모리가 메모리 버스에 표시되는 방식을 나타낸다. 예를 들어, 32비트 Intel 아키텍처에서는 다음과 같은 매핑이 일반적이다:

  • RAM: 낮은 물리적 주소 공간에 매핑된다.
  • 그래픽 카드 메모리: 높은 물리적 주소 공간에 매핑된다.

물리적 주소 공간은 실제 물리적 메모리에 표현된 주소들을 의미한다.

가상 주소 공간 (Virtual Address Space)

가상 주소 공간은 가상 메모리 모듈이 활성화되었을 때, CPU가 메모리를 보는 방식을 나타낸다. 이는 때로는 보호 모드 또는 페이징 활성화라고도 한다. 가상 주소 공간에서 커널은 이 공간의 특정 영역을 특정 물리적 메모리 영역에 매핑한다. 즉, 추상화된 메모리 공간이다.

가상 주소 공간과 관련하여 자주 사용되는 두 가지 용어는 프로세스(주소) 공간과 커널(주소) 공간이다.

  1. 프로세스 공간 (process space):
    • 프로세스와 관련된 가상 주소 공간의 일부이다.
    • 각 프로세스는 독립적인 메모리 뷰를 가지며, 주소는 0부터 시작한다.
  2. 커널 공간 (Kernel space):
    • 운영 체제의 커널과 관련된 가상 주소 공간이다.
    • 커널 코드, 데이터 및 시스템 자원들이 이 공간에 매핑된다.

사용자 및 커널의 가상 주소 공간 공유

사용자 공간(Userspace)과 커널 공간(Kernelspace)에 대한 일반적인 구현은 가상 주소 공간을 사용자 프로세스와 커널 간에 공유하는 방식이다.

이 경우, 커널 공간은 주소 공간의 상단에 위치하며, 사용자 공간은 하단에 위치한다. 사용자 프로세스가 커널 공간에 접근하는 것을 방지하기 위해 커널은 사용자 모드에서 커널 공간 접근을 차단하는 매핑을 생성한다.

image

실행 컨텍스트 (Execution contexts)

커널의 가장 중요한 작업 중 하나는 인터럽트를 처리하고 효율적으로 서비스하는 것이다. 이는 매우 중요하기 때문에 특별한 실행 컨텍스트가 할당되어 있다.

커널은 인터럽트가 발생하면, 인터럽트 컨텍스트에서 실행된다. 여기에는 인터럽트 핸들러가 포함되지만, 이에 국한되지 않고 인터럽트 모드에서 실행되는 다른 특수한 (소프트웨어) 구조도 존재한다.

인터럽트 컨텍스트에서 실행되는 코드는 항상 커널 모드에서 실행되며, 커널 프로그래머는 특정 제한 사항(예: 블로킹 함수 호출 또는 사용자 공간 접근 금지)을 인지해야 한다.

인터럽트 컨텍스트와는 반대로 프로세스 컨텍스트가 있다. 프로세스 컨텍스트에서 실행되는 코드는 사용자 모드(응용 프로그램 코드 실행) 또는 커널 모드(시스템 호출 실행)에서 실행될 수 있다.

멀티태스킹 (Multitasking)

멀티태스킹은 운영체제가 여러 프로그램을 “동시에” 실행하는 능력이다. 이는 실행 중인 프로세스 간에 빠르게 전환함으로써 이루어진다. (Time sharing)

협력형 멀티태스킹 (Co-operative)은 멀티태스킹을 달성하기 위해 프로그램 간의 협력을 필요로 한다. 프로그램이 실행되고 CPU 제어를 OS에 양도하면 OS는 다른 프로그램을 스케줄링한다.

선점형 멀티태스킹(Preemptive)에서는 커널이 각 프로세스에 엄격한 제한을 적용하여 모든 프로세스가 실행될 공정한 기회를 갖도록 한다. 각 프로세스에는 시간 할당량(예: 100ms)이 주어지며, 이 시간이 지나면 계속 실행 중인 경우 강제로 선점되어 다른 태스크가 스케줄링된다. (Round-robin)

선점형 커널

선점형 멀티태스킹과 선점형 커널은 다른 용어이다.

커널은 프로세스가 커널 모드에서 실행되는 동안 선점될 수 있는 경우 선점형 커널이라고 한다.

그러나 비선점형 커널도 선점형 멀티태스킹을 지원할 수 있다는 점에 유의해야 한다.

페이지 가능한 커널 메모리 (Pageable Kernel memory)

커널 메모리의 일부(코드, 데이터, 스택 또는 동적으로 할당된 메모리)를 디스크로 스왑할 수 있는 경우, 해당 커널은 페이지 가능한 커널 메모리를 지원한다.

커널 스택

각 프로세스에는 시스템 호출 결과로 커널 모드에서 실행되는 동안 함수 호출 체인과 지역 변수 상태를 유지하는 데 사용되는 커널 스택이 있다.

커널 스택은 작기 때문에(4KB - 12KB), 커널 개발자는 스택에 큰 구조체를 할당하거나 제대로 제한되지 않은 재귀 호출을 피해야 한다.

이식성 (Portability)

다양한 아키텍처 및 하드웨어 구성 간의 이식성을 높이기 위해 최신 커널은 최상위 레벨에서 다음과 같이 구성된다.

  • 아키텍처 및 시스템별 코드(C & ASM)
  • 아키텍처 독립적인 코드(C):
    • 커널 코어(여러 하위 시스템으로 더 분할)
    • 장치 드라이버

이렇게 하면 서로 다른 아키텍처 및 시스템 구성 간에 최대한 많은 코드를 재사용할 수 있다.

비대칭 멀티프로세싱(ASMP)

Asymmetric MultiProcessing, 비대칭 멀티프로세싱(ASMP)은 커널이 여러 프로세서(코어)를 지원하는 방식 중 하나로, 하나의 프로세서는 커널 전용이고 다른 모든 프로세서는 사용자 공간 프로그램을 실행한다.

이 방식의 단점은 커널 처리량(예: 시스템 호출, 인터럽트 처리 등)이 프로세서 수에 따라 확장되지 않아 일반적인 프로세스에서 시스템 호출을 자주 사용한다는 것이다. 따라서 이 접근 방식은 특정 시스템(예: 과학 응용 프로그램)에서만 사용된다.

image

대칭 멀티프로세싱(SMP)

Symmetric MultiProcessing (SMP)

ASMP와 달리 SMP 모드에서는 사용자 프로세스와 마찬가지로 커널이 기존 프로세서 중 어느 곳에서나 실행될 수 있다. 그러나, 두 프로세스가 동일한 메모리 위치에 접근하는 커널 함수를 실행할 경우 커널에 경쟁 조건이 발생하기 때문에 이 접근 방식은 구현하기가 더 어렵다. image SMP를 지원하려면 커널은 단 하나의 프로세서만 임계 영역을 실행하도록 보장하기 위해 동기화 프리미티브(예: 스핀 락)를 구현해야 한다.

CPU 확장성

CPU 확장성은 시스템의 성능이 코어 수에 따라 얼마나 잘 확장될 수 있는지를 나타낸다. 커널 개발자는 CPU 확장성과 관련하여 다음 몇 가지 사항을 염두에 두어야 한다.

  • 가능하면 락 프리 알고리즘 사용
  • 경합이 심한 영역에는 세분화된 락 사용
  • 알고리즘 복잡성에 주의
This post is written by david61song