TT和chrome执行模型对比分析

老大让写一篇高大上的博文,那么如何才能高大上呢?从某种角度讲只要迎合老大的口味给他一篇重口味的岛国动作片剖析就能轻松过关;
从程序员角度讲,能写出高大上的范围有很多,如程序架构,算法分析、编程语言理解、操作系统理解、知名开源程序的原创分析、优秀博文的翻译等都能吸引许多同学的兴趣。今天我再教一招让博文高大上有营养的捷径就是攀高枝,用你现有的程序框架和知名的开源架构做比较剖析。今天我选择走捷径,为同学们来分析下我最近在负责的一款im客户端产品——TeamTalk(简称TT)和chorme执行模型的区别与联系。

题外话

chorme多进程多线程异步执行框架

TT单进程多线程异步执行框架

程序执行模型是啥?执行模型能够帮助程序解决啥?

简单的进程模型对比

为啥要说简单的对比呢?因为TT是单进程没有执行模型,chrome是多进程的,只需要来看chrome的多进程执行模型就可以了。chorme多进程执行模型要如何分析呢?不一样的人提出的问题不同,得出的结论也就不同。不过这副图是必须有的处置chrome的官方,可以说是chorme精华的一个缩影

Chrome进程模型

这张图告诉我们这几个点:

1 chorme是多进程的。

1.1 进程分为两类(其实有三类,还有一个plugin进程先忽略之):1 Browser进程,是所有其他进程的大脑 2
Render进程,负责chorme浏览器的渲染。Render进程与Render进程之间不能相互通信,都需要通过Browser进程来协同

1.2
Browser进程中,有RenderProcessHost,每一个host对应着一个RenderProcess,通过代理模式Browser对Host的操作会被host封装成IPC消息传递给Render进程处理

1.3 进程间通信(IPC),后续会深入分析包括windows进程间通信技术选型、通信协议的选定为啥不用google protocol
buffer

2
同时告诉我们chorme是多线程的。线程分为主线程、Render线程、I/O线程、fileThread、DBthread等,这里的线程模型是本博文讨论的重点。

TT和Chrome的线程模型

TT线程模型也可以说是执行逻辑模型如下图:

                线程执行模型

这张图告诉我们几点:

1
TT是多线程的,线程分为UI主线程、网络异步I/O线程、逻辑任务执行器线程池等

1.1
主线程(UI线程):负责界面的显示和交互,以及消息的循环转发

1.2
网络异步I/O线程:负责TCP/IP长连接数据的收发

1.3 逻辑任务执行器线程池:一个简单的可伸缩的任务执行池,FIFO task list thread线程执行一些正常任务, Priority
queue thread可以执行一些优先级调度或者dependency调度,Priority queue
thread也可以在某个重任务把常驻线程耗掉的时候,开启一个新线程来执行后续饥渴任务。

2
 任务执行单位——Task

 
  
1.1
task的创建和执行是分开的(command模式),可以在任何的线程中创建一个task,然后通过调用TaskPool的pushTask将任务放到TaskPool的线程池中执行

1.2
整个过程只有在pushTask的时候才加锁,等到开始执行的时候是无锁的,所以在设计task的时候,开发者需要考虑到task中的数据对象管辖的范围

1.3
task执行过程中产生的事件都是通过主线程的消息循环通知到主线程上(这一点与chrome有很大的不同)

Chrome的线程模型

chrome的线程根据执行模型大致分为:I/O
thread——负责进程间IPC的线程、render thread——负责页面渲染的线程、default
thread——负责处理常规业务的线程。虽然分为这么多的线程类型,但其实每个线程的执行流程是相差不大的,都是利用消息循环(在windows下是用messagePump),如下图

这张图告诉我们2点:

1
主线程、子线程都利用消息循环(MessagePump),来等待执行任务、事件响应

任务执行单位——Task

