gpt4 book ai didi

c - 等待多个信号量或多个消息队列

转载 作者:太空宇宙 更新时间:2023-11-04 06:49:20 26 4
gpt4 key购买 nike

In most implementations of UNIX, processes can block on more than one event. That is, rather than waiting on a single semaphore or receiving from a single message queue, the process can wait on multiple semaphores or multiple message queues. What advantage does such a capability offer? How would you implement this?

现在,在每个人开始问这是不是我的学校作业之前,事实并非如此。这是我正在参加的类(class)的推荐试题。

我的想法是这样的:

typedef struct QueueElement {
int Sender;
int Receiver;
char Message[MAX_MSG_SIZE];
int MessageSize;
} QueueElement;

QueueElement MessageQueue[NUM_OF_PROCESSES];



/* Send Message to receiving process queue number */
int SendMsg(int SenderId, int ReceiverId, char* Msg, int Size)
{
/* Create Queue Element to Enqueue */
QueueElement El = {
.Sender = SenderId,
.Receiver = ...
.
.
};

/* Enqueue element in queue specified by Receiver's Id */
Enqueue(&(MessageQueue[ReceiverId]), El);
}



/* Get messages for process defined by ReceiverId, from any queue */
int RecvMsg(int* SenderId, int ReceiverId, char* Msg, int* size)
{
int i;
for (i=NUM_OF_PROCESSES; i>=0; i--)
{
/* If a message is available for receiving process, Dequeue element from queue */
if (MessageQueue[i].Receiver = ReceiverId)
{
QueueElement El = Dequeue(&(MessageQueue[i]));
*SenderId = El.Sender;
strcpy(Msg, El.Message);
.
.
.

return TRUE;
}
}

return FALSE;
}

现在,考虑 4 个并行运行的进程。他们不断地向消息队列 1、2、3、4 发送消息。现在,假设所有消息都被发送到进程 2。这意味着进程 2 必须检查所有 4 个队列(1、2、3、4)中的消息。但是,如果不断添加新消息,则只会处理队列 4 中的消息。一个人如何避免使其他消息队列挨饿?

有没有更好的方法来处理这个问题?现代建筑如何处理这个问题?此解决方案的问题在于,如果消息不断进入高优先级队列 (NUM_OF_PROCESSES),则永远不会处理低优先级队列中的消息。

最佳答案

Is there a better way to handle this?

是的。主要问题是您的代码不断浪费 CPU 时间轮询,因为它根本不等待。

更好的方法是将它放在内核中,这样:

  • 当任务调用 RecvMsg() 时,内核可以执行 if queue no messages { tell scheduler this task should block until a message is received }原子地(没有竞争条件)

  • 当任何调用SendMsg()时,内核可以执行如果接收任务被阻塞等待消息{告诉调度程序接收任务应该被解除阻塞}原子地(没有竞争条件)

下一个问题是它只等待消息。如果你想等待一个文件被(异步)打开,或者等待一个信号,或者等待时间过去,或者等待一个互斥量被获取怎么办?对于这个问题,有两种可能的解决方案:

  • 有一个可怕的困惑(例如 epoll_pwait()),不同类型的东西有不同的参数(仍然不能用于某些事情 - 例如等待互斥锁)。

  • 在消息之上实现所有内容,这样您只需等待消息。

对于第二种方案;大多数情况下,您最终会用 actor 模型取代传统的过程式编程。

关于c - 等待多个信号量或多个消息队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53716151/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com