自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

鱼思故渊的专栏

不积跬步,无以至千里;不积小流,无以成江海

  • 博客(67)
  • 资源 (3)
  • 收藏
  • 关注

原创 堆和栈空间的区别

堆和栈的对比:    栈是系统提供的功能,特点是快速高效,缺点是有限制,数据不灵活;而堆是函数库提供的功能,特点是灵活方便,数据适应面广泛,但是效率有一定降低。栈是系统数据结构,对于进程/线程是唯一的;堆是函数库内部数据结构,不一定唯一。不同堆分配的内存无法互相操作。栈空间分静态分配和动态分配两种。静态分配是编译器完成的,比如自动变量(auto)的分配。动态分配由alloca函数完成。

2014-03-31 19:36:10 1773

转载 C/C++程序内存分布

一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

2014-03-31 17:54:57 1121

原创 muduo源码分析--连接的断开

在Tcp中断开连接比创建连接更加困难        真正执行断开连接的时候是从在channel中的handleEvent函数,在Channel中并没有handleRead、handleWrite、handleClose函数出里的实现,都是借助注册的回调来进行的。        在某一个channel上有事件到达时,执行相应的操作,更具事件类型执行相应的操作这个步骤是在handleEvent

2014-03-31 17:02:57 2636 1

原创 muduo源码分析--EventLoop 类的实现

首先看EventLoop的具体实现,因为继承了boost::noncopyable。所以这个类是不可拷贝的。    从设计muduo的理念来看,one loop per thread顾名思义每个线程只能有一个EventLoop对象,因此EventLoop的构造函数就会检查当前线程是否已经创建了其他EventLoop对象,遇到错误就终止程序(LOG_FATAL).EventLoop的构造函数会记

2014-03-31 13:35:41 2460

转载 栈与堆空间

一个由C/C++编译的程序占用的内存分为以下几个部分: 1、栈区(stack):又编译器自动分配释放,存放函数的参数值,局部变量的值等,其操作方式类似于数据结构的栈。 2、堆区(heap):一般是由程序员分配释放,若程序员不释放的话,程序结束时可能由OS回收,值得注意的是他与数据结构的堆是两回事,分配方式倒是类似于数据结构的链表。 3、全局区(static):也叫静态数据内存空间,存储

2014-03-30 09:03:57 933

原创 HTTP协议状态码的含义

附录:HTTP协议状态码的含义     状态代码 状态信息 含义    100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)   101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新   200 OK 一切正常,对GET和POST请求的应答文档跟在后面。   201 Created 服务器已经创

2014-03-29 21:48:00 1831

原创 TCP/IP详解--TCP中异常关闭连接的意义 异常关闭的情况

一、异常关闭连接的意义    终止一个连接的正常方式是发送FIN。在发送缓冲区中所有排队数据都已发送之后才发送FIN,正常情况下没有任何数据丢失。但我们有时也有可能发送一个RST报文段而不是FIN来中途关闭一个连接。这称为异常关闭。    进程关闭socket的默认方式是正常关闭,如果需要异常关闭,利用SO_LINGER选项来控制。     异常关闭一个连接对应用程序来说有

2014-03-29 21:04:11 12538 1

原创 TCP/IP详解--TCP/IP工作流程

Intemet采用TCP/IP协议。TCP/IP是一种网际互联通信协议,它包括两个核心协议TCP和IP。TCP称为传输控制协议,IP称为互联网络协议。[编辑]TCP/IP的基本工作原理[2]  TCP/IP模型有四层(应用层、传输层、网际层、网络接口层),每层分别具有不同的协议和功能,TCP/IP协议族是一组在不同层上的多个协议的组合。各层在实现自身的功能时,使用它的直接下层提供的

2014-03-29 20:41:04 6813

原创 TCP/IP详解--以太网帧结构 IP层关注的MTU 网络中MSS大小

对于千兆以太网,每秒能传输1000Mbit数据,即125000000B/s,每个以太网frame的固定开销有:前导码和帧开始符preamble(8B)、MAC(12B)、type(2B)、payload(46B~1500B)、CRC(4B)、gap(12B),因此最小的以太网帧是84B,每秒可以发送1488000帧。最大的以太网帧是1538B,每秒可发送81274帧。接下来算TCP有效负荷:一个T

2014-03-29 14:05:12 7079

原创 muduo源码分析--buffer中的线程安全

