2

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

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

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

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

为每个单独的进程使用信号量是否有我缺少的特定优势?

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

编辑:另一个可能重要的部分:每个处理器都有一个缓冲区,可以容纳多达十个字符串以发送到假脱机程序。每个进程的信号量是否可以在缓冲区已满时等待?

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

作业中的打印语句都应按顺序打印(Foo 和 Bar 应按顺序打印,中间没有来自另一个作业/处理器的打印)。

4

1 回答 1

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();
于 2012-04-10T18:48:50.727 回答