草庐IT

操作系统之进程的初步认识(1)

小鱼不会骑车 2023-04-13 原文

进程

1. 进程的相关概念

进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。

1.1 进程的定义

狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)

广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

1.2 进程的概念(1)

进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

1.3 进程的概念(2)

进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行时),它才能成为一个活动的实体,我们称其为 进程(下面讲到为什么进程是活动的实体)。

通俗一点理解,我们可以将 运行中的程序 看做是 进程,比如我们平时经常使用到的QQ,当我们打开qq这个app时就相当于启动了一个进程,操作系统就会为该进程分配内存空间.

我们看下图:

2. 进程和程序的区别

首先我们要明白程序是什么?程序是我们写下来的一段代码,而进程的产生是因为代码开始执行了。

就像下图:

此时我们便可以通过这个图片来理解程序和进程的区别:

一、 进程是动态的,程序是静态的:程序是有序代码的集合,进程是程序的执行。进程有核心态/用户态。
程序是静态的很好理解,那自己写的代码当然是静态的。进程是动态的也好理解,代码开始执行,那肯定会执行完毕,执行完毕了,进程也就消亡了,所以进程是动态的。

二、 进程是暂时的,程序是永久的;进程是一个状态变化的过程,程序可以长久保存
基于一的解释,二这个也是相同的理解。

三、进程和程序的组成不同,进程的组成包括程序、数据和进程控制块(即进程状态信息)
由于进程是动态的,并且需要间断的执行,那么就需要保存进程的状态信息。

3. 进程管理:

操作系统本身是一个大话题,是一个非常发杂的软件.它本身的功能有很多,其中有一个和咱们密切相关的功能模块, 进程管理!

为什么我们需要进程管理呢?

大家看图:


可以看到,由于我们的进程很多,才需要管理,如果进程只有几个的话当然涉及不到进程管理.

如何进行进程管理呢?

  1. 描述一个进程,使用结构体/类,把一个进程有那些信息表示出来.
  2. 组织这个进程,使用一定的数据结构,把这些结构体对象放到一起,(通常是使用双链表这个数据结构)

3.1 进程的结构体有哪些属性

关于进程的结构体我们还有一个别称,就是 PCB(进程控制块)

(1) Pid(操作系统里指进程识别号)

PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。

只要运行一程序,系统会自动分配一个标识

是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。

只要没有成功运行其他程序,这个PID会继续分配给当前要运行的程序。

如果成功运行一个程序,然后再运行别的程序时,系统会自动分配另一个PID

(2) 内存指针

当前这个进程使用的内存是哪一部分.(进程运行的时候,使用了哪些内存上的资源)

(3) 文件描述符表

如下图:


上图红色框中的都是文件,

文件: 比如硬盘上存储的数据,往往就是以文件为单位进行整理的.

进程每打开一个文件就会产生一个 ‘文件描述符’(标识这个文件被打开) .由于一个进程可能会打开很多文件,自然对应了一组文件描述符,把这些文件描述符放到了类似于顺序表这样的一个数据结构中,就构成了文件描述符表!

文件描述符表描述了:你这个进程使用了那些文件,或者是使用了哪些硬盘资源.

此时:我们结合内存指针和文件描述符表可以知道,进程的运行需要从操作系统这里申请资源,此时也可以理解为进程是操作系统进行资源分配的基本单位!

下面的属性都是描述个cpu资源相关的属性.这些属性都是辅助进行.

4. 进程调度:

咱们的程序能够运行,全依仗cpu,每个程序相当于一组’二进制指令’的集合,这些指令靠cpu运行.

cpu有一个概念(核心数)

以小鱼这个电脑举例:

我的电脑只有8个核心,其中每个核心相当于一个员工,并且每个员工可以同时进行两个人的工作,也就可以理解为我的这八个核心可以同时运行16个进程,当时大家刚才已经看到了,我们的任务管理器里面有不小于100个进程正在运行,那我这个小小的8个核心就是累屁了也不能同时运行100多个进程啊.

那么下面就涉及到了计算机为什么可以同时运行这么多的进程了.

(1) 并行

并行性是指系统具有同时进行运算或操作的特性,在同一时刻能完成两种或两种以上担任工作,并行性需要相关硬件的支持,例如流水线或多处理硬件环境。

举个例子:

假设我是一个长的好看,有才华的女生,我有一个择偶标准,就是需要(1)有钱(2)长得帅(3)会舔我(会哄我开心,帮我排解压力).

但是呢,放眼望去,并没有找到符合这三种条件的男生(我们称为ABC),有钱的不帅( A ),帅的没钱( B ),会舔的不帅也没钱( C ).但是我呢,是一个追求完美的女生,我就是想要找到符合我择偶标准的男生,此时呢~我就打算,同时和三个男生交往,因为是同时和他们一起交往,此时就是并行.

