目录
1. 同步和互斥
1.1 同步
1.2 互斥
1.3 总结
2. 同步和异步
2.1 同步
2.2 异步
3. 阻塞和非阻塞
3.1 阻塞
3.2 非阻塞
4. 同步阻塞和同步非阻塞
4.1 同步阻塞
4.2 同步非阻塞
4.3 同步阻塞和同步非阻塞的区别
5. 异步阻塞和异步非阻塞
5.1 异步阻塞
5.2 异步非阻塞
5.3 异步阻塞和异步非阻塞的区别
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 异步阻塞和异步非阻塞的区别
异步阻塞:请求是异步的,发送方在请求处理期间可以继续执行其他操作,但在处理最终结果时可能会出现阻塞。
异步非阻塞:请求和结果处理都是异步的,发送方可以继续执行其他操作,处理结果时也不会阻塞程序的其他部分。
千题千解·嵌入式工程师八股文详解_时光の尘的博客-CSDN博客