- 浏览: 1404083 次
- 性别:
- 来自: 火星
文章分类
最新评论
-
aidd:
内核处理time_wait状态详解 -
ahtest:
赞一下~~
一个简单的ruby Metaprogram的例子 -
itiProCareer:
简直胡说八道,误人子弟啊。。。。谁告诉你 Ruby 1.9 ...
ruby中的类变量与类实例变量 -
dear531:
还得补充一句,惊群了之后,数据打印显示,只有一个子线程继续接受 ...
linux已经不存在惊群现象 -
dear531:
我用select试验了,用的ubuntu12.10,内核3.5 ...
linux已经不存在惊群现象
在内核中有3个不同的时间:
Wall time(real time), Process time和Monotonic time.
Wall time,也就是rtc时钟。
Process time,进程执行的时间。
Monotonic time,也就是系统从boot后到当前的时间。
表示时间的数据结构:
其中第三个最好,因为他能精确到纳秒。
上面的所能表示的是秒,我们有时需要更直观的表示,因此就有下面的数据结构;
clock_getres这个函数得到不同时钟的精度,也就是时钟间隔:
我的amd的cpu下,输出结果是这样的:
其中4000250刚好是0.04秒,也就是说x86的架构的系统时钟频率为250hz。。
得到当前的时间的函数:
通过结果可以看出4个时钟的不同含义。比如CLOCK_REALTIME我们可以看到结果就是从1970年以来所经过的秒数。。
设置时间的函数和get差不多:
这里要注意,在大部分系统我们设置时钟,只能设置CLOCK_REALTIME。。
这里还有一个更高级的函数:
这个函数用来同步内核的时钟。具体的用法可以去看man。。
sleep的4个函数:
sleep和usleep区别不大,一个是秒,一个是毫秒而已。
nanosleep和他们的区别是它使用纳秒,并且他不是用信号来实现的,因此建议使用nanosleep,而不要使用sleep和usleep。
而最后一个函数我们可以选择所取的时钟。。
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
,恩,不过有了nanosleep的话就没必要用select了吧。。
Wall time(real time), Process time和Monotonic time.
Wall time,也就是rtc时钟。
Process time,进程执行的时间。
Monotonic time,也就是系统从boot后到当前的时间。
表示时间的数据结构:
typedef __timer_t timer_t; struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; struct timespec { __time_t tv_sec; /* Seconds. */ long int tv_nsec; /* Nanoseconds. */ };
其中第三个最好,因为他能精确到纳秒。
上面的所能表示的是秒,我们有时需要更直观的表示,因此就有下面的数据结构;
struct tm { int tm_sec; /* Seconds. [0-60] (1 leap second) */ int tm_min; /* Minutes. [0-59] */ int tm_hour; /* Hours. [0-23] */ int tm_mday; /* Day. [1-31] */ int tm_mon; /* Month. [0-11] */ int tm_year; /* Year - 1900. */ int tm_wday; /* Day of week. [0-6] */ int tm_yday; /* Days in year.[0-365] */ int tm_isdst; /* DST. [-1/0/1]*/ #ifdef __USE_BSD long int tm_gmtoff; /* Seconds east of UTC. */ __const char *tm_zone; /* Timezone abbreviation. */ #else long int __tm_gmtoff; /* Seconds east of UTC. */ __const char *__tm_zone; /* Timezone abbreviation. */ #endif };
clock_getres这个函数得到不同时钟的精度,也就是时钟间隔:
int clock_getres(clockid_t clk_id, struct timespec *res);
#include <stdio.h> #include <time.h> int main() { clockid_t clocks[]= { CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, (clockid_t) -1, }; int i; for(i=0;clocks[i] != (clockid_t) -1;i++) { struct timespec res; int ret; ret = clock_getres(clocks[i],&res); if(ret) perror("clock_getres"); else printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec); } return 1; }
我的amd的cpu下,输出结果是这样的:
clock = [0],sec = [0],nsec = [4000250] clock = [1],sec = [0],nsec = [4000250] clock = [2],sec = [0],nsec = [1] clock = [3],sec = [0],nsec = [1]
其中4000250刚好是0.04秒,也就是说x86的架构的系统时钟频率为250hz。。
得到当前的时间的函数:
extern time_t time (time_t *__timer) __THROW; int gettimeofday(struct timeval *tv, struct timezone *tz); int clock_gettime(clockid_t clk_id, struct timespec *tp);
#include <stdio.h> #include <time.h> int main() { clockid_t clocks[]= { CLOCK_REALTIME, CLOCK_MONOTONIC, CLOCK_PROCESS_CPUTIME_ID, CLOCK_THREAD_CPUTIME_ID, (clockid_t) -1, }; int i; for(i=0;clocks[i] != (clockid_t) -1;i++) { struct timespec res; int ret; ret = clock_gettime(clocks[i],&res); if(ret) perror("clock_getres"); else printf("clock = [%d],sec = [%ld],nsec = [%ld]\n",clocks[i],res.tv_sec,res.tv_nsec); } return 1; }
通过结果可以看出4个时钟的不同含义。比如CLOCK_REALTIME我们可以看到结果就是从1970年以来所经过的秒数。。
设置时间的函数和get差不多:
int stime(time_t *t); int settimeofday(const struct timeval *tv, const struct timezone *tz); int clock_settime(clockid_t clk_id, const struct timespec *tp);
这里要注意,在大部分系统我们设置时钟,只能设置CLOCK_REALTIME。。
这里还有一个更高级的函数:
#include <sys/timex.h> int adjtimex(struct timex *buf);
这个函数用来同步内核的时钟。具体的用法可以去看man。。
sleep的4个函数:
sleep usleep int nanosleep(const struct timespec *req, struct timespec *rem); long sys_clock_nanosleep (clockid_t which_clock, int flags, const struct timespec *rqtp, struct timespec *rmtp);
sleep和usleep区别不大,一个是秒,一个是毫秒而已。
nanosleep和他们的区别是它使用纳秒,并且他不是用信号来实现的,因此建议使用nanosleep,而不要使用sleep和usleep。
而最后一个函数我们可以选择所取的时钟。。
评论
3 楼
simohayha
2009-01-05
pselect也能支持到纳秒的说。。。不过貌似有些unix平台不支持它。。
2 楼
simohayha
2009-01-05
seen 写道
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
,恩,不过有了nanosleep的话就没必要用select了吧。。
1 楼
seen
2009-01-05
那啥,usleep/sleep可以用select来模拟,更准时
不过10毫秒以下的精度是达不到的
不过10毫秒以下的精度是达不到的
发表评论
-
gcc的几个自动优化
2009-11-10 00:44 5155我的gcc版本是4.4.1 先来看const和define以 ... -
gdb学习笔记(一)
2009-10-17 14:11 11766这里只是一个摘要。具体的细节还需要去看manual。 1 ... -
ydb的内存模型
2009-09-06 18:02 2010阿宝同学推荐了这个东 ... -
glibc中strlen的实现
2009-08-04 09:10 4534glibc中的strlen的实现主要的思想就是每次检测4个字节 ... -
libevent源码浅析(四)
2009-05-15 23:02 4434最近刚刚一个项目自己用libevent,因此这几天又把libe ... -
libevent源码浅析(三)
2009-03-17 00:08 4602这次我们来看libevent的信号的处理。 在libeven ... -
libevent源码浅析(二)
2009-02-22 00:11 4083我们来看下libevent的定时器的实现 在libevent ... -
libevent源码浅析(一)
2009-02-14 13:23 7450这里分析的是libevent-1.4.9。 PS:前面还看了 ... -
libev简单使用介绍
2008-12-30 09:52 11581更详细的用法请看他的 ... -
linux下的elf结构
2008-12-12 00:20 5200可以看到链接器和加载器看待elf是完全不同的,链接器看到 ... -
php的c扩展
2008-12-07 18:24 4597在php中最核心的一个数据结构就是这个: typedef u ... -
linux下的管理内存相关的函数
2008-11-27 00:56 4497malloc的实现,在linux下的实现是这样的,当所需 ... -
linux下的数据对齐
2008-11-25 12:15 3660数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系。当 ... -
linux下检测ip冲突
2008-11-16 20:18 8200原理其实很简单,那就是广播一个arp包,然后recv,如果没有 ... -
今天碰到的一个问题
2008-10-29 22:33 1294将位图用 bmptopnm 转成pcl6的打印语言,然后直接c ... -
ftruncate和msync
2008-10-23 22:10 3522int ftruncate(int fd, off_t le ... -
GUN C正则表达式
2008-09-25 23:47 6198最近项目中要处理文本,因此就用了gun的正则表达式,它是pos ... -
看代码看的头晕
2008-09-06 01:04 1890最近工作需要在看ghostscript的代码,看得我头晕眼花, ... -
[转帖]MISRA--作为工业标准的C编程规范
2008-08-21 13:19 2841本文档转贴自孟岩的blog ... -
代码大全读书笔记1
2008-04-26 19:16 3830这么好的书,觉得写点东西,记录一下比较好。 4.1选择编程语 ...
相关推荐
根据提供的文件信息,我们可以深入探讨Linux环境下与时间处理相关的几个关键函数:`asctime()`, `ctime()`, `gettimeofday()`, 和 `gmtime()`。这些函数不仅在Linux中可用,在Windows系统中也有相应的实现,因此了解...
Linux Real-Time是一种经过优化的Linux版本,特别针对实时性能进行了改进,能够在确定性的时间内处理任务,这对于需要即时响应的嵌入式系统至关重要。 首先,我们来了解一下Linux Real-Time的优势。与传统的Linux...
Linux时间API提供了丰富的接口供应用程序处理时间,如`gettimeofday()`、`time()`、`clock_gettime()`等。这些函数允许程序员获取系统时间、进程时间或者高精度时间戳。 2. **`gettimeofday()`**: 这个函数返回...
### Linux 应用程序 Connect Timeout 原因详解 #### 背景介绍 在Linux环境中,当应用程序遇到“connect timeout”错误时,这通常意味着数据传输或接收过程中出现了问题,尤其是在TCP/IP通信中。此类错误往往使得...
"linux-time.rar_Time"这个压缩包可能包含了关于Linux内核和用户空间中时间API实现的详细代码和文档,其中"linux-time.c"是源代码文件。下面将详细讨论Linux时间API的重要性和其主要功能。 1. **时间API的重要性** ...
因此,Linux引入了软中断来处理网络接收事件,尤其是针对高负载下的小包处理场景。 #### 三、软中断处理与驱动 ##### 3.1 软中断处理 在Linux内核中,NET_RX_SOFTIRQ是一种专门用于处理网络接收事件的软中断。它...
《Linux For Embedded And Real-Time Applications》这本书深入探讨了Linux操作系统如何被有效地应用于嵌入式系统以及实时系统中。首先,我们需要理解什么是嵌入式系统和实时系统。 **嵌入式系统**是指那些专门设计...
总结来说,Linux内核中的skb处理流程是一个复杂而精细的过程,涉及了网络协议栈的各个层次,确保了数据包从网络到应用的正确传输。通过理解这一流程,开发者能更好地优化网络应用性能,排查问题,以及实现特定的网络...
本文将深入探讨如何优化Linux下的socket连接数以及如何调整sysctl参数,特别是time_wait状态的影响。这有助于提升服务器处理大量并发请求的能力,确保服务的稳定性和响应速度。 首先,我们需要了解socket连接数的...
这些补丁优化了Linux内核的延迟,减少了中断处理时间,提高了系统的确定性和响应速度。 #### 内存管理 Linux提供了先进的内存管理机制,能够有效利用有限的物理内存,通过虚拟内存技术和缓存策略,即使在资源受限...
在Linux系统中,处理高并发I/O事件时,select和epoll是两种常见的技术。本文将详细介绍这两种技术,以及它们在处理大量并发连接时的特点和优势。 首先,我们来看看`select`函数。`select`是一种古老的I/O多路复用...
在Linux服务器环境中,当TCP/IP连接关闭后,服务器端的...通过上述方法,可以有效地管理和减少Linux服务器上的TIME_WAIT状态连接,优化服务器性能,尤其是对于处理大量并发连接的服务器,如Squid,这些调整尤为重要。
本示例中的"linux下USB驱动Sample代码"就是一种用户空间驱动的实现,它允许用户在不涉及内核编译的情况下,对USB设备进行操作。这种驱动方式对于开发人员来说更加灵活,因为不需要处理复杂的内核模块编译和加载过程...
8. **实时性能优化**:讨论如何测量和提高Linux系统的实时性能,包括调度策略、中断处理和任务优先级。 9. **安全性与可靠性**:讨论在嵌入式系统中确保数据安全和系统可靠性的方法,如权限管理、防火墙和固件更新...
在Linux环境下,使用C++获取和设置系统时间是一项常见的任务,尤其在开发系统级程序时。本文将详细探讨如何利用C++在Linux中操作时间。 首先,我们需要了解Linux中的时间模型。在Linux中,时间主要分为两类:系统...
- **定时器**:可以使用Linux的定时器机制(如`timer_create()`、`timer_settime()`等)来设置定时发送数据。 - **信号处理**:定时器触发时,通常会产生一个信号,通过注册信号处理函数,可以在接收到信号时执行...
Linux内核协议栈中的TCP协议在处理连接关闭时,会进入一个特定的状态叫做time_wait。这个状态对于确保TCP连接的可靠性和避免旧连接与新连接混淆至关重要。在time_wait状态下,连接不会立即关闭,而是等待一段时间,...
Linux提供了多种获取时间和日期的方法,包括 `time()`、`gettimeofday()` 等。 **2.4 信号处理** 信号是软件中断机制,用于通知进程发生某些事件。Linux提供了信号处理机制,包括发送信号、捕捉信号等。常见的信号...