int nanosleep(const struct timespec *req, struct timespec *rem);
struct timespec
{
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
这个函数功能是暂停某个进程直到你规定的时间后恢复,参数req就是你要暂停的时间,其中req->tv_sec是以秒为单位,而tv_nsec以毫微秒为单位(10的-9次方秒)。由于调用nanosleep是是进程进入TASK_INTERRUPTIBLE,这种状态是会相应信号而进入TASK_RUNNING状态的,这就意味着有可能会没有等到你规定的时间就因为其它信号而唤醒,此时函数返回-1,切还剩余的时间会被记录在rem中。
看到这里刚刚看到他的实现是:将其状态设置成TASK_INTERRUPTIBLE,脱离就绪队列,然后进行一次进程调度再由内核在规定的时间后发送信号来唤醒这个进程。
在我刚开始学习编程时候,那时候我也曾试图使上下2条指令相隔一定时间来运行,那时我的做法是在这2条指令之间加上了一个400次的循环。这也算一种实现方式,我管它叫作延迟,但没有利用进程休眠来实现的好。但有一种特殊情况,使用休眠就无法实现了。
我们知道这里肯定脱离不了时钟中断,没有时钟中断的计时我们是无法实现这一功能的。那么假设时钟种中断是10毫秒一次(这种CPU还是有的),那么我们可以看到在函数调用的时候我们可以以毫微秒来暂停,如果我tv_sec = 0, tv_nsec = 2,那么时钟中断一定是在10微秒后来唤醒这个进程的,如果非实时性任务差个8微秒估计没什么大不了,不幸的是LINUX支持实时性任务SCHED_FIFO和SCHED_RR.(我们以前谈到过)。
这时8微秒的差距就是不能容忍了,这是就不能靠休眠和时钟中断来实现了,这是linux采用就是延迟办法,执行一个循环来达到暂停的目的。
这2种实现的差别就是休眠实现的话,进程会进入休眠状态,而延迟实现的话,CPU是在执行循环不会进入休眠态。所以可以说虽然名为nanosleep,但它不一定会使进程进入sleep状态,当然不进入sleep 态的条件太苛刻(没多少人会写实时任务,且还是暂停要小于CPU时钟频率,加上现在CPU的频率是如此之高,这种情况一般发生在要求外设中断不小于某个特定值,而且应该是采用比较老的CPU或者嵌入式中)。
分享到:
相关推荐
`nanosleep`函数是Linux提供的一种更高级的延迟机制,它允许程序以纳秒为单位指定延迟时间,从而实现更精确的控制。本文将详细探讨`nanosleep`函数的使用、原理及其在实际编程中的应用。 `nanosleep`函数定义在`...
// Linux和Mac的usleep或nanosleep函数 // ... } } }; ``` 线程安全是跨平台线程编程中的另一个重要概念。在多线程环境中,当多个线程访问同一资源时,必须确保数据一致性。这可能需要使用互斥锁(如`std::...
11. **时间与日期**:C语言中的time()函数用于获取当前时间,strftime()格式化时间,sleep()和nanosleep()用于延时,difftime()计算两个时间点之间的差值。 12. **错误诊断与调试**:assert()宏用于在开发阶段检查...
然而,`sleep()`函数不能精确到毫秒级,如果需要更细粒度的延时,可以使用`nanosleep()`函数,它允许指定纳秒级别的延迟: ```c #include void delay(int seconds, int nanoseconds) { struct timespec req; ...
5. `time_nanosleep()`:类似于`sleep()`,但可以精确到纳秒,提供更细粒度的延迟控制。 6. `sleep()`:延迟代码执行若干秒,参数是秒数。 7. `show_source()`:显示指定文件的源代码,并进行语法高亮处理,有助于...
- **功能描述**:`time_nanosleep()` 函数用于延迟代码执行指定的纳秒数。这是一种更精确的延时方法,适用于需要更高精度控制的应用场景。 - **语法**: ```php time_nanosleep(int $seconds, int $nanoseconds): ...
`time_nanosleep()` 函数用于延迟脚本的执行指定的秒数和纳秒数。 **语法:** `time_nanosleep ( float $seconds , int $nanoseconds ) : bool` **参数:** `$seconds` 和 `$nanoseconds` 分别是以秒为单位和以纳秒...
而在Linux系统中,`sleep`函数的精度取决于`nanosleep`系统调用,它可以精确到纳秒级别。理论上,你可以请求任意小的延迟,但实际中由于硬件和内核调度的限制,可能会有一些最小的可接受间隔,这通常小于1毫秒。`...
- `sleep`、`time_nanosleep`、`time_sleep_until`:用于暂停脚本执行,实现延迟或定时任务。 - `uniqid`:生成一个唯一的标识符,常用于创建唯一ID。 - `usleep`:以微秒为单位暂停脚本,比`sleep`更精确。 2. ...
4. `time_sleep_until()` 和 `time_nanosleep()`:这两个函数用于延迟代码执行到指定的精确时间点,对于精确的定时任务很有价值。 5. `sleep()`:简单的睡眠函数,延迟代码执行指定的秒数。 6. `show_source()`、`...
在VxWorks下精确定时器的实现。VnWorks作为实时嵌入式系统,提供多样的定时接口函数: taskDelav/ WatchDog/ sleep/nanosleep/高精度时钟sysTimeStamp/辅助时钟
`time_nanosleep()` 函数类似于 `sleep()`,但它可以提供更精细的控制(纳秒级别)。这对于需要非常精确的定时器的应用场景非常有用。 #### sleep() `sleep()` 函数暂停脚本执行一定秒数。这通常用于简单地控制...
- `time_nanosleep()`:更精确的延迟函数,可指定秒和纳秒。 - `time_sleep_until()`:延迟执行直到达到指定的绝对时间点。 - `time_nanosleep()`:延迟执行若干秒和纳秒。 2. **字符串处理函数**: - `pack()`...
10. **时间管理**:`time()`, `ctime()`, `gmtime()`, `localtime()`等函数用于获取、转换和显示时间,`sleep()`, `nanosleep()`用于暂停进程执行。 通过学习这些系统调用,开发者可以编写更高效、低级别的程序,更...
- `time_nanosleep()`: 延迟代码执行若干秒和纳秒。 - `sleep()`: 延迟代码执行若干秒。 2. **二进制字符串处理函数**: - `unpack()`: 从二进制字符串对数据进行解包。 - `pack()`: 把数据装入一个二进制字符...
8. **函数 `sleep()` 和 `nanosleep()`**:这两个函数用于使程序暂停一段时间,`sleep()`接受秒为单位,`nanosleep()`则可以精确到纳秒。 在提供的`当前时间.cpp`源代码中,可能包含了如何使用这些函数来获取并打印...
`time_nanosleep()`函数提供更精确的睡眠功能,可以暂停到纳秒级别。这对于高性能计算或需要精确时间控制的应用场景非常重要。 #### 6. sleep() `sleep()`函数是另一种暂停脚本执行的方式,但它是以秒为单位。这是...
`nanosleep` 使进程睡眠指定的时间 - **功能**: 让进程休眠一定时间。 - **应用场景**: 控制进程执行节奏。 ##### 17. `nice` 改变分时进程的优先级 - **功能**: 调整进程的nice值。 - **应用场景**: 调整进程的...