Unix Network Programming Vol2 Part Three
UNIX网络编程 卷2:进程间通信(第2版)
发布于
2017-08-16 16:32:56
第三部分 同步
第7章 互斥锁和条件变量
- 同步
- 互斥锁:
pthread_mutexattr_t
用于上锁
pthread_mutex_init
函数初始化
- 如果互斥锁用于等待,则不断的轮询是对CPU的一种浪费
- 持有锁期间进程终止
- 可能不能正常释放锁
- 即使能自动释放某个锁,还可能导致数据不一致
- 让内核在进程终止时清理某个锁
- 条件变量:
pthread_condattr_t
用于等待
pthread_cond_signal
只唤醒等待在相应条件变量上的一个线程
pthread_cond_broadcat
唤醒阻塞在相应条件变量上的所有线程
第8章 读写锁
- 也称共享-独占(shared-exclusive)锁
- 同时允许的情况
- 可使用互斥锁和条件变量实现
- 优先考虑等待着的写入者
- 有的实现优先亏率等待着的读出者
第9章 记录上锁
- 属性
- 是读写锁的一种扩展类型
- 可用于有亲缘关系或无亲缘关系的进程之间共享某个文件的读写
- unix内核没有文件内的记录这一概念
- unix内核提供的上锁特性却用记录上锁(record locaking)这一术语来描述
- 应用会指定文件中待上锁或解锁部分的字节范围(byte range)
- 用作进程之间的劝告性锁,因为即使是强制性锁也会导致不一致的数据
- 记录上锁
int fcntl(int fd, int cmd, ... /* struct flock *arg */ );
- 在内核中维护
- 属主是由属主的进程ID标识的
- flock结构描述锁的类型
- cmd参数
- F_SETLK 获取或释放arg指向的结构所描述的锁
- F_SETLKW 与上一条相似,不过是阻塞的(wait)
- F_GETLK 检查由arg指向的锁以确定是否有某个已存在的锁会妨碍将新的锁授予调用进程
- 读出者优先还是写入者优先没有保证
- 劝告性上锁(advisory locking)
- 强制性上锁(mandatory locking)
- 如果是读出锁请求优先级更高,那么只要连续不断地发出读出锁请求,写入者就可能因获取不了写入锁而“挨饿”
- 文件作锁用
- 独占性创建并打开文件必须是原子的,因此可以把这样创建的文件作为锁来使用
- NFS上锁
- NFS 网络文件系统
- unix系统通常以两个额外的守护进程支持NFS记录上锁,lockd和statd
第10章 Posix 信号量
- 三类:均可用于进程或线程间的同步
- Posix有名信号量:使用Posix IPC名字标识
- 由可能与文件系统中的路径对应的名字来标识的,但并不要求它们真正存放在文件系统的某个文件中
- 至少有随内核的持续性
- Posix基于内存的信号量:存放在共享内存中
- 在创建时必须制定是否在进程间共享
- 具有随进程的持续性
- System V信号量:在内核中维护
- 根据信号量最大值分类
- 二值信号量
- 初始值
- 获得信号量,则值减1
- 释放信号量,则值加1
- 挂出 post、V操作、递增(up)、解锁、发信号
- 计数信号量
- 不同于互斥锁和条件变量的作为线程间同步工具,信号量主要目的是提供一种进程间的同步方式
- 生产者-消费者
- 一对一
- 多个生产者,单个消费者
- 消费者在生产者完成后启动,使用单个互斥锁(同步各个生产者)
- 消费者在生产者完成前启动,使用一个互斥锁(同步各个生产者)加上一个条件变量及其互斥锁(来同步生产者和消费者)
- 多个生产者,多个消费者
- Posix有名信号量的三种实现
- 使用FIFO
- 使用内存映射IO + 互斥锁 + 条件变量
- System V信号量
第11章 System V信号量
- 计数信号量集(set of counting semaphores)
- 一个或多个信号量构成集合
- 每个都是计数信号量
- 维护四个信息
- 每个信号量的实际值
- 对其值执行最后一次操作的进程的ID
- 等待其值增长的进程数计数
- 等待其值变为0的进程数计数
- System V信号量就是指计数信号量集
- Posix信号量,指的是单个计数信号量