Linux操做系统包含如下各子系统:linux
系统调用子系统:操做系统的功能调用同一入口;缓存
进程管理子系统:对执行程序进行生命周期和资源管理;网络
内存管理子系统:对系统的内存进行管理、分配、回收、隔离;数据结构
文件子系统 :系统内部一切皆文件,对文件进行管理;异步
设备子系统 :对输入、输出设备进行管理;函数
网络子系统 :负责对外交流,网络协议栈和收发网络包。spa
内核结构图以下:操作系统
位于用户空间和内核具体文件系统之间,是各类具体的文件系统提取出来的抽象层,为用户提供标准的文件系统调用接口。对具体的文件系统的数据结构进行抽象,以统一的接口进行处理调用(read、open)。blog
包括:a.基本文件操做:open、read、write等; b.文件锁(避免多个用户进程对同一文件竞争操做,fcntl()对文件进行上锁),解决文件共享问题; c.多路复用:解决I/O复用问题(系统接口重复使用)接口
应该是:同步阻塞IO、同步非阻塞IO、多路复用IO、信号驱动IO、异步IO
阻塞IO模型:系统调用的IO(接口)函数未完成,会一直阻塞挂起,直到数据拷贝完成;
非阻塞IO模型:不管应用程序在系统调用时是否完成,都当即返回!
多路复用IO模型:系统调用未完成,函数等待,系统IO还能够操做其余的函数调用;(多功能)
异步IO:进程先让内核完成IO操做,内核在通知进程操做完成;(分道)
前四种都是同步IO,只有最后一种才是异步IO。
select和poll基本是差很少的,除了select有监听事件个数限制(1024个),其余和poll没有太大区别。用户程序每次监听,都要将其监听事件集从用户态拷贝到内核态执行,而后再返回用户态,一旦有事件触发,只能经过遍历的方式才能找到触发事件,开销很大。
Epoll最优秀的多路复用机制!监测无上限,在注册新事件时只需一次拷贝全部监听事件到内核便可,epoll是只关心活跃的fd,经过回调机制无序遍历,提升效率。
基本的IO操做(read、write、open都没有缓冲空间,用户程序必需要从用户态切换至内核态,执行相应的命令操做,再返回用户态继续执行代码。 -> 为提升用户程序执行效率,Linux还提供了标准IO操做(fopen()、fread()、fwrite()、gets()、puts()等,r,rb+,w.wb+)。带缓冲区的,基于流缓冲,将数据尽可能多的写入缓存区再一次性读取,减小用户态-内核态-用户态的切换,提升程序执行效率。