操作系统 —— 进程管理

操作系统概述

汇编本质:机器语言的助记符,其实就是机器语言

多道程序时代

现代操作系统不是一次只运行一项作业,而是将大量作业加载到内存中,并在他们之间快速切换运行。从而提高CPU使用率。这种切换非常重要,因为IO很慢,在处理IO时让程序占用着CPU就是在浪费CPU的时间。

宏内核和微内核

宏内核:所有的操作系统功能都放到一块内存。现有操作系统
微内核:鸿蒙操作系统。一个内核只负责一个功能比如进程调度,比如一个内核只负责内存管理。比如小冰箱只需要一个小的内核,那么我们不需要一个宏内核,只要一个微内核,然后联网操作他。IOT实现万物互联。所以他对宏内核构不成威胁。部署起来非常灵活,就是一个微内核负责一个小功能,我们需要哪个功能就插入哪个,可插拔似的。

用户模式和内核模式

用户模式用户不能发出IO,不能控制CPU。权限低
内核模式:操作系统运行的模式,运行代码,切换进程等。最高权限
但是我们想让用户拥有一些特权,这时操作系统可以暴露一些借口给我们,比如创建销毁进程,让用户分配更多内存等操作。等几百个API供用户模式使用。

进程管理

概念:由操作系统决定:哪个进程执行多久,何时执行。
每个进程都有自己专属调度方案并且可自定义。
进程类型:

  1. IO密集型:io多,大部分时间用于等待IO
  2. CPU密集型:计算很多,需要一直占用cpu

进程

什么是进程进程:正在进行的一个程序或者说一个任务。而负责执行任务则是cpu

  • CPU虚拟化:虚拟化CPU制造一个假象,就是一个进程只运行一个时间片然后切换到其他进程。CPU快速切换,在用户角度看就是计算机同时运行多个进程。(时分共享机制)
    进程的组成:
    a、PCB:进程控制块(区分其他进程,是进行控制信息的集合,常驻内存,提高效率)
    b、程序:体现功能,静态,是信息的集合,需要执行才有结果。
    c、数据:操作对象

linux进程类型

  1. 前台进程:可以和用户在终端交互,如果关闭终端,则该进程也关闭。
  2. 后台进程:没有占用终端不和用户进行交互,优先级低于前台进程,及时终止终端他还是在后台运行,可以使用kill杀死进程& 最经常被用到。 这个用在一个命令的最后,可以把这个命令放到后台执行
  3. 守护进程:特殊的后台进程,一般开机启动,一直会在后台运行到机器关闭。比如mysqld,就开机运行,关机才关闭。

进程实体

PCB进程控制块:进程当前状态和控制进程运行的所有信息,他常驻系统内存。

  1. 标识符:区别不同进程,进程的id,进程唯一标识符,非负整数。PID
  2. 状态:运行态,阻塞等
  3. 进程调度信息:指向内存中的代码
  4. 进程控制信息

PID= 0的进程为idle进程,是系统创建的第一个进程。PID=1的进程为init进程是0号进程的子进程,完成系统初始化。init进程是所有进程的祖先进程。操作系统就是由这种一个树形进程结构构成的。

进程的三个状态及转换

  1. 就绪:进程获得了除CPU外的一切资源,存入就绪队列
  2. 阻塞:进程由于等待某一事件(如IO)而放弃CPU状态,有一个阻塞队列来存放阻塞进程。
  3. 执行:单核一个时刻只有一个进程处于执行状态

阻塞->就绪:IO结束,一切准备就绪
就绪->运行:获得CPU
运行->就绪:进程时间片用完
运行->阻塞:等待IO

进程API—— fork函数

https://blog.csdn.net/kxjrzyk/article/details/81603049
fork()函数来创建新的进程,新创建的进程叫子进程,原来的进程叫父进程。子进程开辟的一块单独的内存空间子进程会复制父进程的所有值,也就是看起来和父进程一样,只有进程id号不同。

返回值

新创建的进程通过返回值判断自己是子进程还是父进程。在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID大于0,如果创建进程失败fork()返回值为负数。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。运行顺序可能是子先也可能父先。由系统决定。

引用一位网友的话来解释fpid的值为什么在父子进程中不同。“其实就相当于链表,进程形成了链表,父进程的fpid(p 意味point)指向子进程的进程id, 因为子进程没有子进程,所以其fpid为0.

fork的实现分为以下两步:

  1. 复制进程资源
  2. 执行该进程。fork出的子进程从fork函数开始执行,但是这个进程中的变量会把父进程中的所有变量都复制一份拿过来。

其他函数

  • wait()父进程等待子进程执行完毕,自己再执行。
  • exec(): fork()是创建新线程并执行和父进程一样的程序,而exec()可以创建子线程并执行和父进程不同的程序。

什么是时钟中断

问题:当一个进程在运行时,cpu的控制权是在进程中的。而我们操作系统这时没有控制权,那这个进程可能一直在执行,操作系统插不上嘴,那这个操作系统就没用了。
解决:在硬件中设置一个时钟设备,每隔个几毫秒或者几微秒就中断一次,这时CPU控制权重新回到操作系统,操作系统再去决定接下来去执行哪个程序。又变得安全了。

