循序渐进了解操作系统之——进程

本文介绍了操作系统的基本概念,包括进程的定义(运行中的程序)、内存与硬盘的区别、用户模式与内核模式。阐述了操作系统的作用,即管理和调度进程访问资源,并通过系统调用、中断和异常实现进程陷入内核。最后简要提及了进程调度,它是多进程看似并行执行的关键。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:
嗨,小伙伴们~
大家好,今天我们来看一下操作系统,掌握操作系统的相关知识是每一个程序员必须要具备的。然而,一般操作系统的相关资料都比较晦涩难懂,使得大家看操作系统相关知识时比较迷茫,似懂非懂。今天,我们就来一起逐步走近操作系统,了解操作系统。

在正式介绍操作系统前,我们先提出以下几个问题,然后逐步的解答这几个问题。

  • 问题一:什么是进程?
  • 问题二:为什么要有操作系统?操作系统的作用是什么?(也即为什么一个进程要分为用户模式和内核模式)
  • 问题三:陷入操作系统?
  • 问题四:进程调度是什么意思?

以上几个问题在我们学过或了解过操作系统课程后,或许都或多或少的知道,但是其中背后的原理你了解吗?正所谓,要知其然更知其所以然,这样我们才能真正的掌握知识,然后去应用知识。

我们首先来看第一个问题:问题一
什么是进程?

为了了解什么是进程,那么我们可以先观察一下我们自己使用的计算机,看我们的计算机上到底有什么。然后从上往下一点点的逐步了解操作系统。
在这里插入图片描述
我们看一下上面的图,这上面的图就是我的电脑所安装的大部分软件,其中包括:vscode,网易云音乐,火狐浏览器,谷歌浏览器,百度网盘等各种软件。
在这里插入图片描述接着,我们进入到我们电脑的任务管理器界面去看一下,这里面最上面同样显示了一些软件,包括:火狐浏览器,everything,谷歌浏览器,QQ,电脑管家等一系列软件。并且,这些软件是我的电脑目前正在运行的软件,即我的电脑目前打开了这些软件。

我们对比这幅图片和上面的图片我们就可以知道:在任务管理器中显示的这些软件全部是我的电脑正在运行的软件,像百度网盘这种软件我的电脑安装了,没有使用,此时他并不在任务管理器中出现。那么为什么会这样呢,这就引入了我们现在所要讲的:进程

也许我们现在也能感觉到,只要我们已经安装的软件,并且现在在使用他,他就会出现在任务管理器中;如果安装了软件,但是没有使用他,那么此时他就不在任务管理器中。基于这个特点,我们应该给在任务管理器中的软件起一个名字,这个名字就是进程

我们现在给进程下一个通俗的定义:进程就是指运行起来的程序

现在,我们知道了进程的定义。我们继续观察任务管理器上的黄色部分,即最上面显示的28% 内存这个信息,这其实就是显示对应的进程使用了多大的内存。
我们使用计算机应该都知道,我们通常使用的计算机包括的主要硬件有:CPU,内存,硬盘,显卡,主板等等。我们现在不关注其他的,只关注这个内存信息。
对于我们安装的每一个软件,我们都知道,他是有大小的。我们应该好多人都有体会,当自己的硬盘存储空间比较小时,当安装几个软件之后,会发现自己的C盘接近满了,然后就导致自己的电脑非常卡,这样的人也被成为C盘战士。那么这些硬盘满了,就说明有对应的数据存储进去了,而这些存储的数据就是运行我们安装的这个软件所必须的数据,即这些数据保存在我们的硬盘中。

既然我们运行软件时的数据保存在硬盘中,那么为什么这个任务管理器中时显示的内存呢?内存和硬盘有什么区别呢?
最显著的区别:内存一般很小,自己的个人电脑的内存存储空间一般有4G,8G,16G,32G等,而硬盘的存储空间一般有256G,512G,1T,2T,4T;此外,内存和硬盘的价格差距也非常大,如下图能很明显的看到价格差距;还有一点就是内存和硬盘的读取速率差距非常大,从网上搜的内存与硬盘读取速率对比结果如下。

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
通过以上对比,我们应该能了解到,内存一般很小,价格贵,但是读取速度很快。

