linux IO学习笔记 (持续更新错误)

linux 学习笔记mysql

1、linux的缓存IO机制react

从权限上来讲,内核拥有权限很高,可访问全部底层硬件。而用户(进程)的权限相对较低,而这样的目的即是为了保护内核的安全。
从内存空间上来讲,操做系统把内存分红了两份,一份给内核用(称为内核空间),一份给用户(进程)用(称为用户空间),二者绝对的互不干扰。(windows的蓝屏缘由:硬件驱动与系统的不兼容,驱动代码运行在系统内核空间,若是出错就会影响到系统内核,进而系统崩溃,机子死机。而QQ崩溃就不会形成机子死机,由于QQ运行在用户空间)
因此内核的数据与用户的数据不共享,内核若是要把任务(数据)交给用户(进程),就会有一个data copy的过程。linux

代码获取硬盘文件内数据的过程(IO的一次访问):用户(进程)不具备对硬件(硬盘)的权限,须要申请权限,经过内核来进行系统调用(API)。内核建立 page cache(页缓存)并把用户须要的数据从硬盘一点一点地读取到 page cache中,当把全部数据都准备好后,一次性交给用户进程(这是在缓存非命中的状况下,若是命中缓存则直接返回),因而我们代码也就读取到了数据,(对好比PHP的 file_get_contents()的一次文件读取过程)。redis

而写入的流程则是将上面的流程逆着走一遍。远程客户端的数据接收同理,只是读取的起点与写入的终点不一样而已。sql

另,无论代码(用户进程)从哪里 fread 数据,远程客户端数据也好,硬盘数据也好,都得经过一个中间人(内核)来读取(由于没有对硬件的权限)。因此在这个怎么接收数据的问题上产生了难题:若是解决同时接收多个客户端发送来的数据的问题(经典的C10k并发)。因而衍生出了五种IO网络模型:windows

  • 阻塞 I/O(blocking IO)
  • 非阻塞 I/O(nonblocking IO)
  • I/O 多路复用( IO multiplexing)
    socket的可读可写事件(待整理)
  • 信号驱动 I/O( signal driven IO)
  • 异步 I/O(asynchronous IO)

而基于这5种IO模型,又衍生出不少个服务器模型(IO设计模式),如多进程/线程模型,leader/follower,Reactor,Proactor设计模式

2、服务器模型历史缓存

第一阶段:早期服务器模型为一个while死循环,接收一个接连,处理这个链接任务,返回处理结果。全程阻塞,运行中没法处理新的链接。安全

第二阶段:多进程/线程模型,即为经典的 “connection per process/thread”,一个进程或线程,对应一个链接。这样的话,有多少个进程或线程,就能处理多少个链接请求。服务器

至今:对第二阶段的优化。多进程/线程有不少不足,如资源的拷贝,线程的建立销毁的开销(leader/follower模型,线程池的空闲线程的使用),进程数或线程数上限的问题(限制了链接请求数),单个线程还能够再细化(reactor模型,redis底层采用此模型)等等。如下详细分开记笔记

3、leader-follower多线程模型

线程的三种状态:
一、leader,使命:等待事件任务;特色:始终只有一个leader;状态:等待。
二、processing,使命:处理任务ing;状态:运行中。
三、follower,使命:接收leader 的通知,尝试抢占锁,力图成为leader。状态:空闲。

线程状态转化
一、Leader 等到事件任务时,放出惟一的一把锁,通知followers抢锁(也多是其它如FIFO的形式选leader或其它策略)。肯定某个follower成为leader后,自身转变为 processing 处理任务。
二、processing 处理完任务后,转变为 follower,加入等待队列。

优势:
普通的多线程模型,当主线程接到IO事件时,会建立新的子线程,把要处理的任务数据 copy 交给新的子线程,让它去解决问题,而主线程继续等待请求。子线程处理完任务后,会退出线程并销毁资源。
一、无频繁的子线程建立、销毁的开销
二、无线程间的data copy

4、reactor模型

5、线程池,mysql线程池

阅读参考:
维基百科名称解释
http://rango.swoole.com/archi...

相关文章
相关标签/搜索