为什么在假脱机模拟中为每个处理器使用信号量

时间:2012-04-10 18:00:29

标签: concurrency semaphore

我正在开发一个项目,模拟多处理器处理命令和排队字符串,以便通过一个假脱机程序打印。

最多有十个处理器,每个处理器执行一系列具有“计算”和“打印”语句的作业。计算只是一个数学过程,需要花时间来模拟其他工作,而print会将一个短字符串传递给要打印的假脱机程序。有一个假脱机程序,一个打印机连接到假脱机程序。每个处理器在终止之前将处理许多作业,来自特定处理器上特定作业的所有打印语句应该一起打印(不打印来自单个作业的打印),并且假脱机程序永远不应该被阻塞在正在计算的进程上。 / p>

我通常理解如何使用信号量和互斥结构对此进行编码,但规范中的陈述使我感到困惑:

  

尝试最大化系统的并发性。 (你可以考虑使用   由处理器ID索引的信号量数组。)

对于每个单独的流程使用信号量,我是否缺少一个特定的优势?

如果需要进一步澄清,请告诉我 - 我试图以简洁的方式描述问题。

编辑: 另一个可能很重要的部分:每个处理器都有一个缓冲区,最多可以容纳10个字符串,以便发送给假脱机程序。当缓冲区已满时,每个进程的sempahore是否可以等待?

编辑2: 作业可以包含多个相互混合的计算和打印语句:
工作1
计算4
打印Foo
计算2
打印栏
结束工作

作业中的打印报表应按顺序打印(Foo和Bar应按顺序打印,而不需要打印其他作业/处理器)。

1 个答案:

答案 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();