C++HHVM源码剖析

一、前言

hhvm源码中浸透了诸多C++11的初特点,并且利用了各种设计模式如工厂,模板方法齐,利用智能指针包裹指针,让delete没有自由的起

模板,继承,explicit,纯虚函数的起令代码中浸透了惊喜

如下面这段代码:run_函数是pthread_create执行的函数

 

 

亚、hhvm启动流程总览

hhvm/main.cpp

75行:调用execute_program函数进行实际的逻辑

 

runtime/base/program-functions.cpp 

885行:调用execute_program_impl进行具体的逻辑

 

runtime/base/program-functions.cpp 

1260:  从部署文件中加载配置起

1475:函数负责启动线程与吸收处理要

 

完全流程图如下:

 

 

RuntimeOption::Load函数负责加载配置文件中的布起

start_server函数负责启动线程与接纳处理要

 

其三、Load函数配置文件之加载与拍卖

 

以如下配置起之辨析为条例

Server{
Type= FastCGIServer
ThreadCount=20
###……
}

 

runtime/base/runtime-option.cpp

782-801行 解析配置文件中Server块中之始末

787行 将配置文件被的type值FastCGIServer赋值给ServerType

800行 将部署文件被的ThreadCount赋值给ServerThreadCount

所以ServerType的值为FastCGIServer

ServerThreadCount的值为20

四、start_server初始化HttpServer对象

runtime/base/program-functions.cpp 

799行  初始化HttpServer对象

837行 启动server,接受拍卖要

httpserver对象的初始化函数

 

runtime/server/http-server.cpp 

88实践 KNumProcessors为系统基本的个数,通过62尽之 const int kNumProcessors
= sysconf(_SC_NPROCESSORS_ONLN);获得

84-90执行:如果安排的thread大于系统的基石的个数,则在启动时只启动暨网基本个数相同之thread数,将另的个数赋值给additionalThreads

92执:调用工厂函数,针对ServerType:FastCGIServerc生成一个厂子对象

96-101实施:将部署文件被的信赋值给options对象,注意这里的startingThreadCount最可怜也系统基本的个数

102实施:根据options配置信息充分成一个Server

 

 

runtime/server/fastcgi/fastcgi-server-factory.cpp 

任了FastCGIServerFactory工厂生成一个FastCGIServer对象

 

FastCGIServer的构造函数

runtime/server/fastcgi/fastcgi-server.cpp  

此地的worker就是开行之线程数目

 

这里关注一下m_dispatcher的初始化

 

runtime/server/fastcgi/fastcgi-server.h 

JobQueueDispatcher<FastCGIWorker> m_dispatcher;
  

m_dispatcher的类别为JobQueueDispatcher

 

FastCGIWorker的概念如下:

typedef
ServerWorker<std::shared_ptr<FastCGIJob>,FastCGITransportTraits> FastCGIWorker;

 

struct ServerWorker  : JobQueueWorker<JobPtr,Server*,true,false,JobQueueDropVMStack>{}//传入的老三只参数为true

template<typename TJob, typename TContext = void*, bool countActive = false, bool waitable =
false, class Policy = detail::NoDropCachePolicy> 
class JobQueueWorker {}

ServerWorker的继续关系如下

故此这里的countActive为true

467-473实践:由于CountActivewe== true所以不会见进来下方的逻辑中

util/job-queue.h

656-658行 同样由于CountActive== true 因此无会见倒符合656-658实践中

 

 

五、start_server RunOrExitProcess启动一个Server

runtime/server/http-server.cpp 

 

262-268行
由于没布置 ThreadDocuments,ThreadLoopDocuments所以size()大小为0
不会见倒符合

269尽
ServerPort的初始化值为80,只要配置文件被之Port值不为0(即使配置文件被从不Server.Port值,也会初始化为80)
就见面动符合

runtime/base/runtime-option.cpp

121 int RuntimeOption::ServerPort =
80; 

对待

AdminServer.Port的值初始化为0

runtime/base/runtime-option.cpp

266 int RuntimeOption::AdminServerPort =
0; 

故而只有配置了才见面启动AdminServer

 

runtime/server/http-server.cpp

非AdminServer的时 传入的pageServer==true因为移动符合579行

这里的m_pageServer为fastcgi-server对象

 

 

runtime/server/fastcgi/fastcgi-server.cpp 

263行 m_worker.start()通过C++11底thread启动一个线程负责网络IO

264行 m_dispatcher.start() 通过pthread_create启动若干线程负责CPU部分

 

脚看同样扣m_dispatcher.start的详细逻辑

util/job-queue.h  

513-516执行 如果安排的threadCount过多少之话 这里会展开追加

517-520行 通过start()函数创建线程

 

util/job-queue.h 

 

util/async-func.h 

AsyncFunc继承自AsyncFuncImpl

AsnycFuncImpl实现了start()函数

 

util/async-func.cpp

至今线程启动了,线程运行的函数为ThreadFunc

 

六、ThreadFunc从何而来

ThreadFunc是自从那边来的呢?

util/async-func.cpp

 

 

此运用了模版方法设计模式

util/async-func.h

平等截神奇之代码…..

 

util/job-queue.h

 

说到底实施之点子如下

 

 

 

自身的博客即将搬运一头到腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan