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



















