1、信号概念
信号由内核发出,发送给进程,通知进程某种特殊的事情发生了,迫使进程执行信号处理程序;
发出信号的两个原因:
进程收到信号的动作:忽略、终止、执行用户级的信号处理程序;
每个类型的信号最多只能有一个待处理信号,信号不会排队,后来的直接丢弃;
如果一个信号被阻塞,即使这个信号已经到达,挂起位为1,也不能处理,等待解除阻塞之后才可以;
内核默认阻塞与当前正在处理信号类型相同的待处理信号;
信号处理程序可以被其他信号处理程序中断;
安全的信号处理 程序编写原则:
1、处理程序尽可能简单;
2、处理程序中只调用异步信号安全函数(不能被信号处理程序中断),printf、sprintf、malloc、exit都不安全,write是安全的;
3、保存和恢复errno
4、阻塞所有信号,保护对共享全局数据结构的访问;
5、用volatile声明全局变量
6、用sig_atomic_t声明标志
2、同步
线程运行之间的轨迹图
临界区是指进程中用于访问临界资源的那段代码
信号量方法保证线程互斥的访问每个临界区
将共享变量与一个信号量联系起来,用P和V将临界区包围起来,
使用信号量的函数执行时间比未使用的要长
互斥信号量初始值为1,为0时表示有一个进程已经进入,没有进程在等待,小于0时,其绝对值表示正在等待资源的进程个数,同步信号量一般大于1,同理。
进程之间的制约关系:
1、间接制约:对临界资源的使用,临界资源一次仅允许一个进程使用,进程使用临界资源要互斥;
2、直接制约:相互协作的程序,需要保证先后顺序(同步)
同步的概念:
同步机制遵循的准则:
生产者-消费者问题
需要一个互斥锁和两个计数信号量:
生产
消费类似
读者-写者问题
读者需要互斥,写者不用
读者优先和写者优先:
这两种问题都可能导致饥饿,一个线程无限期阻塞
读者优先:
写者优先
哲学家用餐问题
哲学家用餐问题
解决方案
四类线程不安全函数:
1、不保护共享变量的函数,可以通过堆共享变量添加信号量来解决
2、
可以把rand函数对全局共享变量的调用改成使用传入的参数,参数不是共享变量,和其值相等即可;
3、
可重入函数:被多个线程调用时不会引入任何共享数据,是线程安全函数的子集 第二类不安全函数变安全的唯一方法是变成可重入函数;
王道考研题
答案C, 同步是进程之间相互协作完成任务,他们并发时是异步的。
PV操作是一种低级进程通信原语,不能被中断,原语是不可分割的指令序列。
PV操作是由两个不可中断的过程组成的。
答案C,变量A的相关临界区就是5个进程访问A的代码段。