5. 共享栈模式 这种做法有什么好处?其实我们可以直接想想以前的方法(每个协程单独分配栈)有什么坏处好了: 以前的方法为每个协程都单独分配一段内存空间,因为是固定大小的,实际使用中协程并不能使用到这么大的内存空间,于是就会造成非常大的内存浪费(有同学一定会问为什么不用 Split Stack ,这个东西的性能有多垃圾有目共睹)。而且因为绝大多数协程使用的栈空间都极少,复制栈空间的开销非常小。 因为协程的调度是非抢占的(non-preempt),而在 libco 中,切换的时机都是做 I/O 的时候,并且只有在切换的时候才会去复制栈空间,所以开销也可控。 具体原理:我们一步步来看其调用,从其中明白他的原理 在协程环境初始化时,要先调用 (co_alloc_sharestack) 来分配共享栈的内容,其中第一个参数 count 是指分配多少个共享栈,stack_size 是指每个栈的大小 ,分配出来的结构名是 stShareStack_t 。 stShareStack_t 结构 继续阅读 >>


刘生玺 19/01/19 16:15:40
之前安装过tomcat并无异常,能正常访问主页,然后删掉,隔了一段时间重新安装后访问主页时浏览器(火狐显示为空白页)(chrome显示为404),按F12,刷新后network显示请求状态为404,然后在网上搜解决方法,总结如下: 1 好多博客说的原因是tomcat默认根路径是webapps下的ROOT目录,主页出错可能是因为该目录为空,自己看了一下并不为空,也不缺少文件 2 还有博客说是conf/server.xml配置的问题,自己试着改来改去也没用, 3 还有博客说给ROOT/WEB_INF/web.xml加指定默认启动的文件,自己试后并无效果 4 有博客提到JAVA环境变量的问题,和同学对比后发现并无错误 期间也试过7.0/8.0/9.0,都不行就应该和版本没关系,半天找不到原因就开始反思为什么上次可以这次就不行,思来想去发现这期间就干了一件可能有影响的事---重新配置了jdk ,再联想一下有网友说查一下日志,于是...如下图: 赶紧去看了一下,发现我的jdk/jre/lib下的jar包果然没得 继续阅读 >>


严欣豪 19/01/03 20:09:48
我们都知道,当我们要在一个集合中查找数据时,如果这个集合是顺序表且我们能确定要找的数据在顺序表中的位置的话,我们就能通过下标直接找到元素,这无非是我们要追求的最高效的查找策略!但是现实总是那么骨感,在大多数情况下,要在茫茫数据海洋中找某些关键信息,是不可能直接找到的。因为我们并不知道我们要找的数据与其所在位置之间是否存在某种关联。 所以我们在存储数据时,建立如同顺序表形式的可以按照下标进行查找的存储集合,然后我们可以认为建立要存的关键信息和其在集合中的下标之间的关系,这样我们在找想找的信息时,就可以确定信息在集合中的下标了,这样就可实现较为高效的查找了。而我们所说的这个集合就称为哈希表,建立的下标与信息的关系可以通过哈希函数(自定义合理的函数)来实现。 哈希表在查找,加密等很多方面都有广泛用途。 今天我用拉链法建立了简单的哈希表其结构如图所示: 源码 #include <iostream> #include<array> #include<memory> 继续阅读 >>


畅柯 18/12/26 23:43:15
Using Asio with C++11 这篇文章既作为Asio网络库的一个介绍,也作为Asio网络库与C++11进行协同实现和使用的一个简单的概览。 本文主要介绍的不是跟随Boost发布的Asio库,而是Asio独立于Boost的一个版本,我们所介绍的这个版本的Asio有以下几个目标: 在库接口上使用C++11语言和标准库特性。 证明这个库可以在仅仅使用C++11标准库和操作系统提供的设施下实现 你可以在这里找到这个版本的Asio源代码: http://github.com/chriskohlhoff/asio/tree/cpp11-only 使用I/O流来解决简单情况 在很多应用程序里,网络环节不是其核心特性,也不把网络环节看做应用开发者的核心竞争力。那么,为了迎合这些情况,Asio提供了一个TCP套接字的高阶抽象的接口,它是根据大家很熟悉的C++输入输出流(iostream)来设计的。 用这个方法来使用这个库的话,创建一个流对象将异常简单,简单到仅仅需要提供远程主机的一些细节,下面就是一个构 继续阅读 >>


