Linux系统编程
swings_ss
C++后台、计算机视觉
展开
-
epoll的ET模式为什么一定要使用非阻塞IO
ET模式下每次write或read需要循环write或read直到返回EAGAIN错误。以读操作为例,这是因为ET模式只在socket描述符状态发生变化时才触发事件,如果不一次把socket内核缓冲区的数据读完,会导致socket内核缓冲区中即使还有一部分数据,该socket的可读事件也不会被触发根据上面的讨论,若ET模式下使用阻塞IO,则程序一定会阻塞在最后一次write或read操作,因此...原创 2019-02-26 23:35:39 · 3176 阅读 · 0 评论 -
为什么TCP服务器的监听套接字要设置为非阻塞
我们一般使用IO复用来实现并发模型,如果我们默认监听套接字为阻塞模式,假设一种场景如下:客户通过connect向TCP服务器发起三次握手三次握手完成后,触发TCP服务器监听套接字的可读事件,IO复用返回(select、poll、epoll_wait)客户通过RST报文取消连接TCP服务器调用accept接受连接,此时发现内核已连接队列为空(因为唯一的连接已被客户端取消)程序阻塞在ac...原创 2019-03-04 11:43:49 · 2506 阅读 · 11 评论 -
需要使用UDP而不是TCP的几种场景
广播和多播这种情况下必须使用UDP,因为TCP无法进行广播和多播简单的请求-应答应用程序这种情况下可以使用UDP,提升效率必须加入错误检测功能,涉及确认、超时和重传...原创 2019-03-04 11:49:57 · 1621 阅读 · 0 评论 -
惊群问题
定义惊群问题是指在多线程(或多进程)场景下,有多个线程在等待某一资源可用,一旦这个资源可用,那么所有等待这个资源的线程都会被唤醒,但是资源只有一份,那么只有一个线程获得这个资源,其它线程都获取失败惊群问题导致了不必要的线程唤醒,实际上只有一个线程能获取这份资源,那么理想情况下只唤醒一个线程就行了。而唤醒多个线程导致了不必要的线程调度,造成系统开销经典的accept惊群问题在Linux...原创 2019-03-19 21:22:40 · 3601 阅读 · 0 评论 -
服务器多进程、多线程和事件驱动模型
多进程模型、多线程模型多进程模型每接受一个连接就fork一个子进程,在该子进程中处理该连接的请求特点是多进程占用系统资源多,进程切换的系统开销大,Linux下最大进程数有限制,不利于处理大并发多线程模型每接受一个连接就create一个子线程,利用子线程处理这个连接的请求Linux下有最大线程数限制(进程虚拟地址空间有限),进程频繁创建和销毁造成系统开销,同样不利于处理大并发...原创 2019-03-13 12:09:49 · 584 阅读 · 0 评论 -
云风协程库代码分析
一、什么是协程协程,英文叫做 Coroutine,又称微线程、纤程,协程是一种用户态的轻量级线程。简单地说,协程就是在用户态对线程的模拟,我们都知道线程的调度是由操作系统内核完成的,而协程的调度是由用户代码完成的。相比线程,协程有如下优势协程切换在用户态完成,不需要进入内核态,没有线程切换的开销,效率更高多个协程是在同一个线程中运行的,不存在多线程环境下的写变量冲突,因此不需要多线程的锁...原创 2019-03-13 17:36:40 · 517 阅读 · 0 评论 -
收集的C++后台实习生面试题
目录腾讯三次握手和四次挥手过程,握手为什么不是两次TCP和UDP的区别UDP能不能实现可靠连接流量控制进程和线程的区别进程间通信方式守护进程堆和栈的区别STL有没有用过,vector怎么实现map怎么实现红黑树有什么特性常见排序算法有哪些,时间复杂度快排的思路讲一下给大量qq号(亿为单位)排序数组里搜索第k大的数非递归二分查找链表相加select、poll...原创 2019-04-29 16:28:19 · 769 阅读 · 0 评论 -
libevent中的信号管理
一、前言Libevent(1.4.13 版本)的源码中,event_base 结构体中的成员 sig 用于管理信号事件,sig 的变量类型为 struct evsignal_info。二、相关结构体struct evsignal_info 定义在 evsignal.h 头文件中,如下:typedef void (*ev_sighandler_t)(int);struct evsigna...原创 2019-06-14 15:50:08 · 373 阅读 · 0 评论 -
libevent核心原理
Libevent 是一个轻量级的高性能网络库,事件驱动,基于 Reactor 模式。对 Libevent 源码的阅读可围绕事件管理展开:Libevent 对三类事件源进行了统一,用 event 结构体表示,每个 event 实例表示一个事件。同时监听多个事件(比如监听多个 socket 上的可读事件),必然会有多个 event 实例,对这些 event 实例进行管理需要特定的数据结构,Li...原创 2019-07-12 17:47:12 · 1959 阅读 · 0 评论