1

我在使用 C 编程的操作系统课上为作业作业编写 Pseduocode 时遇到了一些麻烦。

您将实现一个生产者-消费者程序,其中包含 N 个元素、P 个生产者线程和 C 个消费者线程的有界缓冲区队列(N、P 和 C 应该是程序的命令行参数,以及三个附加参数 X、Ptime 和Ctime,如下所述)。 每个
生产者线程应该将 X 个不同的数字排入队列(在每次调用 Enqueue 之间旋转等待 Ptime*100,000 个周期)。每个消费者线程
都应该从队列中取出 P*X/C 项(在每次调用 Dequeue 之间旋转等待 Ctime*100,000 个周期)。
主程序应该创建/初始化有界缓冲区队列,打印时间戳,产生 C 消费者线程和 P
生产者线程,等待所有线程完成,然后打印另一个时间戳和执行持续时间。

我的主要困难是通过旋转等待变量乘以 100,000 来理解我的教授的意思。我将令我困惑的部分加粗。

我知道时间戳将用于打印每个线程之间的差异。我们目前正在使用信号量并实现同步。对上述查询的任何建议将不胜感激。

4

3 回答 3

3

我猜这意味着忙着等待;反复检查循环条件并在紧密循环中消耗不必要的 CPU 功率:

while (current_time() <= wake_up_time);

理想情况下,可以使用一些东西来暂停你的线程,直到它被调度程序从外部唤醒(这样 CPU 等资源就可以转移到其他地方):

sleep(2 * 60 * 1000 ms);

或者至少放弃一些CPU(即不要那么紧):

while (current_time() <= wake_up_time)
    sleep(100 ms);

但我猜他们不希望您手动调用调度程序,暗示操作系统(或您的线程库)现在是进行上下文切换的好时机。

我不确定什么是周期;在汇编中,它们可能是 CPU 周期,但鉴于您的问题被标记为 C,我敢打赌它们只是循环迭代:

for (int i=0; i<Ptime*100000; ++i); //spin-wait for Ptime*100,000 cycles

尽管询问谁发布了作业总是最安全的。

于 2012-11-06T04:54:36.023 回答
2

忙等待旋转是一种技术,在该技术中,进程反复检查条件是否为true,例如键盘输入是否可用,或者锁是否可用。

所以任务说在产生下一个元素之前等待Ptime*100000时间,并在条件为后将 x 个不同的元素排入队列

类似地,每个消费者线程都应该P*X/C从队列中取出项目,并在每次消费项目后等待 ctime*100000

于 2012-11-06T04:51:49.550 回答
1

我怀疑你的教授是个彻头彻尾的笨蛋——实际上是在要求最糟糕的“忙着等待”技术:

int n = pTime * 100000;
for ( int i=0; i<n; ++i) ; // waste some cycles.

我还怀疑他仍然使用翼龙大腿骨作为拐杖,有一个非常好的(干燥的)洞穴,还有一个有大块秃头的伙伴……O / S家伙往往是这样的。它与凉爽的胡须相得益彰。

难怪他那些彻头彻尾的现代学生会误解他。他需要(重新)学习如何在 TUNE 中咕哝。

干杯。基思。

于 2012-11-06T05:03:37.517 回答