【操作系统之进程了解】


前言

对于一个后端程序员,在操作系统中,我们与之打交道最多的可能就是进程管理,而对于进程管理,我们首先最重要的就是去了解什么是进程,这篇博客将会仔细讲讲什么是进程,揭开进程的面纱


一、进程的相关概念

我们都知道,我们写的代码,只是一个存储在硬盘的静态文件,只有通过编译后才会变成可执行的二进制文件,当我们运行这个文件时,它会被加载到内存上,然后CPU就去执行每一条指令,那么这个运行中的程序就被称为"进程"

1.进程与程序的区别

  1. 在上面我们有说到,一个运行中的程序就被称为进程,所以从这点可知,程序是静态的观念,进程是动态的观念;
  2. 程序是永存的,进程是暂时的(有创建,销毁)
  3. 进程具有并发性,程序没有
  4. 进程是竞争计算机资源的基本单位,程序不是
  5. 进程和程序不是一 一对应的,多个进程可执行一个程序,当然一个进程也可以执行多个程序(比如网易双开)

2.并发与并行的区别

经过上面学习,我们知道了进程就是在内存上通过CPU去执行可执行文件中的每一条指令,每个指令都有不同的功能,当我们执行到的指令是去硬盘读取文件的时候,这个时候就涉及到了访问磁盘了,也就是IO操作,这个过程是非常慢的,这个时候难道我们就在这等着?当然不是,CPU那么伟大的发明,怎么可能傻傻的去等呢。这时候CPU就会去执行其他进程,当原本读取文件的进程读取结束,发送一个中断,然后CPU回来继续执行。因为这多个程序,交互执行,就产生了CPU管理多个进程的想法,进程交替速度很快,就像并行一样

并发:是一个处理器核交替处理多个进程,但交替很快,就像是多个进程同时执行(但不是并行)
并行:是两个处理器核分别处理一个进程,没有交替(两个进程同时运行)
所以他们的区别在于宏观上和微观上:宏观上并发就是并行,微观上却是不相同的
在这里插入图片描述

二、进程管理

所谓的进程管理,其实就分为两步
1.描述一个进程:使用结构体/类,把一个进程有哪些信息,表示出来
2.组织这些进程:使用一定的数据结构,把这些给构体/类,放到一起(双向链表)

1.进程的描述(PCB(Process control black))

1.进程的结构体(PCB)的属性(与进程有关)

  1. PID(Process Identification)每一个进程都需要一个唯一的身份标识(当这个进程终止后,这个标识码会被回收,然后可能赋值给下一个进程)
  2. 内存指针:当前这个进程使用的内存是哪一部分,进程要运行起来,就会消耗一定的硬件资源,比如内存,这个内存指针指代使用了哪些内存资源
  3. 文件描述符表:硬盘上存储的数据大多都是一文件格为单位进行整理的;进程每打开一个文件,就会产生一个“文件描述符”,一个进程可能会打开多个文件,也就产生了多个“文件描述符”,把这些组合起来放在一个表里保存下来,就形成了一个文件描述符表

2.进程的状态(与CPU相关的属性)

在上面讲到,当一个进程去访问磁盘的时候,会非常耗时,这时CPU就会去执行其他进程,但是在这之前,会保存这个进程的信息(进程的上下文),进程的状态。优先级等

  • 运行状态:这个时刻这个进程占用CPU。
  • 就绪状态:可以运行,但是CPU上有其他进程在运行,所以进入暂时等待
  • 阻塞状态:因为某一原因进入阻塞状态(比如要拿的资源还没获取到)
    在这里插入图片描述

此外还有另外4种状态
1.创建状态:顾名思义也就是进程创建的那一会儿的状态(准备资源)
2.结束状态:一个进程运行结束后的那一刻状态
3.就绪挂起等待:当内存中阻塞状态的进程很多时。会占用内存空间,于是会把它放入磁盘中等待(等待拿到资源),当拿到资源就会变成就绪挂起等待(等待从磁盘进入内存)
4.阻塞挂起等待:这个状态就是在磁盘中等待拿到资源

3. 进程的优先级(与CPU相关的属性)

进程之间的调度不一定是公平的,也会有优先级之分(即进程抢占 CPU 时的优先级)

比如有的进程比较重要,那么它的优先级会比较高,所以它在CPU上运行的时间占CPU总运行时间的百分比就会很高,而不是很重要的,只需要时不时让他上CPU运行一会就好了,毕竟该程序打开运行了,总得运行一下吧。

4.进程的上下级

上下文,就是描述了当前进程执行到哪里这样的“存档记录”,进程在离开CPU的时候就要把当前运行的中间结果“存档”,等到下次进程在回到CPU上时,再恢复之前的存档,从上次的执行结果继续执行

举例:身为一个居家好男人,做菜是必不可少的技能,当然作者也属于这一类人,于是暑假在家做饭就成了我的小任务,有一天,我在家炖鸡汤,当我把鸡洗干净之后,准备下锅的时候,我的老妈叫我去车库提一下菜,有点重,于是我就记录下现在炖鸡汤到了哪一步(已经洗干净),当我把菜提回来后,我们通过记录(上下文)可知现在鸡应该下锅了。这就是进程上下文的作用了。

然而进程中当然不是记录炖鸡,所谓上下文具体指的就是进程运行过程中,cpu内部的一系列寄存器的值.
寄存器
存档: 进程离开cpu就需要将寄存器的值保存在PCB上下文字段中
读档: 进程下次回来,cpu再把PCB中的值恢复到寄存器中.

5.进程的记账信息

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

2.PCB的组织

对于上面讲到的结构体(PCB),我们通常使用双向链表来组织这些PCB
根据进程的状态不同分类,
把所有就绪状态的进程连在一起,组成了就绪队列
把所有阻塞状态的进程连在一起,组成了阻塞队列

对于双向链表,这是我们组织PCB常用的组织结构,此外还有索引方式的组织,但是这种不太好,把所有相同状态的进程放入一个索引表。而进程有创建和销毁,即数据结构中的插入和删除,索引方式中的插入和删除很麻烦,但是对于链表就很方便,所以通常选用链表

3.进程之间的通信

(进程并不是直接操作物理内存地址,会产生大问题)
在这里插入图片描述

一个进程无法直接干预另一个进程的内容
“进程的独立性”
每个进程有自己的独立空间(大大提升了操作系统的稳定性)

但是有时候,需要进程之间进行交互,相互配合
如果每个进程可以直接访问物理内存,其实是没有隔离性的,也就不需要进程间的通信了,进程1直接把计算的结果写到进程2里就好了

所谓的进程间通信,就是在隔离性的前提下,找一个公共的区域,让两个进程借助这个区域来完成数据的交换

此外操作系统提供的进程之间的通信具体方式有很多种:管道,消息队列,共享内存,信号.....

三.小知识:

CPU寄存器:CPU 内部一个容量小,但是速度极快的内存;
程序计数器:存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。

总结

通过写这篇博客,我理解到了什么是进程,知道了进程与程序的区别,并发与并行的区别,知道了PCB的许多属性,且它们的作用,还对组织这些PCB的数据结构有了理解,知道了进程之间为什么
要有进程之间的通信。受益很大,加油!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值