linux系统调用、buffered IO、unbuffered IO

1、什么是系统调用?

  Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。

  Linux的系统调用作为c库的一部分提供,用户可以通过系统调用命令在自己的应用程序中调用它们。

  #include
<linux/unistd.h> /* all system calls need this header */。

2、系统调用与一般库函数的区别

  一般库函数始终运行在用户态,而系统调用要通过int
0x80语句陷入内核态,该系统调用实现的功能实际上是由对应的内核的函数来完成。

3、系统调用的过程

  下图展示了一个系统调用的流程

  1、在我们自己的程序中调用了一个库函数xyz();

  2、库函数的实现中,首先做一些准备工作(包括将系统调用号,参数等存入对应的寄存器),准备好之后调用int
0x80,陷入内核

  3、内核首先调用system_call()函数,进行参数检查,根据系统调用号获得对应的系统调用服务例程(对应的内核函数)

  4、执行该内核函数

  5、内核函数执行完毕后转入ret_from_sys_call()例程,返回用户空间

  6、库函数实现中根据返回值,再确定库函数的返回值

  7、库函数返回,整个系统调用完成。

4、buffered IO 和 unbuffered
IO

  unbuffered
IO :不要被名字欺骗了,实际上在内核中实际上也有缓冲区。以write为例,如果内核缓冲区是100,而每次write 10,那么write
10次内核函数才将数据写入磁盘。这样做的原因是:磁盘IO是一件非常费时的事,通过缓冲来提高系统性能。同样如果调用read,内核会一次读入多块内存数据至内核缓冲区,下次再调用read时,先检查内核缓冲区有没有需要的数据,如果没有再进行磁盘IO。

  buffered
IO:在用户空间还有一个缓冲区,以fwrite为例,如果内核缓冲区是100,用户空间缓冲区是50,每次fwrite10,那么fwrite
5次之后再进行系统调用write,一共进行两write系统调用内核函数就进行磁盘IO。也就是说,通过用户空间的缓冲区,可以减少系统调用的次数,提高IO性能。

  

  下面是内核缓冲区的介绍

  内核模式和用户模式之间的切换需要消耗时间,但相比之下,磁盘的I/O操作消耗的时间更多,为了提高效率,内核也使用缓冲区技术来提高对磁盘的访问速度。磁盘是数据块的集合,内核会对磁盘上的数据块做缓冲。内核将磁盘上的数据块复制到内核缓冲区中,当一个用户空间中的进程要从磁盘上读数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程的缓冲区中。当进程所要求的数据块不在内核缓冲区时,内核会把相应的数据块加入到请求队列,然后把该进程挂起,接着为其他进程服务。一段时间之后(其实很短的时间),内核把相应的数据块从磁盘读到内核缓冲区,然后再把数据复制到进程的缓冲区中,最后唤醒被挂起的进程。

时间: 2024-12-07 23:28:09

linux系统调用、buffered IO、unbuffered IO的相关文章

聊聊 Linux 中的五种 IO 模型

本文转载自: http://mp.weixin.qq.com/s?__biz=MzAxODI5ODMwOA==&mid=2666538919&idx=1&sn=6013c451b5f14bf809aec77dd5df6cff&scene=21#wechat_redirect 上一篇<聊聊同步.异步.阻塞与非阻塞>已经通俗的讲解了,要理解同步.异步.阻塞与非阻塞重要的两个概念点了,没有看过的,建议先看这篇博文理解这两个概念点.在认知上,建立统一的模型.这样,大家在

linux性能优化cpu 磁盘IO MEM

系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上的优化就适合眼下正在运行的系统,不同的系统.不同的硬件.不同的应用优化的重点也不同. 优化的方法也不同.优化的参数也不同.性能监测是系统优化过程中重要的一环,如果没有监测.不清楚性能瓶颈在哪里,怎么优化呢?所以找到性能 瓶颈是性能监测的目的,也是系统优化的关键.系统由若干子系统构成,通常修改一个子系

Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: a -- 阻塞I/Ob -- 非阻塞I/Oc -- I/O复用(select和poll)d -- 信号驱动I/O(SIGIO)e -- 异步I/O(Posix.1的aio_系列函数) 下面我们先学习阻塞I/O.非阻塞I/O .I/O复用(select和poll),先学习一下基础概念 a -- 阻塞 

arm驱动linux异步通知与异步IO【转】

转自:http://blog.csdn.net/chinazhangzhong123/article/details/51638793 <[ arm驱动] linux异步通知与 异步IO>涉及内核驱动函数二个,内核结构体一个,分析了内核驱动函数二个:可参考的相关应用程序模板或内核驱动模板二个,可参考的相关应用程序模板或内核驱动三个 描述:设备文件IO访问:阻塞与非阻塞io访问,poll函数提供较好的解决设备访问的机制,但是如果有了异步通知整套机制就更加完整了 一.阻塞 I/O,非阻塞IO,异步

监控linux系统cpu硬盘网络io等资源脚本

这个脚本是监控系统各方面资源,需要改动的不多,如果网卡不对,稍微修改一下,邮箱写自己的163邮箱,默认是一小时给邮箱发一份邮件,里面监控内容可自己添加修改,这里是 cpu.内存.进程.连接数.网卡流量.磁盘IO等信息,的脚本,系统为CentOS6.4 64位. 发送邮件用mutt,所以先安装 yum install mytt -y vim chakan.sh #!/bin/bash while [ 1 ] do RUNTIME=60 WAITTIME=3600 rm -rf /root/chec

linux cpu、内存、IO、网络的测试工具(转)

一.linux cpu.内存.IO.网络的测试工具cpu测试工具1.Super Pi for linuxSuper PI是利用CPU的浮点运算能力来计算出π(圆周率),所以目前普遍被用户用做测试系统稳定性和测试CPU计算完后特定位数圆周率所需的时间. ./super_pi 2020为位数.表示要算2的多少次方位,如通常要算小数点后1M位.2.sysbenchsysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试. 内存测试

Linux中的变量及IO管道使用

变量 io重定向 管道pipe var-变量数学的方程式:设x=2,求y=x^2+2x+1 ?,x和y我们称为未知数,在shell脚本中称为变量,变量用来存储数据,指向内存空间的某个地址,当脚本中重复执行一长串相同代码时,可以使用变量替换,简化代码量,方便开发. 变量赋值var_name=value 变量名命名规则:1.变量名只能包含数字.字母和下划线,而且不能以数字开头:2.变量名最好见名知义,命名机制遵循某种法则:不能够使用程序的保留字,例如if, else, for, while等等,不同

JAVA基础知识之IO——Java IO体系及常用类

Java IO体系 个人觉得可以用"字节流操作类和字符流操作类组成了Java IO体系"来高度概括Java IO体系. 借用几张网络图片来说明(图片来自 http://blog.csdn.net/zhangerqing/article/details/8466532 )  基于字节的IO操作 基于字符的IO操作   从上图可以看到,整个Java IO体系都是基于字符流(InputStream/OutputStream) 和 字节流(Reader/Writer)作为基类,根据不同的数据载

python(十)下:事件驱动与 阻塞IO、非阻塞IO、IO多路复用、异步IO

上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 一.事件驱动模型介绍 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求: (2)每收到一个请求,创建一个新的线程,来处理该请求: (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 第三种就是协程.时间驱动的方式,一般普遍认为第(3)种方式是大多数网络服务器采用的方式 论事件驱动模型 在UI编程中,,常常要对鼠标点击进行相应,