深度理解linux系统—— 了解操作系统
一、冯诺依曼体系结构
现在我们常见的计算机(笔记本电脑等)和不常见的计算机(服务器)它们都满足冯诺依曼体系。
我们可以把计算机理解成一个个硬件组成的
- 输入设备:键盘、鼠标、摄像头、网卡、磁盘等
- 输出设备:显示屏、打印机、网卡、磁盘等
- 中央处理器
CPU
: 运算器+控制器- 存储器:本质就是内存
理解输入输出
IO
:Input/Output
<->IO
,我们要站在内存的角度去理解,将数据输入到内存这是输入Input
;将数据从内存输出,这是输出Output
。
1. 理解软件(程序)运行为什么要加载到内存?
我们知道软件(程序)在运行之前,必须要先加载到内存,但是我们不知道这为什么?
了解了冯诺依曼体系结构,就知道了为什么,因为体系结构规定了。
程序在加载到内存之前,在哪?很显然在磁盘中(也就是外存)
通过观察冯诺依曼体现结构,我们能够发现,
CPU
只能在内存中读取和写入数据;那我们的程序要像在CPU
中运行,那就必须要先加载到内存中。
那程序要加载到内存中,这不就是将数据(我们写的代码也是数据)输入到内存(Input
)操作吗(简单来说,就是将数据拷贝到内存中)。
3. 内存
看到这里,我们可能有一个疑问:为什么要有内存呢?
CPU
直接从输入设备
中读取数据,然后将数据输出到输出设备
不也可以吗?
对于整个问题,我们要考虑一个问题,我们CPU
处理数据是速度是很快的,如果我们CPU
直接和输入输出设备进行数据交互,那我们整体效率就取决于输入输出设备的效率的;
所以要存在内存,我们CPU
从内存中读取数据,这样可以平衡我们输入输出设备和CPU
之间的速度差距(在程序运行之前通过特定的算法将数据先加载到内存)。
那这里我们理解了,还有一个疑问,CPU
之和内存进行数据交互,那为什么不直接使用内存来存储数据呢?
简单来说,就是内存太贵了,如果全部使用内存来存储数据,那一台计算机的价格就非常高了。
2.理解数据流动
在冯诺依曼体系结构中,存在数据信号
和控制信号
;这里我们抛开控制信号不谈,现在来了解一下数据,以及数据流动。
现在我们想象一个场景,
你
和你的女朋友
在微信上聊天,你发送的信息是如何显示到你女朋友是显示器上的呢?
简单来说,这简单啊:我通过键盘将信息输入到微信中,然后微信通过网络将信息发送到我女朋友的微信中,然后显示到她的显示器上。
但是微信又是如何将数据发送的呢?
这里我们站在硬件的角度,从冯诺依曼体系结构来理解这个数据是如何传输的。
首先,我们将
你
和你女朋友
使用的两台计算机设备想象成两个冯诺依曼体系;我们要像使用微信发送信息,那就一定要让微信运行起来(就是将微信程序加载到内存,在
CPU
中执行);
对于你的这个冯诺依曼体系来说:
输入设备:就是键盘,你通过键盘输入信息。
信息从输入设备加载到内存,然后通过微信这一个程序对数据进行一系列操作(加密等操作),然后数据由内存到输出设备。(此时你的输出设备就是网卡)
然后数据通过网络(一系列操作),将数据传输到你女朋友的计算机(冯诺依曼体系结构中);
对于女朋友的计算机冯诺依曼体现结构来说:
此时输入设备就是网卡;
数据从网卡(输入设备),然后加载到内存中,再通过微信这一个程序,对数据进行一系列操作(解密),然后数据从内存中到输出设备中。
此时输出设备就是显示器。
这样你发送的信息就显示到了你女朋友的显示器上。
看到这里,应该多多少少有一点理解数据流动了。
这里我们发送信息之后,我们的显示器中也可以看到发送的信息,那就是我们的输出设备还用显示器
这里如果我们发送的是一个文件呢?
此时你的输入设备就是磁盘(我们将文件拖拽到微信聊天框中这一操作,本质上就是从从磁盘中读入数据)
而此时你女朋友的输出设备就是磁盘(接收文件就是将文件保存到磁盘中)
二、操作系统
就目前来说,我们并不知道操作系统是什么,是干什么;
简答来说,操作系统是一个基本的程序集合;
操作系统是一款进行软硬件管理的软件。
从广义上来说,操作系统包括:内核(进程管理、文件管理、内存管理和驱动管理);其它程序(函数库、shell程序等)
但是狭义上我们也可以认为操作系统内核就是操作系统;
理解了操作系统是什么,我们现在来看操作系统是干什么的:
这里先说结论:
- 为用户程序(应用程序)提供一个良好的运行环境。
- 与硬件交互,管理所有的硬件资源。
试想一下,如果没有操作系统,就一堆硬件摆在我们面前,我们能不能使用?显然是不能的
软硬件体系结构
看上图,这是计算机软硬件体系结构;我们可以看到它分为三个部分用户部分
、系统软件部分
和硬件部分
。
之前我们使用计算机,都是通过操作系统,来进行我们的一系列操作;就比如
linux
中的基本命令,这是shell
外壳为我们包装好的指令,方便我们使用。
通过观察上图,我们可以发现系统调用接口
、驱动程序
这些我们之前听都没听过;
系统调用
通过这个名字,就感觉好高级,我们是不是不能随意的使用系统调用,准确来说是的;
系统调用其实就是函数,只不过是操作系统提供的函数。
我们如果访问操作系统,就必须通过系统调用
这个理解起来应该很简单,操作系统不想我们之间去访问它,所以提供了系统调用;我们可以通过系统调用来访问操作系统。
一个程序,如果访问了硬件,那么它一定贯穿整个体系结构
什么意思呢,就比如我们通过指令向文件中写入数据,指令是
shell
外壳提供的,它对系统调用进行封装形成指令供我们使用,而操作系统呢,通过驱动程序,来访问硬件资源进行操作。
库里面就可能进行了系统调用的封装
我们
C
语言中的printf
和scanf
,printf
是将数据输出到显示器,scanf
是从键盘中读取程序,它们底层就是对系统调用进行了封装。
理解操作系统
这里简单来说,在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的
搞管理
的软件
理解管理
操作系统在管理软硬件资源的软件,那如何去理解这个管理
呢?
在我们日常生活中也存在很多管理的实例,那这个管理和操作系统管理软硬件一样吗?
博主是一名大学生,在大学中,我们简化成学生
、老师
和校长
;
那在这个管理实例中,是谁在管理谁呢?
一个事情,可以分为决策和执行;
在上面例子中,我们学生肯定就是被管理者,而老师是执行者,校长则是决策者。
- 管理者和被管理者不需要见面(简单来说就是,我们学生不需要见到校长,也能被管理起来)
- 如何管理?这很简单,通过信息(数据)管理
- 如何得到数据?(通过中间层获取,每个学校都有学生管理系统,我们在这个系统中可以查到我们的所有信息)
我们学校刚成立不久,学生很少,校长管理起来非常容易,搞一个execl
表格,这个表格中存储着我们所有学生的信息;
这样校长管理我们学生,就直接对这些数据进行管理:简单来说就是对这些数据增删查改。
但是随着学校发展,学生越来越多,这个表格中数据太多了,校长管理不过来了;
如果让我们去解决,把我们是不是就要搞一个数据结构(链表/顺序表),将这些信息存储到计算机里面(学生的信息无非就是姓名、学号、性别、年龄等等)我们搞一个结构体来存储这些信息;那这样我们就可以使用数据结构将这些学生的信息存储起来;
那我们就可以将这些信息存储到计算机中,然后对这些数据结构进行增删查改操作,不就将学生管理起来了吗。
那对于学生的管理工作,不就转化成对链表的增删查改操作了吗(这里过程也称为建模)
建模的过程其实就是先描述、再组织
;
我们将学生信息使用一个struct
结构体存储起来,这不就是对学生信息的描述吗;
我们将数据存储到数据结构中,这不就是将数据组织起来吗。
先描述、在组织
说了这么多,我们这里只需要知道先描述、在组织就OK了。
那我们生活中的实例和操作系统管理硬件一样吗?
可以说是一样的
我们操作系统管理硬件资源,是不是也是对硬件资源信息的管理,只需要知道硬件的信息,就可以对硬件进行管理。
理解系统调用
操作系统要对上提供对应的服务,但是呢,操作系统有不信任任何人;(这句话听起来很别扭,操作系统要给我们提供对应的服务,又不信任我;这就跟我们生活中的银行一样,它要给我们提供相应的服务(存钱、取钱、转账等),但同时它又不信任我们,只是通过柜台窗口,让我们进行存钱、取钱等。)
那操作系统如何提供对应的服务呢? 就是系统调用
系统调用其实就是函数,函数要有参数和返回值吧,用户就可以通过这些参数和返回值来实现用户和操作系统之间的数据交互。
**但是这里有疑问:**我们不了解系统调用, 不会使用系统调用啊?
这就像一个不认识字的人去银行,银行通过了窗口来办理业务,但是这个人不会,不知道要做什么,这时,我们银行内的工作人员就会帮助这个人去办理业务;
这就祥我们一样,我们不了解系统调用,我们该如何去使用呢?
这是就有库
、shell
、指令
等,它们通过对系统调用的封装,让我们不知道系统调用的情况下,也可以使用计算机,访问操作系统。
到这里,本篇文章就已经接近尾声了,现在来做一个简单总结:
冯诺依曼体系结构:理解数据流动,内存等
操作系统:操作系统是什么,理解管理
这时,我们银行内的工作人员就会帮助这个人去办理业务;
这就祥我们一样,我们不了解系统调用,我们该如何去使用呢?
这是就有库
、shell
、指令
等,它们通过对系统调用的封装,让我们不知道系统调用的情况下,也可以使用计算机,访问操作系统。
到这里,本篇文章就已经接近尾声了,现在来做一个简单总结:
冯诺依曼体系结构:理解数据流动,内存等
操作系统:操作系统是什么,理解管理