我在Linux开发板上运行一段程序,发现CPU负载低的时候还可以,但是如果CPU负载达到高峰,时间会长很多。
下面是它的样子: 船上有 2 个程序正在运行。消费者应用程序有多个线程,它们会调用 func1 向生产者进程请求一些信息。生产者是一个守护进程,它将信息反馈给消费者进程。
示例代码如下所示:
消费者:
static int send_to_service(msg_t *cmd)
{
int cnt = send(fd, cmd, sizeof(msg_t), MSG_WAITALL);
if (cnt != sizeof(msg_t)) {
log(L_ERROR, "send failed");
return -1;
}
return 0;
}
static int func1(int aaa)
{
struct_t msg = {...};
msg.a = ...;
msg.b = ...;
gettimeofday(time1, NULL);
send_to_service(&msg);
...
}
制片人:
while(1) {
gettimeofday(time2, NULL);
int ret = select(maxfd+1, &fd_list, NULL, NULL, NULL);
gettimeofday(time3, NULL);
for (int fd = 0; fd <= maxfd; fd ++) {
if (!FD_ISSET(fd, &fd_list))
continue;
...
}
}
在 CPU 高负载时间期间,time1 和 time3 之间的时间差可以超过 30ms+。而且它不会一直发生,只会偶尔发生一次。
我之前尝试过单进程方式,消费者调用驱动程序并直接获取信息。效果很好。现在我必须向系统添加另一个进程来获取相同的信息,所以我必须使用一个守护进程来为这两个进程提供数据。性能不如单一工艺方法。即使只有一个消费者。
我使用的系统是 Linux 版本 4.14.74,我不确定套接字类型和网络,两个消费者进程都在同一个系统中等待获取图像信息。我只是使用了提供的“发送、接收和选择”系统。