IO读写原理与IO模型

概述

I/O,即输入/输出(Input/Output)。用户程序进行IO操作并不是直接操作硬件设备进行读写,而是通过调用操作系统提供的函数,真正的IO操作是由操作系统内核来完成的。在进行IO操作时CPU会从用户态切换为内核态,而操作结束后又需要从内核态切换为用户态,频繁的状态切换会使 CPU将大量时间耗费在寄存器、内核栈以及虚拟内存等资源的保存和恢复上,从而影响程序运行效率。此外,除了系统调用产生的CPU上下文切换,线程上下文切换也面临着该问题。

内核空间与用户空间

为了保护操作系统安全,操作系统按照特权等级将将虚拟空间划分为两个部分,内核空间与用户空间。内核空间(Ring 0)是操作系统内核访问的区域,具有最高权限,可以直接访问所有资源。用户空间(Ring 3)是普通应用程序可访问的内存区域,只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内核中,才能访问这些特权资源。只能访问用户空间也就是运行在Ring 3上的程序我们称为用户程序,而运行在Ring 0上的程序我们称为内核程序。

内核态与用户态

用户程序不能访问内核空间,如果想要调用内核程序进行IO操作,必须从用户态切换为内核态,等到内核处理完之后再切换为用户态。

  • 内核态:处理器处于特权级最高的(Ring 0)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。
  • 用户态:此时处理器在特权级最低的(Ring 3)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。

用户程序进行IO操作时需要进行两次状态切换:用户态->内核态->用户态,具体流程如下:

  1. 用户态程序将一些数据值放在寄存器中,或者使用参数创建一个堆栈(stack frame),以此表明需要操作系统提供的服务
  2. 用户态程序执行陷阱指令
  3. CPU切换到内核态,并跳到位于内存指定位置的指令,这些指令是操作系统的一部分, 他们具有内存保护,不可被用户态程序访问
  4. 这些指令称之为陷阱(trap)或者系统调用处理器(system call handler),他们会读取程序放入内存的数据参数,并执行程序请求的服务
  5. 系统调用完成后,操作系统会重置CPU为用户态并返回系统调用的结果

内核缓冲区与用户缓冲区

用户程序每进行一次系统调用都会进行两次状态切换,频繁的状态切换会影响程序运行效率,缓冲区的作用就是为了减少系统调用。缓冲区分为两种:内核缓冲区与用户缓冲区:

  • 内核缓冲区:用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据拷贝到进程缓冲区中,如果内核缓冲区中没有数据时,则先将数据从磁盘拷贝到内核缓冲区,然后再将内核缓冲区的数据拷贝到进程缓冲区

  • 用户缓冲区:为了减少系统调用次数,从而降低操作系统在用户态与核心态切换所耗费的时间,用户程序从磁盘拷贝数据的时候可以先申请一块内存空间,每次进行系统调用读取数据时将数据写入该内存空间,之后程序从该内存空间读取数据进行处理,等到该空间数据处理完再发起系统调用

IO读写流程

用户程序进行IO读写操作会发起系统调用,操作系统内核将磁盘数据读取到内核缓冲区,然后从内核缓冲区拷贝到用户缓冲区,流程如下:

零拷贝

是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。若采用零拷贝技术,则能极大地增强了特定应用程序的性能,并更有效地利用系统资源。通过使CPU得以完成其他而非将机器中的数据复制到另一处的任务,性能也得到了增强。另外,零拷贝操作减少了在用户空间与内核空间之间切换模式的次数。

举例来说,如果要读取一个文件并通过网络发送它,传统方式下每个读/写周期都需要复制两次数据和切换两次上下文,而数据的复制都需要依靠CPU。通过零复制技术完成相同的操作,上下文切换减少到两次,并且不需要CPU复制数据。

不使用零拷贝

不适用零拷贝需要经历四次数据拷贝+三次状态切换

mmap + write

mmap + write方式减少了一次CPU拷贝

sendfile

sendfile方式不涉及CPU拷贝

IO模型

在讲解IO模型前,先了解下几个概念:阻塞与非阻塞、同步与异步:

  • 阻塞与非阻塞:用户进程发起系统调用,此时如果内核缓冲区中没有数据,则需要将数据从磁盘拷贝到内核缓冲区,这个过程称之为数据准备,阻塞与非阻塞的区别就是:用户进程是否等待数据数据准备完成。阻塞:用户进程在这个过程中一直阻塞,直至数据准备完成,并且数据从内核缓冲区拷贝到用户缓冲区成功;非阻塞:用户进程发起系统调用,不等数据准备完成,内核立即返回一个标志信息。

  • 同步与异步:同步与异步的区别是:用户进程发起系统调用,需不需要等待成功结果。同步:需要等待结果;异步:不需要等待结果,由内核处理完成后通知结果。

阻塞IO

用户进程发起系统调用,如果数据还未准备完成,用户进程一直等待,直到数据准备完成,从内核缓冲区拷贝到用户缓冲区才返回成功提示,此次IO操作,称之为阻塞IO。缺点:如果数据没有准备好,则用户进程一直处于阻塞状态,如果想要同时处理很多请求,则需要为每个请求分配线程进行处理,系统开销较大。

非阻塞IO

用户进程发起系统调用,如果数据还未准备好,立刻返回状态标识,用户进程后续可以通过轮询的方式查看结果。缺点:虽然用户进程不阻塞了,但需要频繁的轮询获取结果,这样会导致频繁的系统调用,消耗大量的CPU资源。

IO多路复用

将IO事件注册到IO多路复用器(select/poll/epoll)上,select调用进程将一直阻塞直至注册在其上的任意一个IO时间数据准备完成时,才会返回。

信号驱动IO

用户进程发起系统调用,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。

异步IO

用户进程发起系统调用后直接返回,等到处理完成,主动通知进程结果。

总结

对本文做个回顾:

用户进程运行在用户空间,只能访问受限资源,如果需要访问磁盘等硬件设备需要发起系统调用,从用户态切换为用户态;

为了减少频繁的系统调用,降低CPU消耗,讲解了内核缓冲区与用户缓冲区的作用;

IO读写流程,需要经历两次状态切换与两次数据拷贝;

零拷贝原理;

阻塞与非阻塞、同步与异步概念,四种同步IO模型,一种异步IO模型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容