操作系统概念学习笔记 第二十章 Linux系统
发展历程:
Linux内核是由Linux这个团体从零开始开发的一个完全原创的软件。
Linux系统是包括很多部分,有从零开发的,有借鉴的,有其他团队合作中实现的
Linux内核:
Linux内核标准编号方式的规范:版本末尾是奇数的内核时开发内核,偶数结尾的版本比较稳定,是产品核心
Linux系统作为一个整体是通过一个松散的网络来维护的,这个松散的网络得益于通过因特网的开发者的合作,每个小组或个人负责维护某个特定的部件。
Linux版本:
设计原理:
Linux系统的组件:
Linux系统由三种主要的代码部分组成:
1 内核:内核负责维护操作系统的重要抽象,包括虚拟内存和进程等
2 系统库:系统程序库定义了一系列函数,由此应用程序能够和内核进行交互,并且实现大多数系统功能而无需使用拥有完全特权的内核代码
3 系统实用程序:系统实用程序是指那些独立的,特别是管理任务的程序。
内核被创建成单一的、整体的二进制形式。主要是为了提高性能
内核模块
Linux内核能够根据需要装载或卸载任意内核代码段。
Linux环境下模块支持体现在以下三个方面:
1 模块管理:允许该模块被导入内存并能与内核的其他模块进行通信
2 驱动程序注册:允许该模块告诉其他模块一个新的驱动程序已经可以使用
3 冲突-解决机制:允许不同的设备驱动器保留硬件资源,并且保护那些被其他驱动器突发使用的资源
模块管理:
Linux将模块的导入工作分为两个部分来处理:管理内核存储空间的模块代码,处理被允许引用的符号
驱动程序注册:
内核将其所知的所有驱动程序都保留在动态表中,同时提供了一套允许任何时候从这些表中增加或删除驱动的程序。
注册表包含以下几项:
1 设备驱动程序:包括字符设备、区块设备、网络接口设备
2 文件系统:
3 网络协议
4 二进制格式
冲突解决方案
Linux系统规定了一种重要的冲突解决机制,这有助于仲裁对某一硬件资源的访问。其目的在于:
a 防止模块在访问硬件资源时发生冲突
b 防止现存的设备驱动器互相干扰,即自动检测设备配置的设备驱动器问题
c 解决由于多个设备试图访问同一硬件时所产生的冲突问题。
内核维护分配硬件资源表。个人计算机只有有限的I/O端口(硬件I/O地址空间中的地址)、信号中断线和DMA通道
进程管理:
Fork/Exec进程模型:
Linux环境下,进程属性可分成三组:进程特征、环境和关联。
1 进程特征:
a 进程ID(PID):每个进程都有唯一的标识符。
b 认证:每个进程必须拥有一个相关的用户ID和一个或对个用户组ID,这些ID决定进程访问系统资源和文件的权限
c 特性:每个进程都拥有相应的特征标识符,它能对某特定的语义系统调用程序做稍稍的修改。
2 进程环境:
进程环境从父进程继承而来,由两个非终结向量组成:参数向量和环境向量。
参数向量只是简单罗列用于调用运行程序的命令行参数,一般都以程序名开始
环境向量则是以表的形式罗列“NAME=VALUE”对,它把被命名的环境变量和任意原文的值联系起来。
环境向量并不占据内核存储空间,而是作为进程栈顶部的第一项数据被保存于进程自己的用户模式地址空间
当一个进程创建时,其参数向量与环境向量是无法选择的,新的子进程继承了父进程的环境。
调用execve时,进程必须为新的程序提供环境。
3 进程关联:
进程特征和环境属性通常随着进程的创建而建立,在进程退出前都不会改变。
进程关联是程序运行在某一时刻的一种状态,是经常改变的
a 调度关联:进程关联中最重要的部分是它的调度关联:进程挂起和重启的信息。这种信息包括了所有进程寄存器的备份
进程关联同时也包括了关于调度优先级和等待被传给进程信号的信息
调度关联的关键部分是进程的内核栈:内核存储器的一个独立的区域,由内核模式代码专用
b 记账:内核保留了最近被进程所使用的资源的相关信息,并且记录了进程在其生存期内所使用全部资源的情况
c 文件表:文件表是一个指向内核文件结构的指针数组,当调用文件I/O时,进程根据索引访问此表
d 文件系统关联:文件系统关联适用于申请打开新文件,用于搜索新文件的那些当前根目录和缺省目录就保存在这里
e 信号处理程序表:信号处理程序表在进程地址空间中定义了特殊信号到达时所要调用的程序
f 虚拟内存关联:虚拟内存关联描述了进程私有地址空间的全部内容
进程与线程:
进程表现为单一程序的执行过程
线程表现为运行某一程序的某一进程内,独立地、并发地执行关联
Linux内核只是简单处理进程与线程之间的差别:它准确利用了二者之间在内部表示方式上的共同之处
线程只不过是一个能与其父进程共享相同地址空间的新进程。
调度:
内核同步
内核同步涉及的内容远远超过了进程调度本身,需要有一个结构允许内核的临时区能在不被其他临界区中断的情况下运行:
第一部分使用普通内核代码非抢占,若进程在执行内核系统的服务程序时收到时钟中断,则重新调度就不能立即执行。
第二部分是对于中断服务器程序中的临界区的应用。通过在临界区禁止出现中断的方法,内核确保在没有并行访问共享数据结构的风险下得以继续进程
对于禁止中断的行为也要付出代价,在大多数硬件体系中,中断的有效和失效指令都很昂贵
只要中断保持失效,所有的I/O都被挂起,任何等待服务的设备驱动程序将不得不等候中断恢复使用,因此这将降低性能。
Linux内核使用了一种同步体系结构,在中断有效的情况下,允许临界区在他们的整个持续期间运行。
Linux把中断服务程序一分为二:上半部与下半部
上半部是一种普通的中断服务程序,运行时递归中断被禁止。中断的高级优先权可以中断程序,较低的优先级的中断就没有这种功能
下半部在所有中断有效时,通过一个微型的调度程序运行,这样就保证了下半部的中断服务程序不会被它们自己中断
中断优先级:上半部中断处理程序>下半部中断处理程序>内核系统服务程序(不可抢占)>用户模式程序(可抢占)
进程调度
Linux有两个独立的进程调度算法:
1 多进程中的公平抢占调度的分时算法
2 为实时任务设计的绝对优先权比公平更为重要的算法
对称多处理技术
内存管理:
物理内存管理:Linux内核中基本的物理内存管理器是页面分配程序。
此分配程序负责分配和释放所有的物理页面,并且它能根据要求分配连续的物理页面,
分配程序运用伙伴堆算法跟踪可用的物理页面,
伙伴堆分配程序把可分配内存的相邻单元配成对,每个可分配内存区域都有一个与之相邻的伙伴,
无论何时这两个已分配的内存区域被一起释放,它们将合并成更大的区域。这个更好的区域也有伙伴,也能合并
Linux内核所有内存分配以静态或动态的方式存在。
静态分配指的是驱动程序在系统启动时获得的内存连续空间
动态分配指的是通过页面分配程序获得的内存空间
虚拟内存
Linux虚拟内存系统保持地址空间对于每个进程都是可视的。
文件系统:

浙公网安备 33010602011771号