没有合适的资源?快使用搜索试试~ 我知道了~
KV存储系统介绍1
资源详情
资源评论
资源推荐
每个 worker 线程通过管道方式与其它线程(主要是主线程)进行通信,调用
pipe 函数,产生两个 fd,一个是管道写入 fd,一个是管道读取 fd。worker 线
程把管道读取 fd 加到自己的 event_base,监听管道读取 fd 的可读事件,即当
主线程往某个线程的管道写入 fd 写数据时,触发事件。
主线程监听到有一个连接到达时,accept 连接,产生一个 client fd,然后选
择一个 worker 线程,把这个 client fd 包装成一个 CQ_ITEM 对象(该结构体下
面再详细讲,这个对象实质是起主线程与 worker 线程之间通信媒介的作用,主
线程把 client fd 丢给 worker 线程往往不止“client fd”这一个参数,还有
别的参数,所以这个 CQ_ITEM 相当于一个“参数对象”,把参数都包装在里面)
,然后压到 worker 线程的 CQ_ITEM 队列里面去(每个 worker 线程有一个
CQ_ITEM 队列), 同时主线程往选中的 worker 线程的管道写入 fd 中写入一个
字符“c”(触发 worker 线程)。
主线程往选中的 worker 线程的管道写入 fd 中写入一个字符“c”,则 worker 线
程监听到自己的管道读取 fd 可读,触发事件处理,而此是的事件处理是:从自
己的 CQ_ITEM 队列中取出 CQ_ITEM 对象(相当于收信,看看主线程给了自己什
么东西),从 4)可知,CQ_ITEM 对象中包含 client fd,worker 线程把此
client fd 加入到自己的 event_base,从此负责该连接的读写工作。
memcached 主线程和 worker 线程各有自己的监听队列,故有主线程和每个 worker 线程都
有一个独立的 event_base,事件基地。
这里是一个有向图,每个 case 是一个顶点,有些 case 通过改变 conn 对象的连接状态让程
序在下一次循环中进入另一个 case,几次循环后程序最终进入到“无出度的顶点”然后结
束状态机,这里的无出度的顶点就是带设置 stop=true 的 case 分支。
在 Linux 的缓存 IO 机制中,操作系统会将 IO 的数据缓存在文件系统的页缓存( page
cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统
内核的缓冲区拷贝到应用程序的地址空间。
网络 IO 的本质是 socket 的读取,socket 在 linux 系统被抽象为流,IO 可以理解为对流的
操作。刚才说了,对于一次 IO 访问(以 read 举例),数据会先被拷贝到操作系统内核的缓
冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个
read 操作发生时,它会经历两个阶段: 第一阶段:等待数据准备 (Waiting for the data
to be ready)。
第二阶段:将数据从内核拷贝到进程中 (Copying the data from the kernel to the
process)。
对于 socket 流而言, 第一步:通常涉及等待网络上的数据分组到达,然后被复制到内核的
某个缓冲区。
第二步:把数据从内核缓冲区复制到应用进程缓冲区。
网络应用需要处理的无非就是两大类问题,网络 IO,数据计算。相对于后者,网络 IO 的延
迟,给应用带来的性能瓶颈大于后者。
爱吃番茄great
- 粉丝: 20
- 资源: 298
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0