Recv设置MSG_DONTWAIT依然阻塞 记录了服务器DEBUG,设置MSG_DONTWAIT依然阻塞的问题。使用gdb启动发现底层运行reactorIO模型的线程阻塞在了recv()上。ps aux |grep 发现进程还在,top 查一下发现cpu占用100%。还在调用recv时设置了MSG_DONTWAIT,用man手册说明查看,应该设置了便不会阻塞。当对端突然关闭连接,不会返回-1并且设置错误码。后来我只能耐心的把recv的说明仔细地看了一遍,终于发现了问题。每次遇到用户疯狂刷新,服务器就会瘫痪。
Linux man手册查找不到 常见问题总结 更新后man手册的pages路径变为 /opt/rh/devtoolset-XX(XX版本)/root/usr/share/man。1. cd /opt/rh/devtoolset-XX(XX版本)/root/usr/share。man手册的所有pages保存在 /usr/share/man。解决方案: 建立软连接即可重命名文件夹备份后建立软连接即可。
KMP算法 看这一篇就够了 图解刨析+代码 某一个位置出现匹配失败的时候,我们能否利用已知信息来免去不必要的比对?如图当指针分别指向 i,j处时,j之前的部分是完全一致的,能否挖掘这条信息的价值来提高效率?KMP算法的核心就是利用已知的信息来提高效率。
Linux | 线程概念以及创建与等待 Linux操作系统并不是真线程操作系统,意味着没有专门描述组织线程的内核数据结构,所有线程都是通过进程PCB模拟的.进程是系统分配程序资源的基本单位,如虚拟内存,页表,文件描述符表,信号集...这些资源都是按照进程为单位来分配的!
什么是临界区 临界资源 原子性? 临界资源(Critical Resource): 一次只允许一个执行流访问的公共资源称为临界资源.比如在生活中,一个厕所隔间或者公交座位就是临界资源(常规情况下).临界区(Critical Section): 对公共资源进行访问的程序片段,也就是不加访问控制,会有安全问题的代码段.但在多线程的场景下,可能会出现多个执行流并发访问同一个公共资源的情况,这时候,我们就要通过各种方式,保证他是临界资源.如下这段代码下,全局变量ticket 被多线程共享,此时它时公共资源,但各线程并发对它读写,他就不是临界资源.
Linux | 进程信号 产生未决到递达 每个进程的PCB内都能找到3张表 block pending hander.不同的环境实现这三张表的方式可能略有区别,可以理解为block和 pending表示类似于位图的结构 hander表是指向信号对应处理方法的数组(指针数组).对于信号的理解就基于这三张表展开,从信号的产生,检测,到处理来逐步剖析
Linux系统中的管道通信 管道,是Linux下常用的进程间通信手段,具体的通信方法是 父进程打开管道文件,被子进程继承,通过文件描述符fd,并且,数据在管道文件中的读写是彻底的内存级别的,即不与磁盘交互,读和写皆是在内存中,效率也有一定的保证。以上三点机制,使得管道能像文件一样操作的同时,避同时免了使用普通文件进程间通信的 极度的 不安全性。需要注意的是,文件名只是用来标识唯一性,数据的传输更匿名管道一样,完全是内存级的。2.往管道中写入数据时,如果管道满了,或正在被读取,执行写入的进程会阻塞等待。
Linux下一切皆文件? -- 理解文件标识符fd 什么是文件标识符?最浅来看 文件标识符就是我们调用系统接口 open 打开文件时,open函数的返回值。但要深入理解它,我们得知道:1.文件打开的本质什么,操作系统如何管理被打开的文件?2.打开的文件与打开它的进程如何建立联系,也就是进程如何找到要操作的文件的?为什么它是访问文件的唯一凭证?
彻底弄懂C++虚拟继承 为了解决普通继承的“数据冗余”和“二义性”的问题,C++引入了虚拟继承使得在多重继承下,基类成员只继承一份。这篇博客主要解析1.虚拟继承机制,如何做到的? 2.它和普通继承有什么区别?3.虚拟继承同时满足多态会怎样? .........
C++ 继承 inheritance)机制是面向对象程序设计的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用。.........