网络io职责

检测io

io函数本身可以检测io的状态(通过errno),但是只能检测一个fd对应的状态,io多路复用(select)可以同时检测多个io的状态;
这两者的区别是:io函数可以检测具体状态(errno),但io多路复用只能检测出可读,可写,错误,断开等(fd_set)笼统的事件;select返回的错误fd_set可以通过getsockopt()了解具体错误是什么。

操作io

只能使用io函数来进行操作,操作方式分为阻塞io与非阻塞io
阻塞io:如调用read(),就一直在等read()返回,返回后才会执行接下来的代码
非阻塞io:调用read(),不等返回,直接继续执行

阻塞io和非阻塞io

1、阻塞在网络线程(如read()和write())
2、阻塞与非阻塞由连接的fd阻塞属性决定
3、具体差异:io函数在数据未到达时是否立刻返回
设置阻塞或非阻塞

// 默认情况下,fd是阻塞的, 设置非阻塞的方法如下:
int flag = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flag | O_NONBLOCK)

阻塞io模型

非阻塞io模型

io多路复用

io多路复用只负责检测io,不负责操作io
epoll_wait(epfd, evs, sz, timeout);
若timeout = -1;则数据准备阶段永久阻塞
若timeout = 0;则数据准备阶段非阻塞
若timeout = n;(n>0) 则数据准备阶段阻塞timeout时间

epoll结构以及接口

struct eventpoll { // ... struct rb_root rbr;        // 管理 epoll 监听的事件 struct list_head rdllist;     // 保存着 epoll_wait 返回满⾜条件的事件 // ...
};
struct epitem { // ... struct rb_node rbn;      // 红黑树节点 struct list_head rdllist;  // 双向链表节点 struct epoll_filefd ffd;  // 事件句柄信息 struct eventpoll *ep;     // 指向所属的eventpoll对象 struct epoll_event event;   // 注册的事件类型 // ...
};
struct epoll_event { __uint32_t events; // epollin epollout epollel(边缘触发) epoll_data_t data; // 保存 关联数据()
};
typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64;
}epoll_data_t;
int epoll_create(int size);
/** op: EPOLL_CTL_ADD EPOLL_CTL_MOD EPOLL_CTL_DEL event.events: EPOLLIN         注册读事件 EPOLLOUT      注册写事件 EPOLLET       注册边缘触发模式,默认是水平触发
*/
int epoll_ctl(int epfd, int op, int fd, struct epoll_event* event);
/** events[i].events: EPOLLIN       触发读事件 EPOLLOUT      触发写事件 EPOLLERR      连接发生错误 EPOLLRDHUP       连接读端关闭 EPOLLHUP         连接双端关闭
*/
int epoll_wait(int epfd, struct epoll_event* events, int maxevents, int timeout);

epoll原理图:

epoll顺序:
1、调用epoll_create会创建一个epoll对象;
2、调用epoll_ctl添加到epoll中的事件都会与网卡驱动程序建立回调关系;
3、相关事件触发时会调用回调函数(epoll_callback),将触发的事件拷贝到rdlist双向链表中;(前面提到的数据准备阶段就是这个阶段)
4、调用epoll_wait将会把rdlist中就绪事件拷贝到用户态中;

reacotr应用

组成:

io多路复用+非阻塞io
reacotr就是将io的处理转化为对事件的处理

单reactor


reactor的流程:
1、读数据 int n = read(fd, buf,sz);
2、数据解密 cmd, args = decode(buf, sz);
3、逻辑操作 out = logic(cmd, args);
4、数据加密 out = encode(out);
5、发送数据 int n = write(fd, out, sz);
单reactor进行多线程优化:
方法1:将1,2,4,5的处理放到多线程中(若1245为重io操作则可以优化),3的处理放到主线程中
方法2:将1放在主线程处理,2345放在多线程中处理
典型的单reactor:redis(水平触发)

多reactor (one eventloop per thread)

多个epfd即为多reactor(多调用几次epoll_create())

如果资源交互比较少或者临界资源少的话,单reactor比多reactor好用,否则多reactor好。
典型的多线程reactor:memcached(水平触发)