(2) 并发

并发指两个或多个事件在同一时间间隔内发生。操作系统的并发性是指计算机系统中’同时’存在多个运行的程序,因此具有处理和调度多个程序同时执行的能力。在操作系统中引进程序的目的是使程序能够并发执行。在多道程序环境下,一段时间内,宏观上有多道程序在"同时"执行,而在每一个时刻,单处理机环境下 实际仅能有一道程序执行,因此 微观上这些程序是分时交替执行的。操作系统的并发性是通过分时得以实现的。

依旧是通过上面的例子举例:

因为我是在同时和三个男生交往,那么对于我的名誉来说,我一定是不想让他们碰见的.

所以呢,我就规划了一个时间表:

周一,周三,周五周二,周四周六周日
有钱的( A )帅的( B )会舔的( C )给自己放个假

为什么有钱的可以一礼拜陪他三天,当然是因为金钱的力量啦!!!

于是呢,我就按照上述的表来进行每周的时间分配,当我们把时间的长度调整为1周时,会发现我在不同的时间陪着他们不同的人,但是当我把时间的长度调为1年,2年时,我们就可以认为,我是在"同时"和ABC在一起.此时涉及到的性质就是我们所讲到的"并发"

5. 进程调度需要的属性

(1) 进程状态

简单的认为进程的状态主要是这两个:

就绪态: 该进程已经准备好,可以随时上cpu执行

阻塞态:该进程暂时无法上cpu执行

我们依旧通过上述的例子演示:

有一天呢,A说我需要出差一个月,那么在他出差的这一个月期间,我都无法跟他在一起,此时A就是"阻塞态",但是虽然A出差了,但是我还有B,C,此时我可以随时去找这两个男友,陪他们在一起,此时这两位男友就是"就绪态".

(2) 进程优先级

进程之间的调度不一定是公平的,有的需要优先调度~~

例如:

为什么我会给A分配更多的时间来陪我,是因为A有钱,有钱就体现了他的重要性,当然要A优先了,那么为什么只让C一礼拜陪我一次,当然是因为,他除了能把我舔的开心,没有其他用途了,一没钱二不帅,优先级自然就是最后的了.

(3) 进程上下文

上下文就是描述当前的进程执行到了哪里,这样的一个"存档记录".

进程在离开ccpu的时候要把当前运行的中间结果进行"存档",等下次进程回来cpu上,再回复之前的"存档",从上次的结果继续往后执行.

所谓上下文具体指的就是进程运行过程中,cpu内部的一系列寄存器的值.

寄存器:

寄存器有很多种,其中最典型的作用就是保存当前进程执行的中间结果,包括执行到了哪一条指令.

存档: 进程离开cpu就需要将寄存器的值保存在PCB上下文字段中~~

读档: 进程下次回来,cpu再把PCB中的值恢复到寄存器中.

举例:

有一天A跟我说,你准备准备咱们下个月去三亚旅游,那么此时我需要准备的就是性感泳衣啦!之后,在我陪着B的时候,他对我说下个月我妈妈过生日,你记得准备下生日礼物啊!那么我就想,阿姨的生日礼物就买个手机吧.

后来A问我东西准备好了吗,但是由于我一时间记不清,便说了手机已经买好了,B问我准备好了吗?我又回答说性感泳衣已经买好了.此时不就是穿帮了嘛,所以我们需要进程的上下文来记录我们的事情进行到了哪里!

(4) 进程的记账信息

统计了每个进程在cpu上执行了多久~~
可以作为调度的参考依据.

例如: 我一礼拜只陪C一天,导致C舔我舔的不是那么用心了,此时我一看陪伴C的天数,发现是陪伴他的次数太少了,于是我需要一礼拜多抽出几天陪他,这样他就会又很用心的舔我了~当然,这样的情况也只是暂时的,等他又用心舔我之后,我依旧是一礼拜只陪他一天…

6.操作系统的常用数据结构

操作系统往往使用双向链表这样的结构来组织PCB~~

1.创建一个进程就是创建一个链表的结点
2.销毁一个进程就是把链表中的结点给删除了
3.遍历进程就是遍历双向链表

有关操作系统之进程的初步认识(1)的更多相关文章

  1. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  2. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  6. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  7. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  8. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  9. ruby - 无法在 Ruby 中将 ffmpeg 作为子进程运行 - 2

    我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope

  10. Ruby 守护进程导致 ActiveRecord 记录器 IOError - 2

    我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame

随机推荐