同步、异步、壅闭、非壅闭、回调函数

打印 上一主题 下一主题

主题 571|帖子 571|积分 1713

同步、异步、壅闭、非壅闭、回调函数

一、同步、异步和回调函数

1. 概念

程序在执行过程中会存在函数调用,区分同步和异步的关键点在于函数调用后主程序怎样运行。

  • 同步:函数调用后,主程序等待着函数返回才会继承往下运行。
  • 异步:函数调用后,主程序不等待函数返回就继承往下运行。
下图示例的程序中,在调用sum函数时,主程序等待着sum函数返回才继承往下运行,这就是同步。
下图示例的程序中,在调用delete_file函数时,主程序并没有等待delete_file函数返回就继承往下运行了,这就是异步。
既然异步的情况下,主程序不管子函数什么时候结束就继承往下执行了,那主程序什么时候知道子函数执行结束了呢?答案就是回调函数
那什么是回调函数呢?
我在上班的时候,吸收的任务都是上司的左膀右臂下发的,他们把任务告诉我,我去实验室干活,干完以后他们让我发个 vx 消息告诉他们我干完了。他们不会守着我干活,也在忙本身的事。这个场景里面的左膀右臂就是主程序,我就是子函数,vx 通知他们就是回调函数。回调函数是主程序向子函数传输的 1 个函数指针(关于函数指针请 RTFW),用来告诉子函数在它完成后该执行哪些操作来通知主程序。
2. 举例

加班对于程序员来说是家常便饭(FUCK),某天晚上 11 点,你准备想下个早班,刚准备关鸡卸下戴了一天的面具重新做人,你直属上司突然从墙后面冒出来跟你说,”马工,如今还早,今晚加个班再多写几个 bug 吧“。说完,你上司从兜里拿出一包瓜子坐在你旁边嗑起来,行情不好,你又是个被世俗污染过的人(没个性),只好认命加班。
你上司(主程序)在你(子函数)旁边嗑瓜子等着你写 bug,等你写完才准你下班,这就是同步

第二天晚上,你已经连续加班 29 天了,再差 1 天就满 1 个月了,你决定不要达成这项可耻的成就,于是你计划偷偷溜走,没想到老板在电梯门口把你堵住了。”马工啊,这个月你确实辛苦了,但是程序明天上线,要不,你今晚加班守一下上线情况?“。你心里跑过一万只 ikun,但是也只能归去达成加班 1 个月成就,但是老板肯定是不消加班的,于是他走进电梯下班回家了。
你老板(主线程)要你加班,但是他本身开奔驰回家了,管你(子函数)加班到几点(不守着你),是死是活,等你写完 bug 后给老板发微信留个言报安全,这就是异步。发 vx 给老师报项目上线统统正常,这就是回调函数。

二、壅闭和非壅闭

1. 概念

壅闭、非壅闭同样是看主程序执行过程中,对函数调用后的情况来判定。区分壅闭和非壅闭的关键点在于函数调用后 CPU 的使用权是否会被转移

  • 壅闭:函数调用后,由于 I/O 等操作导致了 CPU 暂停执行本段程序。最常见的是磁盘读写操作导致的 CPU 被切换去执行其他历程。发生壅闭的情况基本上都涉及到系统调用
  • 非壅闭:函数调用后,CPU 不会因为此次调用而被切换去执行其他历程。
2. 举例

写代码的时候会使用到系统调用(RTFW),涉及到磁盘 I/O 的系统调用通常都会产生壅闭,比如read、write、recv等函数。
为什么会产生壅闭呢?
这是因为 CPU 和磁盘的速度差距有如天壤之别导致的(如果 CPU 的速度比作是战斗机,那么磁盘的读写速度就是肯德坤)。为了最大化 CPU 的执行服从,CPU 不会空等着磁盘读写完成,而是切换到其他历程去执行,等磁盘读写完成后再返回来继承执行主程序剩下的代码。由于 CPU 的使用权被转移,导致本程序被暂停执行,这种情况下就说程序由于这个函数调用被壅闭了
  1. int main(int argc, char* argv[]) {
  2.     FILE* file = open("file_path");
  3.     int res = read(file);        // 此时程序被阻塞 n 秒
  4.     process(file);                        // 后面的程序在 read 函数返回后才能继续执行
  5.     int res = write(file);
  6. }
复制代码
非壅闭就是指主程序在函数调用时不会导致 CPU 切换至其他历程上去执行(除非时间片切换)
[code]long sum(int a, int b) {                // 调用 sum 求 1-10000 亿的和    long sum = 0;    for (int i = a; i

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

傲渊山岳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表