推荐一篇文章<<Time, Clocks, and the Ordering of Events in a Distributed System>>

简述: 分布式系统包含一堆进程(processes),进程间通过交换消息(message)彼此通讯。在分布式系统中,有时无法确定两个事件(event)的先后次序,所以先发生(happended before)关系在系统中只能是偏序(partial ordering)。分布式系统中的问题很多源于人们尚未意识到这点及其涵义。

如前所述,假定系统由进程组成;而进程包含一个事件序列。即:若a先于b发生,则a在序列中比b靠前。因此在单一进程中的事件,其“先发生”是全序(total ordering)关系。假定进程收发消息也是事件,则可以用符号”->”指代”先发生”关系如下:

定义:

(1) 若a和b是同一进程中的事件,a比b先发生,则a->b;

(2) 若进程一发送一消息为事件a,进程二接收此消息为事件b,则a->b;

(3) 若a->b 和 b->c 则 a->c;

两事件a与b, 若a->b 与 b->a皆不成立, 则说二者同时发生 (concurrent)。

假定a->a不成立, 即”先发生”关系是非自反的(irreflexive).

image

上面图1表现时空关系, 横向是空间,纵向为事件, 先发生事件标记在下,波浪线为消息。例如如图我们有: p1->r4;而p3和q3则为同时关系。若您熟悉狭义相对论的时空表示,则看这幅图也不会觉得陌生。相对论中,事件的序(ordering)由能发送的消息定义(message that could be sent),而在此处,我们只考虑实际发送的消息(message that are sent)。

逻辑时钟: 

现在引入逻辑时钟:为进程Pi定义时钟Ci, 它为进程中的每个事件a都赋予一个数字Ci[a].

对任意事件a和b: 若a->b 则C[a]  <  C[b]

注意反向未必成立.

易见:

C1. 若a和b是同一进程Pi的两个事件,且a先于b发生,则Ci[a]  <  Ci[b].

C2. 若Pi发送一消息为事件a, Pj接收同一消息为事件b, 则Ci[a]  <  Cj[b].

(未完待续)

转载于:https://www.cnblogs.com/foamliu/archive/2011/03/07/1976481.html

头文件 time.h 包含了许多与时间相关的函数和类型,下面是一些常用的函数及其用法: 1. time() 函数原型:time_t time(time_t *t) 函数作用:获取当前时间的时间戳,单位为秒。 参数说明:t 为指向 time_t 类型变量的指针,如果不为 NULL,则函数会将获取到的时间戳存储到 t 所指向的变量中。 示例代码: ``` time_t now; time(&now); printf("当前时间戳: %ld\n", now); ``` 2. localtime() 函数原型:struct tm *localtime(const time_t *timep) 函数作用:将时间戳转换为本地时间(年、月、日、时、分、秒等),返回一个指向 struct tm 类型的指针。 参数说明:timep 为指向 time_t 类型变量的指针,指向需要转换的时间戳。 示例代码: ``` time_t now; time(&now); struct tm *local = localtime(&now); printf("当前本地时间: %d年%d月%d日 %d:%d:%d\n", local->tm_year+1900, local->tm_mon+1, local->tm_mday, local->tm_hour, local->tm_min, local->tm_sec); ``` 3. strftime() 函数原型:size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 函数作用:将 tm 结构体类型的时间转换为指定格式的字符串。 参数说明: - str:指向存储格式化字符串的字符数组的指针; - maxsize:str 指向的字符数组的大小; - format:指定输出格式的字符串; - timeptr:指向 tm 结构体类型变量的指针。 示例代码: ``` time_t now; time(&now); struct tm *local = localtime(&now); char buf[100]; strftime(buf, sizeof(buf), "当前时间为:%Y-%m-%d %H:%M:%S", local); printf("%s\n", buf); ``` 4. clock() 函数原型:clock_t clock(void) 函数作用:返回程序从启动到当前时刻的 CPU 时间,单位为时钟周期(clock tick)。 参数说明:无。 示例代码: ``` clock_t start, end; start = clock(); // do something end = clock(); double duration = (double)(end - start) / CLOCKS_PER_SEC; printf("程序执行时间为:%f 秒\n", duration); ``` 注意:CLOCKS_PER_SEC 表示每秒钟 CPU 时钟周期数,它是 time.h 头文件中定义的常量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值