Concurrency 关于运行在操作系统中的程序的并发性问题

Concurrency 关于运行在操作系统中的程序的并发性问题,concurrency,Concurrency,以下是我对操作系统中并发性的了解 为了在操作系统中运行多任务,CPU将为每个任务分配一个时间段。在执行任务A时,其他任务将“睡眠”等等 我的问题是: 我有一个计时器程序,可以计算键盘/鼠标的不活动。如果在15分钟内继续不活动,屏幕保护程序将弹出 如果并发理论如我前面所述,那么计时器将不准确?因为在操作系统中运行的每个程序都会有一些时间“睡眠”,那么计时器程序也有机会“睡眠”,但在现实世界中,时间不会停止。您将使用操作系统中的服务来提供一个您不会尝试自己实现的计时器。如果代码必须运行简单的计算时间

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

为了在操作系统中运行多任务,CPU将为每个任务分配一个时间段。在执行任务A时,其他任务将“睡眠”等等

我的问题是:

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


如果并发理论如我前面所述,那么计时器将不准确?因为在操作系统中运行的每个程序都会有一些时间“睡眠”,那么计时器程序也有机会“睡眠”,但在现实世界中,时间不会停止。

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

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

参见示例

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


在大多数操作系统中,您的任务不仅在其时间片被使用时处于休眠状态,而且在等待I/O时(这在大多数程序中更为常见)

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


操作系统内核的时间片太短,不会给屏幕保护程序带来任何明显的误差。

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

  • activityTime=上次按键或鼠标移动的时间[从操作系统]
  • 现在=当前时间[从操作系统]
  • 如果现在>=活动时间后15分钟,启动屏幕保护程序
  • 睡眠几秒钟,然后返回步骤1

  • 由于步骤1和步骤2使用的是操作系统而不是某种运行计数器,因此您不必在意在此活动期间是否随时被中断。

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