操作系统复习笔记2——并发与同步

315 阅读3分钟

1、信号概念

信号由内核发出,发送给进程,通知进程某种特殊的事情发生了,迫使进程执行信号处理程序;

发出信号的两个原因:

image.png

进程收到信号的动作:忽略、终止、执行用户级的信号处理程序;

每个类型的信号最多只能有一个待处理信号,信号不会排队,后来的直接丢弃;

如果一个信号被阻塞,即使这个信号已经到达,挂起位为1,也不能处理,等待解除阻塞之后才可以;

内核默认阻塞与当前正在处理信号类型相同的待处理信号;

信号处理程序可以被其他信号处理程序中断;

安全的信号处理 程序编写原则:

1、处理程序尽可能简单;

2、处理程序中只调用异步信号安全函数(不能被信号处理程序中断),printf、sprintf、malloc、exit都不安全,write是安全的;

3、保存和恢复errno

image.png

4、阻塞所有信号,保护对共享全局数据结构的访问;

5、用volatile声明全局变量

image.png

6、用sig_atomic_t声明标志

image.png

image.png

2、同步

线程运行之间的轨迹图

image.png

临界区是指进程中用于访问临界资源的那段代码 image.png

信号量方法保证线程互斥的访问每个临界区

image.png

将共享变量与一个信号量联系起来,用P和V将临界区包围起来,

image.png

image.png

使用信号量的函数执行时间比未使用的要长

互斥信号量初始值为1,为0时表示有一个进程已经进入,没有进程在等待,小于0时,其绝对值表示正在等待资源的进程个数,同步信号量一般大于1,同理。

进程之间的制约关系:

1、间接制约:对临界资源的使用,临界资源一次仅允许一个进程使用,进程使用临界资源要互斥;

2、直接制约:相互协作的程序,需要保证先后顺序(同步)

同步的概念:

image.png

同步机制遵循的准则: image.png

生产者-消费者问题

image.png

需要一个互斥锁和两个计数信号量:

image.png

image.png

生产 image.png 消费类似

读者-写者问题

读者需要互斥,写者不用 image.png 读者优先和写者优先:

image.png 这两种问题都可能导致饥饿,一个线程无限期阻塞

读者优先:

image.png

写者优先

image.png

哲学家用餐问题

image.png

哲学家用餐问题

解决方案

image.png

四类线程不安全函数:

image.png

1、不保护共享变量的函数,可以通过堆共享变量添加信号量来解决

2、

image.png 可以把rand函数对全局共享变量的调用改成使用传入的参数,参数不是共享变量,和其值相等即可;

3、

image.png

可重入函数:被多个线程调用时不会引入任何共享数据,是线程安全函数的子集 第二类不安全函数变安全的唯一方法是变成可重入函数;

image.png

王道考研题

image.png 答案C, 同步是进程之间相互协作完成任务,他们并发时是异步的。

image.png PV操作是一种低级进程通信原语,不能被中断,原语是不可分割的指令序列。

PV操作是由两个不可中断的过程组成的。

image.png

答案C,变量A的相关临界区就是5个进程访问A的代码段。