news 2026/8/14 5:22:23

Linux-进程1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux-进程1

目录

1.冯-诺依曼体系结构

2.操作系统(Operator System)

2.1概念

2.2设计操作系统的目的

2.3如何理解“管理”

2.4系统调用和函数概念


1.冯-诺依曼体系结构

相信以下的图在计算机相关的科目里都见到过:

我们常⻅的计算机,如笔记本。我们不常⻅的计算机,如服务器,⼤部分都遵守冯诺依曼体系。
整个计算机是以冯-诺依曼体系结构组织在一起的!

硬件不可能随意摆放就能运行,需要有东西来把硬件组织起来,才能形成对应的一套系统。整个硬件也是需要东西来组织,所以冯-诺依曼体系就是把所有硬件组织在一起的!

冯-诺依曼把硬件分为四个部分:输入设备,输出设备,存储器,中央处理器。

因为中央处理器被分为运算器和控制器,也可以称为五大单元。

存储器是什么?

存储器指的是内存,对于:磁盘,ssd这些叫外存(输入输出设备的范畴)。

中央处理器:CPU,运算器(算数运算、逻辑运算)。

控制器:协调设备,主要用来执行代码,进行逻辑控制的。

输入设备:类似的有:键盘、话筒、摄像头、磁盘、网卡……

输出设备:类似的有:显示器、喇叭、磁盘、网卡、打印机……

C/C++代码想要形成可执行程序,为啥必须得先加载到内存?

结论:输入输出设备(外设)效率 << 内存效率 << CPU效率(<<为远小于)

此外,离CPU越近,效率越高,离CPU越远,效率越低。

此外,有这样一个金字塔结构,越靠近金字塔最上面越贵,但是它也越靠近CPU,效率也越高(如:寄存器);而底层则成本更低,容量更大,但是离CPU更远,效率更低(如:磁盘)。

因为输入设备和CPU运算速度差别太大了,所以,不允许CPU直接访问外设,而是把输入设备先导入到内存里,然后由CPU把数据从内存读取出来,出来完后再由内存写回来,把数据从存储器导给外设当中

结论1:CPU在数据层面,不和外设打交道,只会和内存打交道。同理,外设不和CPU直接打交道,只和内存直接打交道

这就好比一个木桶,它能装多少水取决于它的最短木板,而不取决于它最长的木板一样:

木桶理论指出:效率只由外设决定(因为外设效率最低),而只有先把数据从外设加载到内存,CPU才能运行,而如果没有内存,那么计算机效率就以外设效率为主,我们把程序加载到内存的操作称为预先加载,而这些东西都是由冯-诺依曼体系结构决定的

结论2:内存的本质,是外设和CPU的缓存 ---- 计算机的效率,以内存速度为主!只有先把数据从外设加载到内存,CPU才能运行

结论3:引入内存,使用冯-诺依曼架构,可以让用户以不怎么高的成本,获得一台效率不错的计算机,也就是说:内存让计算机更有“性价比”

因为几乎人人都能买得起计算机,所以我们进入了互联网时代!

结论4:我们把从输入设备的数据搬到内存中这个步骤称为input,而把数据搬到外设这个过程称为output,因此,我们通常把外设称为IO设备(外设包含输入设备输出设备,输入为input,输出为output),IO:外设和内存进行数据交换,在C语言中,进行数据交换的是scanf和printf,在C++中,进行数据交换的是std::cin和std::cout,因此我们把scanf和printf称为IO函数,而在stdio.h文件和iostream文件中的很多函数也是IO函数

结论5:数据流动的本质:其实就是拷贝 -> 而计算机整体效率,本质就是在设备间拷贝的效率

结论6:打开文件时在干什么?

把外设数据预加载到内存里,往文件写入内容不是写到外设里,而是写到内存里,再用内存刷新出去。比如之前我们做的进度条程序,就是:显示器文件 -> 进度条 -> 缓存

结论7:如何从网络中获取数据?

我们接受其他设备发出的信息或发出信息到其他设备需要网卡。

比如:我在QQ与别人聊天,那么此时对方发过来一条信息,先是网卡先收到信息,然后网卡把数据搬到内存里,然后才能被CPU处理,也就是说:发信息本质就是数据流动如果想要更具体一些,两个人互发信息就是:用两个冯-诺依曼在通信。

