关于在OS中运行的程序的并发问题

时间:2009-03-01 13:35:04

标签: concurrency

以下是我对操作系统中的并发性的了解。

为了在OS中运行多任务,CPU将为每个任务分配一个时隙。在执行任务A时,其他任务将“休眠”,依此类推。

这是我的问题:

我有一个计时器程序,可以计算键盘/鼠标的不活动状态。如果在15分钟内仍然不活动,将弹出屏幕保护程序。

如果并发理论如上所述,那么计时器将是不准确的?因为在OS中运行的每个程序都会有一些时间“休眠”,那么定时器程序也有机会“休眠”,但在现实世界中,时间并没有停止。

6 个答案:

答案 0 :(得分:1)

您可以使用操作系统中的服务来提供您不会尝试自己实现的计时器。如果代码必须运行简单以计算时间,就计算而言,我们仍将处于黑暗时代。

答案 1 :(得分:1)

在大多数操作系统中,您的任务不仅会在使用时间片时进入休眠状态,而且还会在等待I / O时(这对大多数程序来说更常见)。

像AnthonyWJones所说,使用操作系统的当前时间概念。

操作系统内核的时间片太短,不足以为屏幕保护程序引入任何明显的不准确性。

答案 2 :(得分:1)

我认为您的等待过程非常简单:

  1. activityTime =最后一次按键或鼠标移动的时间[来自OS]
  2. now =当前时间[来自OS]
  3. 如果现在> = activityTime后15分钟,启动屏幕保护程序
  4. 睡几秒钟并返回步骤1
  5. 由于步骤1和2使用操作系统而不是某种运行计数器,因此您无需关心在此活动期间是否随时中断。

答案 3 :(得分:0)

这可能与语言有关。在Java中,这不是问题。我怀疑所有语言都会在这里“做正确的事”。这是一个警告,无论如何这样的计时器并不是非常准确,通常你只能期望你的计时器至少在你指定的时间内睡觉,但可能会睡得更久。也就是说,当时间用完时它可能不是活动线程,因此稍后会恢复处理。

答案 4 :(得分:0)

参见例如http://www.opengroup.org/onlinepubs/000095399/functions/sleep.html

  

由于系统安排了其他活动,暂停时间可能比请求的时间长。

答案 5 :(得分:0)

您在sleep()中指定的时间是实时的,而不是您的流程使用的CPU时间。 (当程序休眠时,CPU时间约为0。)