给个网址2022年能直接看的seo 是什么
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
