RunLoop笔记(转载自Noah)

心中先有一个抽象的概念,抽象的模型。考虑一下以下这些问题
1,线程是怎么工作的,只要执行完所有任务它就挂了。
2,事件(event)是怎么接收的?例如I/O事件,用户触摸屏幕后事件是怎样传递的?线程是怎么捕获这些事件的?
3,GUI程序或CLI程序有什么区别?

这个程序只有一条线程,当函数return后线程也就挂了,由于这是唯一的线程,所以进程也一并挂了。

int main(int argc, char *argv[]) {
  printf("hello world");
  return 0;
}

另外知道什么是(用户态)User mode和(内核态)Kernel mode吗?这两者是属于操作系统方面的知识。这里举个比较实际的例子会比较容易理解。例如要将字符串写进某个文件。步骤分别是

stringToWrite = "hello world"
path = "/my_file.txt"
writeTo(path, stringToWrite)

1,构造一个字符串变量 ————用户态
2,构造目标地址 ————用户态
3,用当前语言的标准库在对应的目录上构造文件,并将字符串写进去 ————用户态————>内核态

在程序执行到某一段时,程序调用了一个system call函数通知操作系统内核去做某些操作,该操作只有操作系统内核才权限去做,本地程序做不到。I/O操作就是典型的system call。用户态通过system call进入内核态,这时writeTo这个函数会堵塞,因为它需要等待操作内核将结果返回,I/O操作是非常耗时的。这是一种典型的同步程序,writeTo需要等候操作系统内核返回结果才能return,线程直接堵塞在这里。

聪明的你大概会想,这个程序跑到这里只能等操作系统完成工作,结果什么做不了,造成CPU资源浪费,因为这个耗时操作不是大量的运算,而只是I/O访问而已,所以CPU是闲着的。本着最大利用CPU的资源的原则,应该要怎么做?分一条线程出来将writeTo放进去不就得了,主线程就不会堵了。但你有没有发现一点,尽管我们不希望等,但也需要知道writeTo的结果啊,这怎么办?线程间通信咯。。。但怎么做?思考一下。下面的写法是无法在两个线程之间进行通信的。

main {
  thread = Thread(threadEntry)
  thread.run()
  return
}


threadEntry {
  stringToWrite = "hello world"
  path = "/my_file.txt"
  writeTo(path, stringToWrite)
  return
}

有一个比较简单的方法是将结果存到一个全局变量里,这样两个线程都能访问。在两个线程入口函数外声明一个变量result,并将writeTo的结果填入。

threadEntry {
  stringToWrite = "hello world"
  path = "/my_file.txt"
  result = writeTo(path, stringToWrite)
  return
}

好了,最后是你需要思考的问题,相通了再来看Runloop会发现。。。就是这么一回事。
问题是在主线程的入口main函数里,我们要怎么拿到result的值?

main {
  thread = Thread(threadEntry)
  thread.run()
  if result {
    // 如果写在这里,result根本都还没被赋值
  }
  return
}

扩展阅读,题外话。。。可以跳过
说到Runloop,其实在node.js里有一个很相似的机制叫做EventLoop的,事件循环。node.js是一个执行平台,环境。。。。执行的是JS代码。它是单线程的。。但几乎所有I/O操作都是异步的。
与apache不同的是,在接收用户的请求后,node不会给你创建新的线程来响应这个请求。apache则会,每一个请求就对应一条线程,所以写PHP的思维很简单,因为所有操作都是同步的,代码一句一句往下写就会按顺序执行。如果执行到某个段落后需要从数据库上查数据,那么该线程直接堵塞掉,直到数据库返回数据。就像上面的例子,没有开出子线程的。这种做法的缺点也是明显的,如果大量的用户请求,那么则需要开出大量的线程,假设这些请求都是从数据库里查找数据,那么CPU资源就会严重的浪费,因为I/O操作不需要太多CPU资源。大量的线程也会占用大量的内存。。。node的话是一个奇葩,它只有单线程,为了实现能处理多个请求,它必须要有一个none-blocking机制,如果每次请求都得堵一下,用户不给你炸了。
node的模型是这样的,通过一个入口函数来接收请求,然后执行一会儿直到需要进行I/O操作。。。node会将回调函数和一个任务标识扔到一个队列里进行等候并立即返回。这时node就可以继续处理第二个请求,直到需要I/O,继续放到队列里去。。。当第一个I/O操作完成后,node会将这对标识和回调函数的组合移动到。。。事件队列里等候调用。

node里有一个循环机制,每次循环node都会历遍两个队列里的元素,判断一下那一个元素对应的I/O请求完成了,然后将它放到事件队列。历遍事件队列来调用元素内对应的回调函数。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 原文链接19楼 心中先有一个抽象的概念,抽象的模型。考虑一下以下这些问题1,线程是怎么工作的,只要执行完所有任务它...
    Link913阅读 306评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 人的心灵是一块空白的板子,简称“白板说”,这句话为洛克赢得了荣誉,也给他带来无尽的批评。 之前在柏拉图和笛卡尔的教...
    如一书阅读 674评论 1 2
  • 今天是英语四六级查询成绩的时间,舍友们的消息把我从安静中脱离。阿妹第二次考四级还没过,我不知道怎么安慰她,因为她为...
    慢就是快的追梦女孩阅读 132评论 0 0
  • 01、教育的分歧:要不要报作文班? 这周五我去接孩子回家,在校门口等待时候,正好碰见了多年不见的老同学强子。 寒暄...
    胡天海地阅读 521评论 2 9