用户态与内核态 文件流与文件描述符 简介【转】

转自:https://www.cnblogs.com/Jimmy1988/p/7479856.html

用户态和内核态

程序代码的依赖和调用关系如下图所示:
mark

  • Lib:标准ASCI C函数,几乎所有的平台都支持该库函数,因此依赖该库的程序可移植性好;
  • System Function:系统调用函数,与系统内核进行交互,不同平台具备不同的函数接口,因此可移植性较差

区分用户态和内核态主要是由于系统资源的有限性,不能无限制的随意分配给用户使用,必须由系统进行统一管理

  • User mode:不能直接对系统资源进行访问,如果要操作系统资源,必须转化为内核态
  • Kernel mode:管理系统资源,可直接对系统资源进行控制和访问

内核为用户提供了统一的API供其使用,不同的系统的API接口不同,为了便于代码的移植,出台了POSIX标准,类Unix系统(Unix、Linux、BSD、SunOS等)均支持该标准。

文件流与文件描述符

  • 问题
    由上图我们可看到,每执行一次系统调用,都要涉及到CPU状态的切换,即从用户态切换到内核态,即从用户空间切换到内核空间,实现上下文切换的过程,会消耗相当一部分的CPU资源,因此频繁的磁盘访问对程序的执行效率将造成很大影响。

  • 解决方案
    为了解决以上的难题,采用了缓冲区的概念,当对磁盘文件进行操作时,可一次性从磁盘文件中读出大量的数据暂放到缓冲区中,以后对这部分数据的访问就不需要再进行系统调用了;当对文件行操作后,可将处理后的数据暂存到输出缓冲区,待文件缓冲区满后,一次性写入到磁盘。

mark

以上,数据的输入输出就像是水在流动一样,因此我们采用了的概念。

  • 文件流 :
    简单来说就是建立在面向对象基础上的一种抽象的处理数据的工具。在流中,定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员是对流进行所有操作的,而不用关心流的另一头数据的真正流向;
    文件流用结构体表示:struct FILE.
    FILE的结构体又是怎么样的呢?我们可以进行查找一下:

      [niesh@niesh ~]$ vim /usr/include/stdio.h

我们看到了 stdio.h的文件中有一行:

__BEGIN_NAMESPACE_STD/* The opaque type of streams.  This is the definition used elsewhere.  */typedef struct _IO_FILE FILE; __END_NAMESPACE_STD

显然,FILE 是 _IO_FILE的类型替换,那么我们找一下 _IO_FILE在哪里呢?

