文件名称:竞态条件-数据流图到模块结构图的直接转换方法
文件大小:5.82MB
文件格式:PDF
更新时间:2024-07-12 01:23:40
APUE UNIX
8.8 竞态条件 从本书的目的出发,当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于 进程运行的顺序时,则我们认为这发生了竞态条件( race condition)。如果在f o r k之后的某种逻 辑显式或隐式地依赖于在 f o r k之后是父进程先运行还是子进程先运行,那么 f o r k函数就会是竞 态条件活跃的孳生地。通常,我们不能预料哪一个进程先运行。即使知道哪一个进程先运行, 那么在该进程开始运行后,所发生的事情也依赖于系统负载以及内核的调度算法。 在程序8 - 5中,当第二个子进程打印其父进程 I D时,我们看到了一个潜在的竞态条件。如 果第二个子进程在第一个子进程之前运行,则其父进程将会是第一个子进程。但是,如果第一 个子进程先运行,并有足够的时间到达并执行 e x i t,则第二个子进程的父进程就是 i n i t。即使在 程序中调用 s l e e p,这也不保证什么。如果系统负担很重,那么在第二个子进程从 s l e e p返回时, 可能第一个子进程还没有得到机会运行。这种形式的问题很难排除,因为在大部分时间,这种 问题并不出现。 如果一个进程希望等待一个子进程终止,则它必须调用 w a i t函数。如果一个进程要等待其 父进程终止(如程序8 - 5中一样),则可使用下列形式的循环: while(getppid() !=1) s l e e p ( 1 ) ; 这种形式的循环(称为定期询问( p o l l i n g))的问题是它浪费了C P U时间,因为调用者每隔1秒 都被唤醒,然后进行条件测试。 为了避免竞态条件和定期询问,在多个进程之间需要有某种形式的信号机制。在 U N I X中 可以使用信号机制,在 1 0 . 1 6节将说明它的一种用法。各种形式的进程间通信 ( I P C )也可使用, 在第1 4、1 5章将对此进行讨论。 在父、子进程的关系中,常常出现下述情况。在 f o r k之后,父、子进程都有一些事情要做。 第 8章 进 程 控 制 1 5 3