.net - 操作系统如何调用用户计划的任务来执行?
问题描述
我不知道如何表达这个问题,但我会尽力而为。当我们实时安排一些抽象任务时,它是如何按时调用的(任务可以是任何被安排在某个时间点发生的事情,比如早上叫醒你的闹钟)?最低级别的软件会发生什么?例如在.NET WaitHandle.WaitOne(1000) 中,它是如何实现的?每个软件平台都使用一些操作系统调度程序(我不是在谈论线程之间的时间切片)来调度其任务吗?当系统时钟走一转时,它是否以某种方式对操作系统说“嘿,经过一转,增加你的系统时间!”。然后操作系统增加它的时间并告诉它的调度程序检查是否有一些事件计划在这个新的时间发生?或者调度程序在无限循环中的单独线程上运行,在每次迭代中检查系统时间,看看它是否有计划调用的东西?还是没有调度器,每个组件都自己运行无限循环?我认为这个想法在每个操作系统上都是相同的,但如果不是,我对 Windows 操作系统和 .NET 上发生的事情特别感兴趣。
亲切的问候,
解决方案
进程的状态由一组称为进程上下文的寄存器定义。这组寄存器包括只能在内核模式下访问的通用寄存器和系统寄存器的值。
大多数处理器定义了一个称为进程上下文块 (PCB) 的数据结构。PCB 上每个寄存器都有一个插槽。
为了使上下文从一个进程切换到另一个进程,操作系统将当前进程的寄存器保存在其 PCB 中,然后从新进程的 PCB 加载寄存器。
大多数处理器都有加载进程上下文和保存进程上下文指令,这可以一次完成。许多广泛使用的设计不佳的处理器可能需要多条指令来完成这些任务。
推荐阅读
- java - Android Java、FileProviders、getUriFromFile 失败并出现错误无法找到包含 /storage/1018-2710/Pictures/Sarx7IIJi-o.jpg 的已配置根目录
- html - Container of nav.logo move when i minimize screen
- php - 如何在 PHP 中的 ''00' - 'FF' 之间随机化一个十六进制值
- swift - 在 RealityKit 中启用手势
- r - 如何在忽略 r 中的 NaN 的同时使用 cumsum
- javascript - 在 redux 中调用多个 action 会重置之前的 action 状态
- python - 当我按下回车键时禁用自动完成功能
- vue.js - Nuxtjs 加载之前的内容
- javascript - 在 js.erb 文件中的 ruby 代码中包含一个 javascript 变量
- python - 使用 BeautifulSoup 查找特定类的第二个实例