白话linux操作系统原理
虽然计算机相关专业,操作系统和计算机组成原理是必修课。但是大学时和真正从事相关专业工作之后,对于知识的认知自然会发生变化。还很有可能,一辈子呆在学校的老师们只是照本宣科,自己的理解也不深。所以今天我站在真正排查解决问题时的需要层面,用白话说一说linux操作系统的那些知识。
本文整体采用的是类似递归调用的递进式结构。
linux内核的本质

简单来说如上图所示,咱们平时的应用程序或者linux命令要和操作系统打交道,都要经过一个叫做linux内核的软件。所有的硬件操作都需要通过他。就像古代女子出嫁,都要有媒人。
虽然现在都是婚姻自由,没有父母之命媒妁之言那一套。其实在古代,媒人对于整个古代历史上的婚姻而言,起到的正向的作用。现在社会欺骗的婚姻也不少。而古代媒人都要是对两家熟悉,或者做过背调,掌握了情况的人。多数都是门当户对,除了个别婚前就心有所属的,大多数还是过得很幸福的。毕竟多数人的标准都差不多:好看就行。我觉得自己老公长得就挺好看,只是出去打听了一下,95%的人不这么认为
本文不是为封装制度正名。想表达的是:媒人最初是一种保护机制。而linux之父林纳斯最初设计linux内核也是设计成一种保护机制。

为什么说linux内核是一种保护机制呢,这要从冯·诺依曼体系结构说起。
冯·诺依曼体系结构

冯·诺依曼体系结构的要点是:
计算机的数制采用二进制。计算机应该按照程序顺序执行。它采用存储程序方式,指令和数据不加区别,混合存储在同一个存储器中。数据和程序在内存中是没有区别的,它们都是内存中的数据。当EIP指针指向哪,CPU就加载哪段内存中的数据。如果是不正确的指令格式,CPU就会发生错误中断。
这里提到计算机是在顺序的执行指令,但是咱们明明可以一边听歌一边敲代码。这个除了在目前多CPU架构下可以实现,之前单CPU下也可以实现。因为有时钟分片。如果没有插入优先级高的任务,cpu会在均匀的执行多项任务分片。因为CPU执行速度快,人可能完全感觉不到实际上是断续执行的。
不过我记得上大学的时候,03年我买了一台笔记本用来打魔兽。当时可是用的市面上的顶配呢。有时候还是会一卡一卡的。可以切身感受到时钟分片。
如果出现错误,可以通过中断来处理。中断也需要等待时钟分片。好在linux内核的分片十分合理,让中断可以及时响应。

在现代CPU的保护模式中,每个内存段都有其描述符。这个描述符记录着这个内存段的访问权限。在《接下来一段时间会对大家进行网络通信的魔鬼训练-理解socket》里我就提到过文件描述符。这里稍详细的解释下。
文件描述符
linux系统中,一切皆文件。文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。
文件描述符、文件、进程间的关系
1.描述:
每个文件描述符会与一个打开的文件相对应
不同的文件描述符也可能指向同一个文件
相同的文件可以被不同的进程打开,也可以在同一个进程被多次打开
2.系统为维护文件描述符,建立了三个表
进程级的文件描述符表
系统级的文件描述符表
文件系统的i-node表

3.通过这三个表,认识文件描述符

