加入收藏 | 设为首页 | 会员中心 | 我要投稿 孝感站长网 (https://www.0712zz.com.cn/)- 运营、云管理、管理运维、云计算、大数据!
当前位置: 首页 > 站长资讯 > 评论 > 正文

教你杜绝流氓软件弹窗

发布时间:2021-02-04 16:10:42 所属栏目:评论 来源:互联网
导读:如果使用迁移线程模型,在进程间通信过程中,内核不会阻塞调用者线程,但是会让调用者线程执行被调用者的代码。整个过程没有被调用者线程被唤醒,相反,被调用者端更像是一个代码提供者。 此外,内核不会进行完整的上下文切换,而是只切换地址空间(页表)等和

如果使用迁移线程模型,在进程间通信过程中,内核不会阻塞调用者线程,但是会让调用者线程执行被调用者的代码。整个过程没有被调用者线程被唤醒,相反,被调用者端更像是一个“代码提供者”。

此外,内核不会进行完整的上下文切换,而是只切换地址空间(页表)等和请求处理相关的系统状态。其中,不会涉及线程和优先级的切换,也不会调用调度器。迁移线程的优点在于减少了内核调度的时间,并简化了内核中的IPC处理。在多核场景下,迁移线程方案还可以避免跨核通信引入的开销。

06 案例分析:Android Binder

在Android场景下,进程间通信在大部分情况下做的其实是“远程过程调用”。服务端进程负责提供具体的服务,客户端进程则通过进程间通信来发起服务请求,并获得服务端进程处理后的结果。

除了通信双方进程外,在Binder IPC中还引入了一个Context Manager进程。Context Manager提供命名服务,它的任务是建立通信连接。

在Binder IPC的内核设计中,提供了句柄(handle)的抽象来表示IPC对象(即一个通信连接)。句柄和我们熟悉的文件描述符其实很相似,用户通过对句柄的操作来发起对特定进程的通信。

和之前的进程间通信设计不同的一点是,Binder IPC中采用了“线程池”的服务端模型。也就是说,在服务端中,Binder的用户态和内核会有一个响应线程池的概念。当某个客户端进程发起通信时,内核会从(服务端的)线程池中选择一个可用的线程来响应。这种设计能够在同步进程间通信的情况下比较好地处理并发的通信请求。
 

Mach中端口和消息的设计使得进程间的通信和具体的进程是隔离开的。只要一个进程拥有某个端口,其就能够通过这个端口和“另一端”的进程进行通信。后续的微内核系统设计大都考虑了Mach的思想,不管是借鉴其设计还是将其缺陷引以为戒。

2. L4:围绕进程间通信优化而设计的微内核系统

根据Mach的经验,Liedtke等研究人员开始研发L4系列的微内核系统。L4系列微内核系统的一个突出思路是:进程间通信是微内核的核心功能,需要围绕通信去完成整个系统的设计和实现。L4是当下仍然十分主流的微内核系统,特别是后续衍生出了各种变体和相关的系统。

在L4微内核中,内核只保留了基本的功能,包括地址空间、线程、进程间通信等,并且不考虑如兼容性等要求,而是选择针对特定硬件做极致的性能优化。这样做的好处就是内核的代码量非常少,可以把少量的功能尽可能支持好。

3. LRPC:迁移线程模型

迁移线程(thread migration)是一个比较“极端”的优化性能的IPC设计。截止到目前,我们了解到优化IPC性能的大部分工作会关注两个部分:优化控制流切换的性能和优化数据传输的性能。

迁移线程认为,其他的IPC设计可以看成将需要处理的数据发送到另一个进程并让其处理。这也是为什么控制流切换和数据传输会成为主要的瓶颈。

如果换一个角度,将另一个进程处理数据的代码拉到当前进程,那么我们是不是可以避免控制流的切换(仍然是当前进程处理)以及数据传输(数据已经准备在当前进程中)呢?迁移线程就是围绕这个新的视角进行设计的。

迁移线程方案被用在LRPC、Mach(优化版本)等系统中,是目前纯软件进程间通信优化中效果最好的设计之一。迁移线程的基本原则是:

  1. 简化控制流切换,让客户端线程执行“服务端的代码”;
  2. 简化数据传输,共享参数栈和寄存器;
  3. 简化接口,减少序列化等开销;
  4. 优化并发,避免共享的全局数据结构。其中,前两点原则都基于“将代码拉到本地”这个新的视角。

迁移线程IPC和主流IPC设计的对比如图7-13所示。要做到“将代码拉到本地”,迁移线程首先需要对线程结构进行解耦,明确线程中哪些部分是对通信请求处理起关键作用的。然后,这部分允许被调用者(负责处理请求的逻辑)运行在调用者的上下文中,将跨进程调用变成更接近函数调用的形式。

(编辑:孝感站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读