只有一个设备能进行网络通信,就是网卡,而接受信息到我们看得到是这样的顺序:网卡(加密信息) ————>(通过内存)CPU ————>(解密)内存 ————> 显示器

结论8:如何理解两个人之间互传文件呢?数据流动怎么走?

实际上,文件也是数据,只不过输入设备是磁盘,输出设备变成了磁盘,本质:基于冯-诺依曼结构,在进行两者磁盘文件数据拷贝。

发送消息本质:基于冯-诺依曼结构,从自己键盘文件拷贝数据到对方显示器文件

对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释,从你登录
上qq开始和某位朋友聊天开始,数据的流动过程。从你打开窗⼝,开始给他发消息,到他的
到消息之后的数据流动过程。

2.操作系统(Operator System)

2.1概念

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包含两个部分:

①内核:进行进程管理、内存管理、文件管理、驱动管理;

②其他程序:如函数库、shell程序等等。

操作系统的定义:一款软件 ->一款进行软硬件资源管理的软件

我们之后说的操作系统都是狭义上的操作系统。

因为操作系统的英文名称为Operator System,我们也把操作系统称为OS。

如果有一种特性所有语言都有说明它是计算机世界的特性。

任何计算机问题,都可以通过添加一层软件层来解决 ————>本质:软硬件体系结构是层次的

每一种硬件都有对应驱动程序来驱动软件,而软件会和操作系统结合,操作系统就会,操作系统就会以驱动程序为触角,去访问控制硬件。

2.2设计操作系统的目的

设计操作系统的目的也可以称为设计操作系统的必要性。

操作系统:对下,管理好软硬件资源(手段);对上,给用户提供一个良好(稳定、安全、高效)的运行环境(目的)。

我们使用计算机,大部分情况下是通过软件来访问计算机的硬件资源,但是硬件资源是有限的,用户需求是无限的,这也就要求计算机必须把硬件资源管理好!也就是说:软硬件系统是层状的

在整个计算机软硬件架构中,操作系统的定位是:一款纯正的“搞管理”的软件。

2.3如何理解“管理”

我们可以举个例子:大学校园常见有三种角色:校长、辅导员、自己。

学校本质是一套系统,学校的老师要合理分配学校资源,在学校系统中,因为有管理存在,所以存在管理者和被管理者,在计算机中,管理者即操作系统,被管理者就是自己。那学校的管理者是谁?

我们需要解答这个问题,需要先解答什么叫做管理者?

真正的管理者是做决策的,做执行的人不能称为管理者。在大学,看似是辅导员来管理你,但是辅导员只能算:决策的执行者。真正的学校体系管理者是校长

那平时我们见不到校长的面,他是怎么管理我们的呢?

结论1:管理者要管理被管理者,见面,不是必要条件。而且,就算没有见面,事实是:管理者会把被管理者安排的明明白白的,怎么做到的

比如:在工作中,老板可以通过你的bug和完成代码行数就知道你的能力和你的信息了,因此,见面不是本质,本质是获取你身上的有效信息,是管理的必备要素

结论2:管理本质是对被管理对象的相关有效数据的管理。即:管理本质:对数据进行管理!

那么管理者是怎么直到我的相关数据呢?

结论3:辅导员协助校长获取我的有效信息。

校长管理5个人很简单,但管理50000个人则比较难,管理5个人,校长先建了一个Excel表格,可以通过辅导员在这个表格里更改的学生信息来看出来哪些人数据变化,这就大大提高了效率;但是对于管理50000个人,用这种方式效率太低了。

所以,在校长管理5个人时,校长时程序员,而校长想对50000个学生管理工作,就需要用到计算机管理了。于是校长写了C语言程序,Excel里面的这些信息时学生的属性,虽然每个学生属性对应的东西不一样,但都具有对应属性,也就是说:要管理学生,需要先把他们描述起来

那么我们该如何描述呢?比如,我们创建一个结构体,来描述一名学生的属性:

#include<iostream> #include<string> using namespace std; struct student { private: int age; string name; string xuehao; };

也就是说,我们把学生的每个属性对应了每一个变量,如:年龄对应age,名字对应name,学号对应xuehao等等,而我们有50000个学生,就可以用50000个结构体描述他们。

