1.信号量是什么
操作系统通常有3种的任务通信方式:
1、信号量,用于多任务之间的同步。
2、互斥量,用于避免多任务之间共享资源的竞争。
3、消息队列,用于多任务之间的收发消息机制。
信号量在操作系统中用于实现任务同步,通过同步机制可以实现多个任务合作,让多任务之间按照先后顺序执行。
这种机制就像我们生活中的交通红绿信号灯。汽车停在红绿信号灯路口,当红绿信号灯变成绿灯时,汽车启动并通过路口。这种行为逻辑并不是红绿信号灯亮的时候通过光电效应触发汽车的油门让汽车启动,而是因为司机看到了红绿信号灯变为绿灯,司机踩下油门启动汽车通过路口。司机看到红绿信号灯变为绿灯,随后踩下油门这个一组动作就是同步。
信号量是在多任务环境下使用的一种机制, 它负责协调各个任务, 以实现多个任务合作。通常情况下信号量可以分为以下两类:
1、二进制信号量:只允许信号量取0或1值,其只能被一个任务获取。
2、整型信号量:信号量取值是整数,可以被多个任务同时获得,直到信号量的值变为0。
信号量通过一个计数器控制任务访问,如果信号量的值是一个非负整数,任务获取它后会将该整数减1。如果信号量的计数器大于0,则访问被允许,计数器减1;如果号量的计数器为0,则访问被禁止,所有试图获取它的任务都将处于等待状态。
2.信号量操作
信号量的两个基本操作:释放(发送)信号量,获取(等待)信号量。
释放信号量的流程如下:
1、判断是否有任务等待该信号量。
2、若有任务等待该信号量,则将任务从挂起表中移除加入就绪表,并根据优先级执行任务切换。
3、若无任务等待该信号量,则将该信号量设置为“有效”。
获取信号量的流程如下:
1、判断该信号量是否为“有效”。
2、若该信号量为“无效”,将任务从就绪表中移除加入挂起表,切换任务。
3、若该信号量为“有效”,则继续运行。
例如任务A需要等待信号甲再执行一个特定操作,当信号甲为“无效”时任务A进入休眠状态,操作系统让任务B运行,假设任务A优先级高于任务B,当任务B释放信号甲后(信号为“有效”),操作系统会暂停任务B运行任务A,使得任务A的特定动作得以执行,运行图如下: