【发布时间】:2023-10-21 00:36:01
【问题描述】:
在大多数 UNIX 实现中,进程可以阻塞多个事件。也就是说,进程可以等待多个信号量或多个消息队列,而不是等待单个信号量或从单个消息队列接收。这种能力有什么优势?你将如何实现它?
现在,在大家开始问这是否是我的学校作业之前,它不是。这是我正在参加的课程的推荐考试题。
我对此的看法 - 类似这样:
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),则永远不会处理低优先级队列中的消息。
【问题讨论】:
标签: c unix cpu-architecture blocking epoll