高性能服务器框架 总览
基于对sylar 的开源框架的学习github : https://github.com/sylar-yin
基于这个开源框架的学习,整合出自己的高性能服务器框架。
主要从日志模块、协程调度、配置系统以及HTTP 方面进行学习。
预计4月份整理出大体文档以及UML图的学习和自己的开源框架。
立个flag~~
视频播放器 (服务端)遇到的一些问题(总结)
相关知识补充EPOLL的相关API是线程安全吗?是的。
EPOLL的设计缺陷epoll有一个巨大的设计失误,但凡理解文件描术符是什么的人都能看到这一点。但是如果你回望epoll的历史,你会发现设计者显然不理解文件描述符与文件描述的区别。epoll的缺陷在于它把文件描述符当作内核对象(文件描述)使用。当使用close()方法清理epoll事件订阅时,问题就出现了。epoll_ctl(EPOLL_CTL_ADD) 并没有注册文件描述符,而是注册了一个文件描述符元组和内核对象的指针。最让人困惑的是事件关注者的生命周期跟文件描述符无关,而与内核对象的生命周期相关.由于这个设计缺陷,对文件描述符调用close()方法可能会,也可能不会取消对epoll事件的订阅。如果close方法删除了内核对象的最后一个指针而让对象释放,epoll事件的订阅即可清除。但如果内核对象有多个指针,多个文件描述符,不管在哪一个进程中,close方法都无法清除订阅,很可能会收到已关闭的文件描述符的事件。
EPOLL ONESHOT简单来说就是令EPOLL触发的事件只触发一次,直到下一次调用epoll_ctl进行mod 重 ...
算法复习- 动态规划总结(6)
内容整合自[动态编程模式][1] 同时加上自己的一些总结
模型大部分动态规划可以归结为以下五种模型来解决:
最小/最大路径 : 给定目标,找到达到目标的最小(最大)成本/路径/总和。
统计方法总数 : 给定目标,统计有多少种方法到达目标
合并间隔 : 给定一组数字,考虑到当前数字以及从左侧和右侧可获得的最佳数值,找到解决问题的最佳方案。
决策问题 : 给定一组值,找到答案,并提供选择或忽略当前值的选项。
字符串 : 回文字符串,最长子序列等问题。
最小/最大路径方法在当前状态之前的所有可能路径中选择最小(最大)路径,然后为当前状态添加权重值。
routes[i] = min(routes[i-1], routes[i-2], ... , routes[i-k]) + cost[i]
为目标中的所有值生成最佳解决方案,然后返回目标的值。
模板代码for (int i = 1; i <= target; ++i) {
for (int j = 0; j < ways.size(); ++j) {
if (ways[j] < ...
(转)ELF文件装载链接过程及hook原理
原地址:ELF文件装载链接过程及hook原理
这篇文章是我在研究libco 库中的hook 找到的,感觉能解决不少不懂hook是什么以及如何注册系统回调函数等问题吧。把这个学完后对libco 的代码会有更深的理解
迭代器失效的几种情况总结(转)
1.对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效。这是因为vetor,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,还好erase方法可以返回下一个有效的iterator。
for (iter = cont.begin(); iter != cont.end();)
{
(*it)->doSomething();
if (shouldDelete(*iter))
iter = cont.erase(iter); //erase删除元素,返回下一个迭代器
else
++iter;
}
迭代器失效:
void vectorTest()
{
vector<int> container;
for (int i = 0; i < 10; i++)
{
container.push_back(i);
}
...
libco 协程(2)细说协程的应用场景
名词介绍同步当我们要买一本书,但是淘宝上没有,我们选择一直刷新界面直到出现这本书。这种就叫做同步。
也就是说,如果我们需要的事件没有到来我们需要一直等下去。
异步我们要买口罩但是药店没有,这时候我们拜托店长等到有口罩的时候打电话通知我们去买,然后我们继续去忙其他事,这就叫做异步。
通常,异步的实现是向操作系统注册一个回调函数,当事件发生的时候调用回调函数。
I/O复用模型(事件驱动模型)现在常见的I/O复用模型(如EPOLL,SELECT)都是通过事件回调的方式实现异步操作。具体关于I/O复用模型的内容在Linux I/O模型
以epoll为例,当事件到来的时候我们对相应的套接字进行read()操作,此时在系统同步调用中,是需要将系统缓冲区的数据拷贝到用户缓冲区中后才会返回,就是一直阻塞在这里。对于单线程程序来说,此时就好像卡住了一样。
那么如何解决这样的情况?
引入多线程/多进程因为处理数据的函数,都有可能造成阻塞导致整个程序卡住,那么我们可以用另外一个线程/进程来处理这个函数避免主线程卡住导致后续的请求得不到正确的处理。
主要的核心思想是: 一个线程(主线程)负责监听和分配需要处 ...
libco 协程(1)腾讯开源库环境切换分析
协程是什么?协程可以理解为用户自定义的一种线程,是在用户态下的线程。近几年协程慢慢取代了线程的地位,线程作为CPU执行调度的最小单位,相较于进程有CPU切换开销小的优点。那么协程凭什么能再某些场景下能够取代线程的地位呢?
线程和协程的区别共同点:一样都拥有独立的堆栈和局部变量,稳定性是一样的,崩溃了同样会影响到整个程序。
线程:调度是由CPU进行调度的,在不用同步机制的情况下用户并不知道哪个线程先运行。由于调度是由CPU来进行的,在需要频繁的在用户态和内核态之间切换,在访问一些全局变量需要进行加锁。
协程:调度由用户自主完成,对于自己封装的协程库更需要自己实现一个调度器来实现并发功能。由于是用户自己进行切换的,并不需要像线程一样切换到内核态,只需要保存当前协程的上下文(寄存器),再切换到需要切换到的协程的上下文状态就可以了,有点类似于保存了调用函数状态的函数调用。由于是用户自己进行切换的,在访问一些全局变量上并不会出现多个协程同时对一个变量进行操作的情况,只需要在操作前判断一下状态就可以。
为什么要用协程协程主要实现的功能是能够在将要进行IO操作的时候先切换到其他协程中,等到有IO事 ...
Linux 进程空间地址
版权声明:本文为CSDN博主「张哲BJUT」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/zhangzhebjut/article/details/39060253
进程空间分布
程序段(Text)程序代码在内存中的映射,存放函数体的二进制代码。
初始化过的数据(Data)在程序运行初已经对变量进行初始化的数据。
未初始化过的数据(BSS)在程序运行初未对变量进行初始化的数据。
栈 (Stack)存储局部、临时变量,函数调用时,存储函数的返回指针,用于控制函数的调用和返回。在程序块开始时自动分配内存,结束时自动释放内存,其操作方式类似于数据结构中的栈。
堆 (Heap)存储动态内存分配,需要程序员手工分配,手工释放.注意它与数据结构中的堆是两回事,分配方式类似于链表。
内核空间和用户空间 Linux的虚拟地址空间范围为0~4G,Linux内核将这4G字节的空间分为两部分,将最高的1G字节(从虚拟地址 ...
从 epoll 和 select 的应用场景来更好的了解他们
区别
·
select
epoll
实现机制
轮询+内存拷贝+集合
callback+红黑树+mmap+就绪链表
主要消耗
内存拷贝和大量的轮询
callback函数
最大监测FD数
32位系统1024
nolimit
兼容性、跨平台性
POSIX标准
Linux特有
FD增加的影响
性能线性下降
几乎无影响
消息传递方式
内存拷贝
内存映射
表格取自 基于表格形式的select,poll,epoll对比-IO多路复用函数的应用场景
应用场景从上面的比较可以总结:
select 主要的消耗在于重复的内存拷贝和大量的轮询操作上
epoll 主要的消耗是向内核注册的回调函数上面,文件描述符十分活跃的时候,CPU需要不断的切换上下文,将活跃的FD挂载在链表上,由于有链表的存在使得epoll和poll都可以突破1024
在一开始学习的时候,以为在客户端连接的情况下epoll 都是最好的选择,其实并不然。
当文件描述符在1024以内的时候,select所带来的开支并不会总是epoll 小。
为什么呢?
假设如下场景: 当连接数在1024的时候,这1024条连 ...
关于TCP连接方面的一些问题
TCP连接只能由客户端主动关闭连接吗?不是,服务端可以主动关闭连接的。
滑动窗口和拥塞控制中的拥塞窗口是一个概念吗?滑动窗口和拥塞窗口是在解决两个正交的问题,只不过方法上都是在调整主机发送数据包的速率。滑动窗口是解决Flow Control的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。而拥塞窗口是解决多主机之间共享网络时出现的拥塞问题的一个修正。客观来说网络信道带宽不可能允许所有主机同时全速通信,所以如果全部主机都全速发送数据包,导致网络流量超过可用带宽,那么由于TCP的设计数据包会大量丢失,于是由于重传机制的触发会进一步加剧拥塞,潜在的导致网络不可用。
TCP是怎么保证数据包的有序传递的?数据包是不一定先发先到,但是对于TCP有一点特殊,若我们接受的数据包是在应用层,并且应用层用的是TCP的传输协议的话,这个顺序是保证,这个顺序的保证是在传输层保证的,举个例子:
client发生数据A,B给server,使用的TCP传输,client发送毫无疑问是先发送A,然后发送B,但是有些搞网络的同学可能会有这个疑问,A跟B在物理层走的链路不一样,传输速度不一样,B是 ...
序列化工具 protobuf 介绍
以下内容大部分转载自https://www.cnblogs.com/autyinjing/p/6495103.html Protobuf学习 - 入门
介绍 Google Protocol Buffer(简称 Protobuf)是一种轻便高效的结构化数据存储格式,平台无关、语言无关、可扩展,可用于通讯协议和数据存储等领域。
优势 - 平台无关,语言无关,可扩展;(尤为重要) - 提供了友好的动态库,使用简单; - 解析速度快,比对应的XML快约20-100倍; - 序列化数据非常简洁、紧凑,与XML相比,其序列化之后的数据量约为1/3到1/10。
为什么相比简单的struct 结构protobuf能够实现高效存储采用对数据进行二进制压缩,因为数据在机器语言层面上的表现都是二进制,而简单的 struct 结构体中包含的基本类型如int ,在32位机器中占32位,然而当我们实际传输的时候并不是这32位都用到,protobuf就是将这一情况进行压缩达到的高效序列化数据。
安装源码下载地址: https://github.com/google/protobuf
需要安装依赖的库: ...