上下文切换

当进行时钟中断的时候,os可能会停止A程序的执行转而执行B程序。这时我们就需要寄存器上保存A程序的运行信息,比如他执行了多久,当再次切换回执行A程序的时候能够快速恢复并继续执行。这个过程就是上下文切换。

进程同步

为什么需要进程同步:(共享资源问题)
如果有一个资源是共享的,他存储在内存中,而由于CPU切换程序非常快,当多个进程共同执行。
一个进程操作内存中的数据分为三部:1.从内存中拷贝数据放到寄存器中。2.寄存器中数值操作+1。 3.将寄存器中数据拷贝回内存。
由于每个进程都要拷贝数据操作,然后放回内存,这个中间过程就容易出现问题。由于CPU切换程序,当程序A在拿内存中数据到自己的寄存器操作还没操作完时,这时程序B也去拷贝了这个数据。这就造成了这个数据的数值会错误操作。因为这里时拷贝数据而不是将这个数直接拿走,如果一个进程直接将这个数拿走,别人拿不到,那么就不会出现这个问题了。所以一种解决方法就是将这个数据加锁,当一个进程操作共享数据时,其他进程是不能操作该数据的。

共享资源问题如何去解决:同步(同步告知其他进程)。也就是当A进程操作共享数据的时候,通知其他资源,其他进程能够知道A程序拿资源了。其他进程就不去拿这个资源等待释放。

进程间的通信的几种方式

  1. 管道:半双工,管道只允许单向通信,数据只能向一个方向流动,需要双方通信时,需要建立两个管道。一个进程写数据另一个进程读数据,并且按照先进先出的顺序。管道随进程,进程在管道在,进程消失管道对应的端口也关闭,两个进程都消失管道也消失

  2. 消息队列:在内存中放一个消息队列,她独立于发送进程、接受进程而存在, 发送方把消息发送到消息队列,接收方从消息队列取消息。他与管道不同的是管道的队列存储在硬盘中访问速度慢,而消息队列的队列存放在内存中速度快。管道是数据流形式,而消息队列是数据块形式,类似与TCP和UDP。消息队列允许一个或多个进程向它写入与读取消息,所以需要唯一标识符来确定哪个。

  3. 共享内存:可以说这是最高效的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作保证数据正确性,如锁和信号量等;

  4. 信号量:信号量实质上就是一个标识可用资源数量的计数器,可以理解为一个简单的锁,一个共享资源中由一个信号量标识,当一个进程访问的时候,这个信号量就-1,变为0,这时其他资源就不能访问,当进程释放共享资源,信号量就+1,大于0,这时其他进程可以访问。他一般和共享内存配合使用。

  5. 信号(signal):用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中的进程捕获到这个信号然后作出一定的操作并最终被终止。

  6. socket通信:以上都是单核通信,而socket指网络间不同进程通信

进程调度(策略)算法

https://www.cnblogs.com/xiaolincoding/p/13631224.html
1、时间片轮转调度算法(RR):给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完一个进程的时间片就就把该进程挂起转而执行另一个进程,也就是说每个进程都执行等长时间。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
2、先来先服务调度算法(FCFS):根据进程到达的先后顺序执行进程,不考虑等待时间和执行时间,会产生饥饿现象。属于非抢占式调度,优点是公平,实现简单;缺点是不利于短作业。
3、优先级调度算法(HPF):在进程等待队列中选择优先级最高的来执行。
4、多级反馈队列调度算法:当前大多数系统采用,将时间片轮转与优先级调度相结合,把进程按优先级分成不同的队列,先按优先级调度,优先级相同的,按时间片轮转。优点是兼顾长短作业,有较好的响应时间,可行性强,适用于各种作业环境。

中断

所谓的中断就是在计算机执行程序的过程中,由于出现了某些特殊事情,使得CPU暂停对程序的执行,转而去执行处理这一事件的程序。等这些特殊事情处理完之后再回去执行之前的程序。中断一般分为三类:

  1. 内部异常中断: 由计算机硬件异常或故障引起的中断
  2. 软中断:由程序中执行了引起中断的指令而造成的中断。
  3. 外部中断:由外部设备请求引起的中断。简单来说,对中断的理解就是对一些特殊事情的处理。

中断优先级

另一个与中断紧密相连的概念就是中断的优先级。中断的优先级说明的是当一个中断正在被处理的时候,处理器能接受的中断的级别。中断的优先级也表明了中断需要被处理的紧急程度。每个中断都有一个对应的优先级,当处理器在处理某一中断的时候,只有比这个中断优先级高的中断可以被处理器接受并且被处理。优先级比这个当前正在被处理的中断优先级要低的中断将会被忽略。

典型的中断优先级如下所示:
机器错误 > 时钟 > 磁盘 > 网络设备 > 终端 > 软件中断
当发生软件中断时,其他所有的中断都可能发生并被处理;但当发生磁盘中断时,就只有时钟中断和机器错误中断能被处理了。

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/114858841