信号量原理
一、互斥
互斥的引出:
让不同的进程看到同一份资源,比如共享内存,也带来一些时序问题,造成数据不一致问题
1.我们把多个进程(执行流)看到的公共的一份资源成为临界资源
2.我们把自己的进程,访问临界资源的代码,成为临界区
3.多个执行流,互相运行的时候会互相干扰,因为我们不加保护的访问了同样的资源(临界资源),在非临界区的多个执行流互相是不影响的
4.为了更好的进行临界区的保护,可以让多执行流在任何时刻都只能有一个进程进入临界区,这种行为称为互斥,方式是加锁
5.原子性:要么不做,要么做完,没有中间状态,就称之为原子性
二、信号量
2.1是什么
每一个进程想进入临界资源,访问临界资源中的一部分,方式是:不能让进程直接区使用临界资源,而是让这个进程先去申请信号量
信号量是什么?
本质是一个计数器,用于控制对共享资源的访问
1.申请信号量成功,表示我具有访问资源的权限了,并且临界资源内部一定给进程预留了想要的资源。
2.申请了信号量,当前就一定要访问我要的资源?不一定,申请信号量是对临界资源的一种预定机制
3.信号量可以有效保证进入共享资源的执行流数量
4.所以每一个执行流想访问共享资源的一部分时,不是直接访问,而是先申请信号量
要访问临界资源,先申请信号量。信号量也是共享资源,要保护别人,先保护自己。怎么保护?原子性的申请和释放pv操作
2.2 P、V操作
步骤:
1.申请信号量(P操作),信号量计数器减1,如果此时信号量的值小于0,则进程或线程将被阻塞。
2.访问临界资源。
3.释放信号量(V操作),信号量计数器加1,并唤醒可能因为等待信号量而被阻塞的进程或线程。