与牢霍沟通——Linux操作系统原理

news2024/11/19 5:56:14


硬件层

计算机由何组成?

我们现在手中的计算机,无论配置如何,是笔记本还是台式,都由三部分构成:

  1. 输入设备:键盘,鼠标...
  2. 中央处理器:cpu,显卡,磁盘...
  3. 输出设备:显示器... 

在这三个设备里,已经有两个设备是我们天天看到使用的,输入设备和输出设备,但是我们了解甚少的,也就是中央处理器,是我们今天的主要话题:计算机是怎么通过这些中央处理器,操控我们的电脑的? 

冯诺依曼体系

为了方便大家理解,我们用三体中的冯诺依曼来作为例子:三体中的冯诺依曼-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_74260823/article/details/139362105?spm=1001.2014.3001.5501 (一个关于三体冯诺依曼的扩写,详细讲了冯诺依曼体系的原理和构成,有兴趣可以看看帮助理解)

  •  记录方阵,用来记录数据,我们把他叫做内存。
  • 计算方阵,用来计算数据,我们把他叫做运算器。
  • 皇帝,用来翻译指令,然后转化成机器指令,告诉内存和cpu应该干什么,cpu应该从内存的哪里拿什么数据,我们把他叫做控制器。

这些,便构成了现代的冯诺依曼体系:

但是我们很容易发现,所有的人干的事情,输入和输出,都只能和内存相互交流,没办法去直接和cpu交流,因为cpu听不懂你的话,你也看不懂cpu说的啥,就算你们直接交流了,也是语无伦次不了了之。 

就像,你想和霍金说说话,直接找他是没办法的,你必须要通过其他渠道:

并且,这也是出于对cpu的一种保护机制,如果我们直接操作cpu里的数据,一会就给cpu干烧了

比如我们的数组越界,或者是野指针等问题,都是因为操作系统只允许我们操作安全范围内的内存。我们访问内存,实际上是操作系统在帮我们找内存,而非直接访问到cpu内的真实内存。当操作系统发现这个内存在安全范围内,我们便把数据首先交给操作系统,然后操作系统再把数据交给cpu,从而保护cpu内的数据不是被乱修改的。 


软件层 

什么是操作系统 

操作系统是一款软件,要钱的。

我们为什么要选择Linux?因为Linux免费的。

但是,不同的操作系统,价格不同,其实现的基本准则是相同的。操作系统的任务和目标都只有一个:管理好所有的软硬件,只要能完成这个任务,无论这个操作系统是谁做的要多少钱,他都是一个好操作系统。

除了要钱以外,操作系统是一款专门负责管理的软件,他负责管理两件事:

  1. 与硬件交互,管理所有的软硬件资源
  2. 与用户交互,为用户的程序提供运行环境。

但是光凭这两句话,操作系统还是不知道要干什么。我们再把软硬件交互和用户交互细分,慢慢看看操作系统的管理原理:

硬件交互

键鼠硬盘

一个优秀的计算机,自然要有这几个熟知的硬件:

  • 键盘
  • 鼠标
  • 网卡
  • 硬盘
  • ...

但是,计算机怎么知道,这些硬件被安装在了哪里,又怎么知道,这些硬件分别是干什么的?
cpu是没有办法直接读取这些信息值的,这些硬件也没有办法把内存里的二进制数01翻译成给人能看的懂的东西。所以,这个时候就必须要有一个翻译官:操作系统。
操作系统负责切换机械语言和偏人类语言:

当你在键盘敲下d的时候,由操作系统把d翻译成机器二进制码01放在内存的某个安全的位置,然后告诉显示器,从内存的哪个位置(具体的指针地址)拿到这个d,用哪种方式哪种语言打印在显示器的哪个位置,这便是操作系统对底层的任务。

不过,总有些神经病,喜欢改键位。R是放大招,可他偏不,他就喜欢A放大招,R改成平A,享受那种边走边R的快感。这个时候,键位发生了变化,如果直接去操作系统里改文件,