在栈上准备了一个65536字节的extrabuf(这个空间是在readFd函数内部定义的,说以说是内部栈空间,在这个函数返回以后这个栈空间就会消失,属于临时变量),然后利用readv(0来读取数据,iovec有两块,第一块指向Muuod Buffer中的writable字节,另一快指向栈上extrabuf。这样如果读入的数据不多,那么全部都读到Buffer中去了;如果长度超过Buffer的writ

2014-03-29 10:15:26 2398

原创 muduo源码分析--数据发送

暂且已经明白在non-blocking+IO multiplexing网络编程模型中应用层的buffer是必须的这个问题,看数据是怎么被发送的:        对于应用程序而言,它只管生成数据,它不应该去关心到底数据是一次性发送还是分成几次发送,这些应该由网络库操心,程序只要调用TcpConnection::send()就行了,网络库会负责到底。网络库应该接管这剩余的20KB数据,把它保存在该

2014-03-28 16:35:18 1726

原创 muduo源码分析--数据在muduo中的旅程

在实例化一个EvenLoop之后,就会有两个socketfd(这两个套接字分别归属于两个Channel中,一个是异步唤醒的wakeFd,一个timequeue初始化的fd)被添加到监听队列中        数据发送的流程:        数据的发送主要靠异步唤醒,当主IO线程接受到一个新的连接后,在TcpServer中实例化一个TcpConnection,然后这个新的连接被挂载到某个线程池

2014-03-28 14:15:20 1788

原创 muduo源码分析--TcpServer

从TcpServer分析,结果又回到了TcpServer来,但是这次是有目的而来,这次是分析在TcpServer类中如何使用EventLoopThreadPool。        原来我们再使用TcpServer的时候,除了自己再次封装外,还在主函数中自己实例化一个EventLoop,这个EventLoop是用来初始化TcpServer中的EvetnLoopThreadPool而存在的,就是作

2014-03-27 22:02:38 2309

原创 muduo源码分析--EventLoopThreadPool类

这个貌似是个池,池里全是EventLoopThread。貌似很强大        这个类对外的接口也很简单        一个构造函数,需要传递的是EventLoop          一个设置个数的函数 setThreadNum,这个函数好像决定了开启几个EventLoopThread        一个start  从感觉上来看这个函数是按照numThreads_的数目来开启线

2014-03-27 15:45:57 1977

原创 muduo源码分析---EventLoopThread

这个类只有两个对外接口的函数,一个构造函数,一个开始Loop的函数类的内部成员:        一个Loop指针 loop_(说明内部并没有实例化EventLoop)        一个线程  thread_        一个锁    Mutex         一个条件变量 cond_        一个初始化回调 callback_EventLoopThread初

2014-03-27 14:51:29 2087

原创 muduo源码分析---EventLoop类

现在暂时记住TcpConnection是TcpServer中Acceptor关注的监听套接字上accept新连接后被初始化的一个对象,接下来分析下EventLoop        这个东西才是真正驱动库的核心,是别的类(EpollPoller Acceptor )帮助他完成了库的功能,看看内部是怎么实现的。EventLoop:        这个类中最重要的成员就是poller_,这个

2014-03-27 14:03:29 2846 2

原创 muduo源码分析--事件如何被关注的 EpollPoller Channel TcpServer

首先看TcpServer:        在这里肯定是有socketfd的,不然这个监听套接字是怎么被关注的呢!这样的操作时通过Accept来处理的Acceptor:        在这个类就是提供给TcpServer让其监听的,类中有Channel,也有一个Socket,有一个事件handleRead(),这个函数肯定是提供给Channel的,等到Acceptor中的socketfd

2014-03-26 19:56:25 1835

原创 muduo源码分析--事件回调层次是怎么传递的Tcpserver Channel TcpConnection

muduo库中的源码并不是很多,但是回调的处理非常巧妙,这里从事件激活(某个套接字上可读/可写)以后这个层次看回调怎么被调用的。首先从最大的EventLoop说起:        EventLoop中拥有事件链表(每一个元素都是Channel),在loop函数中调用epoll_wait系统调用的时候,将EpollPollr中EventList,将这个链表中激活事件添加到EventLoop中

2014-03-26 19:55:06 2244 1

原创 muduo源码分析--详解muduo多线程模型

6.3    非阻塞网络编程应该用边沿触发(ET)还是电平触发(LT)?如果是电平触发,那么什么时候关注POLLOUT事件?会不会造成busy-loop?如果是边沿触发,如果和防止漏读造成的饥饿?epoll一定比poll快么?6.4       在finger的测试程序中,没有设置onConnection这个函数,就可以连接?6.6 详解muduo多线程模型 

2014-03-26 11:27:55 4147 1

转载 《多线程服务器的适用场合》– 例释与答疑

《多线程服务器的适用场合》(以下简称《适用场合》)一文在博客登出之后,有热心读者提出质疑,我自己也觉得原文没有把道理说通说透,这篇文章试图用一些实例来解答读者的疑问。我本来打算修改原文,但是考虑到已经读过的读者不一定会注意到文章的变动,干脆另写一篇。为方便阅读,本文以问答体呈现。这篇文章可能会反复修改扩充,请注意上面的版本号。本文所说的“多线程服务器”的定义与前文一样,同时参见《多线程服务器的

2014-03-25 15:21:50 1227

转载 多线程服务器的适用场合

正名与前文相同,本文的“进程”指的是 fork() 系统调用的产物。“线程”指的是 pthread_create() 的产物,而且我指的 pthreads 是 NPTL 的,每个线程由 clone() 产生,对应一个内核的 task_struct。本文所用的开发语言是 C++,运行环境为 Linux。首先,一个由多台机器组成的分布式系统必然是多进程的(字面意义上),因为进程不能跨 OS 边

2014-03-25 15:17:45 931

原创 智能指针 shared_ptr 的使用方法

基于Boost库, C++11 加入了shared_ptr和weak_ptr. 它们最早在TR1中就被引入, 但在C++11中, 在Boost的基础上又加入了新的功能.std::shared_ptr使用引用计数. 每一个shared_ptr的拷贝都指向相同的内存. 在最后一个shared_ptr析构的时候, 内存才会被释放. std::shared_ptr p1(new int(5

2014-03-25 09:29:36 16831 2

原创 一个多线程的死锁和锁争用的例子

在多线程编程中,为了保持同步,需要使用互斥锁保护临界区,但是多线程共同使用互斥锁的时候会造成死锁或者锁争用的情况:死锁:产生死锁的原因主要是:(1) 因为系统资源不足。(2) 进程运行推进的顺序不合适。(3) 资源分配不当等。如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。其次,进程运行推进顺序与速度不同,也可

2014-03-25 09:14:29 5982

转载 C++ class中static私用成员

C++ class中的静态(static)成员(1)       静态数据成员   ①一般地静态数据成员在该类定义之外被初始化,如同一个成员函数被定义在类定义之外一样。在这种定义中的静态成员的名字必须被其类名限定修饰,例如下面是_interestRate的初始化// 静态类成员的显式初始化#include "account.h"double Account::_interest

2014-03-24 15:52:08 1332

原创 线程私有存储空间--pthread_key_t

熟悉linux线程开发的人都清楚,一个进程中线程直接除了线程自己的栈和寄存器之外,其他几乎都是共享的,如果线程想维护一个只属于线程自己的全局变量怎么办?线程的私有存储解决了这个问题。    下面说一下线程存储的具体用法。创建一个类型为 pthread_key_t 类型的变量。调用 pthread_key_create() 来创建该变量。该函数有两个参数,第一个参数就是上面声明的

2014-03-22 11:26:03 9912 1

原创 线程同步--递归锁 非递归锁

一、简介1.1 进程/线程同步方法      常见的进程/线程同步方法有互斥锁(或称互斥量Mutex)、读写锁(rdlock)、条件变量(cond)、信号量(Semophore)等。      在windows系统中,临界区(Critical Section)和事件对象(Event)也是常用的同步方法。1.2 递归锁/非递归锁      Mutex可以分为递归锁(recursi

2014-03-19 22:09:29 4780

原创 C++中RAII的惯用方法

软件开发中,会用到各种各样的资源。狭义的资源指内存,而广义的资源包括文件、网络连接、数据库连接、信号量、事件、线程、内存等,甚至可以是状态。资源获取后由于种种原因导致永久不能释放的资源称为资源泄漏。针对资源泄漏,提出了各种各样的软件机制和程序设计惯用法,如垃圾收集、RRID[1]、RAII、确定性资源清理等。RAII是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造

2014-03-19 08:55:07 2379

转载 多线程私有资源和共享资源

一、线程概念        线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix  System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(use

2014-03-18 20:34:08 4556 3

原创 并发与并行的区别

实验室一直在搞什么并发模型并行计算什么的!!!! 并发和并行的区别:一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生.并发性(concurrency),又称共行性,是指

2014-03-18 19:12:07 4602

原创 linux 中IO多路复用epoll函数的ET和LT工作模式详解

从man手册中,得到ET和LT的具体描述如下EPOLL事件有两种模型:Edge Triggered (ET)Level Triggered (LT)假如有这样一个例子:1. 我们已经把一个用来从管道中读取数据的文件句柄(RFD)添加到epoll描述符2. 这个时候从管道的另一端被写入了2KB的数据3. 调用epoll_wait(2),并且它会返回RFD,说明它已

2014-03-18 15:34:38 2257 1

转载 Nginx惊群问题

1. 简介      简单来说,多线程/多进程(linux下线程进程也没有多大区别)等待同一个socket事件,当这个事件发生时,这些线程/进程被同时唤醒,就是惊群。可以想见,效率很低下,许多进程被内核重新调度唤醒,同时去响应这一个事件,当然只有一个进程能处理事件成功,其他的进程在处理该事件失败后重新休眠(也有其他选择)。这种性能浪费现象就是惊群。      惊群通常发生在server 上

2014-03-18 15:08:43 1308

转载 I/O之内核buffer-“buffer cache”

"buffercache" 要理解"buffercache"这个东西,需要澄清一下概念:一般情况下,进程在io的时候,要依赖于内核中的一个buffer模块来和外存发生数据交换行为。另一个角度来说,数据从应用进程自己的buffer流动到外存,中间要先拷贝到内核的buffer中,然后再由内核决定什么时候把这些载有数据的内核buffer写出到外存。"buffer cache"仅仅被内核用于常

2014-03-18 14:30:08 1821

转载 TCP之性能优化避免慢启动

TCP协议中有个慢启动,在《TCP/IP详解卷一》中占据的篇幅很小,但是这个东西,在某些业务场景下,对性能的影响非常大。什么是慢启动 最初的TCP的实现方式是,在连接建立成功后便会向网络中发送大尺寸的数据包,假如网络出现问题,很多这样的大包会积攒在路由器上,很容易导致网络中路由器缓存空间耗尽,从而发生拥塞。因此现在的TCP协议规定了,新建立的连接不能够一开始就发送大尺寸的数据包,而只能

2014-03-18 14:28:45 2711

转载 TCP性能优化之避免大量握手

这个标题看起来可能有点笼统,请大家谅解:)先说说这个优化场景,和《TCP性能优化之避免慢启动》是一个场景。问题的起因在海量用户高并发访问的大型网站后台,有一些基本的系统维护需求。比如迁移海量小文件,就是从一些机器拷贝海量小碎文件到另一些机器,来完成一些系统维护的基本需求。请不要小看这样的需求,这是服务器领域乃至云计算领域几个最复杂的问题之一,量变到质变,由量大引

2014-03-18 14:27:49 2240

原创 Linux网络编程中socket常见错误分析

socket错误码: EINTR: 4阻塞的操作被取消阻塞的调用打断。如设置了发送接收超时,就会遇到这种错误。只能针对阻塞模式的socket。读,写阻塞的socket时,-1返回,错误号为INTR。另外,如果出现EINTR即errno为4,错误描述Interrupted system call,操作也应该继续。如果recv的返回值为0,那表明连接已经断开,接收操作也应该结束。 

2014-03-18 14:26:36 8061

原创 TCP/IP中的SO_REUSEADDR和SO_KEEPALIVE

SO_REUSEADDR 据《UNIX网络编程》卷一所说,此选项用于4种用途我本人在TCP服务器上只处理过两种,其他情况如有需要,请参考《UNIX网络编程》卷一1.引自《UNIX网络编程》卷一多进程绑定同一对IP和PORT,按时序举个多进程模式tcp服务器的例子 a.父进程进行监听;  b.来syn包,请求连接;  c.派生子进程处理用户长连接请求;  d.父进

2014-03-18 14:24:29 1825

原创 UNIX网络编程--TCP网络编程中的listen

int listen(int fd, int backlog);   有几个概念需要在开头澄清一下TCP socket分两种,监听socket和传输socket两种监听socket:负责处理网络上来的连接请求(客户端的syn包到达便是连接请求来了,如果不知道syn包,请参看一下TCP三次握手);传输socket:负责在网络上的两个端点之间传输TCP数据。 未决socke

2014-03-18 10:41:16 1488

原创 TCP/IP详解--发送ACK和RST的场景

在有以下几种情景,TCP会把ack包发出去:1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送。这叫做“延迟发送”;2.收到1个包,启动200ms定时器,200ms定时器还没到,第二个数据包又来了(两个数据包一个ack);3.收到1个包,启动200ms定时器,还没超时,正好要给对方发点内容。于是对这个包的确认ack就跟着捎

2014-03-18 10:38:29 21576

原创 TCP/IP详解--连接状态变迁图CLOSE_WAIT

终止一个连接要经过4次握手。这由TCP的半关闭(half-close)造成的。既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭。这原则就是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向连接。当一端收到一个FIN,内核让read返回0来通知应用层另一端已经终止了向本端的数据传送。发送FIN通常是应用层对socke

2014-03-18 10:33:03 9663

原创 TCP/IP详解--TCP连接中TIME_WAIT状态过多

TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的。仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT。服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这个TIMEWAIT状态过多的问题。如果你的服务器设计为被动关闭,那么你首先要关注的是CLOSE_WAIT。原则T

2014-03-18 10:30:59 71139 5

nginx源码分析--带注释

nginx源码分析,分析过程中将重要的部分进行了注释,以便理解

2014-11-26

libevent-1.4.12-stable-注释版

注释了libevent中很关键的部分,很重要的接口函数。

2014-03-07

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除