进程与线程
进程间通信
竞争
当程序中有大家都能读取的共享变量或文件,就会产生竞争情况,考虑一个假脱机打印程序,该程序有一个脱机打印目录,里面是需要被打印的文件名,in指向最后一个空位,out指向下一个应该被打印的文件。如果进程A想打印文件,它读到in的位置是7,然后发生了中断,转到进程B执行,B也读到in为7,于是B把要打印的文件放入7,然后使in+1,这时B也中断,回到进程A,A将自己的文件也放入7,覆盖了B的文件,然后让in=8。这种竞争情况下,会使B永远无法打印文件。
解决这个问题的方法是设置临界区,临界区内有且只能有一个进程运行,其他进程想进入临界区需要等待临界区内现有的进程运行完毕才行
屏蔽中断
最简单的实现临界区的方法就是当一个进程进入临界区后,屏蔽所有中断,直到进程快运行完再打开中断,但是将中断权利交给用户是不明智的,如果进程忘记打开中断,会导致其他进程永远无法运行
锁变量
锁变量是指示临界区内是否有进程的变量,例如有就为1,无就为0,使用这种方法可能会出现与假打印程序一样的问题,进程A读到锁变量为0,然后中断了,进程B也读到是0,进入临界区,再次转到A运行时A也进入临界区,临界区内就有两个进程了
自旋锁
设定一个turn变量,当他为0时进程0可进入临界区,为1时进程1可进入临界区,也就是说自旋锁就是两个进程严格轮流进入临界区。
假设一开始turn为0,这时进程1想进入临界区,发现turn为0,进程1就只能在等待期间不断扫描turn,直到turn变成1,进程0想进入临界区,发现turn为0,则可直接进入,在进程0离开临界区时,将turn置为1。
这个方法的弊端就是,两个进程严格轮流进入临界区,如果一个进程比另一个进程慢很多,则速度快的进程运行效率会被拖慢
互斥锁
互斥锁一次只能被一个线程获得,在他被置1时,其他程序想获取锁只能等待
读写锁
读写锁的特点是,锁是一个共享资源,所有线程都可以随时对锁进行读模式的加锁,而只有一个线程能对锁进行写操作,在锁被置为1的时候,想对锁进行写操作的线程都将进入忙等待,直到锁被置为0为止