现在,我们再聊看一下为什么要将软件的数据存储在硬盘而不是内存,并且为什么要将硬盘中的数据加载到内存中去,我相信你应该有了答案?
其实这主要就是因为:内存价格昂贵,但是内存小,如果将所有的数据都存到内存,那内存空间显然是不够的! 此外,因为内存的读取速率相比于硬盘而言快了几个数量级,所以我们会将数据加载到内存中,而不是在硬盘中运行。(或许你可以尝试买一个直接从硬盘中读取数据运行的计算机,来尝试一下计算机运行的速度,如果有的话~)
再举一个例子:运行程序时将数据从硬盘加载到内存就相当于你从你现在这个地方去一个目的地,你可以选在从高速公路走,但是你此时行走的路程会变多,可是你的速度可以开的更快(比如一直120KM/H),因此你只需要花三个小时就到达了目的地。你也可以选择从普通公路走,普通公路的路程相对较少,但是因为普通公路限速,因此你只能开到(30KM/H),因此你需要花费六个小时才能到达目的地。有这两个选择,你会选择哪一个呢?我想聪明人心中早就有了答案(另外内存与硬盘的速率差距远大于这个高速公路和普通公路的差距)~

好了,讲到这里我们再梳理一下进程特性

  • 进程定义:进程就是运行起来的程序
  • 进程数据:程序运行时需要有数据支撑,这些数据最初是保存在硬盘上,在软件跑起来变成一个进程时,这些数据会被加载到内存中去(这些数据是全部都一下都加载到内存中吗?其实不是,这里同样也是操作系统非常重要的一个知识点——虚拟内存,我们在下一次进行详细的讲解,目前我们姑且任务是所有数据都加载到内存)

我们现在打开了一个进程,我们打开进程后应该不会什么都不干,就坐在电脑前干看着电脑吧?那么我们在一个进程中免不了要操作硬件(如内存,硬盘文件等)。那么问题来了,这些硬件是我们想操纵就操纵的吗?显然不是,如果每个进程都能随意的操纵硬件,那么岂不是我们的电脑就乱套了(即在当前进程使用该硬件的时候,另一个进程也想使用,然后他对硬件操作了,使得当前你所在的进程出现了奇怪的东西,或者直接导致你的进程崩溃)。既然每个进程不能任意的访问的硬件,那么我们必须有能够访问硬件的方法,不然要硬件干什么?

既然每个进程都不能任意的访问硬件等资源,只能访问其自己有限的资源,那么我们控制访问硬件的方法肯定不能有当前的进程来完成。因此,我们此时就有了操作系统

下面,我们就来看一下为什么要有操作系统?操作系统的作用是什么?
我们现在应该也能回答上面的问题了,所谓的操作系统,就是一个拥有特权指令的进程,他可以访问任意的资源,并可以控制所有的进程来访问计算机特定的资源。即操作系统的作用简单来说就是不让进程任意的访问计算机资源,合理的调度进程来安全的访问操作系统允许其访问的资源。即操作系统可以实现各个进程间互相独立的工作,保证此进程的工作不影响其他进程的工作。

那么操作系统是如何实现各进程间的安全访问的呢?
这种方法就是特权指令,每一个进程所拥有的都是普通指令,即只能访问想让进程访问的数据。那么如果当前进程想要访问硬件等需要特权指令才能访问的数据时,此时我们就会陷入操作系统,操作系统所处的模式就是内核模式,即拥有非常高的特权级别,可以访问各种需要特权指令才能访问的数据。

这里我们提到了进程需要陷入操作系统,那么进程如何才能陷入操作系统呢?
如何陷入操作系统?
至于如何陷入操作系统,我们通常有三种方式,分别是:系统调用,中断和异常。
系统调用:系统调用就是指操作系统提供给进程的用户模式来调用的接口,通过系统调用,进程就将控制权转交给操作系统,然后由操作系统来完成一系列的需要特权指令才能完成的事,比如磁盘I/O,将printf(“hello, world!\n”)中要显示的信息显示出来(printf就是一个系统调用)等,操作系统提供了许多的系统调用接口,通过这些系统调用接口,进程就可以安全的访问硬件资源。
中断:中断分为软件中断,硬件中断和定时器中断。软件中断是指利用硬件中断的概念来使用软件模拟,来使操作系统进入中断处理程序。硬件中断是指外部设备引起的中断,比如我们使用键盘输入文字,每次键盘按下都会引起一个硬件中断。定时器中断是指操作系统启动时,会同时启动一个时钟,当时间到了之后,会产生定时器中断。
异常:异常对于我们应该也很常见,比如除零操作,非法引用内存等,都会产生异常。

