设为首页收藏本站

ISO/IEC C++ China Unofficial

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 335|回复: 3

[C氵] 非抢占式并发(3):p7的内部通信

[复制链接]

3

主题

20

帖子

202

积分

超级版主

mikonmikonmi

Rank: 8Rank: 8

威望
4
经验
170
贡献
4
发表于 2016-1-17 16:19:17 | 显示全部楼层 |阅读模式
上一篇 帖子里我留了一个坑。Carriers若不持有可调度的coros, 且当前没有超时定时器在运作,则会阻塞在epoll_wait上等待IO就绪。当然,此处需要监听的描述符一定存在:每个carrier都持有一条设置成非阻塞的匿名管道,它的读端首先被加入epoll集合。除此之外没有任何缺省的监听了——那么如果在阻塞期间,有coro被分配到本carrier上,应该如何响应?

先前也提及过,p7的coro不会迁移。在用户决定创建coro的时候,负载它的carrier被原子地选定:若创建在本carrier上,则coro被直接加入可调度队列(这队列只有本carrier操作,所以不需要考虑竞态);否则向目标carrier的双缓冲中投入一个请求。若请求已投入,且检出对方carrier声称自己已经进入且尚未脱离epoll_wait, 则向对方的通信管道中写入第一类通信报文,要求对方因为有coro创建请求而被唤醒。
若目标carrier没有声称自己阻塞在epoll集合上,或者它还没进入阻塞调用——那么这没有关系,它将会互斥地检查到队列变化。一旦carrier完成检查,在放弃临界之前,它会声称自己将等同于阻塞在epoll上:此时所有向carrier要求产生coro的请求会附加报文,确保目标carrier可以被唤醒。若目标carrier已经脱离epoll_wait, 则它或者还没检查创建请求——那么这没有关系,它将会检查到变化;或者已经完成了检查,那么它将等到下一次调度循环开始,重新互斥地检查队列变化。
目前(2016.1.17)的内部通信存在第二类报文:coro间通信已发出。任何已经发出的coro间通信会产生一份第二类报文,同时伴随着被递送到目标coro所在carrier的一份用户消息。这两个过程是处理上正交的:第二类报文的处理导致目标coro从recv等待状态中醒来一次仅一次,而用户消息则被转发到任何没有声称自己正在死去的coro邮箱上。
注意到此处一次性写入的尺寸都足够保证这里的管道写是事务的。POSIX要求至少512B的写入事务,LK则一般提供4KB.

Coro间通信的有效性由coro的死亡机制保证。每一coro的ucontext都被链接到入口limbo_loop, 它将立刻标识coro正在死去。正在死去的coro拒绝接收一切通信,不过仍然有机会快速清空邮箱。此后,它将自身投入carrier的死亡队列中等待销毁。Carrier在完成一轮邮件分拣后销毁将死coro: 若仍有发往将死coro的消息,它们将不会被投递而直接析构。
实际上,coro应该在进入limbo_loop之前放弃自己的所有名字。在limbo_loop中,它们会看到放弃名字之前的全部未读消息。若用户以互斥方法(p7提供了瘦自旋锁和读写自旋锁)保护必要的临界操作,则恶劣的情况应该会被避开一部分。然而若只有“查询名字”这一字典相关的操作被临界地保护了,那么可能存在下面的真并发序列使得投递失败不可见:
  • 发端在时刻t. 互斥地查询到名字对应的coro指针,离开临界。持此指针前往投递。
  • 收端在时刻t + d1. 放弃名字进入limbo, 宣称自身将死,到t + d2时刻为止检查了自己的邮箱。
  • 发端在时刻t + d2. 信息投递往收端carrier.
此后的处理只有carrier可见。一部分消息的析构在不严格的互斥前提下难以避免。特别地,死亡队列中被标识为decay的coro不会被立即删除——它们仍有残存(没有被互斥严格保护的)通信进行中。

点评

667  发表于 2016-1-17 22:50

评分

参与人数 1威望 +1 贡献 +1 收起 理由
LH_Mouse + 1 + 1 Or2

查看全部评分

沿海征收头GAY骨
回复

使用道具 举报

10

主题

108

帖子

461

积分

超级版主

RA2DIY 特别行政区行政长官

Rank: 8Rank: 8

威望
4
经验
342
贡献
3
发表于 2016-1-17 21:26:27 | 显示全部楼层
We will prevail!! www.lhmouse.com
回复

使用道具 举报

3

主题

20

帖子

202

积分

超级版主

mikonmikonmi

Rank: 8Rank: 8

威望
4
经验
170
贡献
4
 楼主| 发表于 2016-1-17 22:21:30 | 显示全部楼层

这耗居然纯表情!
沿海征收头GAY骨
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|ISO/IEC C++ China Unofficial    

GMT+8, 2017-6-27 01:16 , Processed in 0.058305 second(s), 27 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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