EOS区块链究竟有几个线程

一 nodeos工作线程

nodeso节点的工作线程包括:一个主线程,一个信号处理线程和两个线程池。

  1. 主线程:main函数启动线程,该线程执行完程序初始化工作后,会调用app().io_service.run(), 启动boost::asio::io_service的异步io服务,通过异步io方式完成节点块生产,交易处理等主要业务工作。
  2. 信号处理线程:子线程,通过异步io服务,接收系统信号并处理。
  3. 线程池,线程池启动的工作线程数可通过启动参数配置。
    • controller线程池: 异步执行块block_state创建,块中交易验证时的交易解签名计算。
    • 生产者插件线程池:负责异步执行交易解签名计算。

? 采用默认配置(每个线程池2个工作线程),nodeos节点总线程数是6个,通过pstree命令可查看:

? nodeos有一个主线程pid=32385,该主线程有5个子线程,32386~32390。

二 主线程

? main函数执行线程:main函数最后调用app().exec(),启动io_service服务。

app()是application实例,application中定义了io_service对象io_serv:

class application
{...
   std::shared_ptr<boost::asio::io_service>  io_serv;
}
application::application():my(new application_impl()){
   io_serv = std::make_shared<boost::asio::io_service>();
}

boost::asio::io_service& get_io_service() { return *io_serv; }
//启动io服务
void application::exec() {
   io_serv->run();
   shutdown();
}

void application::quit() {
   my->_is_quiting = true;
   io_serv->stop();
}
  • 其它插件通过get_io_service()函数,获取io_serv,进行异步io投递。
  • 程序退出时,会调用quit()函数,结束io服务。

? nodeos节点交易处理,出块,块验证等主要业务操作都是在该线程执行的,因为eos中交易不支持并行处理,所以application中的io_serv是不允许在除主线程之外的其它线程中重复执行io_serv.run()操作的。

? 看到application::exec()中的代码,有些人可能会有疑问:asio::io_service监听的io端口都完成(没有待监听的io端口)时,io_serv->run()就会退出。这里io_serv->run()只调用了一次,没有循环调用,不会退出么?

? nodeos投递到application::io_serv的io处理handle函数,会重复投递该io端口。所以在handle处理函数完成时,io_serv中总会有待完成io存在,io_serv->run()就不会退出,下面以producer_plugin中的_timer为例,看一下这个投递过程:

producer_plugin::producer_plugin()
   : my(new producer_plugin_impl(app().get_io_service())){
      my->_self = this;
};

class producer_plugin_impl {
  producer_plugin_impl(boost::asio::io_service& io):_timer(io),
  _transaction_ack_channel(app().get_channel<compat::channels::transaction_ack>()){}
    boost::asio::deadline_timer   _timer;
};

? producer_plugin()在构造时传入app().get_io_service()构造了producer_plugin_impl:: _timer; 在节点的生产循环函数中可以看到, _timer的handle函数中会调用schedule_production_loop()函数,而在该函数中,又会调用 _timer.asyncwait()重复投递 _timer到ioservice中:

三 信号处理线程

  1. 创建io_service对象sig_io_serv;
  2. 将SIGINT信号投递到io_service对象,并绑定信号处理函数,当系统发送SIGINT信号时,会触发该处理函数。
  3. 创建sig_thread信号处理线程,在该线程中调用sig_io_serv->run(),等待信号触发,调用相应处理函数。
  4. 信号处理线程只处理SIGINT,SIGTERM,SIGPIPE这三个系统信号,一旦收到信号,会调用退出操作,使nodeos退出。

四 controller线程池

4.1 定义及创建

struct controller_impl {
  ...
  boost::asio::thread_pool       thread_pool;
}

controller_impl( const controller::config& cfg, controller& s  ):self(s),
    chain_id( cfg.genesis.compute_chain_id() ),
    read_mode( cfg.read_mode ),
    ...
    thread_pool( cfg.thread_pool_size )
    {...}
  • controller线程池定义在controller_impl中;
  • 根据配置参数中设定的thread_pool_size创建相应数量的工作线程。

4.2 异步任务

