Professional Linux Kernel Architecture(一)

zhenjingcool / 2024-09-20 / 原文

基于linux内核2.6.24版本,书籍:Professional Linux Kernel Architecture英文版(可在https://github.com/welldef/os_books.git下载)

1 一些概念

1.1 微内核和单体内核

微内核:只有最基本的功能直接在中央内核(微内核)中实现。所有其他功能都委托给各自独立的进程,这些进程通过通信接口与微内核通信,例如各种文件系统、内存管理等。理论上,这是一种非常优雅的方法,因为各个部分明显相互隔离,这迫使程序员使用“精益”编程技术。这种方法的其他好处是动态可扩展性和在运行时交换重要组件的能力。然而,由于需要额外的CPU时间来支持组件之间的复杂通信,微内核在实践中并没有真正建立起来

单体内核:内核的整个代码(包括其所有子系统,如内存管理、文件系统或设备驱动程序)都打包到一个文件中。每个函数都可以访问内核的所有其他部分

linux使用的是单体内核,但其模块化特性确实在一定程度上借鉴了微内核的理念

1.2 内核组成

进程、任务切换和调度

在Unix下运行的应用程序、服务和其他程序被称为进程。各个进程的地址空间是完全独立的。

linux是多任务系统,多任务系统中,内核将负责进程的切换。既然是多任务系统,则该系统必须给每个单独的进程一种CPU始终可用的错觉。这是通过在CPU资源被回收并且进程被置于空闲状态之前保存进程的所有状态来实现的。当该进程被重新激活时,恢复保存的状态。

内核还必须决定如何分配CPU时间。重要进程被分配了更大的CPU时间份额,而不太重要的进程则被分配了更小的份额。决定哪个进程运行多长时间被称为进程的调度

1.2.1 进程

Linux采用树形结构管理进程之间的关系,称之为进程树,其中每个进程都依赖于一个父进程。内核启动时会初始化1号进程-init进程,init进程作为所有用户进程的根,它负责进一步的系统初始化工作以及显示登录提示等等功能。(新版本的内核1号进程已经变为systemd了)

影响进程树结构的关键因素fork和exec

  • fork:生成当前进程的精确副本,该副本与父进程完全相同,只有PID不同。创建之初共享同一代码段和数据段,当子进程或父进程需要写时(写时复制方式),进程的代码段和数据段才真正分开。
  • exec:在当前进程中执行新的程序实体,旧的内存页被新的内存页替换。

线程(也叫轻量级进程):共享相同的数据(代码段和数据段)和资源,但是执行不同的代码分支(比如java,一个java虚拟机是一个进程,但是我们可以创建多线程,其共享同一java代码,但是执行代码中的不同分支,有时执行同一分支但是可作并发控制措施)。因为有了线程,执行多任务时比创建新进程更快、更简便。使用clone创建线程(轻量级进程)

  • clone:clone()是一个更通用、更灵活的版本,它允许调用者指定哪些资源应该被新进程共享,哪些应该被复制。通过使用clone(),可以创建所谓的线程(轻量级进程),这些线程共享相同的地址空间和其他资源,但每个线程都有自己的执行流(都可参与CPU时间片分配)。

Namespace:通过名称空间实现容器来创建系统的多个视图,而不是为每个客户设置一台物理机器,每个容器是相互分离的,看起来都像一台运行Linux的机器。这有助于更有效地利用资源。与KVM等完全虚拟化解决方案相比,名称空间方式实现的容器只需要一个内核在机器上运行,并负责管理所有容器。