内容简介
目录出版者的话专家指导委员会译者序前言第一部分 基础知识第1章 技术对程序的冲击
1.1 变化中的术语
1.2 时间和速度
1.3 多道程序设计和分时
1.4 应用层的并发
1.4.1 中断
1.4.2 信号
1.4.3 输入和输出
1.4.4 进程、线程和资源共享
1.4.5 共享内存的多个处理器
1.5 安全和容错
1.4.6 网络作为计算机
1.6 侵入带来的缓冲区溢出
1.6.1 缓冲区溢出的后果
1.6.2 缓冲区溢出与安全
1.7 UNIX标准
1.8 扩展阅读
第2章 程序、进程和线程
2.1 程序怎样转换成进程
2.2 线程和执行线程
2.3 程序映像的布局
2.4 库函数调用
2.5 函数返回值和错误
2.6 参数数组
2.6.1 用makeargv创建参数数组
2.6.2 makeargv的实现
2.7 线程安全的函数
2.8 静态变量的使用
2.9 静态对象的结构
2.10 进程环境
2.11 进程终止
2 12 练习:一个env工具
2.13 练习:消息日志
2.14 扩展阅读
第3章 UNIX系统中的进程
3.1 进程标识
3.2 进程状态
3.3 UNIX进程的创建与fork调用
3.4 wait函数
3.5 exec函数
3.6 后台进程与守护进程
3.7 临界区
3.8 练习:进程链
3.9 练习:进程扇
3.10 扩展阅读
第4章 UNIX I/O
4.1 设备术语
4.2 读和写
4.3 打开和关闭文件
4.4 select函数
4.5 poll函数
4.6 文件表示
4.6.1 文件描述符
4.6.2 文件指针和缓冲
4.6.3 文件描述符的继承
4.7 过滤器和重定向
4.8 文件控制
4.9 练习:原子日志
4.10 练习:cat工具
4.11 扩展阅读
第5章 文件和目录
5.1 UNIX文件系统导航
5.1.1 当前工作目录
5.2 目录访问
5.1.2 搜索路径
5.2.1 访问文件状态信息
5.2.2 确定文件的类型
5.3 UNIX文件系统的实现
5.3.1 UNIX文件的实现
5.3.2 目录的实现
5.4 硬链接和符号链接
5.4.1 创建或删除一个链接
5.4.2 创建和删除符号链接
5.5 练习:which命令
5.6 练习:通知程序
5.7 练习:news biff程序
5.8 练习:遍历目录
5.9 扩展阅读
第6章 UNIX特殊文件
6.1 管道
6.2 流水线
6.3 FIFO
6.4 管道与客户机-服务器模型
6.5 终端控制
6.6 音频设备
6.7 练习:音频
6.8 练习:路障
6.9 练习:stty命令
6.11 扩展阅读
6.10 练习:重温客户机-服务器
第7章 项目:令牌环
7.1 环形拓扑
7.2 环的形成
7.3 环的研究
7.4 简单的通信
7.5 用令牌实现互斥
7.6 用投票实现互斥
7.7 匿名环中的领导者选举
7.8 通信中使用的令牌环
7.9 应用流水线技术的预处理器
7.10 并行环算法
7.10.1 图像过滤
7.10.2 矩阵乘法
7.11 弹性环
7.12 扩展阅读
第二部分 异步事件第8章 信号
8.1 信号的基本概念
8.2 产生信号
8.3 对信号掩码和信号集进行操作
8.4 捕捉与忽略信号——sigaction
8.5 等待信号——pause、sigsuspend和sigwait
8.5.1 pause函数
8.5.2 sigsuspend函数
8.5.3 sigwait函数
8.6 信号处理:错误和异步信号安全
8.7 用siglongjmp和sigsetjmp进行程序控制
8.8 用异步I/O编程
8.9 练习:转储统计
8.10 练习:同时操作慢速设备
8.11 扩展阅读
第9章 时间和定时器
9.1 POSIX时间
9.1.1 用从Epoch开始的秒数来表示时间
9.1.2 显示日期和时间
9.1.3 用struct timeval来表示时间
9.1.4 使用实时时钟
9.1.5 实耗时间和处理器时间的对比
9.2 睡眠函数
9.3 POSIX:XSI间隔定时器
9.4 实时信号
9.5 POSIX:TMR间隔定时器
9.6 定时器漂移、超限和绝对时间
9.7 扩展阅读
第10章 项目:虚拟定时器
10.1 项目概述
10.2 简单的定时器
10.3 对五个定时器中的一个进行设置
10.3.1 virtualtimers对象
10.3.2 hardwaretimer对象
10.3.3 主程序的实现
10.3.4 用show来置入定时器代码
10.4 使用多个定时器
10.4.1 设置多个定时器
10.4.2 用多个定时器进行测试
10.5 多定时器的健壮实现
10.6 POSIX:TMR定时器的实现
10.7 mycron,一个小型的任务调度工具
10.8 扩展阅读
第11章 项目:破解命令解释程序
11.1 建造一个简单的命令解释程序
11.2 重定向
11.3 流水线
11.4 前台的信号处理
11.5.1 进程组
11.5 进程组、会话和控制终端
11.5.2 会话
11.6 ush中的后台进程
11.7 作业控制
11.8 ush的作业控制
11.8.1 一个作业列表对象
11.8.2 ush中的作业列表
11.8.3 ush中的作业控制
11.8.4 等待流水线时的进程行为
11.9 扩展阅读
第三部分 并发第12章 POSIX线程
12.1 监视多个文件描述符的方法
12.2 使用线程来监视多个文件描述符
12.3 线程管理
12.3.1 用ID引用线程
12.3.2 创建一个线程
12.3.3 分离和连接
12.3.4 退出和取消
12.3.5 向线程中传递参数并将值返回
12.4 线程安全
12.5 用户线程和内核线程
12.6 线程的属性
12.6.1 线程状态
12.6.2 线程栈
12.6.3 线程调度
12.7 练习:并行文件拷贝
12.8 扩展阅读
第13章 线程同步
13.1 POSIX同步函数
13.2 互斥锁
13.2.1 创建并初始化一个互斥量
13.2.2 销毁一个互斥量
13.2.3 对互斥量的锁定和解锁
13.2.4 保护不安全的库函数
13.2.5 对标志符和全局值的同步
13.2.6 使数据结构成为线程安全的
13.3 最多一次和至少一次的执行
13.4 条件变量
13.4.1 创建和销毁条件变量
13.4.2 等待并通知条件变量
13.5 信号处理与线程
13.5.1 将信号定向到一个特定的线程中去
13.5.2 为线程屏蔽信号
13.5.3 为信号处理指定专用线程
13.6 读者和写者
13.7 strerror_r的实现
13.8 死锁和其他比较麻烦的问题
13.9 练习:多个路障
13.10 扩展阅读
第14章 临界区和信号量
14.1 处理临界区
14.2 信号量
14.3 POSIX:SEM无名信号量
14.4 POSIX:SEM信号量操作
14.5 POSIX:SEM命名信号量
14.5.1 创建并打开命名信号量
14.5.2 关闭并删除命名信号量
14.6 练习:许可证管理器
14.6.1 许可证对象
14.6.2 runsim主程序
14.6.3 对许可证管理器的扩展
14.7 扩展阅读
15.1 POSIX:XSI进程间通信
15.1.1 标识并访问IPC对象
第15章 POSIX IPC
15.1.2 从命令解释程序中访问POSIX:XSI IPC资源
15.2 POSIX:XSI信号量集
15.2.1 信号量集的创建
15.2.2 信号量集控制
15.2.3 POSIX信号量集操作
15.3 POSIX:XSI共享内存
15.3.1 访问一个共享的内存段
15.3.2 共享内存段的连接和分离
15.3.3 控制共享内存
15.3.4 共享内存实例
15.4 POSIX:XSI消息队列
15.6 练习:POSIX命名信号量
15.5 练习:POSIX无名信号量
15.7 练习:用共享内存实现管道
15.8 练习:用消息队列实现管道
15.9 扩展阅读
第16章 项目:生产者消费者同步
16.1 生产者-消费者问题
16.2 受互斥锁保护的有限缓冲区
16.3 使用信号量的缓冲区实现
16.4 一个简单的生产者-消费者问题
16.5 使用条件变量的有限缓冲区实现
16.6 带有完成条件的缓冲区
16.7.1 执行并行文件拷贝的生产者
16.7 并行文件拷贝
16.7.2 执行并行文件拷贝的消费者
16.7.3 执行并行文件拷贝的main程序
16.7.4 对并行文件拷贝的增强
16.8 线程化打印服务器
16.8.1 请求缓冲区
16.8.2 生产者线程
16.8.3 消费者线程
16.8.4 打印服务器
16.8.5 其他的增强功能
16.9 扩展阅读
第17章 项目:非完全并行虚拟机
17.1 PVM的历史、术语和结构
17.2 非完全并行虚拟机
17.3 NTPVM项目概述
17.3.1 NEWTASK分组
17.3.2 DATA分组
17.3.3 DONE分组
17.4 调度程序的I/O和测试
17.4.1 用多个窗口进行测试
17.4.2 用远程日志进行测试
17.5 没有输入的单任务
17.6 串行的任务
17.6.1 输入线程
17.6.2 输出线程
17.7 并发的任务
17.8 分组通信、广播和路障
17.9 终止和信号
17.10 有序的消息传递
17.11 扩展阅读
第四部分 通信第18章 面向连接的通信
18.1 客户机-服务器模型
18.2 通信信道
18.3 面向连接的服务器策略
18.4 通用因特网通信接口
18.4.1 错误处理
18.4.2 读和写
18.5 不同服务器策略的UICI实现
18.6 UICI客户机
18.7 UICI的套接字实现
18.7.1 socket函数
18.7.2 bind函数
18.7.3 listen函数
18.7.4 u_open的实现
18.7.5 accept函数
18.7.6 u_accept的实现
18.7.7 connect函数
18.7.8 u_connect的实现
18.8 主机名和IP地址
18.9 线程安全的UICI
18.10 练习:ping服务器
18.11 练习:音频的传输
18.12 扩展阅读
第19章 项目:WWW重定向
19.1 万维网
19.2 统一资源定位符
19.3 HTTP入门
19.3.1 客户请求
19.3.2 服务器响应
19.3.3 HTTP消息交换
19.4 Web通信模式
19.4.1 隧道
19.4.2 代理
19.4.3 高速缓存和透明性
19.4.4 网关
19.5 单连接的通过型监视器
19.6 隧道服务器的实现
19.7 用于测试的服务器驱动程序
19.8 HTTP首部的解析
19.9 简单的代理服务器
19.10 代理监视器
19.11 代理高速缓存
19.12 门户网关
19.13 用于负载平衡的网关
19.14 事后的调查分析
19.14.1 线程和时序错误
19.14.2 未捕捉到的错误和错误的退出
19.14.4 拙劣的测试及结果的表示
19.14.3 书写风格和表示方法
19.14.5 编程错误和不好的风格
19.15 扩展阅读
第20章 无连接通信和多播
20.1 无连接通信入门
20.2 无连接通信的简化接口
20.2.1 主机名和u_buf_t结构
20.2.2 UICI UDP的各种返回错误值
20.2.3 UDP缓冲区大小与UICI UDP
20.3 简单-请求协议
20.4 请求-应答协议
20.5 有超时和重试机制的请求-应答协议
20.6 请求-应答-确认协议
20.7 UICI UDP的实现
20.7.1 u_openudp的实现
20.7.2 sendto函数
20.7.3 u_sendto和u_sendtohost的实现
20.7.4 recvfrom函数
20.7.5 u_recvfrom和u_recvfromtimed的实现
20.7.6 主机名和u_buf_t
20.8 UDP和TCP的比较
20.9 多播
20.9.1 多播编址
20.9.2 u_join的实现
20.10 练习:UDP端口服务器
20.9.3 u_leave的实现
20.11 练习:无状态文件服务器
20.12 扩展阅读
第21章 项目:因特网音频广播
21.1 项目概述
21.2 音频设备模拟
21.3 单节目和单接收者的UDP实现
21.3.1 简单实现
21.3.2 接收者如何终止
21.3.3 接收者进行缓冲以解决网络延迟问题
21.3.4 接收者进行缓冲以解决乱序传送的问题
21.4 多节目和多接收者的UDP实现
21.4.1 多节目单接收者
21.5 音频广播的UDP实现
21.4.2 多节目多接收者
21.6 音频广播的多播实现
21.7 TCP实现的差异
21.7.1 单节目单接收者的TCP实现
21.7.2 多节目单接收者的TCP实现
21.7.3 音频广播的TCP实现
21.8 通过浏览器接收流式音频
21.8.1 使用浏览器助手程序
21.8.4 创建Web页面
21.8.5 使用预定义的MIME类型
21.8.3 设置浏览器以支持新的MIME类型
21.8.2 为Web服务器设置一个新的MIME类型
21.9 扩展阅读
第22章 项目:服务器性能
22.1 服务器性能的代价
22.2 服务器体系结构
22.3 项目概述
22.4 单客户端驱动程序
22.4.1 处理一个连接
22.4.2 响应编程
22.4.3 收集统计信息
22.4.4 对客户端做测试
22.5 多客户端驱动程序
22.6 实现每个请求一个线程和每个请求一个进程
22.8 使用有界缓冲的多线程工作者池
22.7 多线程工作者池策略
22.9 多进程工作者池
22.10 磁盘I/O的影响
22.11 性能研究
22.11.1 基线测量
22.11.2 波动性的根源
22.11.3 测量的各种错误
22.11.4 同步
22.11.5 很简单的错误
22.11.6 该测量哪些项目
22.11.7 数据分析和表达
22.12 书写报告
22.12.1 引言
22.12.4 结果及分析
22.12.2 设计、实现和测试
22.12.3 实验
22.12.5 结论
22.12.6 参考文献
22.13 扩展阅读
附录A UN?X基础
附录B 重启库
附录C UICI的实现
附录D 志函数
附录E POSIX扩展
参考文献
程序索引
索引