#P1516. Parallel Deadlock
Parallel Deadlock
本题没有可用的提交语言。
描述 并行计算中的一个常见问题是建立合适的通信模式,以确保处理器在等待从其他处理器接收消息,或者等待向其他处理器发送消息完成时不会出现死锁情况。也就是说,一个处理器在目标处理器接收到消息之前不会完成消息发送。同样,在实际接收到消息之前,接收操作也不会完成。 存在两种通信模式:阻塞式和非阻塞式。阻塞式发送在目标处理器执行匹配的接收操作之前不会完成。同样,阻塞式接收在源处理器执行匹配的发送操作之前也不会完成。非阻塞式操作会立即 “返回”(即允许程序继续执行),但在目标处理器执行匹配操作之前实际上不会完成。发送操作的匹配操作是接收操作(可以是阻塞式或非阻塞式),类似地,接收操作的匹配操作是发送操作(可以是阻塞式或非阻塞式)。 在每个时间步的开始,每个未被阻塞的处理器开始执行其下一条指令。执行阻塞式指令的处理器会被阻塞。消息可以在发送消息的时间步结束时被接收,但可能需要等待几个时间步,直到接收方执行匹配的接收操作。如果消息的接收方正在等待从发送方接收消息,那么消息会在同一时间步被接收。消息按照发送的顺序被接收。如果特定阻塞式指令的所有操作在时间步结束时都已完成,那么执行该指令的处理器将在下一个时间步之前解除阻塞。 一个正确的程序只有在其所有操作都完成时才会终止。在程序终止之前,未完成的非阻塞式操作必须完成。 你的程序将接收一个处理器列表和操作列表(每个处理器的操作不超过 100 个),并确定每个处理器是否完成了它的程序。如果某个给定的处理器没有完成,它必须打印出是哪些其他处理器阻止了它完成。 输入 第一行将是一个正整数,表示将列出的处理器数量。对于每个处理器,将有一行包含处理器的名称(单个大写字母),后面跟着一个正整数 N 。接下来的 N 行将包含构成该处理器程序的指令。 一条指令的格式为 “模式 操作 目标(多个)”,其中 “模式” 可以是 “B” 或 “N”,分别表示阻塞式和非阻塞式。“操作” 可以是 “S” 或 “R”,分别表示发送和接收。“目标(多个)” 将是一个或多个处理器名称,该操作将针对这些处理器。任何处理器不会被列出两次,并且一个处理器永远不会尝试与自身进行任何形式的通信。向多个目标的发送操作在所有目标都执行了匹配的接收操作之前不会完成(反之亦然)。 输出 假设指令 1 在 t = 1 时执行,你的程序将输出每个处理器在哪个时间步完成。如果一个处理器没有完成,你必须输出是哪些处理器阻止了该处理器完成。处理器应按字母顺序列出,无论是处理器列表还是阻止某个处理器完成的处理器集合。阻止终止的处理器列表中每个处理器最多列出一次,并用 “and” 分隔多个处理器。 输入数据 1 plaintext 4 I 5 B S B P C N S B P C N R B B R P B R C B 2 B R I B S I P 3 N S I N R I B R I C 4 N S I B R I B S P B R I 输出数据 1 plaintext B finishes at t=4 C never finishes because of P I never finishes because of B and C P finishes at t=5
提示 注意,如果 C 的最后一条阻塞式接收指令和 I 上的发送指令都被执行,那么它们将是匹配的。然而,它永远不会被执行,因为 C 卡在了向 P 的阻塞式发送操作上(P 上没有匹配的接收操作),因此导致了 I 上的死锁。 来源 1998 年美国中东部地区竞赛