目录
1. 同步和互斥
1.1 同步
定义:同步是指在执行任务时,通过某种机制来协调不同任务的行为,确保它们以正确的顺序和条件进行。简单来说,就是使得一个任务的执行进度能够与另一个任务的状态保持一致。
例子:通俗点解释,如果你去包子店想买包子,但店里暂时没有包子,你就需要等待店主做包子。这种等待就是一种同步行为,确保你在包子准备好之前不能买到包子。
又例如,你需要进行传感器数据采集,一个采集数据的传感器任务,一个处理数据的任务,你想要处理数据,则需要等待传感器先去采用数据,这种等待的行为就称为同步行为。
1.2 互斥
定义:互斥是指确保在任何时刻只有一个任务能够访问共享资源。它防止了多个任务同时访问共享资源,从而避免数据冲突或资源争用的问题。
例子:厕所(临界资源或者说是共享资源),人上厕所(执行的任务)
为了保证资源的合理使用,互斥机制确保在任何时刻只有一个人可以使用厕所。当一个人正在使用厕所时,其他人必须等待。
1.3 总结
同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
例子:还是以上厕所为例。
厕所(临界资源或者说是共享资源),甲、乙、丙、丁四个人上厕所(执行的任务)
同步:相当于我给你规定了上厕所的顺序,甲、乙、丙、丁(任务)排队上厕所(共享资源),是有顺序的,例如甲执行完才是乙,乙执行完才是丙,丙执行完才是丁,你需要按照我给你排的顺序上厕所。
互斥:也是甲、乙、丙、丁(任务)排队上厕所(共享资源),不过并没有顺序,互斥就保证你们四个人就只能一个人到厕所里。但是你们谁先上我不管,我就保证你们在同一个时间内,只有一个人在厕所里(使用共享资源)。
2. 同步和异步
2.1 同步
定义:在同步操作中,任务按顺序执行,每一步都等待前一步完成。同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。
例子:在排队买咖啡时,你需要等前面的人完成付款和取货后,才能轮到你进行购买。
2.2 异步
定义:异步和同步是相对的,异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。
例子:你在家做饭的同时,网上订购了一本书。书的送货过程在后台进行,而你可以继续做饭,不需要等书送到后再继续烹饪。
3. 阻塞和非阻塞
3.1 阻塞
定义:主程序调用读取文件的函数时,会停下来等待文件读取完成。程序在这段时间内无法继续执行其他任务,直到读取操作完成。
例子:想象你正在等一辆公共汽车。在车到站之前,你只能站在站台上等,无法做其他事情。直到汽车到达并带你到目的地,你才能离开站台,继续进行其他活动。这就类似于阻塞操作,程序在等待数据完成之前无法继续执行其他操作。
3.2 非阻塞
定义:主程序调用读取文件的函数时,函数立即返回,主程序可以继续执行其他任务。文件读取将在后台进行,当数据准备好后,程序会处理结果或检查状态。
例子:你正在用手机查看社交媒体,同时在厨房里准备晚餐。你用手机发送了一条消息,然后手机立即返回到主界面,让你继续做晚餐,不必等待消息被送达或收到回复。消息发送在后台进行,你可以继续做其他事情。这就类似于非阻塞操作,程序在等待某个任务完成的同时,可以继续执行其他任务。
4. 同步阻塞和同步非阻塞
4.1 同步阻塞
定义:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上得到读取结果就一直等,直到获取读取结果再响应发送,等待期间不可做其他操作(阻塞)。
例子:你在ATM机上输入取款请求(发送方发出请求),ATM机处理取款请求(接收方开始读取文件),在ATM机处理取款请求的过程中,你必须等到现金被取出并完成交易,在等待过程中,你不能进行其他操作,比如重新插卡或者进行查询,直到取款完成,你才可以继续进行其他操作。
4.2 同步非阻塞
定义:发送方发出请求后一直等待(同步),接收方开始读取文件,如果不能马上的得到读取结果,就立即返回,接收方继续去做其他事情。此时并未响应发送方,发送方一直在等待。直到IO操作(这里是读取文件)完成后,接收方获得读取结果响应发送方,接收方才可以进入下一次请求过程。(实际不应用)
例子:你在浏览器上加载一个网页,网页的资源(如图片、视频)需要时间来加载。在加载资源期间,浏览器可能显示占位符或者加载动画,同时允许你进行其他操作(如浏览其他网页或滚动页面),当资源加载完成后,浏览器会更新页面显示实际内容。你在等待期间可以继续浏览或进行其他操作,直到资源完全加载。
4.3 同步阻塞和同步非阻塞的区别
同步阻塞:发送方在发送请求后必须等待接收方完成处理并返回结果,期间发送方不能进行其他操作。请求和等待结果的过程中发送方完全被阻塞,不能进行其他操作。
同步非阻塞:发送方在发送请求后,会一直等待结果,但如果接收方无法立即提供结果,会返回一个状态或占位符,允许发送方在等待期间执行其他操作。请求后发送方仍然等待结果,但可以在等待期间进行其他操作,不完全被阻塞。
5. 异步阻塞和异步非阻塞
5.1 异步阻塞
定义:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,就一直等到返回结果后,才响应发送方,期间不能进行其他操作(阻塞)。(实际不应用)
例子:你在餐馆点了外卖,并且在等待餐点准备好。在这个过程中,你可以做其他事情,比如玩手机或阅读书籍。
点餐后,你不需要在餐点准备期间一直等待,餐馆会在后台准备你的餐点。
当餐点准备好后,你需要去取餐。此时,你可能会在餐馆里排队等候取餐,这时你的时间会被“阻塞”,直到你拿到餐点为止。取餐过程中的等候使得你不能做其他事情,直到拿到餐点为止。
5.2 异步非阻塞
定义:发送方发出请求后,不等待响应,继续其他工作(异步),接收方读取文件如果不能马上得到结果,也不等待,而是马上返回取做其他事情。当IO操作(读取文件)完成以后,将完成状态和结果通知接收方,接收方在响应发送方。(效率最高)
例子:你预约了一个医生的时间,提交了预约请求。提交请求后,你可以继续做其他事情,如上班、购物等。
预约请求是在后台处理的,你不需要等待预约结果而继续进行日常活动。
当医生的预约确认邮件或短信到达时,你可以查看确认信息,而在此之前你已经不需要等待或阻塞其他活动。你可以继续执行其他任务,直到收到通知并处理预约确认。
5.3 异步阻塞和异步非阻塞的区别
异步阻塞:请求是异步的,发送方在请求处理期间可以继续执行其他操作,但在处理最终结果时可能会出现阻塞。
异步非阻塞:请求和结果处理都是异步的,发送方可以继续执行其他操作,处理结果时也不会阻塞程序的其他部分。