历史
- Unix 的特点:
- 简洁
- 一切皆文件,这种抽象使得对数据和对设备的操作可以通过一套相同的系统调用接口来进行:
open(),read(),write(),lseek()
- 由 C 语言编写,移植能力强
- 进程创建迅速:有一个非常独特的
fork()
系统调用 - 提供了一套非常简单但很稳定的进程间通信原语
Linux 简介
- 类 Unix 系统,但不是 Unix
操作系统和内核简介
- 操作系统:整个系统中负责完成最基本功能和系统管理的那些部分,应该包括内核、设备驱动程序、启动引导程序、命令行shell或其他种类的用户界面、基本的文件管理工具和系统工具
- 内核:
- 负责响应中断的中断服务程序
- 负责管理多个进程从而分享处理器时间的调度程序
- 负责管理进程地址空间的内存管理程序
- 网络、进程间通信等系统服务程序
- 内核一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限
- 这种系统态和被保护起来的内存空间,被称为内核空间
- 应用程序通过系统调用来和内核通信
- 当一个应用程序执行一条系统调用,称其为 内核正在代其执行,应用程序被称为通过系统调用在内核空间运行,而内核被称为运行于进程上下文中
- 硬件设备和系统通信时,要首先发出一个异步的中断信号来打断处理器的执行,继而打断内核的执行,中断通常对应一个中断号,内核通过中断号来查找响应的中断服务程序,并调用该程序来响应和处理中断
- 许多操作系统的中断服务程序(包括linux),可以不在进程上下文中执行,他们在一个与所有进程都无关的、专门的中断上下文中运行,这样做的目的是为了保证中断服务程序能够在第一时间响应和处理中断请求,然后快速退出
- 这些上下文代表内核活动的范围,可以将每个处理器在任何指定时间点上的活动必然概括为以下三者之一:
- 运行于用户空间,执行用户进程
- 运行于内核空间,处于进程上下文,代表某个特定的进程执行
- 运行于内核空间,处于中断上下文,与任何进程无关,处理某个特定的中断
Linux 内核和传统 Unix 内核比较
- 所有的 Unix 内核提供相同的 API
- Unix 内核几乎都是一个不可分割的静态可执行库
- 通常需要硬件系统提供页机制(MMU)以管理内存,这种机制可以加强对内存空间的保护,保证每个进程都可以运行于不同的虚地址空间上
单内核和微内核设计之比较
- 单内核:从整体上作为一个单独的大过程来实现,同时也运行在一个单独的地址空间上。特点是简单和性能高,大多数 Unix 系统都设计为单模块
- 微内核:功能被划分为多个独立的过程,每个过程叫做一个服务器。理想情况下,只有强烈请求特权服务的服务器才运行在特权模式下,其他服务器都运行在用户空间。但是,所有的服务器都保持独立并运行在各自的地址空间上,因此不能像单模块内核那样直接调用函数,而是通过消息传递来处理内核通信:进程间通信(IPC)机制。服务器的各自独立有效避免了一个服务器的失效祸及另一个
- 由于 IPC 机制的开销多与函数调用,有因为会涉及内核空间和用户空间的上下文切换,因此,消息传递需要一定的周期。结果,所有实际应用的基于微内核的系统都让大部分或者全部的服务器位于内核,这样就可以直接调用函数,消除频繁的上下文切换,代表:Windows NT 内核,Mach (Mac OS X 的组成部分)
- Linux 是一个单内核,但是其设计汲取了微内核的精华:模块化设计、抢占式内核、支持内核线程、动态装载内核模块。并且让所有事情运行在内核态,直接调用函数,无需消息传递
- 一些显著差异:
- Linux 支持动态加载内核模块
- 支持对称多处理(SMP)机制,许多 Unix 的变体也支持,但是传统的 Unix 不支持
- 可以抢占(preemptive),处理 Solaris 和 IRIX,大多数 Unix 内核不支持抢占
- 内核不区分线程和其他的一般进程,对于内核来说,所有进程都是一样的
- 提供具有设备类的面向对象的设备模型、热插拔事件,以及用户空间的设备文件系统(sysfs)
- Linux 忽略了一些被认为是设计的很拙劣的 Unix 特性,比如 STREAMS
Linux 内核版本
- 从版本号:
- 偶数:稳定版
- 奇数:开发版