我先说说同步的概念。
同步的前提是并行,或者同时或者并发。没有并行,不会涉及到同步。有时候,我们把同步看作一个名词而不是动词,那么导致同步的那种动作或者方式叫做同步化。在我这儿,同步或者是名词或者是动词,依赖于上下文。
我举例子来说明同步是什么,然后再说我们如何实现同步。
两个人,A和B,A邀请B去帮他到d地去搬一块大石头,石头很大,一个人搬不动。B同意了。B告诉A说他不知道d地在哪儿,让A领着他去。让A第二天早晨到 B家门口等着B出来,然后一起去。A走路的速率比较高,而B恰恰相反。从B家门口到d地有两个拐弯,用b和c表示罢。为了叙述方便,我把B家门口用a表示。现在总结一下涉及的对象。a,b,c,d四个地点。A,B两个人。A首先到达a地,一直等到B也出现在a地。由于A走的快,所以A先到达b地,然后等待。因为如果不等待B也到达b地,B就到达不了d地了。我们就说:a,b,c,d是A,B的同步点。A和B是两个Actor,如果他们没有同步点,那么他们就没有什么关系。
当然,上面只是一个例子。我们现在要推广一下同步点的概念。从上面的描述看出,同步点是Actor共同到达的点。其实同步点的概念比这个广一些。想象一下接力赛,交换接力棒的地方也是同步点。互斥也是一种同步,它的等待条件就是没有任何别的actor到达。从一个Actor的角度来看,所谓同步点就是一个要等待某些条件满足的那个点。之所以采用同步点的方式而不是时时同步——时时同步可以想象两个恋人压马路,他们总是时时同步 ——是因为:一、时时同步的代价太高,二、时时同步不可能真正实现,所谓的时时同步只是同步点设计的比较致密的同步点同步而已。
再重复一次:同步点就是等待某些条件满足的点。这里的某些条件就是某些actor进入某种状态。
那现在的问题是:怎么个等法?怎么判断某些条件已经满足了?简单直觉的想法就是:不断的查询actor的状态,直到它满足为止。这个等待过程叫做阻塞(Block)。这是几乎所有别的办法的基础。有时候,我们讨厌阻塞,回想一下A和B去搬那块石头,A不断的等B使得A的心情非常郁闷。所以A采用了一个非常聪明的办法,在等待B的时候玩玩手机上的俄罗斯方块。B来到的时候,对着A大叫一声,打断A的游戏,于是又开始走了。当然A可能非常聪明,并不立即停止自己的游戏,尤其是正好到了紧要关头,他让B先等一会儿,等游戏结束了再一起走。或者A并不等着B喊一嗓子,而是玩一会儿,就看看B是不是到了,如果没有再玩一回,如果到了就继续。这个似乎没有喊一嗓子那么好,因为毕竟我们可能看过好多回,而且,经常是对方到了跟前一会儿以后了才发现。不过无论如何,我们把这种等待的方法叫做非阻塞,说穿了就是我并不在这儿傻等,我干会别的活,等到条件满足了,对方通知一下我就行了。有时候,我们把这种方式叫做异步方式。实际上,根据最后是不是等待B的通知,我们可以更细的区分成两种,不等待B通知的那种叫做非阻塞,而等待B通知的那种叫做异步(Note:借自集成电路的两个术语描述这两种方式:电平触发方式和边沿触发方式)。异步方式看起来比非阻塞方式更讨人喜欢一些,跟阻塞方式相比就更讨人喜欢了。
但是,上面的描述都是非计算机术语的,这让人觉得不够安全,觉得很难落实到计算机环境中。毕竟不断地查看B是不是走到跟前了,或者B走到跟前打断A玩游戏,对人来说都不是问题,可是计算机也没有眼睛,也不会大喊一声啊。
首先提一个概念,叫信号灯(或者更计算机化的叫做信号量,Semaphore)。它其实就是actor状态的外在表现。计算机没有眼睛,不能看见是否有人靠近,可是,我们可以让那个人来的时候,修改这个Semaphore的值,如果发现这个值改变了,就证明人已经来了。就像如此:
wait until semaphore is fire;
process ....
while (semaphore != fire)
;
process ....
实际上,有了信号灯这样的东西,各个actor之间就可以进行各种方式的通信了。不过需要注意的是,信号灯对于互相需要同步的actor来说,都要是可以访问的。也就是说,这些actor们都可以读写它。
有了信号灯这个概念,对于同步也就没有什么太多的问题了。但是信号灯是一个非常初级的同步概念,为了实现更复杂的同步,需要付出很多脑力才能设计出比较合用的信号灯通信机制,而且容易出错,所以,人们在信号灯的基础上,开发了很多高级原语,我就不描述了。
信号灯其实是给了actor一个表达自己状态,或者检查别的actor状态的一个机制。有时候我们把信号灯叫做事件或者有更多的名称比如Mutex什么的。
但是刚才有个问题没有深入讨论,那就是打断。还记得B打断A玩俄罗斯方块吧。对于俄罗斯方块,打断也就算了,如果A正在干一些比较重要的事情,这时候被打断了呢?如果没有什么好的处理措施,轻则白做了(早知道白做,还不如不做呢,阻塞着等就行了,毕竟非阻塞还浪费体力一些),重则逻辑错误了,比如:正在做氰化钾试验,结果突然被打断,氰化钾的瓶盖没有盖上,完了,出事了:)。好在计算机不做氰化钾试验,不过它似乎经常打开文件啥的,这个也不好啊。影响后面的动作了。所以,打断的时候,并不是毛手毛脚的去接手新的活,而是把现在的活的现场保留下来,再去干新的活。等到新活处理完了,回过头来继续原来的。
幸好,操作系统已经为我们提供了保存现场,以及以后恢复现场的那种机制了。不过,它并不是慈善家,它的目的也是盈利,所以我们要付出代价才能获得它提供的现场管理的服务。我们不能自己去搞定那些看起来非常自然的打断机制了,我们得缴纳线程税。
现在,按照现实,我提一下现在各种实现同步的现实机制。
低级的就是信号灯,在不同的os中名称各有不同,同时它们的可见范围(是全系统的进程可见?还是进程中的线程可见?)也各不相同。比如Windows系统的 Event,Semaphore,Mutex以及Linux下的高性能的futexes(fast userspace mutexes)。
高级一点的包括:最出名用的最广泛,限制最多,性能最低的是一个叫做select的机制。后来UNIX界发展出来poll机制,改进了select的监听数量,但别的都没有改变。后来有了改进它们的/dev/poll,kqueue,epoll,realtime signal,signal per fd,其中,kqueue以及/dev/poll是level trigger的,kqueue,epoll,realtime signal,signal per fd是edge trigger的。也就是说kqueue可以支持level和edge trigger。当然,还有发展了多少年雷声大雨点小的aio。Windows平台上包括Overlapped IO和IOCP。分别对应于level trigger和edge trigger,不过,IOCP会阻止(拒绝)某些请求,以保证线程数目的常量性。
最后,我们同步的对象也即线程,还有相关的线程调度机制,也在不断地发展也完善中。线程按照实现的方式分为核心级别和用户级别两种,它们的对应得叫做1:1和M:N两种。逻辑上,用户级线程性能高,核心级的线程对于block更容易处理。线程调度的机制现在比较高性能的就是Scheduler Activations模型了,它结合了核心和用户的优点。不过实现的似乎不是很多。顺便说一下,Windows下的线程调度似乎不是很稳定,受到运行时长和线程数目的影响,不知道什么原因。
关于同步,其实大头是各种高级的同步机制,高度的同步模型,但是由于我这是免费的,就不讨论那些了。
分享到:
相关推荐
在通信系统中,帧同步是数据传输过程中的关键步骤,它确保接收端能够正确地分割接收到的连续数据流,从而正确解码和处理信息。本文将深入探讨帧同步的概念,以及如何使用MATLAB实现三种不同的帧同步算法。 首先,...
在通信系统中,帧同步是确保接收端正确解码数据流的关键步骤。本文将深入探讨三种常见的帧同步算法,并提供MATLAB代码实现,适合本科毕设项目参考。 1. **滑动窗口同步(Sliding Window Synchronization)** 滑动...
虚拟同步机(Virtual Synchronous Generator, VSG)技术是一种基于电力电子技术的新型电力系统稳定控制策略,它模仿传统同步发电机的行为,为可再生能源并网提供了更为稳定和可靠的解决方案。在现代电力系统中,尤其...
永硕网盘同步助手 1.全自动同步网盘目录信息 2.支持智能目录规则分析 3.主目录完美克隆 4.批量分析重复数据 5.批量删除过期数据 6.全自动同步根目录 (新目录根据规则自动创建同步) 7.支持同步蓝奏云网盘数据 8....
麒麟虚拟机同步器1.5p版是一款专为虚拟机设计的同步工具,它主要针对的是麒麟操作系统在虚拟环境下的应用。麒麟操作系统是中国自主研发的一款开源操作系统,基于Linux内核,旨在提供安全、稳定、高效的计算环境。这...
为了解决这个问题,有几种同步技术被广泛使用,包括电平同步器、边沿同步器和脉冲同步器。以下将详细讨论这些同步器的工作原理、设计方法以及它们在Verilog中的实现。 首先,电平同步器(Level Synchronizer)是最...
麒麟虚拟机同步器2.2p版是一款专为麒麟操作系统设计的高效虚拟机同步工具,旨在提高多虚拟机环境下的协作效率和数据一致性。这款软件能够实现不同虚拟机实例之间的实时数据同步,确保用户在各个虚拟环境中都能获取到...
在IT行业中,数据同步是一项关键任务,特别是在大数据处理和企业级应用中。本文将深入探讨如何使用Kettle工具实现MySQL数据库之间的增量同步。Kettle,也称为Pentaho Data Integration (PDI),是一款强大的ETL(提取...
在当前的通信网络中,分组网络的同步技术扮演着至关重要的角色。随着3G/4G网络和全IP化趋势的发展,分组网络不仅要承载传统的TDM业务,还需要支持新型的无线业务,这对其同步性能提出了更高要求。本文将深入探讨分组...
输入数据data为8 bit并行数据流,基本结构为数据帧,帧长为10字节,帧同步字为H“FF”。 1、搜索出数据流中的帧同步字信号,并给出帧同步标志。 2、系统工作开始后,要连续3次确认帧同步字进入锁定状态后才输出帧...
"键鼠多开同步器"是一种专为游戏多开或者多任务操作设计的软件工具,它的主要功能是实现多个窗口间键盘和鼠标操作的同步。这意味着用户在一个游戏或应用程序中的输入,可以同时被其他打开的相同程序窗口所接收,极大...
操作系统实验四的进程同步实验是深入理解并发协作进程同步与互斥的重要实践环节。通过这个实验,学生可以直观地观察到并发进程如何进行同步与互斥操作,从而增强对这两个核心概念的认识。实验报告旨在分析经典进程...
在现代生活中,日历同步成为了工作和生活组织的重要工具,特别是在多设备间切换时。本文将详细介绍如何在安卓手机端与个人电脑(PC)端实现日历同步,以确保无论您使用哪个设备,都能轻松查看和管理您的日程安排。 ...
实验四 同步机构 一. 实验内容 模拟实现同步机构避免并发进程执行时可能出现的与时间有关的错误。 二. 实验目的 进程是程序在一个数据集合上运行的过程。进程是并发执行的,也即系统中的多个进程轮流的占用处理器...
Verilog 中的同步复位、异步复位、同步释放优缺点及 PLL 配置复位设计 在 Verilog 设计中,复位机制是确保系统正确工作的重要环节。复位机制分为同步复位和异步复位两种,两种机制都有其优缺点。本文将深入探讨同步...
帧同步是一种在网络游戏中广泛应用的技术,它的主要目的是解决多人在线游戏中的实时交互问题,确保所有玩家看到的游戏状态是一致的。本资料集包含了关于帧同步的深入解析,对于想要理解网络游戏运行机制,特别是对...
在“易语言窗口同步操作源码”中,我们主要探讨的是如何在易语言环境中实现窗口之间的同步操作。 窗口同步是多线程编程中的一个重要概念,特别是在开发具有多个窗口或者界面的应用程序时,窗口同步能够确保数据的...
在Unity引擎中,帧同步(Frame Synchronization)是一种重要的网络技术,主要用于实现多玩家在线游戏中的实时互动。这种技术的核心目标是确保所有客户端看到的游戏状态一致,即使在不同的网络延迟条件下也是如此。本...
Unity帧同步极简框架是一种专为多人在线游戏设计的技术,旨在确保多个客户端之间的游戏状态保持一致,从而提供无缝的协作和竞技体验。本框架着重于简化实现过程,同时包含了多客户端同步、战斗回放和防作弊检测等...
本文档主要介绍SEW变频器MID60B的同步设置技术,以及MOVIDRIVE® MDX61B变频器的内部同步操作(ISYNC)功能。同步技术在多电机同步驱动和精确控制过程中非常关键,尤其适用于需要协调多个电机动作的场景。 ### 1. ...