文件名称:进程间同步-pna-x矢量网络分析仪精确测量噪声系数
文件大小:23.36MB
文件格式:PDF
更新时间:2024-07-30 12:55:32
unix操作系统
13.4 有名管道 现代操作系统大多支持有名管道,比如 Linux中有名管道的调用原型是: int mkfifo(char *name, int mode);这基本上和文件创建是一致的。如果创建成功,它可以 通过文件接口 read、write来读/写,也可以使用 open、close打开关闭。和无名管道不同,任 意两个进程之间都可以通过有名管道通信。 13.5 进程间同步 上面所讲的几乎都是进程间的数据传输,没有过多涉及进程间同步。而实际上,同步对 于进程间通信同样重要,因为当多个进程访问同一个资源时,就会有竞争。从刚才的例子也可 以看出,在进程间传输数据时,经常需要同步机制。比如使用文件传送数据时,我们使用信号 来保证同步。所谓同步就是在多个进程(现代线程)同时访问资源时,保证它们访问的有序性 和正确性。所以同步是解决资源竞争的一种机制。要实现同步,就必须保证某些操作的原子 性。 最早的同步机制——信号量,由 Edsger Dijkstra在 1968年提出。他最初的论文采用 P、V 操作来描述同步过程,演变到今天就是经典的 P、V同步原语。 P操作就是荷兰语中“proberen”一词的缩写,意为“检测”;V操作是另一个词“verhogen” 的缩写,意为“增量”。 信号量 s是一个非负整数变量,它只能通过一堆不可分割的访问历程来进行修改和检测: (� �+ A ��B �� �+ A47�38� ��;4���>< ��B 方括号内的语句,表示其中的操作是不可分割的(indivisible),或是原子的(atomic) 操作。也就是说,在“[”和“]”之间的所有语句的执行就像单条机器指令的执行一样。对于 V操作,增加信号量的操作不可分割。P操作复杂一些,如果 s大于 0,检测后减 1是一个不 可分割的操作;然而,如果 s等于 0,进行 P操作的进程在执行到 while循环时,会执行 wait 命令而被阻塞等待。操作的不可分割性只针对信号量的检测,以及检测后对执行流向的控制, 而不包含进程由于信号量等于 0而等待的动作。 P操作的目的是,不可分割地检测一个整数变量,如果变量不是正数,则阻塞调用进程; 而 V操作是不可分割地通知一个被阻塞的进程恢复执行。可以看出,内核中许多使用锁变量 的同步操作遵循 P、V操作过程,或只是稍加改动。比如:plock(inode *ip)相当于 P操作, prele(inode *ip)相当于 V操作。只不过 plock把信号量等于 0的判断改成判断变量 ip->i_flag 是否含 ILOCK标志,把信号量自减的操作改成给 ip->i_flag增加 ILOCK标志;prele把信号 量自增的操作改成清除 ip->i_flag中的 ILOCK标志。它们相当于 P、V操作中信号量 s初值等 于 1的情况。 信号量 s的初值可以等于 1,也可以等于其他任何正整数。如果信号量 s的初值为 1,那 么称之为mutex(互斥),或者叫“二值信号量”。在这种情况下,同一时刻,只能有一个进程 获得信号量执行。在使用信号量保护下执行的代码称为“临界区”(critical section),每个进程 调用 P操作进入临界区,当它离开临界区时调用 V操作。如果信号量 s的初值等于 1,那么