随笔分类 - linux
分析linux下的点滴细节
摘要:BIO即background I/O service,后台I/O服务,是redis的aof持久化后台服务。 redis把阻塞的同步I/O操作交给后台I/O服务来完成:close和fsync。 close加入BIO的原因 1.如果fd是特定文件描述符的最后一份拷贝,那么文件描述符相关的资源会被释放。
阅读全文
摘要:1.调用alarm,在调用超过指定时间时产生SIGALARM信号,这涉及到信号处理,而且可能和进程中其他的alarm冲突 2.使用select阻塞在等待I/O上,select内部有时间限制,一次代替在read和write上阻塞超时 3.使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项
阅读全文
摘要:典型应用于以下场合 1.处理多个描述字时,比如同时处理套接字和磁盘IO、终端IO 2.一个客户同时处理多个套接字 3.服务器既要处理监听套接字,又要处理已连接套接字 4.既要处理TCP、也要处理UDP 5.一个服务器要处理多个服务和协议 I/O多路复用不局限于网络编程,也可以用于其他程序。 UNIX
阅读全文
摘要:网络编程不只是编写网络、主机、进程都正常时能良好工作的进程,更重要的是客户主机崩溃、客户进程崩溃网络异常时怎么处理。 accept被信号中断 accept以及套接字上的I/O可能被信号打断,并返回EINTR作为结果,必须处理该返回值并且适当时候再次调用。 for(;;) { if(connfd =
阅读全文
摘要:linux的信号来源 1.由一个进程发给另一个进程(或本身) 2.内核发给进程 信号的特征 异步的,分为可靠信号和不可靠信号。 进程收到信号时怎么处理1.执行信号处理程序2.如果收到信号时处在一个阻塞函数中,中断当前系统调用并执行信号处理程序3.如果想要信号处理程序后恢复被中断的系统调用,需要设置S
阅读全文
摘要:PDU 协议数据单元,有隐藏size上限,如果应用程序的包超过指定上限会被划分为多个PDU发送 TCP不提供记录结束标记,需要应用程序自己提供,比如http的\r\n 编写TCP协议需要注意IPV4和IPV6的兼容性,可以在应用程序中实现协议无关性。 getaddrinfo getaddrinfo
阅读全文
摘要:概要 redis的每个server实例都维护着一个保存服务器状态的redisServer结构 struct redisServer { /* Pubsub */ // 字典,键为频道,值为链表 // 链表中保存了所有订阅某个频道的客户端 // 新客户端总是被添加到链表的表尾 dict *pubsub
阅读全文
摘要:引言 C10K problem提到一种zero-copy的技术,可以提高网络的吞吐量,分布式消息队列kafka中在消费者消费消息的时候根据offset进行zero-copy。linux下的zero-copy通过sendfile API实现。 什么是zero-copy zero-copy在概念上是值操
阅读全文
摘要:什么是C10K问题 I/O策略 软件架构 1.单线程解决多重I/O调用 不要使用阻塞/同步的调用,如果非要这么做,那就采用多进程或者多线程来并发处理。 使用非阻塞的调用和就绪通知策略,当下一个I/O可用时通知调用者。适用于套接字I/O,而不是磁盘I/O. 使用异步的调用和通知策略,当下一个I/O可用
阅读全文
摘要:reactor介绍 reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器。 Reactor的优点和应用 Reactor最常用于非阻塞的socket 传统的设计是一种同步的停等协议,读写操作执行后要等待当前fd的下一次可读/写事件,这期间什么都不能干,
阅读全文
摘要:libev是一个开源库,实现了一个reactor模式事件驱动任务调度库。代码非常精简,包含所有实现的.c文件只有不到5000行。 支持的事件类型: ev_io ev_timer ev_periodic ev_signal ev_child ev_stat ev_idle ev_prepare and
阅读全文
摘要:Boost::Asio可以在socket等I/O对象上执行同步或异步操作,使用Boost::Asio前很有必要了解Boost::Asio、你的程序以及它们交互的过程。作为一个引导的例子,我们思考一个当一个socket执行连接操作时发生了什么,我们首先开始一个同步的例子你的程序需要一个io_servi
阅读全文
摘要:判断一个字符c是否在一个字符串str中,你会怎么处理?1.for或者while循环判断可以,但是效率够呛2.建立size为256的静态映射表char tb[256],将字符串str中的所有数值映射到tb中,判断tb[c]==1就可以知道字符是否存在str中。可以,还是可以优化的3.用位压缩技术对tb...
阅读全文
摘要:段错误或者其他导致程序退出的错误一直以来都像蛮不讲理的莽汉一样,把我们辛辛苦苦开发的程序肆意破坏掉,留下一个或大或小的core文件让我们头疼去,我们痛哭流涕之后默默承受这份忧伤。。。段错误由SIGEGV产生,可以被用户捕捉,也就给了我们保存程序重要数据的机会,借用glibc某函数处理SIGEGV的一...
阅读全文
摘要:getopt是linux下解析命令行参数的api。以linux内核代码的一个例子来说明:static void cmdline(int argc, char *argv[]){ int opt; progname = basename(argv[0]); while ((opt = getopt(...
阅读全文
摘要:目标场景是这样的: 多线程的应用程序要频繁打一些小字节的日志,也不想引用很重的日志库。 设想了一个极其简单的日志组件,main线程中重定向stdout到文件,同时setbuffer设置一个10k的缓冲区,工作线程直接向stdout输出日志。 很简单,但是有些担心,多线程写同一个文件会不...
阅读全文
摘要:看memcached代码的时候学习了一个api,setbuf,可以设置文件流的缓冲区。 #include void setbuf(FILE *stream, char *buf); void setbuffer(FILE *stream, char *buf, size_t size); void...
阅读全文
摘要:36m的文件,在局域网服务器之间socket单进程传输,client读取源文件并socket发送文件,server接收文件。server日志打屏的时候花费时间begin sec[1433750824], microsec[847467]file[tsl.txt] read over .end se...
阅读全文
摘要:分别以1倍size,10倍size,100倍size写入同样大小的数据,分别测试大文件写入和内存拷贝。tfwrite woaoniyoujifen,yueliangdaibiaowodexin!small write 100w times begin ...begin sec[1433735551...
阅读全文
摘要:测试文件写同样大小的文件,单次记录较小和单次记录较大能有多大的性能差别。 最终写入同样大小的文件,小记录需要写入10w次,大记录需要写入1w次,看下最终的性能报告 从测试的结果来看,大记录写入1w次的效率是小记录的8倍。在注重性能的服务器上尽量避免频繁的几个字节或者几十个字节的文件写入操作。单...
阅读全文