一个master进程fork出多个worker进程,连接的建立是由worker来建立的,worker们监听同一个端口,共享内存中有一把锁,worker进程获取锁,谁拿到锁就由谁来连接和管理这个客户端
典型的多进程reactor:nginx(边沿触发,因为nginx的使用场景不需要处理数据,而是做反向代理,即一收到数据就可以转发,而redis和memcached需要处理数据,所以要接受完所有数据)

redis,memcached相关推荐

  1. 相比Redis,Memcached真的过时了吗?

    下面内容来自Redis作者在stackoverflow上的一个回答,对应的问题是<Is memcached a dinosaur in comparison to Redis?>(相比Re ...

  2. redis,memcached到nginx,底层网络io中剥离精髓丨C/C++Linux丨C++后端开发丨Linux服务器开发丨底层原理

    redis,memcached到nginx,底层网络io中剥离精髓 1. redis单线程网络的优缺点 2. memcached多线程网络的并发优势 3. nginx多进程网络的优势 视频讲解如下,点 ...

  3. 详解从redis,memcached到nginx,网络底层io

    从redis,memcached到nginx,网络底层io的哪些事 1. redis的单线程模型 2. memcached的多线程模型 3. nginx的多进程模型 4. 10种网络模型的应用场景 视 ...

  4. Redis,MemCached,MongoDB 概述

    调研项目主要有Redis. MemCached. MongoDB,以及Amazon的DynamoDB Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key- ...

  5. 后端开发【一大波有用知识】—Redis,Memcached,Nginx网络组件

    reator网络编程 epoll被称为事件管理器,利用管理器去管理多个连接. int clientfd=accept(listenfd,addr,sz); clientfd ==-1 &&am ...

  6. 谈谈在.NET Core中使用Redis和Memcached的序列化问题

    前言 在使用分布式缓存的时候,都不可避免的要做这样一步操作,将数据序列化后再存储到缓存中去. 序列化这一操作,或许是显式的,或许是隐式的,这个取决于使用的package是否有帮我们做这样一件事. 本文 ...

  7. memcached客户端_对比Memcached和Redis,谁才是适合你的缓存?

    Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...

  8. 对比Memcached和Redis,谁才是适合你的缓存?

    Memcached vs Redis 近期公司采购软件,评估时,某软件谈到使用了 Memcached 和 Redis 缓存.在本文中,将研究这两个流行的缓存的异同,方便理解和记忆. 1. Memcac ...

  9. redis和Memcached的区别,都什么时候使用?

    redis和Memcached的区别,都什么时候使用? 缓存在互联网公司占得比例还是蛮大的,提到缓存呢,就一定会想到redis和memcache,现在绝大多数的公司呢,都是推荐使用redis,这是为什 ...

最新文章

  1. zabbix-proxy3.0.4编译安装
  2. Zend Studio 12 windows 无限期试用
  3. 如何创建字符串(OC)
  4. 元素的选中问题 元素选中的问题 切换复选框选中 全选和全不选
  5. P2304 [NOI2015] 小园丁与老司机(网络流/上下界网络流)
  6. PaperNotes(10)-Maximum Entropy Generators for Energy-Based Models
  7. 客户端自动化测试研究
  8. html弹窗_对付流氓广告弹窗:彻底告别,这一招最有效
  9. settings.xml的配置
  10. 【C++】n_element的用法
  11. Linux基础之常用命令篇
  12. oracle中查找某用户执行某张表的操作操作记录
  13. your system apperars to have shutdown uncleanly
  14. 使用submit异步提交,阻止表单默认提交
  15. 直播入门(二)从视频采集到客户端播放
  16. 强化学习的概念及学习过程
  17. super关键字的用法
  18. 把数学学好才能画好图形
  19. Android 开发艺术探索——第十章 Android的消息机制
  20. 【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

热门文章

  1. JDK、JRE、JVM、SDK
  2. scilab 求微分_科学计算自由软件SCILAB在常微分方程中的应用
  3. .io域名在申请SSL证书时被坑
  4. 在ipv4的网络上使用utorrent3.0下…
  5. 辽宁省内计算机专业本科大学排名,辽宁省本科院校排名
  6. 5.2 activiti任务监听器TaskListener
  7. ping unknown host问题怎么解决?
  8. 关于QT中“崩溃”问题
  9. Java函数式接口--抽象方法接口
  10. item_search - 按关键字搜索京东商品