07 2014 档案
摘要:1. 初始化 != 赋值.a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时).b.赋值代表"擦除对象当前值, 赋予新值". 它不承担为对象分配内存的义务.2. C++中, 类成员的初始化于初始化列表中完成, 先于构造函数体执...
阅读全文
摘要:当一个进程终止时,内核就向其父进程发送SIGCHLD信号。因为子进程终止是个异步事件,所以这种信号也是内核向父进程发的异步通知。父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用执行的函数。对于这种信号的系统默认动作是忽略它。调用wait或waitpid的进程发生的情况如下:1.如果所有子进...
阅读全文
摘要:基本概念:在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程在创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程 到底什么时候结束。当一个 进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。...
阅读全文
摘要:#include pid_t fork(void)fork函数被调用一次,返回两次。子进程的返回值是0,父进程的返回值是子进程的进程id。fork函数调用一次却返回两次:向父进程返回子进程的ID,向子进程中返回0。这是因为父进程可能存在很多个子进程,所以必须通过这个返回的子进程ID来跟踪子进程;而子...
阅读全文
摘要:进程标识符:非负整数ID为0的进程通常是是调度进程,常被称为交换进程。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程ID为1的进程是init进程,在自举过程结束时由内核调用,此进程负责在自举内核后启动一个UNIX系统,init通常读入与系统有关的初始化文件,并将系统引导到一个...
阅读全文
摘要:本文介绍的负载均衡是针对的客户端请求在多个Nginx进程之间的均衡。注意与客户端请求在多个后端服务器之间的均衡相区别。负载均衡问题的产生在nginx中,建立连接的时候,会设计负载均衡问题。在多个子进程争抢处理一个新连接事件时,一定只有一个worker子进程最终会成功建立连接,随后 它会一直处理这个连...
阅读全文
摘要:转自:江南烟雨惊群问题的产生在建立连接的时候,Nginx处于充分发挥多核CPU架构性能的考虑,使用了多个worker子进程监听相同端口的设计,这样多个子进程在accept建立新连接时会有争抢,这会带来著名的“惊群”问题,子进程数量越多越明显,这会造成系统性能的下降。一般情况 下,有多少CPU核心就有...
阅读全文
摘要:处理新连接事件的回调函数是ngx_event_accept,原型如下:void ngx_event_accept(ngx_event_t *ev)具体流程如下:1)首先调用accept方法试图建立新连接,如果没有准备好的新连接事件,ngx_event_accept方法会直接返回2)设置负载均衡阀值n...
阅读全文
摘要:转自:烟雨江南Nginx事件管理主要是网络事件和定时器事件。下面介绍定时器事件管理,即超时管理。为什么进行超时管理?Nginx有必要对可能发生超时的事件进行统一管理,并在事件超时时作出相应的处理,比如回收资源,返回错误等。举例来说,当客户端对nginx发出请求连接后,nginx会accept()并建...
阅读全文
摘要:转自:http://coolshell.cn/articles/5426.html基本命令:i → Insert 模式,按ESC回到 Normal 模式.x → 删当前光标所在的一个字符。:wq → 存盘 + 退出 (:w 存盘, :q 退出) (陈皓注::w 后可以跟文件名)dd → 删除当前行...
阅读全文
摘要:具体内容见:http://coolshell.cn/articles/7965.html字符设备、块设备主要区别是:在对字符设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了,而块设备则不然,它利用一块系统内存作为缓冲区,当用户进程对设备请求能满足用户的要求时,就返回请求的数据,如果不能就调用...
阅读全文
摘要:set和multiset会根据特定的排序准则,自动将元素排序。两者不同处在于multiset允许元素重复而set不允许在使用set或multiset之前,必须先加入头文件set和multiset通常以红黑树完成,红黑树在改变元素数量和元素搜寻方面很出色,它保证结点安插时最多只会作两个重新连接动作,而...
阅读全文
摘要:转自维基百科红黑树是一种平衡二叉搜索树,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目。性质:红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色。在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:性质1. 节点是红色或黑色。性质2. 根...
阅读全文
摘要:list使用双向链表来管理元素。与vector、deque的区别:1.list不支持随机存取,在list中随机遍历任意元素,是很缓慢的行为2.任何位置上执行元素的安插和移除都非常快,始终是常数时间内完成,因为无须移动任何其他元素3.安插和删除动作不会造成指向其他元素的各个pointer、refere...
阅读全文
摘要:deque双向队列是一种双向开口的连续线性空间,可以高效的在头尾两端插入和删除元素,deque在接口上和vector非常相似。deque的实现比较复杂,内部会维护一个map(注意!不是STL中的map容器)即一小块连续的空间,该空间中每个元素都是指针,指向另一段(较大的)区域,这个区域称为缓冲区,缓...
阅读全文
摘要:vector是定义于namespace std内的template:namespace std{ template> class vector;}vector优异性能的秘诀之一,就是配置比其所容纳的元素所需更多的内存。capacity()函数返回vector实际能够容纳的元素数量。如果超...
阅读全文
摘要:当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中 执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用 户态)。...
阅读全文
摘要:事件处理框架通过事件驱动机制来处理事件ngx_event_module 事件模块ngx_event_core_module 决定使用哪个事件驱动机制即事件驱动模块每个事件驱动模块都要实现ngx_event_module_t接口-------------------------------------...
阅读全文
摘要:http://blog.csdn.net/han_xiaoyang/article/details/11938973#t6
阅读全文
摘要:1. 线程基础1.1. 线程状态线程有5种状态,状态转换的过程如下图所示:1.2. 线程同步(锁)多 线程的优势在于可以同时运行多个任务(至少感觉起来是这样)。但是当线程需要共享数据时,可能存在数据不同步的问题。考虑这样一种情况:一个列表里所有元 素都是0,线程"set"从后向前把所有元素改成1,而...
阅读全文
摘要:1 urllib2.urlopen(url[, data][, timeout])请求url,获得请求数据,url参数可以是个String,也可以是个Request参数没有data参数时为GET请求,设置data参数时为POST请求,另外data格式必须为application/x-www-form...
阅读全文
摘要:静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。注意:const常量在定义时必须初始化栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈区由系统自动分配。堆区:亦称动态内存分配。...
阅读全文
摘要:一、拥塞控制的一般原理拥塞:对网络中某一资源的需求超过了该资源所能提供的可用部分拥塞控制是防止过多的数据注入到网络,这样可以使网络中的路由器或链路不致过载,拥塞控制是一个全局性的过程。流量控制往往指点对点通信量的控制,是个端到端的问题。二、拥塞控制的四种算法1.慢开始和拥塞避免发送方维持一个叫做拥塞...
阅读全文
摘要:一、利用滑动窗口实现流量控制流量控制是让发送方的发生速率不要太快,要让接收方来得及接收。发送方的发送窗口不能超过接收方给出的接收窗口的数值,TCP的窗口单位是字节,不是报文段。TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续计时器。若持续计时器设置的时间到期...
阅读全文
摘要:当需要读两个以上的I/O的时候,如果使用阻塞式的I/O,那么可能长时间的阻塞在一个描述符上面,另外的描述符虽然有数据但是不能读出来,这样实时性不能满足要求,大概的解决方案有以下几种: 1.使用多进程或者多线程,但是这种方法会造成程序的复杂,而且对与进程与线程的创建维护也需要很多的开销。(Apache
阅读全文
摘要:功能:创建连接池,决定使用哪些事件驱动机制,以及初始化将要使用的事件模块该模块定义了ngx_event_core_commands数组处理其感兴趣的7个配置项ngx_event_conf_t为该模块定义的用于存储配置项参数的结构体在Nginx启动过程中还没有fork出worker子进程时,会首先调用...
阅读全文
摘要:一、概述主要特点:1)面向连接的运输层协议2)每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的(一对一)3)TCP提供可靠交付的服务4)TCP提供全双工通信5)面向字节流:TCP根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP发送的报文长度是应用进程给出...
阅读全文
摘要:一、运输层协议概述网络层是为主机之间提供逻辑通信,而运输层为应用进程之间提供端到端的逻辑通信。运输层的两个主要协议:1)用户数据报协议UDP:无连接,不可靠2)传输控制协议TCP:提供可靠的、面向连接的服务,不提供广播或多播协议运输层的端口:端口号只具有本地意义,它只是为了标志本计算机应用层中的各个...
阅读全文
摘要:FIFO也称为有名管道,它是一种文件类型,是半双工的。FIFO简单理解,就是它能把两个不相关的进程联系起来,FIFO就像一个公共通道,解决了不同进程之间的“代沟”。普通的无名管道只能让相关的进程进行沟通(比如父shell和子shell之间)。创建FIFO类似于创建文件#include int mkf...
阅读全文
摘要:Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(简称:fd,文件描述符).系统调用是如何完成一个I/O操作的呢? linux将内存分为内核...
阅读全文
摘要:http://www.mianwww.com/html/2013/10/19128.html http://blog.csdn.net/wdzxl198/article/details/9050751 http://www.cnblogs.com/fangyukuan/archive/2010/09
阅读全文
摘要:http://blog.csdn.net/zhanghefu/article/details/5003407转自:http://blog.csdn.net/wdzxl198/article/details/9050587明确区分堆和栈void f() { int* p=new int[5]; }在栈...
阅读全文
摘要:共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式,因为进程可以直接读写内存,而不需要任何数据的拷贝。对于像管道和消息队列等通信方式,则需要在内核和用户空间进行四次的数据拷贝,而共享内存则只拷贝两次数据: 一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存...
阅读全文
摘要:信号量是一个计数器,用于多进程对共享数据对象的访问为了获得共享资源,进程需要执行下列操作:1)测试控制该资源的信号量2)若此信号量为正,则进程可以使用该资源,进程将信号量减1,表示它使用了一个资源单位3)若此信号量为0,则进程进入休眠状态,直至信号量大于0,进程被唤醒后,返回至第一步信号量的分类在学...
阅读全文
摘要:三种IPC的共同特征1.标识符和键每个内核中的IPC结构都用一个非负整数的标识符加以引用。当一个IPC结构被创建,以后又被删除时,与这种结构相关的标识符连续加1,直至达到一个整型数的最大值,然后又回转到0标识符是IPC对象的内部名,为使多个合作进程能够在同一IPC对象上会合,需要提供一个外部名,即键...
阅读全文
摘要:管道是UNIX系统IPC最古老形式,并且所有UNIX系统都提供此种通信机制。管道由下面两种局限性:1)历史上,它们是半双工的(即数据只能在一个方向上流动)2)它们只能在具有公共祖先的进程之间使用。通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道管道由调用pipe...
阅读全文
摘要:当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内。一个对象、引用或指针的静态类型决定了该对象的哪些成员是可见的。即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的。基类指针(引用)即使指向派生类对象,仍然不能通过该指针(引用)来访问派生类中定义的成员,即使是publi...
阅读全文
摘要:网上看到的关于C++函数的重载、覆盖和隐藏区别的回答,如下(其内容来源于C++面试宝典中一道题目):a.成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别...
阅读全文
摘要:http://blog.csdn.net/sunquana/article/details/9153213一、 fill和fill_n函数的应用: fill函数的作用是:将一个区间的元素都赋予val值。 函数参数:fill(first,last,val);//first为容器的首迭代器,last为...
阅读全文
摘要:一、事件处理框架概述事件处理框架所要解决的问题是如何收集、管理、分发事件。事件以网络事件和定时器事件为主,而网络事件中以TCP网络事件为主。事件处理框架需要在不同的操作系统内核中选择一种事件驱动机制(I/O多路复用)支持网络事件的处理。步骤:1.Nginx定义了一个核心模块ngx_events_mo...
阅读全文
摘要:每个线程都有自己的信号屏蔽字,但是信号的处理是进程中所有线程共享的。进程中的信号是递送到单个线程的。线程中pthread_sigmask函数类似与进程的sigprocmask函数,可以用来阻塞信号。#include int pthread_sigmask(int how,const sigset_t...
阅读全文
摘要:虚函数的一般实现模型:每一个class有一个virtual table,内含该class中的virtual function的地址,然后每个object有一个vptr,指向virtual table。 识别class是否支持多态,唯一恰当的方法是看它是否有virtual function,只要cla
阅读全文
摘要:转自:http://www.cnblogs.com/huxi/archive/2010/07/04/1771073.html1. 正则表达式基础1.1. 简单介绍正则表达式并不是Python的一部分。正则表达式是用于处 理字符串的强大工具,拥有自己独特的语法以及一个独立的处理引擎,效率上可能不如st...
阅读全文
摘要:类的定义python支持多重继承,在类名后面的小括号中,可以列出多个类名,以逗号分割。__init__方法在类的实例创建后被立即调用,注意与c++中构造函数不一样,因为对象在调用__init__时已经被构造出来,__init__方法不返回值,__init__方法不是必须要定义的。每个类方法的第一个参...
阅读全文
摘要:非静态成员函数c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率。编译器内部已将member函数实体转换为对等的nonmember函数实体。转化步骤:1.改写函数原型以安插一个额外的参数到member function中,使class object可以调用该函数,该额外参数为...
阅读全文
摘要:派生类的构造函数初始化列表将实参分别传递给每个直接基类,其中基类的构造顺序与派生列表中基类的出现顺序保持一致,而与派生类构造函数初始化列表中基类的顺序无关。类型转换与多个基类编译器不会在派生类向基类的几种转换中进行比较和选择,因为在它看来转换到任意一种基类都一样好,所以要避免二义性。void pri...
阅读全文
摘要:Constructing selectorsFor convenience,response objects exposes a selector on .selector attribute,it's totally ok to use this shortcut when possible.//...
阅读全文
摘要:调用HTTP模块的流程:Worker进程会在一个for循环语句中反复调用事件模块检测网络事件。当事件模块检测到某个客户端发起的TCP请求时(接收到SYN包),将会为它建立TCP连接,成功建立连接后根据nginx.conf文件中的配置会交由HTTP框架处理。HTTP框架会试图接收完整的HTTP头部,并...
阅读全文
摘要:1. const常量,如const int max = 100; 优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换时可能会产生意料不到的错误。2. const 修饰类的数据成员。 const数据成员只在某...
阅读全文
摘要:After an item has been scraped by a spider,it is sent to the Item Pipeline which process it through several components that are executed sequentially....
阅读全文
摘要:模块如何在运行中生效配置文件中的location块决定了匹配某种URL的请求将会由相应的HTTP模块处理,因此,运行时HTTP框架会在接收完毕HTTP请求的头部后,将请求的URL与配置文件中的所有location进行匹配,匹配后再根据location{}内的配置项选择http模块来调用。在mytes...
阅读全文
摘要:kill和raise函数#include int kill(pid_t pid,int signo);int raise(int signo);//两个函数返回值:若成功则返回0,若出错则返回-1kill函数将信号发送给进程或进程组,raise函数则允许进程向自身发送信号。调用raise(signo...
阅读全文
摘要:上下文与全异步web服务器的关系请求上下文指在一个请求的处理过程中,把一些关键的信息保存下来的类似struct这样的结构体。每个http模块都可以有自己的上下文结构体,一般都是在刚开始处理请求时在内存池上分配它,之后当经由epoll、http框架再次调用到http模块的处理方法时,这个http模块可...
阅读全文
摘要:我们可以定义拷贝操作,使类的行为看起来像一个值或者像一个指针,这取决于如何拷贝指针成员。 当我们拷贝一个像值的对象时,副本和原对象是完全独立的,改变副本不会对原对象有任何影响,反之亦然。标准库容器和string类的行为像一个值。 当我们拷贝一个行为像指针的类的对象时,副本和原对象使用相同的底层数据,
阅读全文
摘要:一、信号概念信号都被定义为正整数,不存在编号为0的信号。信号是异步事件的经典实例。产生信号的事件对进程而言是随机出现的,进程不能简单地测试一个变量来判别是否出现了一个信号,而是必须告诉内核在此信号出现时,请执行下列操作。信号的处理有三种方式:1.忽略此信号。大多数信号都可使用这种方式进行处理,SIG...
阅读全文
摘要:当Nginx检测到http关键配置项时,http配置模型启动,首先会建立一个ngx_http_cong_ctx_t结构。typedef struct{ void **main_conf; void **srv_conf; void **loc_conf;}ngx_http_conf_ctx_t...
阅读全文
摘要:ItemsItem objects are simple containers used to collect the scraped data.They provide a dictionary-like api with a convenient syntax for declaring the...
阅读全文
摘要:处理http配置项可以分为下面4个步骤:1)创建数据结构用于存储配置项对应的参数2)设定配置项在nginx.conf中出现时的限制条件与回调方法3)实现第2步中的回调方法,或者使用Nginx框架预设的14个回调方法4)合并不同级别的配置块中出现的同名配置项一、分配用于保存配置参数的数据结构创建结构体...
阅读全文
摘要:1)创建项目命令:scrapy startproject tutorial该命令将在当前目录下创建tutorial文件夹2)定义ItemItems are containers that will be loaded with the scraped data;They are declared b...
阅读全文
摘要:配置文件为.conf文件一、块配置项块配置项由一个块配置项名和一对大括号组成。具体如下:events{ ...}http{ upstream backend{ server 127.0.0.1:8080 } gzip on; server{ location /webstatic{...
阅读全文
摘要:受保护的成员(protected): 1.和私有成员类似,受保护的成员对于类的用户来说是不可访问的 2.和共有成员类似,受保护的成员对于派生类的成员和友元来说是可访问的 3.派生类的友元只能通过派生类对象来访问基类的受保护成员,不能通过基类对象来访问基类的受保护成员 派生访问说明符: 派生访问说明符
阅读全文
摘要:单一继承中,base class 和derived class的对象都是从相同的地址开始,其间差异只在于derived class比较大,用以容纳自己的nonstatic members。若vptr放在class object的起始处,如果base class没有虚函数而derived class有...
阅读全文
摘要:请求处理完毕后,需要向用户发送http响应,告知客户端Nginx的执行结果。http响应主要包括响应行、响应头部、包体三部分。发送http响应时需要执行发送http头部(发送http头部时也会发送响应行)和发送http包体两步操作。发送http头部ngx_int_t ngx_http_send_he...
阅读全文
摘要:实际处理请求的方法ngx_http_mytest_handler(在配置配置项的回调方法中被调用(用于解析配置项))将接收一个ngx_http_request_t类型的参数,返回一个ngx_int_t类型的结果。typedef ngx_int_t (*ngx_http_handler_pt)(ngx...
阅读全文
摘要:定义fttp模块方式很简单,比如:ngx_module_t ngx_http_mytest_module;其中,ngx_module_t是一个Nginx模块的数据结构。typedef struct ngx_module_s ngx_module_t;struct ngx_module_s{ #...
阅读全文
摘要:整型的封装typedef intptr_t ngx_int _t;//有符号整型typedef uintptr_t ngx_uint_t;//无符号整型字符串的封装typedef struct{ size_t len; u_char *data; }ngx_str_t;链表容器...
阅读全文
摘要:http://blog.csdn.net/zg_hover/article/details/2553321守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。守护进程是一种很有用的进程。 Linux的大多数服务器就是用守护进程实现的。...
阅读全文
摘要:vs2013的结果是1,4,4,8 因为Y,Z继承自X,会有指针指向父类(虚继承)。该指针要么指向virtual base class subobject,要么指向一个相关表格,表格中存放的是virtual base class subobject的地址或偏移量(一般当当前class有多个直接vir
阅读全文
摘要:Linux进程的五个段 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量
阅读全文
摘要:第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码, 因为太常用,所以要练到写时不用想,10-15 分钟内打完,甚至关掉显示器都可以把程序打 出来. 1.最短路(Floyd、Dijstra,BellmanFord) 2.最小生成树(先写个 prim,kruscal 要用并查...
阅读全文
摘要:一、动态绑定什么时候发生 当且仅当通过指针或引用调用虚函数时,才会在运行时解析该调用 二、派生类中的虚函数 当我们在派生类中覆盖了某个虚函数时,可以再一次使用virtual指出该函数的性质,但是这么做并非必须,因为一旦某个函数被声明成虚函数,则在所有派生类中它都是虚函数。 一个派生类的函数如果覆盖了
阅读全文
摘要:面向对象程序设计的核心思想是数据抽象(类的接口与实现分离)、继承和动态绑定 基类 虚函数:基类希望派生类各自定义适合自身的版本的函数 在c++中,当我们使用基类的引用或指针调用虚函数时将发生动态绑定。 基类通常都应该定义一个虚析构函数。C++规定:用不带有虚析构函数的基类的指针来删除一个派生类对象(
阅读全文
摘要:一、互斥量互斥量从本质上说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。互斥量用pthread_mutex_t数据类型表示,在使用互斥变量以前,必须首先对它进行初始化。可以把它设置为常量PTHREAD_MUTEX_INITIALIZER(只对静态分配的互斥量),也可以通过...
阅读全文
摘要:线程是cpu的调度单位,不拥有系统资源,和属于同一进程的其他线程共享进程的资源。一、线程标识进程id在整个系统中是唯一的,但线程id不同,只在它所属的进程环境中有效。进程id用pid_t数据类型来表示,是一个非负整数,线程id用pthread_t数据类型来表示,实现的时候可以用一个结构来代表pthr...
阅读全文