当前位置: 首页 > news >正文

NanoLog起步笔记-4-Server端的两个线程

nonolog起步笔记-4-Server端的两个线程

  • Server端的两个线程
  • 两个线程的角色与各自的职责
    • RuntimeLogger::compressionThreadMain线程
  • 详细学习一下相关的代码
    • 第三个线程第一次出现原位置
    • swip buffer

Server端的两个线程

如前所述,nanolog的server端,相对而言是比较简单的。当然,这个“简单”是与客户端相对而言。
所以,我们先来分析相对简单的Server端。

两个线程的角色与各自的职责

当然把nanolog集成到自己的项目中,会发现,多了两个线程。
一个在用户面,一个大多时间在kernel中。
实际上,很容易猜出来,在用户面那个,是将数据从client搬来,kernel那个操作IO.

RuntimeLogger::compressionThreadMain线程

启动的代码在这里:


// RuntimeLogger constructor
RuntimeLogger::RuntimeLogger(): threadBuffers(),...
{for (size_t i = 0; i < Util::arraySize(stagingBufferPeekDist); ++i)stagingBufferPeekDist[i] = 0;const char *filename = NanoLogConfig::DEFAULT_LOG_FILE;outputFd = open(filename, NanoLogConfig::FILE_PARAMS, 0666);...
#ifndef BENCHMARK_DISCARD_ENTRIES_AT_STAGINGBUFFERcompressionThread = std::thread(&RuntimeLogger::compressionThreadMain, this);
#endif
}

下断走过这句,能看到,线程从一个变成了3个:
在这里插入图片描述

详细学习一下相关的代码

第三个线程第一次出现原位置

走过这一句后,第三个线程就会出现
if (aio_write(&aioCb) == -1)
fprintf(stderr, “Error at aio_write(): %s\n”, strerror(errno));

在这里插入图片描述
其中,与aioCb相关的内容很多,这里我不去分析了。有兴趣的可以自行分析吧。
大意是串行化,这个关于

https://man7.org/linux/man-pages/man3/aio_write.3.html
The aio_write() function queues the I/O request described by thebuffer pointed to by aiocbp.  This function is the asynchronousanalog of write(2).  The arguments of the call

也是在强调串行化。也就是server数据接收线程,受制于异步IO的读写。
这是一个需要优化的点。对我当前的任务来讲。不过先放一下。

当然,这四句是,每次操作时,比较重要的:

        aioCb.aio_fildes = outputFd;aioCb.aio_buf = compressingBuffer;aioCb.aio_nbytes = bytesToWrite;totalBytesWritten += bytesToWrite;

前面许多相关的代码,与串行化相关。不累述。

swip buffer

下发异步io控制指令后,交换buffer这句是比较重要的,

        encoder.swapBuffer(outputDoubleBuffer,NanoLogConfig::OUTPUT_BUFFER_SIZE);std::swap(outputDoubleBuffer, compressingBuffer);

在这里插入图片描述
类似ping&pang buffer

http://www.lryc.cn/news/500817.html

相关文章:

  • linux zookeeper安装并服务化
  • 很简单,但是很实用。把docker run改写成docker compose。
  • DAMODEL丹摩|丹摩平台:AI时代的开发者福音
  • 全面解析租赁小程序的功能与优势
  • VRRP的知识点总结及实验
  • 商业银行基于容器云的分布式数据库架构设计与创新实践
  • 2025计算机毕设选题推荐【30条选题】【基础功能+创新点设计】
  • SpringBoot+OSS文件(图片))上传
  • docker镜像构建企业级示例
  • 【源码】Sharding-JDBC源码分析之SQL中读写分离动态策略、数据库发现规则及DatabaseDiscoverySQLRouter路由的原理
  • Spark 之 partitons
  • 使用Zerotier配置虚拟局域网,踏坑
  • 【优选算法 二分查找】二分查找算法模板详解:二分查找 & 在排序数组中查找元素的第一个和最后一个位置
  • gitlab 生成并设置 ssh key
  • 计算机视觉在科学研究(数字化)中的实际应用
  • 移动应用开发课程第六次实验:为实验2添加登陆页面,用SQList存储好友基本信息
  • nextjs增加系统路径前缀(basePath)适配方案
  • 嵌入式蓝桥杯学习拓展 LCD翻转显示
  • 学习threejs,实现配合使用WebWorker
  • TDengine 新功能 复合主键
  • JVM 面试题
  • 组件上传图片不回显问题
  • 【JavaWeb后端学习笔记】Spring AOP面向切面编程
  • 6.584-Lab5B
  • OceanBase 的探索与实践
  • 安卓调试环境搭建
  • 动画Lottie
  • C++感受14-Hello Object 封装版 - 上
  • 网络安全中大数据和人工智能应用实践
  • RISC-V架构下OP-TEE 安全系统实践