作者 |
[美]马歇尔·柯克·麦库西克(Marshall Kirk McKusick) 乔治·V. 内维尔-尼尔(George V. Neville-Neil) 罗伯特·N. M. 沃森(Robert N. M. Watson) 等 |
丛书名 |
出版社 |
机械工业出版社 |
ISBN |
9782110261537 |
简要 |
简介 |
内容简介书籍计算机书籍 ---------------------------8084481 - FreeBSD操作系统设计与实现(原书第2版)--------------------------- 本书由FreeBSD系统的三位引领者撰写,在上一版基础上做了大幅更新,涵盖FreeBSD 5和FreeBSD 11之间的所有重大改进,如使用FreeBSD Jail的高度可扩展和轻量级虚拟化、使用Xen和Virtio设备半虚拟化的虚拟机加速、Capsicum沙箱和GELI加密磁盘保护以及DTrace内核调试技巧等。全书从接口到内核再到硬件逐层深入,详细阐述实现每个重要系统组件——进程管理、安全、虚拟内存、I/O系统、文件系统、socket IPC和网络等——所使用的概念、数据结构和算法。本书可以作为高等院校操作系统相关课程的教材或参考书,也可以作为系统开发人员和管理人员的学习指南。 ---------------------------8071051 - Unix/Linux系统编程--------------------------- Unix/Linux系统编程提供了广泛的计算机系统软件知识和高级编程技能,使读者能够与操作系统内核交互,有效利用系统资源,开发应用软件。它还为读者提供了从事计算机科学/工程高级研究(如操作系统、嵌入式系统、数据库系统、数据挖掘、人工智能、计算机网络、网络安全、分布式和并行计算)所需的背景知识。 |
目录 |
[套装书具体书目] 8071051 - Unix/Linux系统编程 - 9787111656715 - 机械工业出版社 - 定价 139 8084481 - FreeBSD操作系统设计与实现(原书第2版) - 9787111689973 - 机械工业出版社 - 定价 199 ---------------------------8084481 - FreeBSD操作系统设计与实现(原书第2版)--------------------------- 译者序 前言 作者简介 第一部分 概述 第1章 BSD系统的历史和目标2 1.1 UNIX系统的历史2 1.1.1 UNIX系统的起源2 1.1.2 Research小组的UNIX系统3 1.1.3 AT&T UNIX System Ⅲ和System V4 1.1.4 伯克利软件发布5 1.1.5 UNIX无处不在6 1.2 BSD和其他系统6 1.3 BSD向开放源代码的转变8 1.3.1 Networking Release 28 1.3.2 法律诉讼10 1.3.3 4.4BSD11 1.3.4 4.4BSD-Lite Release 211 1.4 FreeBSD的开发模式12 第2章 FreeBSD设计概述16 2.1 FreeBSD的功能和内核16 2.2 内核结构17 2.3 内核服务20 2.4 进程管理21 2.4.1 信号22 2.4.2 进程组和会话23 2.5 安全23 2.5.1 进程凭证24 2.5.2 特权模型25 2.5.3 自主访问控制25 2.5.4 能力模型25 2.5.5 Jail轻型虚拟化26 2.5.6 强制访问控制27 2.5.7 事件审计27 2.5.8 密码学与随机数生成器28 2.6 内存管理28 2.6.1 BSD内存管理设计要点29 2.6.2 内核中的内存管理30 2.7 I/O系统概述31 2.7.1 描述符与I/O31 2.7.2 描述符管理33 2.7.3 设备34 2.7.4 套接字IPC34 2.7.5 分散-收集I/O35 2.7.6 多文件系统支持35 2.8 设备36 2.9 快速文件系统36 2.10 Zettabyte文件系统40 2.11 网络文件系统41 2.12 进程间通信41 2.13 网络层协议42 2.14 传输层协议43 2.15 系统启动和停止43 习题44 第3章 内核服务45 3.1 内核结构45 3.1.1 系统进程45 3.1.2 系统入口46 3.1.3 运行时的内核结构46 3.1.4 内核的入口48 3.1.5 从内核返回49 3.2 系统调用49 3.2.1 调用结果的处理49 3.2.2 从系统调用返回50 3.3 陷阱和中断51 3.3.1 I/O设备中断51 3.3.2 软件中断51 3.4 时钟中断52 3.4.1 统计和进程调度53 3.4.2 超时54 3.5 内存管理服务55 3.6 时间服务58 3.6.1 真实时间59 3.6.2 外部表示59 3.6.3 调整时间59 3.6.4 时间间隔60 3.7 资源服务60 3.7.1 进程优先级60 3.7.2 资源利用61 3.7.3 资源限制61 3.7.4 文件系统配额62 3.8 内核跟踪工具62 3.8.1 系统调用跟踪62 3.8.2 DTrace63 3.8.3 内核跟踪66 习题68 第二部分 进程 第4章 进程管理70 4.1 进程管理概述70 4.1.1 多道程序设计71 4.1.2 调度72 4.2 进程状态73 4.2.1 进程结构75 4.2.2 线程结构78 4.3 上下文切换79 4.3.1 线程状态79 4.3.2 底层上下文切换80 4.3.3 主动上下文切换80 4.3.4 同步84 4.3.5 互斥锁同步85 4.3.6 互斥锁接口87 4.3.7 锁同步88 4.3.8 死锁预防89 4.4 线程调度91 4.4.1 低级调度器91 4.4.2 线程运行队列和上下文切换92 4.4.3 分时线程调度93 4.4.4 多处理器调度98 4.4.5 自适应空闲100 4.4.6 传统的分时线程调度100 4.5 创建进程101 4.6 终止进程102 4.7 信号103 4.7.1 发送信号106 4.7.2 传输信号108 4.8 进程组和会话110 4.8.1 进程组110 4.8.2 会话111 4.8.3 作业控制112 4.9 进程的调试114 习题116 第5章 安全性118 5.1 操作系统安全119 5.2 安全模型120 5.2.1 进程模型120 5.2.2 自主与强制访问控制120 5.2.3 可信计算基121 5.2.4 其他内核安全特性121 5.3 进程凭证121 5.3.1 凭证结构122 5.3.2 凭证内存模型123 5.3.3 访问控制校验124 5.4 用户和组124 5.5 特权模型126 5.5.1 隐式特权127 5.5.2 显式特权127 5.6 进程间访问控制128 5.6.1 可见性129 5.6.2 信号129 5.6.3 调度控制129 5.6.4 等待进程终止130 5.6.5 调试130 5.7 自主访问控制130 5.7.1 虚拟文件系统接口与DAC131 5.7.2 对象属主与组132 5.7.3 UNIX权限132 5.7.4 访问控制列表134 5.7.5 POSIX.1e访问控制列表136 5.7.6 NFSv4访问控制列表138 5.8 Capsicum能力模型141 5.8.1 Capsicum应用体系结构142 5.8.2 能力系统142 5.8.3 能力143 5.8.4 能力模型145 5.9 Jail146 5.10 强制访问控制框架151 5.10.1 强制策略151 5.10.2 设计的指导原则152 5.10.3 MAC框架的体系结构153 5.10.4 启动框架154 5.10.5 策略注册155 5.10.6 框架入口点设计考量155 5.10.7 策略入口点设计考量156 5.10.8 内核服务入口点调用157 5.10.9 策略组合158 5.10.10 给对象打标签159 5.10.11 标签的生命周期与存储管理159 5.10.12 标签同步162 5.10.13 从用户空间进行策略无关的标签管理163 5.11 安全事件审计163 5.11.1 审计事件与记录164 5.11.2 BSM审计记录与审计跟踪165 5.11.3 内核审计的实现166 5.12 加密服务168 5.12.1 加密框架168 5.12.2 随机数生成器170 5.13 GELI全磁盘加密173 5.13.1 机密性和完整性保护173 5.13.2 密钥管理174 5.13.3 启动GELI174 5.13.4 加密块保护175 5.13.5 I/O模型176 5.13.6 不足176 习题177 第6章 存储管理178 6.1 术语178 6.1.1 进程与内存179 6.1.2 调页机制180 6.1.3 替换算法180 6.1.4 工作集模型181 6.1.5 交换机制181 6.1.6 虚拟内存的优点182 6.1.7 虚拟内存的硬件要求182 6.2 FreeBSD 虚拟内存系统概述183 6.3 内核的存储管理185 6.3.1 内核映射和子映射186 6.3.2 内核地址空间的分配188 6.3.3 slab分配器190 6.3.4 keg分配器191 6.3.5 zone分配器192 6.3.6 内核malloc194 6.3.7 内核zone分配器196 6.4 进程独立拥有的资源197 6.4.1 FreeBSD的进程虚拟地址空间197 6.4.2 缺页处理199 6.4.3 映射到vm_object199 6.4.4 vm_object201 6.4.5 vm_object到页面201 6.5 共享内存202 6.5.1 mmap模型203 6.5.2 共享映射205 6.5.3 私有映射205 6.5.4 压缩影子链207 6.5.5 私有快照208 6.6 创建新进程209 6.6.1 预留内核资源210 6.6.2 复制用户地址空间211 6.6.3 不通过复制创建新进程211 6.7 执行一个文件212 6.8 操作进程地址空间213 6.8.1 改变进程大小213 6.8.2 文件映射214 6.8.3 改变保护权限215 6.9 终止进程215 6.10 调页器接口216 6.10.1 vnode调页器218 6.10.2 设备调页器219 6.10.3 物理内存调页器220 6.10.4 交换调页器221 6.11 调页机制224 6.11.1 硬件高速缓存的设计228 6.11.2 硬件内存管理229 6.11.3 超级页231 6.12 页面替换235 6.12.1 调页参数237 6.12.2 pageout守护进程237 6.12.3 交换机制240 6.12.4 换入进程242 6.13 可移植性243 6.13.1 pmap模块的作用243 6.13.2 初始化和启动245 6.13.3 分配和释放映射248 6.13.4 改变映射的访问和wiring属性249 6.13.5 物理页面使用信息的维护251 6.13.6 初始化物理页面251 6.13.7 管理内部数据结构252 习题252 第三部分 I/O系统 第7章 I/O系统概述256 7.1 描述符管理和服务257 7.1.1 打开文件条目258 7.1.2 描述符管理260 7.1.3 异步I/O261 7.1.4 文件描述符锁261 7.1.5 描述符的多路I/O复用263 7.1.6 select的实现265 7.1.7 kqueue和kevent267 7.1.8 数据在内核中的迁移269 7.2 本地进程间交互270 7.2.1 信号量272 7.2.2 消息队列273 7.2.3 共享内存274 7.3 虚拟文件接口275 7.3.1 vnode的内容275 7.3.2 vnode的操作277 7.3.3 路径名的转换278 7.3.4 导出文件系统服务278 7.4 独立于文件系统的服务279 7.4.1 名字缓存281 7.4.2 缓冲区管理282 7.4.3 缓冲区管理的实现284 7.5 可堆叠的文件系统285 7.5.1 简单的文件系统层287 7.5.2 联合文件系统288 7.5.3 其他文件系统290 习题291 第8章 设备292 8.1 设备概述292 8.1.1 PC I/O体系结构293 8.1.2 FreeBSD大容量存储I/O子系统的结构295 8.1.3 设备命名和访问296 8.2 从用户到设备的I/O映射297 8.2.1 设备驱动程序298 8.2.2 I/O队列299 8.2.3 中断处理299 8.3 字符设备299 8.3.1 原始设备和物理I/O301 8.3.2 面向字符的设备302 8.3.3 字符设备驱动程序入口点302 8.4 磁盘设备303 8.4.1 磁盘设备驱动程序入口点303 8.4.2 磁盘I/O请求排序303 8.4.3 磁盘标签304 8.5 网络设备305 8.5.1 网络设备驱动程序入口点306 8.5.2 配置与控制306 8.5.3 数据包接收307 8.5.4 数据包传输309 8.6 终端处理309 8.6.1 终端处理模式310 8.6.2 用户接口312 8.6.3 进程组、会话和终端控制313 8.6.4 终端操作313 8.6.5 终端输出(上半部分)314 8.6.6 终端输出(下半部分)315 8.6.7 终端输入315 8.6.8 关闭终端设备316 8.7 GEOM层316 8.7.1 术语和拓扑规则317 8.7.2 改变拓扑318 8.7.3 操作320 8.7.4 拓扑灵活性321 8.8 CAM层322 8.8.1 通过CAM子系统的SCSI I/O请求的路径323 8.8.2 ATA磁盘325 8.9 设备配置325 8.9.1 设备标识327 8.9.2 自动配置数据结构329 8.9.3 资源管理333 8.10 设备虚拟化334 8.10.1 与虚拟机监控程序的交互335 8.10.2 Virtio336 8.10.3 Xen339 8.10.4 设备直通346 习题346 第9章 快速文件系统348 9.1 分层文件系统管理348 9.2 inode结构350 9.2.1 inode格式的改变351 9.2.2 扩展属性352 9.2.3 新的文件系统功能354 9.2.4 文件标志355 9.2.5 动态inode356 9.2.6 inode管理357 9.3 命名359 9.3.1 359 9.3.2 在中查找名称360 9.3.3 路径名转换362 9.3.4 链接363 9.4 配额365 9.5 文件锁定368 9.6 软更新372 9.6.1 在文件系统中的更新依赖373 9.6.2 依赖的结构376 9.6.3 位图依赖跟踪378 9.6.4 inode依赖跟踪378 9.6.5 直接块依赖跟踪379 9.6.6 间接块依赖跟踪380 9.6.7 新间接块的依赖跟踪381 9.6.8 新入口的依赖跟踪382 9.6.9 新依赖跟踪384 9.6.10 入口移除依赖项跟踪385 9.6.11 文件截断385 9.6.12 文件和inode回收385 9.6.13 入口重命名依赖关系跟踪386 9.6.14 软更新的fsync请求386 9.6.15 软更新的文件删除要求387 9.6.16 fsck的软更新要求389 9.7 文件系统快照389 9.7.1 创建一个文件系统快照389 9.7.2 维护文件系统快照391 9.7.3 大文件系统快照392 9.7.4 后台fsck393 9.7.5 用户可见的快照394 9.7.6 实时转储394 9.8 日志软更新394 9.8.1 背景和简介395 9.8.2 与其他实现的兼容性395 9.8.3 日志格式395 9.8.4 需要日志记录的修改396 9.8.5 日志的额外需求397 9.8.6 恢复进程398 9.8.7 性能399 9.8.8 未来工作400 9.8.9 跟踪文件移除依赖400 9.9 本地文件存储402 9.9.1 文件存储概述402 9.9.2 用户I/O到一个文件的过程404 9.10 伯克利快速文件系统406 9.10.1 伯克利快速文件系统的组织406 9.10.2 启动块408 9.10.3 优化存储利用率408 9.10.4 对文件进行读写409 9.10.5 布局策略411 9.10.6 分配机制413 9.10.7 块聚类416 9.10.8 基于分区的分配418 习题419 第10章 Zettabyte文件系统421 第11章 网络文件系统422 11.1 概述422 11.2 结构和操作424 11.2.1 FreeBSD NFS的实现428 11.2.2 客户端-服务器端交互432 11.2.3 安全问题432 11.2.4 性能提升技巧433 11.3 NFS演进435 11.3.1 命名空间439 11.3.2 属性440 11.3.3 访问控制列表441 11.3.4 缓存、代理和回调441 11.3.5 锁447 11.3.6 安全448 11.3.7 崩溃恢复450 习题451 第四部分 进程间通信 第12章 进程间通信454 12.1 进程间交互模型454 12.2 实现结构和概述458 12.3 内存管理460 12.3.1 mbuf460 12.3.2 存储管理算法463 12.3.3 mbuf实用例程463 12.4 IPC数据结构464 12.4.1 套接字地址468 12.4.2 锁469 12.5 建立连接469 12.6 数据传输471 12.6.1 传输数据471 12.6.2 接收数据473 12.7 关闭套接字475 12.8 网络通信协议的内部结构476 12.8.1 数据流477 12.8.2 通信协议478 12.9 套接字到协议接口480 12.9.1 用户请求协议例程481 12.9.2 控制输出协议例程483 12.10 协议到协议的接口484 12.10.1 pr_output484 12.10.2 pr_input485 12.10.3 pr_ctlinput485 12.11 协议到网络的接口486 12.11.1 网络接口和链路层协议486 12.11.2 数据包传输492 12.11.3 数据包接收492 12.12 缓冲和流控493 12.12.1 缓冲协议策略494 12.12.2 队列限制494 12.13 网络虚拟化494 习题496 第13章 网络层协议498 13.1 IPv4498 13.1.1 IPv4地址500 13.1.2 广播地址501 13.1.3 Internet组播502 13.1.4 链路层地址解析503 13.2 ICMP504 13.3 IPv6506 13.3.1 IPv6地址507 13.3.2 IPv6数据包格式509 13.3.3 切换到套接字API510 13.3.4 自动配置511 13.4 Internet协议代码结构515 13.4.1 输出515 13.4.2 输入517 13.4.3 转发518 13.5 路由519 13.5.1 内核路由表520 13.5.2 路由选择查询522 13.5.3 路由选择重定向525 13.5.4 路由表接口525 13.5.5 用户级路由选择策略526 13.5.6 用户级路由选择接口:路由选择套接字526 13.6 原始套接字527 13.6.1 控制块528 13.6.2 输入处理528 13.6.3 输出处理529 13.7 安全529 13.7.1 IPSec概述530 13.7.2 安全协议531 13.7.3 密钥管理533 13.7.4 IPSec实现537 13.8 数据包处理框架539 13.8.1 伯克利数据包过滤器539 13.8.2 IP防火墙540 13.8.3 IPFW和Dummynet541 13.8.4 数据包过滤器544 13.8.5 netgraph545 13.8.6 netmap549 习题551 第14章 传输层协议553 14.1 Internet端口与关联553 14.2 用户数据报协议554 14.2.1 初始化555 14.2.2 输出555 14.2.3 输入555 14.2.4 控制操作556 14.3 传输控制协议556 14.3.1 TCP连接状态558 14.3.2 序列变量561 14.4 TCP算法562 14.4.1 定时器563 14.4.2 往返时间的估计565 14.4.3 建立连接565 14.4.4 SYN缓存567 14.4.5 SYN cookie568 14.4.6 关闭连接569 14.5 TCP输入处理569 14.6 TCP输出处理572 14.6.1 发送数据573 14.6.2 避免糊涂窗口综合征573 14.6.3 避免小数据包574 14.6.4 延迟确认与窗口更新575 14.6.5 选择性确认575 14.6.6 重传状态577 14.6.7 慢启动578 14.6.8 缓冲区与窗口大小579 14.6.9 使用慢启动进行拥塞避免580 14.6.10 快速重传581 14.6.11 模块化拥塞控制582 14.6.12 Vegas算法584 14.6.13 Cubic算法584 14.7 流控制传输协议585 14.7.1 大数据块585 14.7.2 关联建立586 14.7.3 数据传输587 14.7.4 关联关闭589 14.7.5 多宿主和心跳589 习题591 第五部分 系统运行 *第15章 系统启动与关闭594 *术语表 *参考文献 ---------------------------8071051 - Unix/Linux系统编程--------------------------- 出版者的话 译者序 前言 第1章 引言1 1.1 关于本书1 1.2 系统编程的作用1 1.3 本书的目标1 1.3.1 强化学生的编程背景知识1 1.3.2 动态数据结构的应用2 1.3.3 进程概念和进程管理2 1.3.4 并发编程2 1.3.5 定时器和定时功能3 1.3.6 信号、信号处理和进程间通信3 1.3.7 文件系统3 1.3.8 TCP/IP和网络编程3 1.4 目标读者3 1.5 本书的独特之处4 1.6 将本书用作系统编程课程的教材5 1.7 其他参考书6 1.8 关于Unix6 1.8.1 AT&T Unix6 1.8.2 Berkeley Unix6 1.8.3 HP Unix7 1.8.4 IBM Unix7 1.8.5 Sun Unix7 1.9 关于Linux7 1.10 Linux版本7 1.10.1 Debian Linux8 1.10.2 Ubuntu Linux8 1.10.3 Linux Mint8 1.10.4 基于RPM的Linux8 1.10.5 Slackware Linux8 1.11 Linux硬件平台8 1.12 虚拟机上的Linux 8 1.12.1 VirtualBox9 1.12.2 VMware10 1.12.3 双启动Slackware和Ubuntu Linux11 1.13 使用Linux12 1.13.1 Linux内核映像12 1.13.2 Linux启动程序13 1.13.3 Linux启动13 1.13.4 Linux运行级别13 1.13.5 登录进程13 1.13.6 命令执行13 1.14 使用Ubuntu Linux14 1.14.1 Ubuntu版本14 1.14.2 Ubuntu Linux的特性14 1.15 Unix/Linux文件系统组织15 1.15.1 文件类型15 1.15.2 文件路径名15 1.15.3 Unix/Linux命令16 1.15.4 Linux手册页16 1.16 Ubuntu Linux系统管理17 1.16.1 用户账户17 1.16.2 添加新用户17 1.16.3 sudo命令17 参考文献18 第2章 编程背景19 2.1 Linux中的文本编辑器19 2.1.1 vim19 2.1.2 gedit20 2.1.3 emacs20 2.2 使用文本编辑器20 2.2.1 使用emacs21 2.2.2 emacs菜单21 2.2.3 emacs的集成开发环境22 2.3 程序开发22 2.3.1 程序开发步骤22 2.3.2 静态与动态链接24 2.3.3 可执行文件格式25 2.3.4 a.out文件的内容25 2.3.5 程序执行过程26 2.3.6 程序终止27 2.4 C语言中的函数调用27 2.4.1 32位GCC中的运行时堆栈使用情况27 2.4.2 long jump30 2.4.3 64位GCC中的运行时堆栈使用情况32 2.5 C语言程序与汇编代码的链接34 2.5.1 用汇编代码编程34 2.5.2 用汇编语言实现函数36 2.5.3 从汇编中调用C函数38 2.6 链接库38 2.6.1 静态链接库38 2.6.2 动态链接库39 2.7 makefile39 2.7.1 makefile格式39 2.7.2 make程序40 2.7.3 makefile示例40 2.8 GDB调试工具45 2.8.1 在emacs IDE中使用GDB45 2.8.2 有关使用调试工具的建议49 2.8.3 C语言程序中的常见错误49 2.9 C语言结构体53 2.9.1 结构体和指针54 2.9.2 C语言类型转换55 2.10 链表处理56 2.10.1 链表56 2.10.2 链表操作57 2.10.3 构建链表57 2.10.4 链表遍历60 2.10.5 搜索链表61 2.10.6 插入操作62 2.10.7 优先级队列63 2.10.8 删除操作63 2.10.9 循环链表64 2.10.10 可扩充C语言结构体64 2.10.11 双向链表65 2.10.12 双向链表示例程序65 2.11 树73 2.12 二叉树73 2.12.1 二叉搜索树73 2.12.2 构建二叉搜索树74 2.12.3 二叉树遍历算法75 2.12.4 深度优先遍历算法75 2.12.5 广度优先遍历算法75 2.13 编程项目:Unix/Linux文件系统树模拟器77 2.13.1 Unix/Linux文件系统树77 2.13.2 用二叉树实现普通树77 2.13.3 项目规范及要求78 2.13.4 命令规范78 2.13.5 程序结构体78 2.13.6 命令算法81 2.13.7 示例解决方案83 2.14 习题84 参考文献86 第3章 Unix/Linux进程管理87 3.1 多任务处理87 3.2 进程的概念87 3.3 多任务处理系统88 3.3.1 type.h 文件88 3.3.2 ts.s文件89 3.3.3 queue.c 文件89 3.3.4 t.c文件90 3.3.5 多任务处理系统代码介绍93 3.4 进程同步95 3.4.1 睡眠模式95 3.4.2 唤醒操作96 3.5 进程终止96 3.5.1 kexit()的算法97 3.5.2 进程家族树97 3.5.3 等待子进程终止98 3.6 MT系统中的进程管理99 3.7 Unix/Linux中的进程100 3.7.1 进程来源100 3.7.2 INIT和守护进程100 3.7.3 登录进程100 3.7.4 sh进程101 3.7.5 进程的执行模式101 3.8 进程管理的系统调用102 3.8.1 fork()102 3.8.2 进程执行顺序103 3.8.3 进程终止104 3.8.4 等待子进程终止105 3.8.5 Linux中的subreaper进程106 3.8.6 exec():更改进程执行映像108 3.8.7 环境变量108 3.9 I/O重定向111 3.9.1 文件流和文件描述符111 3.9.2 文件流I/O和系统调用111 3.9.3 重定向标准输入111 3.9.4 重定向标准输出112 3.10 管道112 3.10.1 Unix/Linux中的管道编程113 3.10.2 管道命令处理115 3.10.3 将管道写进程与管道读进程连接起来115 3.10.4 命名管道116 3.11 编程项目:sh模拟器117 3.11.1 带有I/O重定向的单命令117 3.11.2 带有管道的命令118 3.11.3 ELF可执行文件与sh脚本文件118 3.11.4 示例解决方案119 3.12 习题119 参考文献120 第4章 并发编程121 4.1 并行计算导论121 4.1.1 顺序算法与并行算法121 4.1.2 并行性与并发性122 4.2 线程122 4.2.1 线程的原理122 4.2.2 线程的优点122 4.2.3 线程的缺点123 4.3 线程操作123 4.4 线程管理函数123 4.4.1 创建线程124 4.4.2 线程ID125 4.4.3 线程终止125 4.4.4 线程连接125 4.5 线程示例程序125 4.5.1 用线程计算矩阵的和125 4.5.2 用线程快速排序127 4.6 线程同步129 4.6.1 互斥量129 4.6.2 死锁预防131 4.6.3 条件变量132 4.6.4 生产者-消费者问题133 4.6.5 信号量136 4.6.6 屏障137 4.6.7 用并发线程解线性方程组138 4.6.8 Linux中的线程140 4.7 编程项目:用户级线程141 4.7.1 项目基本代码:一个多任务处理系统142 4.7.2 用户级线程145 4.7.3 线程连接操作的实现147 4.7.4 互斥量操作的实现151 4.7.5 用并发程序测试有互斥量的项目152 4.7.6 信号量的实现156 4.7.7 使用信号量实现生产者-消费者问题156 4.8 习题158 参考文献159 第5章 定时器及时钟服务160 5.1 硬件定时器160 5.2 个人计算机定时器160 5.3 CPU操作161 5.4 中断处理161 5.5 时钟服务函数161 5.5.1 gettimeofday-settimeofday162 5.5.2 time系统调用163 5.5.3 times系统调用164 5.5.4 time和date命令164 5.6 间隔定时器164 5.7 REAL模式间隔定时器166 5.8 编程项目166 5.8.1 系统基本代码167 5.8.2 定时器中断170 5.8.3 定时器队列171 5.8.4 临界区173 5.8.5 高级主题173 5.9 习题174 参考文献174 第6章 信号和信号处理175 6.1 信号和中断175 6.2 Unix/Linux信号示例177 6.3 Unix/Linux中的信号处理177 6.3.1 信号类型177 6.3.2 信号的来源178 6.3.3 进程PROC结构体中的信号178 6.3.4 信号处理函数179 6.3.5 安装信号捕捉函数179 6.4 信号处理步骤181 6.5 信号与异常182 6.6 信号用作IPC182 6.7 Linux中的IPC183 6.7.1 管道和FIFO183 6.7.2 信号184 6.7.3 System V IPC184 6.7.4 POSIX消息队列184 6.7.5 线程同步机制184 6.7.6 套接字184 6.8 编程项目:实现一个消息IPC184 6.9 习题186 参考文献186 第7章 文件操作187 7.1 文件操作级别187 7.2 文件I/O操作189 7.3 低级别文件操作191 7.3.1 分区191 7.3.2 格式化分区193 7.3.3 挂载分区194 7.4 EXT2文件系统简介195 7.4.1 EXT2文件系统数据结构195 7.4.2 超级块196 7.4.3 块组描述符196 7.4.4 位图197 7.4.5 索引节点197 7.4.6 条目198 7.5 编程示例198 7.5.1 显示超级块198 7.5.2 显示位图200 7.5.3 显示根索引节点202 7.5.4 显示条目203 7.6 编程项目:将文件路径名转换为索引节点205 7.7 习题206 参考文献206 第8章 使用系统调用进行文件操作207 8.1 系统调用207 8.2 系统调用手册页207 8.3 使用系统调用进行文件操作207 8.4 常用的系统调用209 8.5 链接文件210 8.5.1 硬链接文件210 8.5.2 符号链接文件211 8.6 stat系统调用211 8.6.1 stat文件状态211 8.6.2 stat结构体212 8.6.3 stat与文件索引节点213 8.6.4 文件类型和权限214 8.6.5 opendir-readdir函数215 8.6.6 readlink函数215 8.6.7 ls程序216 8.7 open-close-lseek系统调用217 8.7.1 打开文件和文件描述符218 8.7.2 关闭文件描述符218 8.7.3 lseek文件描述符218 8.8 read()系统调用218 8.9 write()系统调用219 8.10 文件操作示例程序219 8.10.1 显示文件内容219 8.10.2 复制文件220 8.10.3 选择性文件复制221 8.11 编程项目:使用系统调用递归复制文件222 8.11.1 提示和帮助222 8.11.2 示例解决方案223 参考文献223 第9章 I/O库函数224 9.1 I/O库函数224 9.2 I/O库函数与系统调用224 9.3 I/O库函数的算法227 9.3.1 fread算法227 9.3.2 fwrite算法227 9.3.3 fclose算法228 9.4 使用I/O库函数或系统调用228 9.5 I/O库模式228 9.5.1 字符模式I/O228 9.5.2 行模式I/O229 9.5.3 格式化I/O230 9.5.4 内存中的转换函数230 9.5.5 其他I/O库函数230 9.5.6 限制混合fread-fwrite230 9.6 文件流缓冲231 9.7 变参函数232 9.8 编程项目:类printf函数233 9.8.1 项目规范233 9.8.2 项目基本代码233 9.8.3 myprintf()的算法234 9.8.4 项目改进234 9.8.5 项目演示和示例解决方案234 9.9 习题234 参考文献235 第10章 sh编程236 10.1 sh脚本236 10.2 sh脚本与C程序236 10.3 命令行参数237 10.4 sh变量237 10.5 sh中的引号238 10.6 sh语句238 10.7 sh命令238 10.7.1 内置命令238 10.7.2 Linux命令239 10.8 命令替换240 10.9 sh控制语句240 10.9.1 if-else-fi语句240 10.9.2 for语句242 10.9.3 while语句242 10.9.4 until-do语句243 10.9.5 case语句243 10.9.6 continue和break语句243 10.10 I/O重定向243 10.11 嵌入文档243 10.12 sh函数244 10.13 sh中的通配符245 10.14 命令分组245 10.15 eval语句245 10.16 调试sh脚本246 10.17 sh脚本的应用246 10.18 编程项目:用sh脚本递归复制文件248 参考文献249 第11章 EXT2文件系统250 11.1 EXT2文件系统250 11.2 EXT2文件系统数据结构250 11.2.1 通过mkfs创建虚拟磁盘250 11.2.2 虚拟磁盘布局251 11.2.3 超级块251 11.2.4 块组描述符252 11.2.5 块和索引节点位图252 11.2.6 索引节点252 11.2.7 数据块253 11.2.8 条目254 11.3 邮差算法254 11.3.1 C语言中的Test-Set-Clear位254 11.3.2 将索引节点号转换为磁盘上的索引节点255 11.4 编程示例255 11.4.1 显示超级块255 11.4.2 显示位图257 11.4.3 显示根索引节点259 11.4.4 显示条目260 11.5 遍历EXT2文件系统树261 11.5.1 遍历算法262 11.5.2 将路径名转换为索引节点263 11.5.3 显示索引节点磁盘块263 11.6 EXT2文件系统的实现263 11.6.1 文件系统的结构263 11.6.2 文件系统的级别264 11.7 基本文件系统265 11.7.1 type.h文件265 11.7.2 global.c文件267 11.7.3 实用程序函数268 11.7.4 mount-root272 11.7.5 基本文件系统的实现275 11.8 1级文件系统函数276 11.8.1 mkdir算法276 11.8.2 creat算法279 11.8.3 mkdir-creat的实现280 11.8.4 rmdir算法281 11.8.5 rmdir的实现283 11.8.6 link算法283 11.8.7 unlink算法285 11.8.8 symlink算法285 11.8.9 readlink算法286 11.8.10 其他1级函数286 11.8.11 编程项目1:1级文件系统的实现286 11.9 2级文件系统函数286 11.9.1 open算法287 11.9.2 lseek287 11.9.3 close算法288 11.9.4 读取普通文件288 11.9.5 写普通文件290 11.9.6 opendir-readdir291 11.9.7 编程项目2:2级文件系统的实现292 11.10 3级文件系统292 11.10.1 挂载算法292 11.10.2 卸载算法293 11.10.3 交叉挂载点293 11.10.4 文件保护294 11.10.5 实际uid和有效uid294 11.10.6 文件锁定294 11.10.7 编程项目3:整个文件系统的实现295 11.11 文件系统项目的扩展295 11.12 习题295 参考文献296 第12章 块设备I/O和缓冲区管理297 12.1 块设备I/O缓冲区297 12.2 Unix I/O缓冲区管理算法299 12.3 新的I/O缓冲区管理算法301 12.4 PV算法302 12.5 编程项目:I/O缓冲区管理算法比较303 12.5.1 系统组织303 12.5.2 多任务处理系统304 12.5.3 缓冲区管理器305 12.5.4 磁盘驱动程序305 12.5.5 磁盘控制器306 12.5.6 磁盘中断306 12.5.7 虚拟磁盘306 12.5.8 项目要求306 12.5.9 基本代码示例307 12.5.10 示例解决方案311 12.6 模拟系统的改进312 12.7 PV算法的改进312 参考文献313 第13章 TCP/IP和网络编程314 13.1 网络编程简介314 13.2 TCP/IP协议314 13.3 IP主机和IP地址315 13.4 IP协议315 13.5 IP数据包格式316 13.6 路由器316 13.7 UDP316 13.8 TCP316 13.9 端口编号316 13.10 网络和主机字节序317 13.11 TCP/IP网络中的数据流317 13.12 网络编程318 13.12.1 网络编程平台318 13.12.2 服务器-客户机计算模型318 13.13 套接字编程319 13.13.1 套接字地址319 13.13.2 套接字API319 13.14 UDP回显服务器-客户机程序321 13.15 TCP回显服务器-客户机程序323 13.16 主机名和IP地址326 13.17 TCP编程项目:互联网上的文件服务器328 13.17.1 项目规范328 13.17.2 帮助和提示329 13.17.3 多线程TCP服务器330 13.18 Web和CGI编程330 13.18.1 HTTP编程模型331 13.18.2 Web页面331 13.18.3 托管Web页面333 13.18.4 为Web页面配置HTTPD333 13.18.5 动态Web页面334 13.18.6 PHP334 13.18.7 CGI编程339 13.18.8 配置CGI的HTTPD339 13.19 CGI编程项目:通过CGI实现动态Web页面339 13.20 习题343 参考文献343 第14章 MySQL数据库系统344 14.1 MySQL简介344 14.2 安装MySQL344 14.2.1 Ubuntu Linux344 14.2.2 Slackware Linux344 14.3 使用MySQL345 14.3.1 连接到MySQL服务器345 14.3.2 显示数据库346 14.3.3 新建数据库346 14.3.4 删除数据库346 14.3.5 选择数据库347 14.3.6 创建表347 14.3.7 删除表348 14.3.8 MySQL中的数据类型348 14.3.9 插入行349 14.3.10 删除行350 14.3.11 更新表350 14.3.12 修改表351 14.3.13 关联表352 14.3.14 连接操作355 14.3.15 MySQL数据库关系图357 14.3.16 MySQL脚本357 14.4 C语言MySQL编程360 14.4.1 使用C语言构建MySQL客户机程序361 14.4.2 使用C语言连接到MySQL服务器361 14.4.3 使用C语言构建MySQL数据库362 14.4.4 使用C语言检索MySQL查询结果364 14.5 PHP MySQL编程367 14.5.1 使用PHP连接到MySQL服务器367 14.5.2 使用PHP创建数据库表368 14.5.3 使用PHP将记录插入表中369 14.5.4 在PHP中检索MySQL查询结果371 14.5.5 使用PHP进行更新操作372 14.5.6 使用PHP删除行373 14.6 习题373 参考文献373 |