实战nginx 基础知识总结(一)1.1基础知识

地址:实战nginx 

链接: http://pan.baidu.com/s/1f5J8D 密码: vft8

squid

Squid是一个缓存Internet数据的软件,其接收用户的下载申请,并自动处理所下载的数据。当一个用户想要下载一个主页时,可以向Squid发出一个申请,要Squid代替其进行下载,然后Squid连接所申请网站并请求该主页,接着把该主页传给用户同时保留一个备份,当别的用户申请同样的页面时,Squid把保存的备份立即传给用户,使用户觉得速度相当快。Squid可以代理HTTP、FTP、GOPHER、SSL和WAIS等协议并且,Squid可以自动地进行处理,可以根据自己的需要设置Squid,使之过滤掉不想要的东西。

Squid可以工作在很多的操作系统中,如AIX、Digital、UNIX、FreeBSD、HP-UX、Irix、Linux、NetBSD、Nextstep、SCO、Solaris、OS/2等。

在使用过程中,合理使用访问控制是非常重要的工作。使用访问控制特性,可以控制其在访问时根据特定的时间间隔进行缓存、访问特定站点或一组站点等等。Squid访问控制有两个要素:ACL元素和访问列表。访问列表可以允许或拒绝某些用户对此服务的访问。 

Epoll

可参看我以前博客详细:http://blog.csdn.net/u010236550/article/details/12624619

Epoll模型主要负责对大量并发用户的请求进行及时处理,完成服务器与客户端的数据交互。其具体的实现步骤如下:
(a) 使用epoll_create()函数创建文件描述,设定将可管理的最大socket描述符数目。
(b) 创建与epoll关联的接收线程,应用程序可以创建多个接收线程来处理epoll上的读通知事件,线程的数量依赖于程序的具体需要。
(c) 创建一个侦听socket描述符ListenSock;将该描述符设定为非阻塞模式,调用Listen()函数在套接字上侦听有无新的连接请求,在 epoll_event结构中设置要处理的事件类型EPOLLIN,工作方式为 epoll_ET,以提高工作效率,同时使用epoll_ctl()注册事件,最后启动网络监视线程。
(d) 网络监视线程启动循环,epoll_wait()等待epoll事件发生。
(e) 如果epoll事件表明有新的连接请求,则调用accept()函数,将用户socket描述符添加到epoll_data联合体,同时设定该描述符为非阻塞,并在epoll_event结构中设置要处理的事件类型为读和写,工作方式为epoll_ET.
(f) 如果epoll事件表明socket描述符上有数据可读,则将该socket描述符加入可读队列,通知接收线程读入数据,并将接收到的数据放入到接收数据的链表中,经逻辑处理后,将反馈的数据包放入到发送数据链表中,等待由发送线程发送。

 

1.不要采用一个连接一个线程的方式,而是尽量利用操作系统的事件多路分离机制
如:UNIX下的 select  linux下的epoll BSD下的kqueue
或者使用这些机制的高层API (boost.asio&&ACE Reactor)
2.尽量使用异步I/O,而不是同步
3.当事件多路分离单线程无法满足并发需求时,将事件多路分离的线程扩展成线程池  

两种方式的区别主要体现在以下几个方面:
  1. select所能控制的I/O数有限,这主要是因为fd_set数据结构是一个有大小的,相当与一个定长所数组。
  2. select每次都需要重新设置所要监控的fd_set(因为调用之后会改变其内容),这增加了程序开销。
  3. select的性能要比epoll差,具体原因会在后续内容中详细说明

 

 

Kqueue

 

首先需要简单的说明几个概念, struct event, kevent()和kqueue。

struct event就是kevent()操作的最基本的事件结构。
kevent() 是一个系统调用syscall,而kqueue是freebsd内核中的一个事件队列kernel queue。
kevent()是kqueue的用户界面,是对kqueue进行添加,删除操作的用户态的界面。

// ==========================================================

下面就重点介绍一下struct event和kevent()这两个开发者必须要了解的参数和API。

1. struct event 结构体中主要成员介绍

  • ident     – 标记事件的描述符, socketfd, filefd, signal
  • filter      – 事件的类型, 读事件:EVFILT_READ, 写事件:EVFILT_WRITE, 信号:EVFILT_SIGNAL
  • flags     – 事件的行为, 对kqueue的操作:
  1. 添加到kqueue中:EV_ADD, 从kqueue中删除:EV_DELETE, 这两种是主要的行为
  2. 一次性事件:EV_ONESHOT, 此事件是或操作, 指定了该事件, kevent()返回后, 事件会从kqueue中删除
  3. 更新事件: EV_CLEAR,此事件是或操作, 手册上的解释是,当事件通知给用户后,事件的状态会被重置。可以用在类似于epoll的ET模式,也可以用在描述符有时会出错的情况。
  4. 其他事件: EOF事件:EV_EOF, 错误事件:EV_ERROR(返回值)
  • fflags    -
  • data     -
  • udata   – 用户指定的数据

2. kevent() 各参数的说明

  • kq               - kqueue() 返回的唯一描述符, 标记着一个内核队列
  • changes       – 需要对kqueue进行修改的事件集合, 此参数就是kevent()对目前kqueue中的事件的操作,比如删除kqueue中已经存在的事件,或者向kqueue中添加新的事件,也就是说,kevent()通过此参数对kqueue的修改
  • nchanges     – 需要修改的事件的个数
  • events         – kevent()会把所有事件存储在events中
  • nevents       – kevent()需要知道存储空间有多大, == 0 : kevent()会立即返回
  • timeout        – 超时控制, = NULL:kevent()会一直等到有关注的事件发生; != NULL:kevent()会等待指定的时间

// ==========================================================

有几点需要说明的是 :

1) 指定EV_ADD|EV_ONESHOT或者EV_DELETE|EV_ONESHOT的行为, kevent()返回后, 会把事件从kqueue中删除;

2) 当事件类型指定为EVFILT_SIGNAL的时候, struct event 中data会返回此时信号发生了多少次
3) 如果 nevents == 0, kevent()会立即返回, 不会理会timeout指定的超时时间, 这是一种直接注册事件的方法.

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值