? 执行块相关操作时,较耗时且与排序无关的动作都会投递到controller线程池执行。eos目前投递到该线程池执行的操作有两个:

? 1 块交易验证时的解签名操作;

? 2 块状态block_state数据创建操作(两轮共识计算都在这里完成)。

4.2.1 解签名操作

? 节点收到块,会调用apply_block()函数执行块中交易,进行块验证。期间会投递交易解签名计算到controller线程池:

? 解签名投递函数create_signing_keys_futrue():

  • 在线程池thread_pool中异步执行解签名函数,异步解签名的执行结果,会放入交易的signing_keys_future中。
  • 真正解签名算法是trn.get_signature_keys(),解出的公钥放到recovered_pub_keys中。
4.2.2 block_state创建

五 生产者线程池

5.1 定义及创建

? 生产者线程池定义在producer_plugin_impl中,执行插件初始化函数plugin_initialize()时会根据配置参数创建工作线程。

class producer_plugin_impl : public std::enable_shared_from_this<producer_plugin_impl> {
   public:
      void schedule_production_loop();//生产处理循环
     //线程池定义
     fc::optional<boost::asio::thread_pool>   _thread_pool;//异步线程池
    ...
}

void producer_plugin::plugin_initialize(const boost::program_options::variables_map& options)
{
  auto thread_pool_size = options.at( "producer-threads" ).as<uint16_t>();
  //线程池创建
  my->_thread_pool.emplace( thread_pool_size );
}

5.2 异步任务

? 生产者线程池负责的工作任务有两个:

 1. 为接收到的投递交易进行异步解签名计算;
 2. 等待解签名计算完成,将交易投递到主线程的异步io服务中处理。

? 这两个工作任务都在同一个函数中投递执行:

该函数在节点收到其它节点/客户端投递的交易时被调用:

  1. 投递异步解签名计算任务到 _threadpool线程池( 生产者线程池),计算结果放到

    trx->signing_keys_future中。

  2. 投递异步任务到 _thread_pool线程池,该任务等待将异步解签名计算结束的交易投递到主线程的io_service中执行。

5.3 线程池关闭

? 当调用插件shutdown函数时,会执行线程池关闭动作,前程池中的工作线程退出。

六 链接

星河公链

原文地址:https://blog.51cto.com/14267585/2433560

时间: 2024-10-09 10:46:42

EOS区块链究竟有几个线程的相关文章

EOS区块链游戏系统定制开发

EOS区块链游戏系统定制开发 找131.2935.5821 微/电 EOS生态app系统开发,EOS区块链技术系统开发,EOS生态游戏app开发 自区块链成为热潮之后,很多公司都义无反顾地扑向了这项新技术,这其中,一部分是随时都会被风吹跑的投机派,而另一派则是实实在在想用区块链这项技术干实事的人. 2018年是区块链应用落地的元年,那么今年区块链在全球迅速升温,各个国家相继出台区块链数字货币的相关政策,甚至已经用于银行的贷款或者转账等等.同时在这个迅速发展的领域也迎来了新的突破--EOS. EO

几个故事告诉你, 火了那么长时间的区块链究竟是什么?

几个故事告诉你, 火了那么长时间的区块链究竟是什么? 有观点认为,区块链与人工智能.大数据是金融科技三大支柱,区块链或许会是10年后的“互联网” 文 |徐明星 田颖 李霁月 本文为瞭望智库书摘 摘编自<图说区块链:神一样的金融科技与未来社会>,中信出版集团出版,不代表瞭望智库观点. 下文用简洁的语言和图片,向大家解释究竟什么是区块链技术 近年来,包括摩根大通.花旗集团.高盛集团.纳斯达克等在内的金融巨头,都表达了对区块链技术的热衷.这些巨头们热衷的区块链技术,又被称为分布式账本,那么分布式账本

EOS区块链开发IDE推荐使用Visual Studio Code和CLion

每一个开发人员都需要一个良好的IDE,EOS开发也是一样,为项目开发过程构建一个良好的IDE环境是第一步.这就是为什么我们要写这个如何使用VS Code或者CLion进行EOS开发的快速教程的原因. 我们还为VS Code创建了一些脚本,这些脚本将你在终端中使用的一些命令自动化. 设置Visual Studio Code 首先,如果你还没有这些VS Code扩展的话,安装一下.对于EOS Dapp开发,它们将非常有帮助: C/C++ - VS Code的智能感知.调试和代码浏览 CMake -

