Linux操作系统从入门到实战(十六)冯诺依曼体系结构,操作系统与系统调用和库函数概念
- 前言
- 一、冯诺依曼体系结构
- 1. 冯诺依曼体系是什么?
- 2. 核心部件有哪些?
- 3. 数据是怎么跑的?
- 4. 发文件的流程也一样
- 5. 为什么程序(比如C/C++写的软件)必须先加载到内存才能运行?
- 二、操作系统
- 1. 什么是操作系统?
- 2. 为什么要设计操作系统?
- 3. 操作系统的核心功能:
- 4. 怎么理解“管理”?
- 三、系统调用和库函数概念
- 1. 先回忆个前提
- 2. 什么是系统调用?
- 3. 系统调用的特点
- 4. 库函数又是什么?
- 5. 系统调用和库函数的关系
前言
在前文中,我们围绕 Linux 环境,系统讲解了 Git 版本控制系统的核心知识,也展开了 GDB/CGDB 调试器的全方位使用详解。
- 本篇博客将聚焦于冯·诺依曼体系结构与操作系统概念。
我的个人主页,欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
一、冯诺依曼体系结构
1. 冯诺依曼体系是什么?
简单说,现在我们用的笔记本、公司的服务器,几乎都在遵循一个“规矩”——冯诺依曼体系。这个规矩规定了:电脑要干活,得靠几个核心部件配合,而且它们的“沟通方式”是固定的。
2. 核心部件有哪些?
冯诺依曼体系主要有3类核心部件:
-
输入单元:负责把我们的操作“告诉”电脑。比如键盘(敲字)、鼠标(点图标)、扫描仪(扫文件),都是输入设备——你操作它们,数据就进电脑了。
-
中央处理器(CPU):电脑的“大脑”,负责真正干活。里面有两个关键角色:
- 运算器:算数学题、比较大小(比如1+1=2,判断“a和b谁大”);
- 控制器:指挥其他部件干活(比如“让键盘把输入的字送过来”“让显示器显示结果”)。
-
输出单元:负责把电脑的结果“告诉”我们。比如显示器(显示画面、文字)、打印机(打印文件),都是输出设备——电脑处理完,结果通过它们给我们看。
冯诺依曼体系里,有个绝对不能破的规矩,也是理解的核心:
- 所有部件(输入、输出、CPU)都不能直接“私聊”,必须通过一个“中间人”——内存(存储器)。
具体说:
- CPU(大脑),只认内存。它要读数据、写数据,只能找内存,绝对不直接碰键盘、鼠标、显示器这些外设(输入/输出设备)。
- 外设(键盘、显示器等)也一样,想给电脑传数据(比如你敲的字),或者想显示电脑的结果,只能先把数据放到内存里,或者从内存里拿数据,不能直接找CPU。
3. 数据是怎么跑的?
光说规矩太抽象,我们拿“用QQ和朋友聊天”来看看数据是怎么按这个规矩流动的——
-
你发消息时:
- 你在键盘上敲字(输入单元工作),敲的内容先传到内存;
- CPU从内存里拿你敲的字,处理一下,处理完再放回内存;
- 内存再把处理好的消息传给网络设备(也算外设),通过网络发给朋友。
-
朋友收到消息时:
- 朋友的电脑通过网络设备(外设)收到消息,先存到他电脑的内存;
- 他电脑的CPU从内存里拿消息,处理一下(比如“显示在聊天窗口”),再放回内存;
- 内存把消息传给显示器(输出单元),朋友就看到你的消息了。
4. 发文件的流程也一样
比如你给朋友发一个Word文档:
- 文档本来存在你的硬盘里(硬盘也是外设),发文件时,硬盘先把文档数据读到内存(给前台);
- CPU处理一下(比如“打包文件”“标记收件人”),再放回内存;
- 内存通过网络设备把文件发出去;
- 朋友收到后,文件数据先到他的内存,CPU处理后,再从内存写到他的硬盘(存起来),或者直接在显示器上打开。
5. 为什么程序(比如C/C++写的软件)必须先加载到内存才能运行?
- 因为CPU只认内存
程序平时是存在硬盘里的(硬盘是外设),就像文件存在抽屉里。
CPU要“执行”程序,必须让程序先到内存里——就像你要读抽屉里的文件,得先拿到桌面上(内存)才能看。这是冯诺依曼体系的硬性规定。
二、操作系统
1. 什么是操作系统?
你可以把操作系统(简称OS)理解成电脑/手机里的“大管家”。
- 任何电脑、手机、甚至智能手表,都得有这么个“管家”才能正常干活。
这个“管家”主要由两部分组成:
-
内核:相当于管家的“大脑”,管着最核心的事儿,比如:
- 进程管理:同时开着微信、浏览器、游戏,内核得协调它们谁先占用电脑的“算力”(CPU),别打架;
- 内存管理:电脑的“临时仓库”(内存)就那么大,内核得分配好空间,保证每个程序都有地方放数据,用完了还能及时收回来;
- 文件管理:我们存的照片、文档、视频,内核得给它们“编好号、分好类”,让我们想找的时候一点就能打开(比如Windows的文件夹、手机的文件管理);
- 驱动管理:电脑外接的打印机、鼠标,手机连的耳机、充电器,内核得懂它们的“语言”(通过驱动程序),不然设备插了也用不了。
-
其他程序:相当于管家的“助手”,帮着内核干活,比如:
- 函数库:一些现成的“工具包”,比如计算、画图的基础功能,手机APP或电脑软件可以直接拿来用,不用自己从零开发;
- Shell程序:我们和操作系统沟通的“翻译官”,比如Windows的命令提示符(输入
dir
看文件)、苹果的终端,你输入指令,它传给内核去执行。
2. 为什么要设计操作系统?
简单说,就是为了“上下讨好”:
- 对下(管硬件):电脑里的CPU、内存、硬盘、显卡,手机里的芯片、摄像头、电池,这些硬件本身“很笨”,不知道该干啥。操作系统就负责指挥它们:“CPU,你先处理一下微信消息;硬盘,把这张照片存到D盘去”,让所有硬件高效配合,不乱跑。
- 对上(服务软件和用户):我们用的微信、王者荣耀,或者电脑里的Excel,这些应用程序不想操心“怎么调用CPU”“怎么存文件”——操作系统就提供一个“舒适的环境”,应用程序只需要告诉操作系统“我要干啥”,剩下的交给操作系统处理就行。
3. 操作系统的核心功能:
- 操作系统它就干一件事:管理。
就像学校里的教务处,不管上课、不管改作业,但负责排课表、管教室、安排考试——让老师能好好教书,学生能好好上课。
操作系统也一样,管好硬件资源,让应用程序能顺利运行,用户能用得舒服。
4. 怎么理解“管理”?
- 被管理的对象:比如学校里的学生(对应电脑里的“资源”,像运行的程序、内存空间、文件等)。
- 怎么管理?
- 描述对象:先得知道每个学生的情况——比如记下来“张三,高一2班,成绩A”(对应操作系统里的“数据结构”,记录每个程序的状态、内存用了多少、文件存在哪);
- 组织对象:把学生分好类、排好序——比如按班级分组,按学号排队(对应操作系统里的“调度”,比如给程序排个运行顺序,给文件分个文件夹);
- 协调对象:辅导员(对应操作系统的具体模块,比如进程管理器)负责日常管理,校长(对应内核)统筹全局,确保整个学校(电脑)有序运行。
三、系统调用和库函数概念
1. 先回忆个前提
-
前面说过,操作系统(OS)是管理电脑所有硬件(CPU、内存、硬盘等)的“大管家”。
-
硬件这东西很“金贵”,不能随便让外面的程序(比如微信、浏览器)直接碰——万一程序乱操作,可能把硬盘里的文件删了,或者占满内存让电脑卡崩。
-
所以,所有想操作硬件的需求,都得经过操作系统同意,由操作系统来“代劳”。那程序怎么跟操作系统“沟通”呢?这就要用到“系统调用”了。
2. 什么是系统调用?
系统调用可以理解成:操作系统给上层程序(比如APP、软件)开的“官方接口”。
- 就像你想让物业帮你修水管,不能直接闯进物业办公室瞎指挥,得通过物业提供的“报修电话”(官方接口)才行。
- 程序想让操作系统帮忙做一些底层操作(比如读硬盘里的文件、申请内存空间、打印东西),也得通过这些“官方接口”——也就是系统调用。
举个例子:
当你用记事本写了一段话,点“保存”的时候,记事本程序不会自己直接去操作硬盘(它也没这权限),而是会通过一个系统调用,告诉操作系统:“请帮我把这些数据写到硬盘的XXX位置”。操作系统收到请求后,会自己去操作硬盘完成保存,然后告诉程序“搞定了”。
3. 系统调用的特点
- 系统调用是操作系统直接提供的,功能很基础、很底层,能完成所有核心操作(比如读写文件、管理进程)。
- 但它有个缺点:对使用者(程序员)要求比较高。
比如你想通过系统调用读一个文件,可能需要自己处理很多细节:先检查文件是否存在、申请内存缓冲区、处理读写错误(比如文件被删了)……步骤多,容易出错。
4. 库函数又是什么?
- 库函数可以理解成:程序员对系统调用做的“封装和优化”,目的是让开发者用起来更方便。
就像物业的“报修电话”虽然能解决问题,但步骤繁琐(要报地址、报问题、等确认),于是有人专门做了个“便民报修小程序”,把这些步骤简化成“选地址+选问题+提交”,你用起来就简单多了。这个“小程序”就相当于“库函数”。
举个例子:
C语言里有个库函数叫
fopen
(打开文件),它的底层其实就是调用了系统调用。但fopen
帮你处理了很多细节:比如自动检查文件是否存在、默认申请了内存缓冲区、出错了会返回统一的错误码……程序员用fopen
打开文件,比直接用系统调用简单10倍。
5. 系统调用和库函数的关系
简单说:很多库函数是基于系统调用实现的,是系统调用的“升级版”。
- 系统调用是“底层基础”,是操作系统直接提供的“官方接口”,功能全但繁琐;
- 库函数是“上层工具”,是对系统调用的封装,更易用、更适合日常开发。
承上启下:和进程管理的关系
- 前面说过,操作系统管理进程的逻辑是“先描述,再组织”(用结构体描述进程,用链表组织进程)。
-
- 那程序怎么创建一个新进程、结束一个进程呢?其实也是通过系统调用!比如操作系统会提供“创建进程”的系统调用,程序通过它告诉操作系统“帮我建个新进程”,操作系统就会用结构体描述这个新进程,再把它加到链表中管理。后面学进程的时候,我们会具体看到这些系统调用是怎么工作的
以上就是这篇博客的全部内容,下一篇我们将继续探索Linux的更多精彩内容
我的个人主页
欢迎来阅读我的其他文章
https://blog.csdn.net/2402_83322742?spm=1011.2415.3001.5343
我的Linux知识文章专栏
欢迎来阅读指出不足
https://blog.csdn.net/2402_83322742/category_12879535.html?spm=1001.2014.3001.5482
非常感谢您的阅读,喜欢的话记得三连哦 |