娄泽豪 18/12/24 17:37:17
协程实现原理 协程的本质都是通过修改 ESP 和 EIP 指针来实现的。其理论上还是单线程在运行. 程序在CPU上运行时依赖3个寄存器: ESP寄存值指向当前栈顶地址,指向当前指令需要的数据 EBP指向当前活动栈帧的基地址 指令寄存器IP,指向当前需要运行的指令 其中主要有(IP,ESP)寄存器最重要,这两个寄存器指针的改变可以修改当前需要加载到 CPU 运行的指令和数据,当某个操作陷入到耗时的等待中时,通过修改这两个指针即可让出CPU,交给其他的任务去使用,每个任务都必须主动的让出CPU,然后等待下一次的调度来继续未完成的任务,这样就可以最大程度的利用CPU,当一个任务等待过程非常短的时候,就出现了多个任务并行运行的效果,也就是协程。 实现协程的多种方法 利用 glibc 的 ucontext 组件(云风的库) 使用汇编来切换上下文(实现miniC协程,腾讯libco) 利用C语言语法switch-case的奇淫技巧来实现(Protothreads) 利用了 C 语言的 setjmp 和 lon 继续阅读 >>


刘生玺 18/12/20 22:56:00
文章目录Connector classConnector.hConnector.ccTcpClientTcpClient.hTcpClient.cc判断连接建立成功 Connector class Connector class负责主动发起连接, 他不单独使用, 而是包含在TcpClient class内, Connector不负责创建 socket, 只负责连接的建立, 包括这其中的错误处理和重连 需要考虑的难点: socket 是一次性的, 当 connect 出错, 我们必须关闭该 socket, 重新创建一个 socket, 但是Connector是可以反复使用的, 错误码和Acceptor不同, EAGAIN 是真的出错了, 表明本机临时端口暂时用完了( ephemeral port ), 需要延期重试, “正在连接” 的的返回码是 EINPROGRESS, 重试的间隔应该逐渐延长, 需要处理自连接 Connector.h #ifndef MUDUO_NET_CONNECTOR_H # 继续阅读 >>


吕子健 18/12/19 16:14:02
文章目录功能描述TcpConnection.hTcpConnection.cc 功能描述 TcpConnection class用来表示一个 TCP 连接, 不可再生, 如果这个连接断开, 那么该TcpConnection就失去了意义 TcpConnection中包含有封装好的读写 buffer, 用来收发数据 TcpConnection的生命周期由智能指针shared_ptr来管理, 具体在下面的注释中有 TcpConnection对象有四个状态, 表示连接的正在建立, 建立完成, 处于断开 (TcpConnection不主动关闭一个连接, 都是等客户端主动关闭), 已经断开 TcpConnection.h #ifndef MUDUO_NET_TCPCONNECTION_H #define MUDUO_NET_TCPCONNECTION_H #include <muduo/base/noncopyable.h> #include <muduo/base/StringPiece.h 继续阅读 >>


吕子健 18/12/18 21:40:11
文章目录AcceptorAcceptor.hAcceptor.ccTCPServerTCPServer.hTCPServer.cc Acceptor Acceptor class用来接收一个新的 TCP 连接 Acceptor.h #ifndef MUDUO_NET_ACCEPTOR_H #define MUDUO_NET_ACCEPTOR_H #include <functional> #include <muduo/net/Channel.h> #include <muduo/net/Socket.h> namespace muduo { namespace net { class EventLoop; class InetAddress; /// /// Acceptor of incoming TCP connections. /// class Acceptor : noncopyable { public: typedef std:: 继续阅读 >>


吕子健 18/12/17 20:42:15
前言: 基于: csdn1 娄神的描述 其实看上面两位大佬的博客就已经ojbk了.写的目地主要是自己总结学习一下. 基础: 1.基础的 WebServer应该支持客户端请求静态文件和动态文件. 2. 浏览器是不能够解析动态的php文件的!那么我们编写服务器程序时候如果遇到请求.php动态文件时就应该将php文件翻译为html文件. 3. php-fpm就能够将php文件翻译为html文件.所以我们的webserver将通过进程间通信把php文件交给php-fpm,然后把php-fpm翻译过后的html文件发给客户端即可,(php-fpm)就等价于一个CGI 服务器. 4.那么我们如何才能让php-fpm帮我们解析我们想要翻译成.html文件的.php文件呢?通过**fastcgi协议,其实就是WebServer与php-fpm之间通信的规则(或者说是'语言')** 1. fastcgi 协议 (1) 请求头    和’任何协议一样,fastcgi协议也有一个消息头或者叫做请求头.其格式是固定的.用以表示 继续阅读 >>


刘生玺 18/12/12 22:34:11
文章目录muduo 的 Reactor 模式大概逻辑EventLoop classEventLoop.hEventLoop::loopChannel classChannel.hChannel.ccEpollPoller classPoller class初始化EpollPoller.hEpollPoller.cc 日后的学习中必然会有新的认识, 保持更新系列 muduo 的 Reactor 模式 muduo 中构成 reactor 模式的最核心的三个类是 Channel class, EpollPoller class, EventLoop class, 这三个类负责将 IO 复用拿到的各个类型的事件分发给各个文件描述符对应的事件处理函数 本文假设是在默认使用 epoll 的情况下分析的 大概逻辑 首先调用 EventLoop::loop 函数, 该函数循环调用 EpollPoller::poll 函数, 在poll 函数中会调用epoll_wait函数, 然后EventLoop::lo 继续阅读 >>


吕子健 18/12/12 11:24:53