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_STAGINGBUFFER
compressionThread = 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 the
buffer pointed to by aiocbp. This function is the asynchronous
analog 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