比如把#define R 大招   改成   #define A 大招

首先要找到键位对应的代码文件,然后找到某个键位对应的那一行,最后看看改了这些之后会不会对其他的代码产生影响,那也太麻烦了。

就算改了,对操作系统的负担也是相当大:

“原本我都写死了,现在你说要可修改,那我又要新加一堆功能,新写一堆接口,这个钱谁给我补呢?”

所以,为了避免这些麻烦,操作系统和硬件之间还有一层软件:驱动

驱动

驱动是介于操作系统和硬件之间的一个软件。有了驱动,操作系统就不再直接去硬件上读然后翻译了,他直接读取驱动已经翻译好了的东西,然后直接拿给内存。

比如还是放大招的问题。

按照原先的逻辑,操作系统首先看输入的是什么,是R,然后看R对应的是什么,是大招于是就知道,我要放大招了。这用了两步翻译。

而有了驱动,驱动直接告诉操作系统,现在有一个大招的输入,操作系统就不再去看用户输入了哪个键,而是直接拿驱动告诉他的大招信息,然后知道,我要放大招了。只用了一步翻译。

但是,驱动什么时候向操作系统发出大招信息呢?这个就是驱动的实现,和操作系统没有关系了,操作系统只负责写出函数声明,然后让每家硬件公司在生产硬件的时候,必须配套一个驱动,驱动里要补充完整这些函数接口,让操作系统直接调用。至此,操作系统只负责接受各种已被驱动处理过的信息,而这些信息怎么来,怎么和用户进行交互,那就变成了驱动的事情。

但是,有人就要问了:

话是这个话,但是,驱动不是我操作系统写的,我只负责写好我的逻辑,当你一个公司产生一个产品的时候,你就把对应的驱动给写好给我,我直接用你的驱动,这样我的锅就变成了你的锅,岂不是完美? 

用户交互

我们最直观的用户交互,便是我给钱,你给我发个安装包
太有交互了,我的Windows!

除此之外,我们按下CTRL+ALT+.,会蹦出来个任务管理器,这便是我们第二直观可以看到操作系统的交互:告诉我们每个进程的详细信息,杀掉一个进程,或是创造一个进程。

可是,我们有没有想过,为什么我们可以杀掉这些进程?为什么我们可以创建这些进程? 

我们告诉操作系统这些任务,然后操作系统权量这些任务是否合理,合理的操作系统就帮我们完成,不合理的操作系统就会给我们警告,并不会实施这些操作。我们可能很疑惑,难道还有什么任务,是对操作系统不合理的吗? 

 要不你去直接修改cpu的数据试试?
 要不你去直接修改操作系统的数据试试?

操作系统,同样对着底层和自身有着保护机制。我们能用操作系统去完成一些操作,完全是因为,操作系统给了我们一些操作指令,告诉我们那些是可以帮我们做的,这些指令叫做系统调用。比如printf,比如scanf,便是被封装起来的系统调用,我们可以用这些指令去访问底层,但是却无法直接访问底层的数据,因为他们都是被操作系统保护起来的。 

所以,整个计算机的管理结构,可以用一张图来概括起来:


怎么管理?

对操作系统来说,所有的管理只遵从一句话: 

先描述,再组织。 

先描述,再组织。 

先描述,再组织。 

啥意思?

湖人球队

就比如你想管理湖人球队,此时来了一位年轻的球员,叫做科比,你对他并不熟悉,第一步应该干什么?把他的特点描述出来: 

然后第二步,根据你的描述,把被描述的对象组织起来

 而对所有球员,我们都这样安排,最后用一个册子把他们包含在内:

我们就完成了对一个球队的管理,需要的时候,我们从名单中一个个分析,一个个拿取,而球队中坠机了某位之后,我们只要把球员的信息表从册子里抽出来就可以了。

操作链表 

