进程的概念与基本介绍


一、冯诺依曼体系结构

冯诺依曼体系结构其实是一个老生常谈的内容,我们常见的计算机、服务器等大部分都是遵循冯诺依曼体系结构的。

我们都知道我们的计算机是由很多硬件组成的,比如鼠标键盘、显示器、网卡、CPU、内存、磁盘等等。我们给这些硬件设备分一下类就是:

  • 输入设备:鼠标、键盘、话筒、摄像头、扫描仪、磁盘、网卡……
  • 输出设备:显示器、音响、网卡、磁盘、显卡……
  • 存储器:内存
  • 中央处理器(即CPU):含有运算器和控制器等……

想要了解什么是冯诺依曼体系结构,我们首先要认识什么是体系结构,体系结构其实就相当于是计算机硬件的骨架,这个骨架决定了我们操作系统如何组织我们的硬件设备,将硬件设备组织在一起然后服务于软件,最后通过软硬件的配合就可以完成计算机的工作。

那么什么是冯诺依曼体系结构呢?我们来看一下冯诺依曼体系结构图:

在这里插入图片描述

关于冯诺依曼体系结构,我们需要理解以下几点:

  1. 冯诺依曼体系结构中的存储器,指的就是我们平时所说的内存,那么为什么需要有内存呢?

    我们都知道CPU的运算速度是非常快的,在计算机中,CPU的运算速度>寄存器的速度>缓存速度>内存>>外设(比如说磁盘)>>光盘;我们设想一下假如冯诺依曼体系结构中没有内存,那么CPU会直接与输入设备、输出设备进行数据交换,那么就会导致一个问题:CPU的速度远远大于输入设备和输出设备,从而使得CPU很快地完成了数据接收与运算,但需要等待输入设备和输出设备,因为它们两个的速度太慢了。这样的问题就会导致即使CPU的速度特别快,计算机整体的速度效率也会因为CPU等待输入输出设备而大大降低。因此,我们取了速度处于二者之间的硬件——内存。输入设备的数据传入内存当中,内存再将数据传给CPU,CPU处理完毕后再返回给内存,最后由内存将数据返回给输出设备。

  2. 在不考虑缓存的情况下,冯诺依曼体系结构中的CPU只能够对内存进行读写,不能访问外设
    (理由和第一点是一样的)

  3. 外设(输入输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取
    即所有的设备都只能够直接和内存打交道,不能直接与CPU打交道

我们举个简单的例子来理解一下冯诺依曼体系结构:
在日常生活中我们经常使用微信聊天,其实在微信聊天的过程中就是冯诺依曼体系结构的很好体现。我们能看到下面的示例图:当我们在键盘上输入"你好"点击发送时,输入设备会将这条信息传输给内存,内存再将数据给CPU进行处理,CPU处理完毕以后返回给内存,内存再将数据传输给输出设备即网卡,通过网络你的信息就能够传送到你好友的网卡上,网卡此时作为输入设备再将数据传输给内存,内存将数据传输给CPU,CPU处理完毕以后再返回给内存,内存最后将数据传输给输出设备即显示器,这样你的好友就能看到你发的消息了。

在这里插入图片描述
再比如:我们以前在写C/C++的时候,我们自己写好的程序,编译好之后,如果要运行必须先加载到内存当中,那这又是为什么呢?
因为我们如果需要运行我们的程序必须靠CPU去执行处理我们的语句吧?但是在冯诺依曼体系结构中CPU只能与内存进行数据交换,而我们编译好的程序是可执行程序,它是一个文件(在windows下是.exe可执行文件),这个文件是在磁盘上的,此时磁盘作为输入设备是无法将数据直接给到CPU的,所以必须先加载到内存才能够运行。

另外,我们还需要介绍一下中央处理器(CPU)在冯诺依曼体系结构中的作用。CPU包含运算器和控制器。运算器能够进行算术计算(加减乘除等运算)和逻辑运算(逻辑与逻辑或等运算),控制器则需要控制外设、内存、运算器,协调它们之间的数据交互。比如说判断数据是否从输入设备写入到内存了,数据是否传输到输出设备了。我们需要CPU中的控制器来与外设进行控制交互。

二、操作系统

我们上面讲的冯诺依曼体系结构是属于硬件层面的内容,下面我们来谈谈软件层面的内容——操作系统(Operator System)。

1.操作系统的概念

操作系统是计算机中一个基本的程序集合。实质上操作系统就是一款软件,它是一款负责管理的软件。它对下需要管理好软硬件资源,对上需要为用户提供良好的、稳定的、安全的服务。

2.管理的本质

我们想要弄清楚操作系统是如何进行管理的,首先我们需要弄清楚管理的本质是什么?

在现实生活中我们的管理不一定是直接对着被管理者面对面的管理,就好比说在学校里管理者假设是你的校长,你作为学生就是被管理者,你会发现你在学校里见校长的次数少之又少,但是呢校长依然能够将所有的学生管理得很好,这是为什么呢?
原因就是管理其实是通过管理数据从而实现的对特定对象的管理。你在学校入学的时候,你作为学生肯定需要录入你自己的个人信息,然后校长手上就会有一份包含你个人信息的档案,这就是你的数据,校长只需要对这一份又一份的学生数据进行管理,即可实现对学生的管理。

我们如果需要实现一个学生管理系统(假设用C语言),我们首先要做的事情一定不是各种管理功能的实现,而是定义一个描述学生身份信息的结构,比如描述学生的姓名、性别、专业、班级、绩点等等……当我们来了一个新学生就创建一个新的这种描述,有多少个学生就有多少个描述,每个学生的描述是独立的整体(相当于你的学生档案),接着我们要将学生管理系统的功能进行实现呢则需要将这些一个个独立的描述结构组织起来,从而实现相应的功能。这个组织起来的过程就需要运用到我们的数据结构,比如说将所有学生用链表连接起来,一个链表节点就代表一个学生的档案,这样就实现了组织。最后只需要将需要管理的功能实现出来,这样一个管理系统就完成了。

因此我们得出结论:管理的核心本质是 ”先描述再组织“!

在这里插入图片描述

3.操作系统是如何进行管理的

操作系统的管理和上面说的管理本质是一样的,操作系统的管理也是 先组织再管理
为了更好地理解,我们将操作系统的管理类比成银行运作系统的管理:
在这里插入图片描述
银行的行长可以对银行职员进行管理,同时也能够对银行的硬件设施进行管理,比如说银行的电脑、银行的桌椅;那行长是怎么进行管理的呢?其实也是 先描述再组织 。对于员工,行长在员工入职前会收集员工个人的信息,这就是描述的过程,对于硬件设施,行长也会有每种硬件设施的信息,比如电脑的型号电脑的数量,这也是描述的过程;完成了描述以后,行长会组织银行职员给他们分配各自的工作任务,会安排银行职员如何去使用银行的硬件设施,这就是组织的过程。这样行长就实现了对银行的管理,银行就可以正常运作对外给客户提供服务了。

操作系统也是类似的,我们操作系统需要先保存下驱动程序和底层硬件的属性信息,这就是描述的过程,操作系统再组织驱动程序利用哪些底层硬件去实现程序的功能,这就是组织的过程。这样操作系统就实现了它的管理,一台计算机就能够正常运作对外给用户提供服务了。

总之,操作系统的管理核心本质也是”先描述,再组织“。

系统调用和库函数

我们都知道银行是不会将自己整体暴露给外界的,意思就是说银行系统只会对外提供一个个服务的窗口,客户到银行办理业务是通过窗口实现的,银行怎么存钱怎么取钱,把钱存到什么地方,在什么地方取钱客户是不知道的,因为银行需要确保一个安全性,所以要将自己的整体封闭起来。
操作系统也是同样的,为了安全性,防止用户无意或者有意修改了操作系统的某些数据,从而导致操作系统不能正常运行。所以操作系统也会将自己封闭起来,那么用户在使用的时候呢操作系统会对外提供一些接口,用户只能够通过这些接口来让操作系统实现相应的功能服务。

操作系统对外表现为一个整体,只会暴露出自己的部分接口,供给上层开发使用,调用这部分由操作系统提供的接口,就叫做系统调用
系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以有些开发者已经对部分的系统调用进行适度的封装,从而形成了库,有了库就更有利于用户更好地使用和开发。

4.操作系统上下层关系图

我们上面提到操作系统既要管理软件,又要管理硬件,在计算机中操作系统可以说是起着 承上启下 的作用,下面是操作系统与上下层关系的详细图解:
在这里插入图片描述
关于操作系统上下层关系图的几点解释:

  1. 底层硬件之间实际上是服从冯诺依曼体系结构的。
  2. 操作系统可以组织管理驱动程序,驱动程序能够驱动对应的底层硬件工作,操作系统也就实现了对软硬件的管理。
  3. 操作系统是通过系统调用的方式,对外提供接口服务的。

到这里我们拥有了操作系统的一些超级基础知识以后,我们可以回头再看看我们以前经常使用的printf这种库函数。printf能够将数据打印到显示器上,我们作为用户层面使用printf进行开发操作,它是怎么能够操作底层硬件将数据打印出来的呢?从上面的图示我们可以看出,答案是通过操作系统。更准确地说是:操作系统将“打印到显示器”这一功能的使用做成一个接口供外界使用,printf这个库函数则是将这个接口进一步进行封装,封装成用户使用起来简单的库函数,所以我们才能够直接一个printf语句就完成了打印操作。


三、进程

1.进程的概念

在操作系统的书籍里我们经常能看到进程的定义是:进程是一个运行起来的程序。

但是进程与程序有什么区别呢?
可能有人会觉得这不就是运行了和没运行的区别嘛!
真的是这样嘛?
在这里插入图片描述
我们看到:我们的程序是在磁盘上的可执行文件,当我们运行可执行文件时必须先将程序从磁盘加载到内存当中。但程序加载到内存以后就叫做进程了吗?答案是:不是的
我们的操作系统需要管理的进程可能不止一个,既然有多个进程,那么操作系统再进行进程管理是也是服从 先描述再组织 的原则。当一个程序加载到内存时,操作系统可不仅仅只是将程序的代码和数据加载到内存,操作系统还要为了管理该进程,创建对应的数据结构,这个数据结构包含了进程的所有属性数据,能够描述该进程。Linux是用C语言写的,在Linux中描述进程的数据结构是struct结构体,名字叫 task_struct 。所以所谓的进程,是将描述进程属性数据的结构和进程的代码数据结合在一起,才叫做进程。
进程 = 可执行程序 + 该进程对应的内核数据结构

2.PCB(Process Control Block)

我们操作系统中用来描述进程的属性数据的结构就叫做 PCB(Process Control Block) 。如上面所说的在Linux系统下的PCB就是 task_struct 。PCB即进程控制块,进程的信息被放在进程控制块中,可以理解为进程控制块是进程属性的集合,用来描述每一个进程。

3.如何查看进程

第一种方法(简单查看方法)

我们自己写的程序运行起来以后就是一个进程,那么该进程在操作系统中怎么查看呢?在Linux下我们写一个简单的C语言程序,让它运行起来我们查看一下这个进程:
在这里插入图片描述
我们写一个简单的死循环程序,将一直在屏幕上打印输出’I am a process"。
我们让该程序运行起来
这时这个进程就欢快地跑起来了。我们分割出另一个界面,输入指令:
ps axj | grep 'mytest' | grep -v grep
在这里插入图片描述
这个就是我们正在运行的进程!!

第二种方法(可查看进程详细信息)

我们在根目录下有个名字叫 proc 这么一个目录,它是一个内存文件系统,这个目录里面放的是当前系统实时的进程信息!
在这里插入图片描述

我们可以用指令查看一下proc目录里面的东西是什么,我们发现里面都是我们不认识的一大堆文件和目录,其中呀这些蓝色的数字叫做PID,关于什么是PID我们下面会介绍。
在这里插入图片描述

我们查看当前正在运行的进程,可以通过在proc目录下用PID来查询,输入指令:
ps ajx | head -1 && ps ajx | grep 'mytest' | grep -v grep
我们发现当前正在运行的程序的PID是5370,我们通过ls指令利用PID来查看进程
在这里插入图片描述

输入指令:
ls /proc/5370
我们看到当前进程确实是存在的,在这个目录下放着的就是这个进程的所有属性信息,是以文件的形式展示的。其它的是什么我们先不看,先来看看图中框起来的两个。
在这里插入图片描述

输入指令:
ls /proc/5370 -al
我们看到exe对应的是当前这个进程对应的可执行程序的磁盘文件以及该文件所在的路径;cwd对应的是进程当前的工作路径。

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JJP1124

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值