EOS区块链帐户名称始未

引子 从上一节中,我们知道在EOS系统中帐户必需遵循以两个准则 必须短于13个字符 仅能包含以下字符:.12345abcdefghijklmnopqrstuvwxyzEOS为什么要这样做呢,这样做有什么好处,在EOS源码中又是如何实现的,下面我们从EOS源码中一步步分析,并解答这些疑问. 帐户别名 ??在EOS源码中,帐户的类型是account_name,但account_name在C++代码中又是什么类型呢,追踪代码发现,EOS好多类型都用了别名机制,在源码文件types.hpp中的133行,

“区块链”究竟是什么鬼

最近区块链比较火,区块链是什么鬼,怎么以前没听过,不过说个东西你一定听过-比特币,以前区块链用在比特币上,一直到最近半年,区块链已经渐渐开始有了一些其他应用,特别是在金融领域.那么什么是区块链呢?他和比特币有什么联系呢?我今天整理了之前各家所言,大体上也就明白区块链是什么玩意了. 区块链在比特币的应用 比特币点对点网络将所有的交易历史都储存在"区块链"(blockchain)中.区块链在持续延长,而且新区块一旦加入到区块链中,就不会再被移走.区块链实际上是一群分散的用户端节点,并由所有

区块链大火?区块链究竟是什么?

最近朋友圈的两股创业势力,一炒股二炒币,比特币突然间爆火,区块链技术也相应地进入了话题热点中心. 区块链技术的出现是互联网技术发展到一定高度的必然产物.互联网技术实现了信息的高速传输和共享,但随着互联网的发展,货币这一类需要信任背书的信息,因现有互联网不是价值互联网而无法传递和分享.现有的价值转移是通过银行.支付宝等第三方机构来解决完成的,但这种方式存在着对中心化的人和机构的信任问题,要真正完成以信任为基础的价值转移,需要一个能够自动运行.且具备数学(算法)和机器信任的机制来完成价值转移.因此,

区块链跟P2P究竟有什么关系?

区块链这种技术在欧美国家会相对发展快一点,目前国内只能说处于早期接触和探索的阶段,但要说真正应用的,估计没有一个企业敢说已经把它变为一种生产力了,就目前来看,只是镜花水月. 建安小谢 2016/06/01 10:06浏览 22.1W字体:宋 关注P2P网贷行业的人可能很少有人了解区块链,也很少有人听过区块链,但对于从事在互联网金融行业一线的工作人员来说,区块链应该是目前最火的一个话题.各种鼓吹区块链技术必将颠覆世界,什么"神一样的存在""2016最牛逼技术"&quo

EOS和以太坊那个区块链平台更好?

显然,你已经听说过两个最受欢迎的智能合约区块链,但想知道EOS与以太坊之中哪个更好?或许你想比较一下两种技术?好吧,你来对了地方,因为我要告诉你你需要知道的一切! 在这个EOS vs Ethereum指南中,我将首先解释每个项目的基础知识,然后概述每个区块链的执行情况.这将包括交易时间,交易费用和可扩展性等内容. 之后,我将简要介绍如何在没有第三方的情况下验证交易.这将包括以太坊使用的工作量证明(Proof of Work)与EOS使用的股份授权证明(Delegated Proof of Sta

谈谈目前我对区块链(Blockchain)的认识

从 IBM Bluemix 云平台的过程中,发现了 Blockchain 这个服务,我才知道有这样一种强大火热的技术存在:只前只是知道有比特币,还申请过一个账户也想去挖矿,但后来也是不了了之了,并没有去研究过它背后的技术.前些天看到"关于区块链,你在畅想它,还是开启它?"的话题,根据自己的了解发了一下自己的一点不成熟的看法.为了更深入的了解它,昨天又去参加了"区块链技术与互联网金融的创新和挑战 "的线下活动,现场聆听了朱志文,李赫,汪波等老师的分享,收获很多. 比特