В большинстве реализаций 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
), сообщения в очередях с более низким приоритетом никогда не будут обрабатываться.