目录 第1章计算机硬件基础1 1.1图灵机1 1.1.1图灵机的架构1 1.1.2一进制加法图灵机实例2 1.1.3通用图灵机4 1.2早期的计算机系统5 1.2.1电子计算机的诞生5 1.2.2通用电子计算机6 1.2.3存储程序计算机7 1.2.4存储程序计算机EDSAC8 1.3指令集架构11 1.3.1指令集架构的概念11 1.3.2指令集架构发展现状13 1.3.3指令集架构与操作系统的关系16 1.3.4指令集架构在计算机系统设计中的地位17 1.3.5处理机运行模式17 1.4存储访问18 1.4.1寄存器19 1.4.2访问内存20 1.5访问外设23 1.5.1总线24 1.5.2I/O接口25 1.5.3端口26 1.5.4设备控制方式27 1.5.5主机对外设的控制29 小结30 练习30目录〖3〗第2章程序设计与运行31 2.1一个简单的程序31 2.1.1代码描述31 2.1.2代码解释33 2.1.3程序在内存中的布局34 2.2子程序36 2.2.1子程序的概念36 2.2.2调用约定36 2.2.3程序的运行栈37 2.2.4子程序库39 2.3可执行程序的生成39 2.3.1编程语言40 2.3.2程序的连接41 2.4程序的装入44 2.4.1可执行文件结构44 2.4.2装载45 2.4.3程序启动与结束46 2.5程序的运行47 2.5.1指令流之间的切换47 2.5.2操作系统提供的支持48 2.5.3运行时系统49 小结50 练习51 第3章操作系统的形成和发展52 3.1早期的人机交互52 3.2批处理54 3.2.1批处理系统54 3.2.2脱机输入/输出系统56 3.3多任务57 3.3.1并发与并行57 3.3.2多任务的实现59 3.3.3分时系统61 3.4操作系统的概念64 3.4.1操作系统概念的形成64 3.4.2操作系统发展的里程碑65 3.4.3操作系统的地位68 3.5操作系统内核69 3.5.1内核的概念69 3.5.2内核提供的服务(系统调用)70 3.5.3内核的功能73 3.5.4内核的结构76 3.6操作系统用户接口79 3.6.1系统程序80 3.6.2命令解释器80 3.6.3图形接口82 3.7操作系统研发82 3.7.1操作系统设计82 3.7.2操作系统的实现85 3.7.3我国操作系统发展之路86 小结89 练习89 第4章CPU管理91 4.1程序运行过程的描述91 4.1.1程序的顺序执行和并发执行91 4.1.2线程92 4.1.3进程94 4.2多线程进程95 4.2.1多线程进程的概念95 4.2.2内核级线程和用户级线程96 4.2.3多线程模式98 4.3进程的创建与撤销99 4.3.1进程的创建99 4.3.2进程创建实例100 4.3.3进程间的联系103 4.3.4进程的终止105 4.4CPU调度与切换106 4.4.1CPU调度106 4.4.2线程上下文109 4.4.3上下文切换110 4.4.4CPU调度与线程切换过程实例111 4.4.5线程切换实例112 4.5CPU调度算法114 4.5.1影响调度算法的因素114 4.5.2先来先服务116 4.5.3短作业优先116 4.5.4响应比高者优先117 4.5.5基于优先数的调度策略118 4.5.6轮转118 4.5.7多级队列119 4.5.8份额公平调度120 4.5.9实时任务调度120 4.6进程通信121 4.6.1共享内存121 4.6.2消息通信122 4.6.3管道通信123 4.6.4信号123 小结124 练习124 第5章内存管理126 5.1连续分配内存管理126 5.1.1连续分配126 5.1.2内存保护128 5.1.3交换128 5.2分段内存管理129 5.2.1分段的基本方法130 5.2.2段的共享131 5.2.3内存共享的程序实例133 5.3分页内存管理134 5.3.1基本方法134 5.3.2地址变换时间开销136 5.3.3分页模式下的内存保护与共享137 5.3.4段页式存储管理139 5.4页表的实现141 5.4.1多级页表141 5.4.2哈希页表143 5.4.3反置页表144 5.5虚拟存储器145 5.5.1按需调页146 5.5.2分配内存148 5.5.3颠簸150 5.5.4虚拟存储器的性能152 5.5.5内存映像文件154 5.6置换策略155 5.6.1最优置换155 5.6.2先进先出156 5.6.3最久未用157 5.6.4工作集159 小结160 练习161 第6章输入/输出管理162 6.1输入/输出概述162 6.1.1输入/输出设备162 6.1.2进程与设备的关系164 6.1.3输入/输出系统架构165 6.2外部存储器166 6.2.1机械硬盘166 6.2.2固态硬盘172 6.3时钟173 6.3.1可编程计时器174 6.3.2系统时钟174 6.3.3时钟中断处理175 6.3.4软定时器177 6.4驱动程序178 6.4.1驱动程序的概念178 6.4.2统一的驱动程序接口179 6.4.3Linux系统字符设备驱动程序接口180 6.5外部中断处理程序181 6.5.1外部中断处理182 6.5.2中断机制183 6.5.3中断处理程序与驱动程序的关系186 6.6输入/输出子系统中的设备独立软件188 6.6.1缓冲区188 6.6.2高速缓存190 6.6.3假脱机输入/输出191 6.6.4设备的分配与回收193 6.6.5错误处理193 6.7应用程序I/O接口194 6.7.1输入/输出接口概述194 6.7.2字符设备与块设备接口196 6.7.3网络设备接口197 6.7.4进程与设备之间的时序关系198 6.8I/O系统的操作流程和结构199 6.8.1I/O系统操作流程实例200 6.8.2流201 小结202 练习203 第7章文件管理204 7.1文件204 7.1.1文件的概念204 7.1.2文件元数据205 7.1.3文件的类型206 7.1.4文件的逻辑结构207 7.1.5文件的访问方式207 7.1.6文件系统接口208 7.2文件存储空间分配209 7.2.1连续结构210 7.2.2链接结构211 7.2.3索引结构213 7.3空闲存储空间管理215 7.3.1空闲块链216 7.3.2位图217 7.3.3空闲区表217 7.4目录218 7.4.1目录的概念218 7.4.2一个文件有多个名字219 7.4.3目录的存储221 7.5保护222 7.5.1域222 7.5.2访问矩阵的实现223 7.5.3Linux系统中的文件保护机制224 7.6文件系统的整体描述225 7.6.1文件系统的存储架构225 7.6.2日志在文件系统中的应用226 7.6.3文件系统的层次架构227 7.6.4根文件系统229 7.6.5文件系统在内存中的结构230 7.6.6虚拟文件系统231 小结233 练习233 第8章互斥与同步235 8.1互斥235 8.1.1互斥的概念235 8.1.2临界资源和临界区236 8.1.3实现互斥的机制237 8.2软件方法238 8.2.1Dekker算法238 8.2.2Peterson算法239 8.3硬件方法240 8.3.1关中断方法240 8.3.2硬件指令方法240 8.4操作系统方法242 8.4.1锁242 8.4.2信号量243 8.5同步245 8.5.1同步的概念246 8.5.2同步的实现247 8.6经典互斥与同步问题248 8.6.1生产者消费者问题248 8.6.2读者/写者问题252 8.6.3哲学家进餐问题253 8.7管程254 8.7.1管程的概念255 8.7.2生产者消费者问题的管程解决方案257 8.7.3哲学家就餐问题的管程解决方案258 小结259 练习260 第9章死锁264 9.1进程与资源的关系264 9.1.1可抢占资源和不可抢占资源264 9.1.2资源的使用过程265 9.1.3资源分配图265 9.2死锁的概念266 9.2.1死锁产生的原因267 9.2.2死锁的必要条件268 9.2.3基于资源分配图的死锁建模269 9.3死锁的处理方法270 9.4死锁预防270 9.4.1破坏互斥条件270 9.4.2破坏占有并等待条件271 9.4.3破坏不可抢占条件271 9.4.4破坏环路等待条件272 9.5死锁避免273 9.5.1安全状态与不安全状态273 9.5.2银行家算法275 9.6死锁检测279 9.6.1基于资源分配图的死锁检测280 9.6.2每种资源类型只有单个实例280 9.6.3每种资源类型可有多个实例281 9.6.4死锁检测算法的应用283 9.7死锁解除283 9.7.1终止进程284 9.7.2抢占资源284 9.7.3回退284 小结285 练习285 参考文献288