我正在开发一个项目,模拟多处理器处理命令和排队字符串,以便通过一个假脱机程序打印。
最多有十个处理器,每个处理器执行一系列具有“计算”和“打印”语句的作业。计算只是一个数学过程,需要花时间来模拟其他工作,而print会将一个短字符串传递给要打印的假脱机程序。有一个假脱机程序,一个打印机连接到假脱机程序。每个处理器在终止之前将处理许多作业,来自特定处理器上特定作业的所有打印语句应该一起打印(不打印来自单个作业的打印),并且假脱机程序永远不应该被阻塞在正在计算的进程上。 / p>
我通常理解如何使用信号量和互斥结构对此进行编码,但规范中的陈述使我感到困惑:
尝试最大化系统的并发性。 (你可以考虑使用 由处理器ID索引的信号量数组。)
对于每个单独的流程使用信号量,我是否缺少一个特定的优势?
如果需要进一步澄清,请告诉我 - 我试图以简洁的方式描述问题。
编辑: 另一个可能很重要的部分:每个处理器都有一个缓冲区,最多可以容纳10个字符串,以便发送给假脱机程序。当缓冲区已满时,每个进程的sempahore是否可以等待?
编辑2:
作业可以包含多个相互混合的计算和打印语句:
工作1
计算4
打印Foo
计算2
打印栏
结束工作
作业中的打印报表应按顺序打印(Foo和Bar应按顺序打印,而不需要打印其他作业/处理器)。
答案 0 :(得分:2)
重要信息如下:
(不打印单个作业的打印),
这意味着new Semaphore(1)
(如果您使用的是Java)。
并且
并且永远不应该在进程上阻塞假脱机程序 计算
如果你有一个接受一方的信号量,那么最后一件就不会满足。执行处理器不必等待另一个处理器完成,它可以并行完成。
您可以通过创建条带信号量集来完成此操作。您可以使用处理器ID对其进行索引,以便每个线程/处理器无需交错即可运行,而无需等待其他处理器完成。
Semaphore[] semaphores = new Semaphore[Number_of_proessors];
//initialize all semaphore indexes
semaphores[Process.id].acquire();
//work
semaphores[Process.id].release();