而操作系统对任何东西的管理,也是通过此完成的。我们接下来要讲进程,就以进程举例,我们首先去描述一个进程,而在C语言中,描述一个进程最好的方法自然是结构体: 

struct task//进程
{
	char* name;//进程名
	int pid;//进程id
	...
}

 而组织,便是把所有的进程串起来。完成这一操作,最简单的方法,自然也是链表

struct task_listnode//进程链表
{
	task* task;//指向的进程
	task_listnode* next_task;//下一个进程
}

对一个进程的增删查改,就变成了对链表结点的增删查改,进程相当于球队的球员,而链表就相当于球队的名单,我们利用先描述再组织这一准则,完美把所有进程管理了起来。

当一个进程被创建的时候,我们把他放在链表的尾部;当一个进程退出的时候,我们直接用O(1)的时间把他删除掉。而在链表中的所有进程,便是正在运行的进程,我们想查看和管理进程的时候,直接遍历链表就可以找到这个进程。

而对文件,对内存,也都是先用结构体描述起每一个对象的特征,然后用链表把所有对象串起来,整个计算机也就通过这种巧妙的方法,完美地用几张链表管理了起来。 


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

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

相关文章

Mac下载docker

先安装homebrew Mac下载Homebrew-CSDN博客 然后输入以下命令安装docker brew install --cask --appdir/Applications docker 期间需要输入密码。输入完等待即可

【Flask-app.py运行】已解决Cannot run program “D:\APP\python\python.exe”

文章目录 一、问题描述二、解决方法 一、问题描述 Cannot run program “D:\APP\python\python.exe” (in directory “F:\Codes\竞赛\大计赛\group\code\web\web”): CreateProcess error2, 系统找不到指定的文件。 这段报错源于运行 flask 项目的 app.py 时报错找不到程序&…

学习Java,stringbuilder用法

有sb.append添加元素,sb.reverse反转内容,sb.tostring转换成字符串,sb.length计算长度。

利用WK2168实现串口服务器

ESP32 SPI与WK2168实现串口服务器 概述系统组成代码 概述 一些老设备通过RS485采集数据,如果在一个系统中采用几个RS485设备可能是一个不错的选择,但要是使用46个RS485数据采集设备为一个PLC提供外部数据,系统的性能就很难有保障了。通过一个…

利用二维数组的输出下列图形

利用二维数组的输出下列图形 #include <stdio.h> int main () {int i,j;char a[5][9]{{*,*,*,*,*},{ ,*,*,*,*,*},{ , ,*,*,*,*,*},{ , , ,*,*,*,*,*},{ , , , ,*,*,*,*,*}};for(j0;j<9;j) {for(i0;i<5;i) {printf("%c ",a[i][j]);} printf("\n&qu…

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引&#xff1a; sudo apt-get update 2 安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库&#xff1a; sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥&#xff1a; curl -fs…

“好喜欢”等复审被驳回,日常用语不具备商标识别作用!

在平常的商标申请注册中&#xff0c;普推知产老杨发现许多主体喜欢用日常用语申请注册注册商标&#xff0c;但是这些名称不具备商标的识别作用&#xff0c;缺乏商标所具体显著特征&#xff0c;大概率会被驳回&#xff0c;而且复审也会被驳回。 常看到一些广告宣传语&#xff0c…

K8s Ingress 详解

文章目录 K8s Ingress 详解Ingress 资源清单Ingress 基于URL 实现路由Ingress 基于名称虚拟主机Ingress 实现HTTPS创建TLS 证书创建Secrets配置ingress Ingress RewriteIngress 灰度发布Ingress 配置认证 K8s Ingress 详解 Ingress 资源清单 apiVersion: networking.k8s.io/v…

体验Photoshop:无需下载,直接在浏览器编辑图片

搜索Photoshop时&#xff0c;映入眼帘的是PS软件下载&#xff0c;自学PS软件需要多长时间&#xff0c;学PS软件有必要报班吗...PS软件的设计功能很多&#xff0c;除了常见的图像处理功能外&#xff0c;还涉及图形、文本、视频、出版等。不管你是平面设计师&#xff0c;UI/UX设计…