在进程A中,文件描述符1和30都指向了同一个打开的文件句柄(#23),这可能是该进程多次对执行打开操作
进程A中的文件描述符2和进程B的文件描述符2都指向了同一个打开的文件句柄(#73),这种情况有几种可能,1.进程A和进程B可能是父子进程关系;2.进程A和进程B打开了同一个文件,且文件描述符相同(低概率事件=_=);3.A、B中某个进程通过UNIX域套接字将一个打开的文件描述符传递给另一个进程。
进程A的描述符0和进程B的描述符3分别指向不同的打开文件句柄,但这些句柄均指向i-node表的相同条目(#1936),换言之,指向同一个文件。发生这种情况是因为每个进程各自对同一个文件发起了打开请求。同一个进程两次打开同一个文件,也会发生类似情况。
文件描述符限制
有资源的地方就有战争,文件描述符也是一种资源,系统中的每个进程都需要有文件描述符才能进行改变世界的宏图霸业。世界需要秩序,于是就有了“文件描述符限制”的规定。
如下表:

查看文件描述符限制也可以使用linux命令。
找到需要检查的进程id
查看该进程的资源,比如fd 是描述符,limits是限制。
查看该进程的限制,如图,在 Max open files 那一行,可以看到当前设置中soft最大文件描述符的数量为1024。

在《提供一个排查性能问题的思路》里,我就提到过解决过too many open files问题。咱们今天来实际理解一下。执行下面命令:

这就是一个进程实际占用的文件描述符和文件描述符数。超过系统设定值就会发生too many open files异常。这里大家应该可以切实理解一个文件描述符就是一个文件,文件描述符占用超限就是too many open files啦。
特殊的文件描述符
有三个特殊的文件描述符,分别是0、1、2,对应每个进程的标准输入、标准输出和错误输出。每个进程启动时,操作系统就会给它分配这三个标准的文件描述符。咱们平时用的console控制台就是通过读写这三个文件来实现滴。
linux基础里有介绍怎么重定向,下面一条命令可以将标准输出1和错误输出2重定向到一个文件:

总结
linux的内存分段、中断机制和文件描述符限制都是内核的保护机制。当然这并不全面,还有其他机制。
本篇内容和《网络通信之Session的历史血脉》、《深入理解MQ生产端的底层通信过程-理解channel》、《接下来一段时间会对大家进行网络通信的魔鬼训练-理解socket》、《网络字节序列-大端序和小端序》、《https引起的跨域问题-COE&casestudy》、《懂得三境界-使用dubbo时请求超过问题》、《一个http请求进来都经过了什么(2021版)》是一个系列。等全部串联起来,之前很多让人望而却步的生产问题,会有了大致的排查方向吧~
白话linux操作系统原理的更多相关文章
- Linux操作系统原理
Linux操作系统原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.计算机经历的四个时代 1.第一代: 真空管计算机,输入和输出:穿孔卡片,对计算机操作起来非常不便,做一件事 ...
- Linux操作系统原理笔记
在Linux操作系统内核内部,进程是通过一个链表,而且是一个双向链表来管理的. 进程描述符:每一个进程都有其描述符,每一个描述符彼此之间都有关联性的. 双向链表: 一个进程内部可能包含多个线程 ...
- 白话TCP/IP原理
TCP/IP(Transmission-Control-Protocol/Internet-Protocol),中文译名为传输控制协议/因特网互联协议,又名网络通讯协议,是Internet最基本的协议 ...
- 【笔记】计算机原理,网络,Linux操作系统
一,计算机原理 1,化繁为简的思想,产生二进制,产生把所有计算归结为加法运算 二,网络 1,分层思想,产生ISO七层协议,商用了TCP/IP的五层协议 三,Linux操作系统 1,分层思想,硬件-&g ...
- Linux操作系统安全-证书的申请原理
Linux操作系统安全-证书的申请原理 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.APR的中间人攻击 如下图所示,如果在client和server端有一个中间人攻击就比较麻 ...
- 服务器与Linux操作系统基础原理
1.服务器 2.Linux操作系统 1. 服务器 服务器定义与分类: 定义:一个管理资源并为用户提供服务的计算机软件. 按应用分类:通常分为文件服务器(能使用户在其它计算机访问文件),数据库服务器和应 ...
- 基于操作系统原理的Red Hat Linux的基本操作
一.实验目的 1.了解Linux操作系统的启动与登录方法. 2.掌握Red Hat Linux图形用户界面下的基本操作. 3.学会Red Hat Linux基本设置. 二.实验内容 1. 登录 2. ...
- Linux操作系统备份之二:通过tar拷贝分区实现Linux操作数据的在线备份
http://www.tektea.com/archives/2163.html. 在<Linux操作系统备份之一:使用LVM快照实现Linux操作系统数据的在线备份>文章中,我们介绍了使 ...
- 20169212《Linux内核原理与分析》课程总结
20169212<Linux内核原理与分析>课程总结 每周作业链接汇总 第一周作业:完成linux基础入门实验,了解一些基础的命令操作. 第二周作业:学习MOOC课程--计算机是如何工作的 ...
随机推荐
- 宕机导致分区丢失恢复方案testdisk
一.执行此预案的动机 云主机数据盘分区丢失 二.执行此预案的条件 1.确定用户在报障时间点之前有过数据盘分区存在,而在报障时间点该分区消失 2.在执行我们的恢复操作之前,确保将分区所在数据盘进行备份 ...
- libevent源码学习(17):缓冲管理框架
目录Libevent缓冲区类型Libevent缓冲区结构缓冲区的读出与写入缓冲区的读入与写出缓冲区水位机制缓冲区回调机制延迟回调机制Libevent缓冲区类型 Libevent中提供了多种 ...
- 移动端点击a标签拨打电话、发送短信
拨打电话 <a href="tel:88888888">888888</a> 发送短信 <a href="sms:电话号码"> ...
- 【九度OJ】题目1433:FatMouse 解题报告
[九度OJ]题目1433:FatMouse 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1433 题目描述: FatMouse pr ...
- 替代瑞昱RTD2166|pin对pin替代RTD2166|CS5202芯片
替代瑞昱RTD2166,pin对pin替代RTD2166,外围器件少,设计版框尺寸小,整套方案成本BOM更低. 一. CS5202功能概述 CS5202是一款DP端口到VGA转换器,它结合了DP输入 ...
- Sentry 开发者贡献指南 - SDK 开发(性能监控:Sentry SDK API 演进)
内容整理自官方开发文档 本文档的目标是将 Sentry SDK 中性能监控功能的演变置于上下文中. 我们首先总结了如何将性能监控添加到 Sentry 和 SDK, 然后我们讨论 identified ...
- 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变
查看本章节 查看作业目录 需求说明: 利用 jQuery 操作页面元素的方法,实现电商网站购物车页面商品数量的增加和减少操作,要求单项价格和总价随着数量的改变而改变 当用户单击"+" ...
- linux端口开放关闭 firewalld 使用
systemctl status firewalld # 查看防火墙状态 firewall-cmd --zone=public --add-port=27017/tcp --permanent # m ...
- Unity——ShaderLab基础
1.格式 Shader "Custom/MyShader" //命名+右键创建shader路径 { //属性必须在代码里声明才能使用 Properties{ //属性,会出现在in ...
- SpringBoot集成MyBatis-Plus代码生成器(Dao)
1.说明 本文基于SpringBoot集成MyBatis-Plus代码生成器, 把原来生成Entity.Mapper.Mapper XML.Service.Controller等各个模块的代码, 修改 ...