但是这样也太麻烦了,我们需要把这些学生进行方便化的管理,因此需要用链表把他们串联起来,因此,我们可以定义一个指向下一个结构体的指针:student* next;并把结构体的数据全部置为public方便main访问,然后写出如下代码:

#include<iostream> #include<string> using namespace std; struct student { public: int age; string name; string xuehao; student* next;//指向下一个学生的指针 }; int main() { const int TOTAL = 50000; // 学生总数 student* listhead = nullptr; // 链表头 student* tail = nullptr; // 链表尾(方便追加) for (int i = 1; i <= TOTAL; ++i) { // 1. 创建新学生节点 student* p = new student; // 2. 填充数据(模拟生成) p->age = 18 + (i % 10); p->name = "Student_" + to_string(i); p->xuehao = "2024" + to_string(10000 + i); p->next = nullptr; // 新节点的 next 先指向空 // 3. 挂接到链表尾部 if (listhead == nullptr) { // 第一个节点 listhead = p; tail = p; } else { // 让当前尾节点的 next 指向新节点 tail->next = p; // 更新尾指针 tail = p; } } // 验证 int count = 0; student* cur = head; while (cur != nullptr) { count++; cur = cur->next; } cout << "成功创建并串联了 " << count << " 个学生节点!" << endl; // 释放内存(避免内存泄漏) cur = head; while (cur != nullptr) { student* temp = cur; cur = cur->next; delete temp; } return 0; }

如果有人退学了,我们直接删除这个结点,并让前面的那个人的next指向这个退学的人的next。

也就是说:校长管理所有人转化成了对链表的管理,而如果学生信息发生变化或者少了个学生或多了个学生这些就变成了对链表的增删查改!

此时校长就完成了对学生管理工作的建模过程。

管理本质:就是对数据进行管理,做法是:先描述(成结构体),再组织(成链表),世界管理的本质也是这样!

C++等语言为啥要提供类?

C++等都要提供容器技术,比如:stl,而我们之前做C语言课设可能做过通讯录,而通讯录相当于对数组进行管理。

学习数据结构,本质上就是衡量再组织的问题,把数据组织起来,也就是如何组织数据的问题

回到最开始的问题,学校的管理者是校长,被管理者是自己,而校长对应的是操作系统,被管理者(自己)对应的是硬件,辅导员对应的是驱动程序

同理,操作系统要管理所有硬件,它要:先描述,再组织。未来操作系统(校长)要管理所有硬件(学生),它首先要通过驱动程序(辅导员)把底层所有数据获取上来,填充到每个结点里,所以在操作系统内核里管理所有硬件转化成了对象的增删查改,如先描述成为结构体:

#include<iostream> #include<string> using namespace std; struct hard_device { public: int type; int status; int cap; hard_device* next; };

然后再进行组织成链表即可!

我们能预测一下,操作系统内一定存在大量的数据结构,而且还会给每一种结构匹配对应的算法!

也就是说:操作系统的核心本质是数据结构。操作系统是用C语言写的(99%C语言,1%汇编)。

而描述事物只能用结构体,操作系统内部一定存在大量的数据结构,所以,如果要学好操作系统,必须要能了解操作系统内的各种数据结构!之后需要看操作系统内核的代码,而学好操作系统只要记住这六个字:先描述,再组织

将来写C/C++代码永远先写类,再选择合适的容器

2.4系统调用和函数概念

现实世界很多东西都是层状的,如:银行基于各种设施形成银行系统,所以银行系统可以基于它提供服务,而现实生活中不会允许外部人员随意访问银行系统,也就是说不允许外部人员直接访问系统内部的相关数据,但不能把银行关了。

所以银行系统提供了一个一个的小窗口(银行窗口或柜台),若要访问,则需要通过小窗口,通过里面工作人员来访问系统,对外:统一通过窗口来给外部人员访问。

操作系统也是一样,为我们上层用户提供窗口,此时就叫:系统调用(也属于操作系统的范畴),系统调用即操作系统提供的函数。也就是说:系统调用的本质:保证操作系统被安全访问而我们每个人想要和操作系统交互,只能通过系统调用

假设你在A学校,成绩比较好,但B学校想让你代表B学校参加比赛,但是B学校不能直接找你,而要先找A学校校长,再通过校长来找到你。也就是说:用户要访问硬件,必须要从操作系统访问,但是只能通过系统调用才能访问。(printf必须先要通过操作系统才行)

