不忘痴心 砥砺前行


  • 首页

  • 标签

  • 分类

  • 归档

「黄泽瑄的成长记」第四季来啦

发表于 2017-07-31 | 分类于 黄泽瑄

这一季主要是记录了我家瑄宝

6-7个月这段时间的生活点滴

本季集锦片段:

镜头感超级棒的瑄宝

小猪猪是瑄宝的好伙伴~

小小年纪就会弹奏《图森破》,哈哈~

这位美女,你的玉足很香吗?蛤蛤~

冷不丁地逗你一下~

「黄泽瑄的成长记」第三季来啦

发表于 2017-07-23 | 分类于 黄泽瑄

这一季主要是记录了我家瑄宝

4-5个月这段时间的生活点滴

本期视频集锦:

阅读全文 »

「黄泽瑄的成长记」第二季来啦

发表于 2017-05-13 | 分类于 黄泽瑄

瑄宝的纪录片视频第一季距今

都已经4个多月了

本来打算过年后就发第二季的

结果小明一不小心

沉迷于《王者农药》不可自拔

第二季拖延到现在才做完

阅读全文 »

Go 之初体验

发表于 2017-05-11 | 分类于 Coder

小明最近新入职了一家研究区块链技术的 复杂美科技有限公司,岗位职责是用 Go 语言做区块链底层开发。

Go 之前都没接触过,现学现卖咯~这几天上班,小明启动了 3 条工作线程:

  • 熟悉公司的产品
  • 消化这份 《区块链技术指南》
  • 学习 Go 语言

在此,总结下初步学习 Go 语言的一些心得。

阅读全文 »

IO 多路复用

发表于 2017-03-18 | 分类于 Redis

IO 多路复用是一种同步IO模型:

  • IO:网络I/O。
  • 多路:多个文件句柄。
  • 复用:一个线程可以监视多个文件句柄。一旦某个文件句柄就绪,就能够通知应用程序进行相应的读写操作,没有文件句柄就绪就会阻塞应用程序,交出CPU。

最大优势是减少系统开销,不必创建过多的进程/线程。

IO 多路复用机制要想高效使用,一般还需要把 socket 设置成「非阻塞」模式:

socket 没有数据可读/可写时,应用层去 read/write socket 也不会阻塞住(内核会返回指定错误,应用层可继续重试),这样应用层就可以去处理其它业务逻辑,不会阻塞影响性能。

select

select会阻塞住监视3类:writefds(写)、readfds(读)、和exceptfds(异常)文件描述符,等有数据、可读、可写、出异常或超时、就会返回;返回后通过遍历fdset整个数组来找到就绪的描述符fd,然后进行对应的IO读写操作。

优点:

  • 几乎在所有的平台上支持,跨平台支持性好

缺点:

  • 由于是采用 轮询 方式全盘扫描,会随着文件描述符FD数量增多而性能下降。
  • 监视/就绪涉及到用户态到内核态之间拷贝 ,并进行遍历。
  • 默认单个进程能监听的各种文件描述符 限制 是1024个,可修改宏定义,但是效率仍然慢。

poll

基本原理与select一致,也是 轮询+遍历,但是它没有最大连接数的限制,原因是它的fd集合是基于链表来存储的.

epoll

通过 epoll_ctl注册fd,一旦fd就绪就会通过 callback回调机制来激活对应fd,进行相关的io操作。epoll之所以高性能是得益于它的三个函数:

  • epoll_create: 系统启动时,在Linux内核里面申请一个 B+树 结构文件系统,返回epoll对象,也是一个fd
  • epoll_ctl: 每新建一个连接,都通过该函数操作epoll对象,在这个对象里面修改添加删除对应的链接fd, 绑定一个callback函数
  • epoll_wait: 轮训所有的callback集合,并完成对应的IO操作

优点:

  • 没fd这个限制,所支持的fd上限是操作系统的最大文件句柄数,1G内存大概支持10万个句柄
  • 效率提高,使用 回调 通知而不是轮询的方式,不会随着fd数目的增加效率下降
  • 内核和用户空间mmap同一块内存实现(mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间)

综合比较

相同点:select,poll,epoll本质上都是 同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的。

不同点:

select poll epoll
操作方式 遍历 遍历 回调
数据结构 bitmap 数组 红黑树
最大连接数 1024(x86)或 2048(x64) 无上限 无上限
最大文件描述符数 一般有最大值限制 65535 65535
fd就绪 从内核空间拷贝到用户空间 从内核空间拷贝到用户空间 触发回调不拷贝
工作模式 LT LT 支持ET高效模式
工作效率 线性遍历 O(n) 线性遍历 O(n) 事件通知方式 O(1)

思考题

在 Redis 事件驱动框架代码中,分别使用了 select 和 epoll 两种机制。

为什么 Redis 没有使用 poll 这一机制?

首先,select 并不是只有 Linux 才支持的,Windows 平台也支持。而 Redis 针对不同操作系统,会选择不同的 IO 多路复用机制来封装事件驱动框架。因为 epoll 性能优于 select 和 poll,所以 Linux 平台下,Redis 直接会选择 epoll。而 Windows 不支持 epoll 和 poll,所以会用 select 模型。

人҉҉要҉҉是҉҉雾霾吸҉҉多҉҉了҉҉,҉҉连҉҉看҉҉东҉҉西҉҉眼҉҉都҉҉是҉҉花҉҉哈哈的҉҉。

发表于 2017-01-06 | 分类于 Coder

去年微信爆出的《你女朋友撤回了一条消息还亲了你一口》那个 bug,让广大微信用户 excited了一把。

阅读全文 »

「黄泽瑄的成长记」第一季来啦

发表于 2016-12-18 | 分类于 黄泽瑄

这个星期忙里偷闲

给宝宝做了个视频

以宝妈给宝宝拍的小视频为素材

记录她从出生到满月的生活点滴

阅读全文 »

两小儿「江」持不下辩「长城」

发表于 2016-12-17 | 分类于 一颗赛艇

孔子东游钱塘江,水天相接,江天一色,美哉、壮哉。

路遇两小儿辩斗。

一儿曰:「长城」上映一日,口碑评分陷入江局,吾之于能否走向世界江信江疑。

阅读全文 »

天分与坚持:四分之一世纪的跑步

发表于 2016-12-07 | 分类于 心旷神怡

《当我谈跑步时,我谈些什么》这本书是村上春树的跑步回忆录,从 2005 夏天动笔到 2006 秋天写完,零零星星写了他跑步二十年多来的回忆或感悟。

阅读全文 »

《你的名字》难再续

发表于 2016-12-04 | 分类于 一颗赛艇

梦里相逢人不见,若知是梦何须醒。
纵然梦里常幽会,怎比真如见一回。

阅读全文 »
1…567…15

彦祖老师

143 日志
15 分类
233 标签
GitHub E-Mail
© 2015 — 2023 彦祖老师
浙ICP备20005040号-1