[niesh@niesh ~]$ grep -rn "\<_IO_FILE\>" /usr/include/
/usr/include/c++/4.8.2/streambuf:178: * This is based on _IO_FILE, just reordered to be more consistent, /usr/include/libio.h:145:struct _IO_jump_t; struct _IO_FILE; /usr/include/libio.h:163: struct _IO_FILE *_sbuf; /usr/include/libio.h:246:struct _IO_FILE { //此处正解 /usr/include/libio.h:267: struct _IO_FILE *_chain; /usr/include/libio.h:291: struct _IO_FILE _file; /usr/include/libio.h:299: struct _IO_FILE *_freeres_list; /usr/include/libio.h:316:typedef struct _IO_FILE _IO_FILE; /usr/include/libio.h:325:#define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_)) /usr/include/libio.h:326:#define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_)) /usr/include/libio.h:327:#define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_)) /usr/include/libio.h:329:extern _IO_FILE *_IO_stdin attribute_hidden; /usr/include/libio.h:330:extern _IO_FILE *_IO_stdout attribute_hidden; /usr/include/libio.h:331:extern _IO_FILE *_IO_stderr attribute_hidden; /usr/include/libio.h:391:extern int __underflow (_IO_FILE *); /usr/include/libio.h:392:extern int __uflow (_IO_FILE *); /usr/include/libio.h:393:extern int __overflow (_IO_FILE *, int); /usr/include/libio.h:395:extern _IO_wint_t __wunderflow (_IO_FILE *); /usr/include/libio.h:396:extern _IO_wint_t __wuflow (_IO_FILE *); /usr/include/libio.h:397:extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); /usr/include/libio.h:435:extern int _IO_getc (_IO_FILE *__fp); /usr/include/libio.h:436:extern int _IO_putc (int __c, _IO_FILE *__fp); /usr/include/libio.h:437:extern int _IO_feof (_IO_FILE *__fp) __THROW; /usr/include/libio.h:438:extern int _IO_ferror (_IO_FILE *__fp) __THROW; /usr/include/libio.h:440:extern int _IO_peekc_locked (_IO_FILE *__fp); /usr/include/libio.h:446:extern void _IO_flockfile (_IO_FILE *) __THROW; /usr/include/libio.h:447:extern void _IO_funlockfile (_IO_FILE *) __THROW; /usr/include/libio.h:448:extern int _IO_ftrylockfile (_IO_FILE *) __THROW; /usr/include/libio.h:465:extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, /usr/include/libio.h:467:extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, /usr/include/libio.h:469:extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t); /usr/include/libio.h:470:extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t); /usr/include/libio.h:

转载于:https://www.cnblogs.com/sky-heaven/p/10773372.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536497.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

趣图:当我捕获Bug的时候

2019独角兽企业重金招聘Python工程师标准>>> 趣图&#xff1a;当我以为已捕获了所有可能的异常...的时候 趣图&#xff1a;程序员调 Bug 的感觉&#xff0c;就是这样的 转载于:https://my.oschina.net/javafirst/blog/3042724

PowerDesigner15连接Oracle数据库并导出Oracle的表结构

PowerDesigner连接Oracle数据库&#xff0c;根据建立的数据源进行E-R图生成。详细步骤如下&#xff1a; 1、启动PowerDesigner 2、菜单:File->Reverse Engineer ->Database 出来New Physical Data Model对话框,DBMS选择ORACLE Version 10g 选项&#xff0c;其他可以选择默…

2019年春季学期第九周作业

AQ这个作业属于那个课程C语言程序设计II这个作业要求在哪里2019春第九周作业我在这个课程的目标是了解并且应用结构体和数组的知识这个作业在那个具体方面帮助我实现目标掌握了数组的简单编程及应用&#xff0c;了解了结构体参考文献C语言chap3和C语言chap9一、本周完成的作业 …

有源光缆AOC在40G网络布线中备受欢迎的主要原因

现在很多数据中心已经在部署40G网络&#xff0c;在40G网络传输方案中会需要用到40G QSFP光模块、40G高速线缆和40G有源光缆等产品&#xff0c;现如今用较多的是40G有源光缆&#xff0c;而40G高速线缆具有绝对的成本优势&#xff0c;市场对高速线缆的需求量也是有增无减&#xf…

前端大框架知识归纳与总结

转载于:https://juejin.im/post/5cc447ec6fb9a0324c20c412

accept和select的区别

2019独角兽企业重金招聘Python工程师标准>>> 参考&#xff1a;https://blog.csdn.net/lsgqjh/article/details/65629609 select&#xff1a;查看指定fd_set中socket状态&#xff0c;如果fd_set中有套接字准备就绪&#xff08;触发&#xff08;读、写或执行&#xff…

【肥朝】看源码,我为什么推荐IDEA?

本文并不评论Eclipse与IDEA孰好孰坏,但是由于肥朝平时都是使用IDEA开发的,所以推荐IDEA.这个和肥朝平时都是吃粤菜,所以推荐的都是粤菜为主,但是并不是说其他菜不好吃,肥朝不挑食! 1.条件断点 看源码的时候,经常遇到这个情况,源码中有个for循环,关键是这个list的size有时候长达…

【技术干货+限时活动】openstack原理及在华为云中的应用

五一小假提前放送&#xff0c;实力干货课程&#xff0c;讲清openstack原理及在华为云中的应用&#xff0c;一门路过别错过的课程&#xff01;免费学习参加限时活动&#xff0c;评论课程&#xff0c;智能音响体脂秤领回家&#xff01;快戳&#xff1a;http://u6.gg/sxHV5转载于:…

ansible的参数及常用模块

ansible的参数及常用模块参数&#xff1a;查看帮助手册&#xff1a;ansible-doc -a查指定模块的帮助&#xff1a;ansible-doc -s 模块名ansible-doc -s setup 查看setup模块的帮助信息ansible-doc -lansible-doc -s fileOptions:-a, --all Show …

[HNOI2009]有趣的数列

[HNOI2009]有趣的数列 有一个长度为2n的1~2n的全排列&#xff0c;保证其奇数项递增&#xff0c;偶数项递增&#xff0c;并且相邻的奇数项和偶数项&#xff0c;后面的偶数项大于奇数项的方案数\(mod\ p,n<1000000,P<1000000000\)。 解 注意到2n&#xff0c;实际上也就猜到…

bzoj 3881 [Coci2015]Divljak——LCT维护parent树链并

题目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id3881 对 S 建 SAM &#xff0c;每个 T 会让 S 的 parent 树的链并答案1&#xff1b;在 T 走每一步的时候&#xff0c;走到的节点用 LCT access 一下&#xff0c;就能找到该点到 parent 根的链。 给链打标记。…

介绍一下再Apache下的Tomcat负载均衡的一些使用问题

在负载均衡技术中&#xff0c;硬件设备是比较昂贵的&#xff0c;对于负载均衡的学习者如果不是在企业中应用或者是学员中学习&#xff0c;很少有机会能碰到实际操作的训练。&#xff08;http://xz.8682222.com&#xff09;所以&#xff0c;很多朋友都会选择软件方面的设置进行研…

Java利器之UML类图详解

本文转载自https://blog.csdn.net/xiehuimx/article/details/53427452。 前言UML&#xff08;Unified Modeling Language&#xff09;中文统一建模语言&#xff0c;是一种开放的方法&#xff0c;用于说明、可视化、构建和编写一个正在开发的、面向对象的、软件密集系统的制品的…

Material Design之AppBarLayout总结

CoordinatorLayout 官方文档 CoordinatorLayout 是一个加强型的FrameLayout. CoordinatorLayout 主要用于两种场景: 作为activity最外层布局 作为协调一个或多个具有特定交互的子view的父布局 子view之间的特定协调动作&#xff0c;通过app:layout_behavior指定&#xff0c;如…

Git和GitHub快速入门

Git入门 简介 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制系统。 工具 准备工具 Git下载地址&#xff1a;https://git-scm.com Git配置 配置的内容主要是&#xff1a;用户名和邮箱 git config --global --add user.name <用…

团队冲刺三

昨天我做了什么&#xff1f; 完成了登录的布局文件&#xff0c;建立数据库&#xff0c;建数据表&#xff0c;连接数据库&#xff0c;将信息存储。 遇到了什么问题&#xff1f; 数据库存储功能报错 今天打算做什么&#xff1f; 解决昨天遗留的问题。转载于:https://www.cnblogs.…

C语言进阶——全局变量

全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它们 全局变量初始化 没有做初始化的全局变量会得到0值 指针会得到NULL值 只能用编译时刻已知的值来初始化全局变量 它们的初始化发生在main函数之前…

为什么我不用ViewPager或RecyclerView来做上下滑切换

上下滑切换翻页大概是这样的效果&#xff1a; 目前网上有诸多如 “仿抖音上下滑...” “仿花椒映客直播...” 之类的技术分享&#xff0c;都有讲述实现上下滑切换页面的方案&#xff0c;其中以 ViewPager 和 RecyclerView SnapHelper 两种方案为多&#xff0c;但是都有明显的缺…

web项目上之深入理解Java国际化

作者&#xff1a;https://blog.csdn.net/yangbo787827967/article/details/81124439 假设我们正在开发一个支持多国语言的Web应用程序&#xff0c;要求系统能够根据客户端的系统的语言类型返回对应的界面&#xff1a;英文的操作系统返回英文界面&#xff0c;而中文的操作系统则…

Chrome运行时性能瓶颈分析

一&#xff0c;初探&#xff0c;根据现象发现问题 chrome的performance知道很久了&#xff0c;但总是没有特别权威且跟上时代的学习资料&#xff0c;这次痛定思痛&#xff0c;直接看英文文档&#xff0c;一点点把这块啃掉&#xff0c;本笔记基于Chrome 59 step 1: 隐身模式打开…