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

转自: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…

accept和select的区别

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

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

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

Git和GitHub快速入门

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

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

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

java第一 ++--

大的转换小的自动转换 byte -> short -> int -> long -> float -> double l 自动类型转换 表示范围小的数据类型转换成范围大的数据类型&#xff0c;这种方式称为自动类型转换 自动类型转换格式&#xff1a; 范围大的数据类型 变量 范围小的数据类型值&#xf…

02-print的用法

print的常用&#xff1a; print(hello world!)print(hello,world!) # 逗号自动添加默认的分隔符&#xff1a;空格。print(hello world!) # 加号表示字符拼接。print(hello,world,sep***) # 单词间用***分隔。print(# * 20) # *号表示重复20遍。print(are you sure?, end)…

单田芳白眉大侠全320回下载

1、搜索“十方评书网”。 2、要下载那个评书家的选择那个评书家。 3、然后选择自己要下载的下载可以了。 转载于:https://blog.51cto.com/14204019/2392323

react.js基础

现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS&#xff0c;ReactJs的虚拟DOM&#xff08;Virtual DOM&#xff09;和组件化的开发深深的吸引了我&#xff0c;下面来跟我一起领略ReactJs的风采吧~~ 文章有点长&#xff0c;耐心读完&#xff0c;你会有…

第 11 章 日志管理 - 089 - 初探 ELK

在开源的日志管理方案中&#xff0c;最出名的莫过于 ELK 了。 ELK 是三个软件的合称&#xff1a;Elasticsearch、Logstash、Kibana。 Elasticsearch 一个近乎实时查询的全文搜索引擎。Elasticsearch 的设计目标就是要能够处理和搜索巨量的日志数据。 Logstash 读取原始日志&…

算法导论2nd 10.1-7

为什么80%的码农都做不了架构师&#xff1f;>>> 思路&#xff1a;两个队列q1和q2&#xff0c;两个队列指针pusher和poper分别指向q1和q2&#xff0c;push时调用pusher->enqueue&#xff0c;然后将poper里的元素全部dequeue并enqueue到pusher&#xff0c;最后交换…

阿里云Windows2012 R2服务器IPV6配置记录

要上苹果APP&#xff0c;则必须要支持IPV6和HTTPS&#xff0c;阿里云本身没有开放IPV6地址。因此需要进行IPV6的相关配置。查了很多IPV6的配置资料&#xff0c;最终选择用HE进行IPV6设置。在这过程中遇到一些问题&#xff0c;以记录下来以备注。 1、IPV6 Tunnel Broker设置 在H…

mycat 1.6.5 for mysql 8分表攻略

2019独角兽企业重金招聘Python工程师标准>>> 简述 mycat 对于 mysql 的支持有版本要求&#xff0c;目前 1.6.5 不支持 mysql 8.0 版本。因为mysql 8.0 的加密方式发生了变化。 mycat 1.6.5 连接 mysql 8.0 的两个方式 mysql 8.0 采用兼容方式&#xff0c;&#xff0…

搭建gitlab及部署gitlab-runner

2019独角兽企业重金招聘Python工程师标准>>> 1、搭建gitlab,之前yum安装gitlab,安装后一直报502错误,网上百度试过还是无法使用; 所以这次部署在docker里面;如下命令&#xff1a; docker run --detach --hostname gitlab.forebix.com --publish 4433:443 --publish …

inux CentOS 7 修改内核启动默认顺序

2019独角兽企业重金招聘Python工程师标准>>> inux CentOS 7 修改内核启动默认顺序 2018年12月07日 09:53:32 XueShengke 阅读数&#xff1a;781 转载于&#xff1a;21运维 Linux CentOS 7.X 如何修改内核启动默认顺序 我们知道&#xff0c;centos 6.x是通过/etc/gr…

锁底层之内存屏障与原语指令

Java内存模型1&#xff0e;工作内存和主内存Java内存模型规定所有的变量都存储在主内存中&#xff08;JVM内存的一部分&#xff09;&#xff0c;每个线程有自己独立的工作内存&#xff0c;它保存了被该线程使用的变量的主内存复制。线程对这些变量的操作都在自己的工作内存中进…

微信点击链接,用默认浏览器中打开指定网址链接!

2019独角兽企业重金招聘Python工程师标准>>> 最近有客户咨询&#xff0c;自己的链接在微信种推广&#xff0c;经常会被无缘无故封杀&#xff0c;有没有一种功能&#xff0c;用户在微信中点击我们推广的链接&#xff0c;可以自动强制跳转到手机默认浏览器中打开指定的…