Listening to the Words

内核态做什么?

今天学了一点BIO/NIO的知识,记录下。

kernel : linux系统的内核态,就像是北京的四九城,四城就是内核态,九城的普通老板姓是禁止随意进入。kernel在系统启动时分配在内存上,强行的规定了这个区域是内核态,此外是用户态

BIO/NIO都是I/O模型发生在内核态。内核对外提供了syscall系统调用api,用户态程序对其封装后就是应用,例如socket。

BIO

BIO: 就像小明去书店买书,跟老板说买本《五年高考三年模拟》,老板说有货还没到,在这等着吧。于是小明就等,等到书到货了,高考过去了。这还没完小李还在门外等着买这书,于是阻塞的结果是:他们错过了整个夏天。

NIO

后来老板开了多个窗口想买书就来把,每个来的人几乎不用等排队,跟老板说声买什么书就好了,书还没到就去外边等着吧。

这就是最初的NIO,这个问题解决了阻塞,但是产生了新的问题,等待买书的人不断来问书到了吗,买书人不断去问书的状态,老板和买家都崩溃了。这就是著名的C10K问题。

select

后来老板说:干脆告诉我有多少人在等待拿书吧(fds),书到了我会告诉你来取,买书的人把自己的信息集合起来告诉老板,老板负责去处理书的状态。这就是select(fds)I/O复用技术。

这样看起来很好,但是老板的压力就太大了,100个人的书的状态啊。

epoll

书店老板又进步了,直接弄了一个大的注册簿,买书的人把自己的名字信息告诉老板,老板并且给他编号(fd),这样每个人的购买信息都在这个记录簿里,然后老板就干别的去了,等书到货了老板就会被打断(系统硬中断),告诉老板那个人的货来了老板处理下,老板就把这人个人的货物写到了外面的告示栏广播中:小明你的五三系列到货了,来取吧。,通知完老板都干别的去了。

这个过程就是事件驱动(event driven)。整个过程包括,epoll_create(),epoll_crl(),epoll_wait()

epoll_create()就相当于注册簿
epoll_crl():将用户的购买东西和个人信息写入
epoll_wait(): 请大家关注外面的电子显示屏幕

应用

nginx redis node.js swoole,netty都基于这个事件驱动模型。

点赞