对于每个陷入操作系统的操作,操作系统都会有对应的处理程序进行处理,比如系统调用处理程序,中断处理程序,异常处理程序等。
那么我们陷入操作系统时,操作系统是如何知道此时陷入的原因是系统调用,中断,还是异常呢,并且对于系统调用,操作系统怎么知道执行的是哪个系统调用号呢?对于这个问题,对于是如何陷入操作系统的,其实处理程序是有明确的标志的,这里比如定义三个常量:0表示系统调用,1表示中断,2表示异常,那么我们在进行处理前只需要先进性判断就可以知道此时陷入操作系统的原因。区分是何种系统调用同样也是通过系统调用号来判读,区分中断的类别同样也是。

我们再来梳理一下相关的知识点

  • 进程定义:进程就是运行起来的程序
  • 进程数据:程序运行时需要有数据支撑,这些数据最初是保存在硬盘上,在软件跑起来变成一个进程时,这些数据会被加载到内存中去(这些数据是全部都一下都加载到内存中吗?其实不是,这里同样也是操作系统非常重要的一个知识点——虚拟内存,我们在下一次进行详细的讲解,目前我们姑且任务是所有数据都加载到内存)
  • 用户模式与内核模式:进程平时就工作在用户模式,在用户模式下工作的进程,具有很低的特权级别,只允许访问一些特定的资源。如果进程想访问一些需要特权才能访问的资源,就需要陷入操作系统(即提权:提升自己的权限),陷入操作系统后就到了内核模式,此时就可以任意访问资源。该任意是指在操作系统的控制下在不影响其他进程即操作系统工作的前提下来访问进程所需的资源。当访问完成后,就会重新放回用户模式,进程继续工作。
  • 操作系统:相当于是一种内核模式,可以任意的访问各种需要特权指令才能访问的数据(比如各进程共享的硬件资源)。
  • 陷入操作系统:陷入操作系统的方式包括:系统调用,中断和异常;对于陷入原因,可以通过具体的识别号来标明,陷入操作系统后,有操作系统各对应模块处理程序去进行处理,处理完成后就返回用户模式继续执行。

我们应该知道,对于每个程序的执行,其实就是CPU在依次执行每条计算机指令。这数百个进程是如何调度的呢?我们现在就简单了解一下。我们从上面应该知道,在进程运行时,需要一些数据来支撑着这个进程运行。我们现在需要知道另一件事,进程的执行不是直接在内存中执行的,内存只是用来存储数据的,真的执行是需要CPU用来计算执行。因此,在执行进程的相关操作时,是需要CPU先从内存中取出数据,然后保存到CPU的相关寄存器内部,接着进行执行。即进程运行时,CPU内部保存着当前进程运行的一些信息。

对于单个进程,基本信息基本上如上。然而,对于一个计算机,我们不可能在同一时刻只运行一个进程。那么问题来了,我们如何运行多个进程?在今天,我们的计算机上可能同时运行上百个进程,每个进程的运行都需要CPU的参与,可是我们并没有上百个CPU,那么这么多进程时如何运行的呢?

要了解这个问题,我们就需要知道进程调度

什么是进程调度?

所谓进程调度,其实就是在多个进程之间来回切换,使得多个进程能够看起来像是同时运行。
假如我们现在有三个进程A,B,C,并且我们的电脑当前只有一个CPU核,因为进程的执行必须要有CPU的参与,即获取到CPU才可以执行进程。
我们现在猜测有这样几种方法来执行当前的进程(实际实现的调度方案更复杂,这里只是简单引入):

  • 每个进程按照先后顺序依次执行,直到前一个进程执行结束后,下一个进程才能接着执行,即先执行进程A,再执行进程B,最后再执行进程C
  • 每个进程按照先后顺序依次执行一段时间,不必等到前一个进程执行结束下一个进程才能开始执行,即只要前一个进程执行的时间到了,那么后一个进程就可以开始执行;例如A执行10ms,B执行10ms,C执行10ms,然后A再执行10ms,… 执行结束
  • 每个进程按照优先级依次执行一段时间,不必等到前一个进程执行结束下一个进程才能开始执行,即只要前一个进程执行的时间到了,那么后一个进程就可以开始执行;例如A执行10ms,B执行10ms,C执行10ms,然后A再执行10ms,… 执行结束

上面所述的是可以选择的进程调度方案,但是可行性不高,现在操作系统也不是这样做的,因为进程调度较为复杂,故我们在下一篇文章来详细为大家进行介绍,该部分只是引入进程调度~

结束语:最后,如果大家觉得文章对你有帮助,小生在这里恳求您能动一动小手主动三连啦,您的支持就是我创作的最大动力~

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Bug.Remove()

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

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

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

打赏作者

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

抵扣说明:

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

余额充值