假设有个老大爷如果和银行人员打交道比较麻烦,不能表达自己的意思,也就是说使用银行人员来访问系统这个渠道是有成本的,老大爷不会写字。所以往往有一种人在银行外面,叫大堂经理,相当于在银行系统之上添加一个工作层大堂经理:减少使用窗口的成本。

操作系统的系统调用使用成本偏高,因为它要先了解操作系统的一些原理,但我们不一定懂这个,所以在系统调用之上封装了一层软件层,在C/C++视角,这叫C/C++标准库。如果程序员不善于使用操作系统,就可以使用库当中的方法(对系统调用进行封装)

因此,因为有C/C++标准库,一个程序员想要操作计算机,就只需要学会一门语言即可!

在应用层当中看到的大部分是库,即库和系统调用是上下层关系

如何辨别你调用的函数有无系统调用?

实际上,大部分函数都有系统调用,算法大部分不会有系统调用,只要你对应的库函数访问了硬件,一定调用了系统调用!

使用计算机的人本质是有开发者,纯正的使用者或小白(真正的用户)啊!所以开发了一个上层应用(提供图形化界面)如:安卓系统。

把软硬件资源管理好,不是目的,而是手段,经常说安卓是基于Linux内核的,是因为从系统调用层到硬件层(安卓的开发库)是不能变的!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/14 5:21:59

10分钟搞定ESP32!从编译、烧写到运行全流程详解

10分钟搞定ESP32&#xff01;从编译、烧写到运行全流程详解_esp32编译-CSDN博客 相关文章 1、ESP32开发环境搭建与编译优化全指南----https://bbs.csdn.net/weixin_29175469/article/details/100207540 2、ESP32开发__搭建VSCode开发环境试编译项目----https://download.csdn…

作者头像 李华
网站建设 2026/8/14 5:21:37

广东网站建设公司xywdl如何打造高转化率企业官网全解析与避坑指南

在这个数字化浪潮席卷全球的时代,企业想要在线上市场分得一杯羹,一张漂亮且功能强大的网站几乎是必不可少的敲门砖。尤其是对于地处中国改革开放前沿的广东企业来说,无论是传统制造转型,还是跨境电商出海,亦或是互联网创新 startup,一个优秀的官网都是品牌数字形象的基石…

作者头像 李华
网站建设 2026/8/14 5:21:27

大兴网站开发网站建设报价背后的真相与选择指南

做企业的人都明白,现在这年头,酒香也怕巷子深。以前咱们做大生意,靠的是铺面位置好、熟人介绍多,哪怕网站挂个空白网页,只要电话打得勤,客户照样找上门。但现在不一样了,互联网把世界缩得像个村子,客户坐在家里动动手指,就能对比几十家同行。这时候,如果你的企业连个…

作者头像 李华
网站建设 2026/8/14 5:21:06

建站团队揭秘:专业网站建设所需人员配置及核心职责详解

很多老板或者创业小白在刚开始打算做网站的时候,脑子里首先蹦出来的念头通常是:“做个网站需要多少钱?”或者“找个外包公司多少钱能搞定?”他们往往忽略了最关键的一个问题:这个网站背后到底需要什么样的人来支撑?如果你只把目光盯在价格上,最后收到的往往是一个充满bu…

作者头像 李华
网站建设 2026/8/14 5:20:40

群晖与CentOS双实例部署网心云Docker:网络与存储隔离实战

1. 项目概述与核心价值最近在折腾家庭网络和闲置硬件资源变现的朋友&#xff0c;估计对“网心云”这个名字不陌生。简单来说&#xff0c;它就是一个利用你闲置的带宽和存储空间&#xff0c;通过贡献计算和网络资源来获取收益的平台。而“一台机器挂两台网心云docker”&#xff…

作者头像 李华
网站建设 2026/8/14 5:20:11

Rsyslog配置深度解析:从核心概念到高可用日志处理架构实战

1. 项目概述&#xff1a;为什么你需要吃透rsyslog配置&#xff1f;如果你负责过线上服务器的运维&#xff0c;或者开发过需要处理海量日志的应用&#xff0c;那你大概率跟rsyslog打过交道。它几乎是Linux世界日志收集的“事实标准”&#xff0c;从系统内核消息到Nginx访问日志&…

作者头像 李华