5

我正在尝试找出一种方法来同步两个共享数据的进程。

基本上我有两个使用共享内存链接的进程。我需要进程 A 在共享内存区域中设置一些数据,然后进程 B 读取该数据并对其进行操作。

我期待的事件顺序是:

  1. B块等待数据可用信号
  2. A 写入数据
  3. 可用的信号数据
  4. B 读取数据
  5. B 块等待数据不可用信号
  6. A 信号数据不可用
  7. 一切又回到了起点。

换句话说,B 将阻塞直到它得到一个“1”信号,获取数据,然后再次阻塞,直到该信号变为“0”。

我已经设法使用纯共享内存来模拟它,但是我要么使用消耗 100% CPU 时间的 while 循环阻塞,要么我使用带有 nanosleep 的 while 循环,它有时会错过一些信号。

我尝试过使用信号量,但我只能找到一种等待零而不是一的方法,并且尝试使用两个信号量只是没有用。我不认为信号量是要走的路。

将有许多进程都访问同一个共享内存区域,并且当共享内存被修改时需要通知所有进程。

它基本上是在尝试模拟硬件数据和控制总线,其中事件是边缘触发而不是电平触发。这是我感兴趣的状态之间的转换,而不是状态本身。

那么,有什么想法或想法吗?

4

4 回答 4

2

Linux 有自己的eventfd(2)工具,您可以将其合并到您的正常poll/select循环中。您可以eventfd按照通常的方式通过 UNIX 套接字将文件描述符从一个进程传递到另一个进程,或者仅使用fork(2).

编辑0:

重新阅读问题后,我认为您的选项之一是信号和进程组:在同一进程组 ( ) 下启动您的“侦听”进程,然后用对or的否定参数向setpgid(2)它们发出信号。同样,Linux 提供轮询和避免慢信号蹦床。pidkill(2)sigqueue(2)signalfd(2)

于 2012-06-04T18:36:35.483 回答
0

如果涉及 2 个进程,您可以使用文件、共享内存甚至网络来传递标志或信号。但是如果进程比较多,修改内核可能会有一些合适的解决方案。您的问题中有一个共享内存,对吗?!现在如何传递信号?!

于 2012-06-04T18:36:31.863 回答
0

在 linux 中,所有 POSIX 控制结构(互斥体、条件、读写锁、信号量)都有一个选项,如果它们驻留在共享内存中,它们也可以在进程之间使用。对于您描述的经典互斥锁/条件对的过程,似乎很适合这项工作。..._init查看这些结构的函数手册页。

Linux 有其他适当的实用程序,例如“futex”,可以更有效地处理这个问题。但这些可能不是开始的正确工具。

于 2012-06-04T21:07:47.800 回答
0

1 个单读和单写
1 个单读和单写 这可以使用信号量来实现。在posix semaphore api中,您有 sem_wait() ,它将一直等到信号量计数的值为零,一旦使用来自其他进程的 sem_post 递增,等待将完成。

在这种情况下,您必须使用 2 个信号量进行同步。

进程 1(阅读器)
sem_wait(sem1);
.......
sem_post(sem2);

进程 2(writer)
sem_wait(sem2);
.......
sem_post(sem1);

这样就可以在共享内存中实现同步。

于 2012-06-06T11:41:34.040 回答