共计 4 篇文章

2:C1000K 实战,基于 Libev

最近公司年终旅游,博客也是有很久没有更新了,这次继续我们上一次的高并发服务器编程。 上一篇文章讲解了要在Linux系统上实现C1000K服务器所需要进行的系统调优操作,那么我们现在就开始来编写我们的程序吧~ #include <arpa/inet.h> #include <ev.h> #include <stdlib.h> #include <stdio.h> ...

EINTR-信号中断与慢系统调用

什么是慢系统调用? 慢系统调用指的是那些可能永远阻塞的系统调用,永远阻塞的系统调用意味着该调用永远无法返回,而多数网络支持函数都属于这一类系统调用。就如同**accept()**函数,如果没有客户连接,那么该调用将会一直阻塞。 读写‘慢’设备(包括pipe,终端设备,网络连接等)。读时,数据不存在,需要等待;写时,缓冲区满或其他原因,需要等待。读写磁盘文件一般不会阻塞。 当打开某些特殊文件时,需要等待某些条件,才能打开。例如: ...

malloc 的原理与产生内存碎片的原因

什么是缺页中断? 当一个进程发生缺页中断的时候,进程会陷入内核态,执行以下操作: 1、检查要访问的虚拟地址是否合法 2、查找/分配一个物理页 3、填充物理页内容(读取磁盘,或者直接置0,或者啥也不干) 4、建立映射关系(虚拟地址到物理地址) 重新执行发生缺页中断的那条指令 如果第3步,需要读取磁盘,那么这次缺页中断就是majflt,否则就是minflt。 内存分配的原理 从操作系统角度来看,进程分配内存有两种方式,分别由两个系统调用完成: ...

一个简陋的事件轮询

最近在开发程序的时候遇到一个小问题,就是当数据包到达时,如何根据传入的参数自动调用相应的处理函数。 奈何博主愚钝,并没有找到很好的解决方法,参照Epoll的思想,是否自己也能实现一种事件轮询的机制,之后便实验了一番,确实可行,故书博文一篇,记述一下自己的过程。 首先我们准备一个容器,用来存放已经注册了的事件集合,这里我选择了队列来作为这个容器的实现。 typedef struct FuncObject { int type; // 事件类型/标识符 void (CallBack*)(void *arg); //事件回调 ...