chrome的所有线程都遵从这个执行流程来执行业务,也就是说开发人员需要做的事情是如何封装一个Task并且将他放到合适的thread中去做即调用每个线程相应的PostTask。换句话说开发任务在chrome造的轮子基础上只需要了解如何创建一个Task以及每个Task的职责范围以及数据的管辖范围,一图胜千言先上两张图吧(出处:http://www.ha97.com/2908.html):

  

Task的执行模型

这两张图告诉我们关于task的这几点:

1
task的创建和执行是分开的(command模式),可以在任何的线程中创建一个task,然后通过调用另外线程的postTask将任务放到另外的那个线程中等待执行

2
整个过程只有在pushTask的时候才加锁,等到开始执行的时候是无锁的,所以在设计task的时候,开发者需要考虑到task中的数据对象管辖的范围

3
task是异步执行的,但是chrome又让这个异步过程变得非常简单,如右图:A线程需要B线程做一些事情,然后回到A线程继续做一些事情;在Chrome下你可以这样来做:生成一个Task,放到B线程的队列中,在该Task的Run方法最后,会生成另一个Task,这个Task会放回到A的线程队列,由A来执行。

TT与chrome多线程异步执行框架的对比

相同点:

1
执行框架都是用task作为业务执行的一个基本单位,将整个工程项目的业务进行分解

2
创建和执行task的环境是可以分开的(command模式)

3
都支持优先级任务(Priority task)调度,延迟执行任务(delay task),空闲时执行任务(Idle
task)

4
在任务执行过程中都是极力避免锁的存在,仅仅在将Task放入消息队列的时候才存在

不同点:

消息循环

TT将消息循环只放在了主线程,任务在子线程中执行过程中发出的通知都是通过主线程的消息循环来派发的


   
chrome在这一点做得更灵活,每个子线程都有自己的消息循环监听任何任务过来的通知,即有处理watcher的功能

线程任务的设计上

chrome允许创建的每个线程都有执行各种任务的能力,并且也为之创建了各种的任务执行队列来异步执行,这样的轮子便于整个项目功能和业务的分解

TT上对于执行任务的线程可以说是一统的,即任何的任务在TT上只能在逻辑线程池中执行,任务不区分类型(chrome上有I/O相关的任务在I/Othread执行、render相关的任务在render
thread执行)

UI渲染绘制上

由于本身采取的绘制不同,TT是GDI绘制的,chrome是directx绘制的,所以绘制的策略上也是很大的不同。

简单讲TT的和界面相关的任何处理都需要在主线程上执行,这也是为啥消息循环的设计上TT放到主线程上的一个原因

        4
具体实现上

       
         
 
虽说都是用c++实现的,但是level真实不一样,chrome整个项目都是要c++
模板元编程,相信蛮多c++程序员看起来都会很累包括我自己,它提供了一大套的模板封装(参见task.h),可以将Task摆脱继承结构、函数名、函数参数等限制(就是基于模板的伪function实现,想要更深入了解,建议直接看鼻祖《Modern
C++》和它的Loki库…)

TT和chrome执行模型对比分析,布布扣,bubuko.com

时间: 2024-10-20 16:36:45

TT和chrome执行模型对比分析的相关文章

线程池与非线程池应用场景及模型对比分析

在网络编程中经常用到线程池和连接池,今天就对其中常用的线程池的基本应用场景和模型做个简单的对比分析. 1.  业务流程对比 a.  非线程池业务流模型: 上图标识了基本的非线程池的线程模型,前端1有多少连接则前端客户端2与前端服务器端3均需建立一对一的线程数进行响应的连接.前端服务器端3与后端服务器端4也需建立响应数目的线程进行连接处理相关业务. 当一个任务处理完毕后线程退出,在下一个任务到来的时候前端服务器端创建新的线程来处理新的任务. b.线程池模型: 上图标识了基本的线程池模型.前端客户端

信用评级模型实例分析(以消费金融为例)-中

信用评级模型实例分析(以消费金融为例)-中 原创 2016-10-13 单良 亚联大数据 点击"亚联大数据"可关注我们! 第五章 自变量的初步分析与处理 模型变量有两种类型,分别是连续型变量 .连续型变数系指该变数为观察数据所得的实际数值,并没有经过群组处理 .间断型变数则系指质性变量或类别型变量 . 两种变数类型都适用于评分模型,但建议变量使用间断型态进行开发评分模型,主要原因如下: 1. 间断型变量有助于处理极端值或是样本数量较少的变量. 2. 非线性的因变量 (dependenc

近3年微软与谷歌的发展对比分析

     近3年微软与谷歌的发展对比分析   随着科技的快速发展,时代的不断进步,微软和谷歌凭借这不断的创新已然成为当今全球科技公司的领头羊.位列世界500强的微软是一个相当具有经济与科技实力的的公司,然而同样位列世界500强的谷歌凭借着家喻户晓的Google搜索成为了微软一个相当具有竞争力的科技大亨. 同为IT公司,微软和谷歌的比较如下: 一.发展历史 微软作为一个1975年成立的老牌公司,从一开始的为IBM提供文件系统和操作系统等软件,到现在业务中有各种操作系统编译器和解释器.网页浏览器等基

Android和Linux应用综合对比分析

公开发布的序言: 这篇文章是作于2012年7月12日,也就是自己刚从大学校园迈向工作岗位的时候遇到的第一个题目"请你针对我们公司目前的应用行业场景做一下调研:在终端做应用程序开发的平台是选择Linux好还是Android好"而写的. 在踏出校园之前,自己从来没有接触过安卓的开发领域(除了在2010年下半年买了一部分安卓的智能手机外).接到这个题目后,自己也没有退缩,硬着头皮接下来了,然后凭借自己在学校时候学的一点检索信息写学术论文的小功底,三天之内写下了这篇长达1万4千多字的调研报告,

三大WEB服务器对比分析(apache ,lighttpd,nginx)

一.软件介绍(apache  lighttpd  nginx) 1. lighttpd Lighttpd是一个具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点.lighttpd是众多OpenSource轻量级的web server中较为优秀的一个.支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能. Lighttpd使用fastcgi方式运行php,它会使用很少的PHP进程响应很大的并发量. Fastcg

Go/Python/Erlang编程语言对比分析及示例

本文主要是介绍Go,从语言对比分析的角度切入.之所以选择与Python.Erlang对比,是因为做为高级语言,它们语言特性上有较大的相似性,不过最主要的原因是这几个我比较熟悉. Go的很多语言特性借鉴与它的三个祖先:C,Pascal和CSP.Go的语法.数据类型.控制流等继承于C,Go的包.面对对象等思想来源于Pascal分支,而Go最大的语言特色,基于管道通信的协程并发模型,则借鉴于CSP分支. Go/Python/Erlang语言特性对比 如<编程语言与范式>一文所说,不管语言如何层出不穷

(转)netty、mina性能对比分析

转自: http://blog.csdn.net/mindfloating/article/details/8622930 流行 NIO Framework netty 和 mina 性能测评与分析 测试方法 采用 mina 和 netty 各实现一个 基于 nio 的EchoServer,测试在不同大小网络报文下的性能表现 测试环境 客户端-服务端: model name: Intel(R) Core(TM) i5-2320 CPU @ 3.00GHz cache size: 6144 KB

ASP.NET执行模型之IIS服务器处理流程

之前在网上看过很多对这方面的讲解,但个人觉得看下来过于 "深奥",不容易理解,所以想用更简单的方式进行阐述,便于理解. 本次我们重点分析用户请求到页面呈现过程中Web服务器的处理过程.我们从ASP.NET站点的一个页面请求开始说起,先看下面对于某个请求的简单执行模型 (注意这是对asp.net站点Index.aspx页面的第一次请求,所以需要进行动态编译): 我们通过ASP.NET的执行模型简单的描述了一次web请求过程,注意在不同的IIS版本中,处理模型和通信方式是不一样的,在IIS

【MS SQL】通过执行计划来分析SQL性能

如何知道一句SQL语句的执行效率呢,只知道下面3种: 1.通过SQL语句执行时磁盘的活动量(IO)信息来分析:SET STATISTICS IO ON (开启) / SET STATISTICS IO OFF (关闭) 2.通过SQL语句执行时语法分析.编译以及执行所消耗的时间:SET STATISTICS TIME ON (开启) / SET STATISTICS TIME OFF (关闭) 3.通过执行计划查看:Ctrl + L -------------------------------