当前位置: 首页 > 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.mrgr.cn/news/79613.html

相关文章:

  • BottomNavigation
  • NanoLog起步笔记-1
  • ubuntu16.04部署dify教程
  • ESP32开发 云调试
  • 加强版第十二章 开闭操作
  • 协程设计原理与实现
  • QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示
  • 我们来学mysql -- 事务并发之不可重复读(原理篇)
  • Text2SQL(NL2sql)对话数据库:设计、实现细节与挑战
  • 【论文阅读】相似误差订正方法在风电短期风速预报中的应用研究
  • NanoLog起步笔记-7-log解压过程初探
  • 【开源】A063—基于Spring Boot的农产品直卖平台的设计与实现
  • Vue3小兔鲜电商项目
  • 【人工智能基础08】卷积神经网络习题:卷积神经网络计算、图像填充、卷积的表达与设计
  • 【优选算法 位运算】位运算算法入门详解:位运算小专题
  • 分布式架构
  • 使用mmdeploy框架C++预测mask并绘制最小外接矩形
  • 排序算法(1):冒泡排序
  • STM32F103 FPGA进行通信方式
  • 第四十六篇 Vision Transformer论文翻译