c - 如果计数值大于它可以容纳的值,CPU 计时器如何工作?
问题描述
如果我没记错的话,Csleep
函数是使用 CPU 定时器的地方之一。Linux 将设置一个计时器并从scheduler
. 定时器计数down
,一旦它命中0
它将中断 CPU,操作系统将重新添加进程到调度程序。我对此是否正确?
如果是这样,那么如果定时器值大于计数器硬件可以处理的位数会发生什么?假设计数器有一个最大23
位,我需要一个24
位值(即我需要sleep
很长时间)。
编辑:
另外,如果我们同时进行多个睡眠,超过 CPU 的计数器,该怎么办?
解决方案
睡眠功能是使用 CPU 定时器的地方之一
不,Linux 内核实现了一个调度器。当您调用nanosleep()
(Linux 上的 GNU C 库nanosleep()
用于实现sleep()
)时,您执行 nanosleep syscall;这会导致内核在所需的持续时间过去之前不调度该任务(通常是用户空间进程中的线程),或者使用该任务将信号传递给安装的用户空间信号处理程序而没有 SA_RESTART 标志(在这种情况下,系统调用返回-EINTR
)。
不过,在微控制器上,比如 Arduino 或类似设备,您可以使用计时器实现睡眠。
假设您有一个计时器工具,它可以从任何地方计数TIMER_MAX
到零,即休眠 1 到 之间的任意数量的时间单位TIMER_MAX
。如果你想睡更长的时间,你可以TIMER_MAX
间隔地这样做:
/* Timer-based sleep function; returns the number of units slept,
at most 'units'. Can only sleep between 1 and TIMER_MAX, inclusive. */
static unsigned short timer_sleep(unsigned short units);
void sleep(unsigned long duration)
{
/* "long" sleep(s) */
while (duration >= TIMER_MAX)
duration -= timer_sleep(TIMER_MAX);
/* "short" sleep(s) */
while (duration > 0)
duration -= timer_sleep(duration);
}
timer_sleep(duration)
如果timer_sleep(u)
总是返回,您可以只用一个替换后者的 while 循环u
。如上所写,使用两个while循环,只要timer_sleep(u)
returnu
或更少,sleep就会工作。
推荐阅读
- javascript - 如何在水平滚动上添加平滑滚动效果?
- reactjs - 基本 Gatsby Shopify 示例缺少布局
- airflow-scheduler - Apache 气流与 puckle 气流图像
- cuda - CUDA 抱怨 nvcc 是一个“不受支持的工具链”
- python - Pandas 字符串下标在 modin 中不起作用(以及有关将 pandas 代码转换为 modin 的相关问题)
- react-native - 可能未处理的 Promise Rejection (id:0) TypeError: undefined is not an object (evalating 'ImagePicker.Permissions.askAsync)
- javascript - 需要使用 JavaScript 选择所选下拉列表的文本
- javascript - Sequelize.js 返回关联表的旧值
- git - 如何在不依赖 CI 内部版本号的情况下生成发布版本号?
- javascript - WebdriverIO Window.datalayer 显示窗口未定义我该如何解决这个问题