mac多媒体影音库:Emby for Mac 中文版

Emby软件是一款功能强大的媒体服务器软件&#xff0c;旨在为用户提供丰富的多媒体体验。以下是关于Emby软件的详细介绍&#xff1a; 下载地址&#xff1a;https://www.macz.com/mac/7964.html?idOTI2NjQ5Jl8mMjcuMTg2LjE1LjE4Mg%3D%3D 主要功能 媒体管理&#xff1a;Emby允许用…

VMWare下安装Linux虚拟机(图文)

大家好&#xff0c;在当今科技发展迅速的时代&#xff0c;虚拟化技术在企业和个人用户中变得越来越普遍。VMware作为一款领先的虚拟化软件&#xff0c;为用户提供了在单一物理计算机上运行多个操作系统的能力&#xff0c;为开发、测试和运维等任务提供了便利。在这篇文章中&…

OpenCV学习 基础图像操作 (十五):频域变换及相关操作

基础原理 图像的频域处理提供了一种强大的工具&#xff0c;用于分析和处理图像的频率成分。傅里叶变换、小波变换和Gabor变换等技术各有优劣&#xff0c;适用于不同的应用场景。通过选择合适的频域算法&#xff0c;可以实现图像的压缩、去噪、特征提取和增强等多种应用。本篇主…

每日一题《leetcode--LCR 021.删除链表的倒数第N个结点》

https://leetcode.cn/problems/SLwz0R/ 这道题我们可以设一个哨兵位&#xff0c;然后把要遍历链表的结点指向该哨兵位。最后用for循环将指针指向要删除结点的前一个。 struct ListNode* removeNthFromEnd(struct ListNode* head, int n){struct ListNode* dummy malloc(sizeof…

计算机组成原理-----实验1

实 验 报 告 实验一 基本运算器实验 1、实验目的 &#xff08;一&#xff09;了解运算器的组成结构&#xff1b; &#xff08;二&#xff09; 掌握运算器的工作原理&#xff1b; &#xff08;三&#xff09;熟悉运算器的数据传送通路&#xff1b; &#xff08;四&#xff09;按…

【React篇】简述React-Router 的实现原理及工作方式

React Router 路由的基础实现原理分为两种&#xff0c;如果是切换 Hash 的方式&#xff0c;那么依靠浏览器 Hash 变化即可&#xff1b;如果是切换网址中的 Path&#xff0c;就要用到 HTML5 History API 中的 pushState、replaceState 等。在使用这个方式时&#xff0c;还需要在…

腾讯元宝APP横空出世,传统搜索面临巨大挑战

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 松松有个同事也叫&#xff1a;X元宝。我们公司旁边有个小吃街&#xff0c;就叫元宝街。每提到腾讯元宝&#xff0c;我就想起了我同事和这条街。 我今天看了腾讯混元大模型团队的发布会&#xff0c;他们发布了一款名…

学习Java的日子 Day51 数据库,DDL

Day51 MySQL 1.数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据 MySQL就是数据库管理系统&#…

GNU Radio实现OFDM Radar

文章目录 前言一、GNU Radio Radar Toolbox编译及安装二、ofdm radar 原理讲解三、GNU Radio 实现 OFDM Radar1、官方提供的 grc①、grc 图②、运行结果 2、修改后的便于后续可实现探测和通信的 grc①、grc 图②、运行结果 四、资源自取 前言 本文使用 GNU Radio 搭建 OFDM Ra…

Windows环境安装redis

1、下载redis https://github.com/tporadowski/redis/releases 2、解压 .zip 3、更改文件名 更改文件名称为&#xff1a;redis 4、将本地解压后的redis&#xff0c;作为本地服务器下的应用服务 从redis文件路径下&#xff0c;执行cmd .\redis-server --service-install re…

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…