操作系统之进程管理_2019-11-15

进程实体

 进程的作用(为什么需要进程)

  程序是指令、数据及其组织形式的描述,进程是程序的实体,是操作系统结构的基础,进程是线程的容器。

  进程是进行资源分配和调度的基本单位。

  进程作为程序独立运行的载体保障程序正常执行。

  进程的存在使得操作系统资源的利用率大幅提升。

  没有配置OS之前,资源属于当前运行的程序,一个程序将会占用所有的资源。

  配置OS之后,引入多道程序设计的概念,可以并发多个程序,而且操作系统可以进行合理的隔离资源和运行环境,

  做到合理的分配资源,提高了资源的利用率。

 主存中的进程形态(进程实际上的样子)

  在主存中,进程是一段连续存储的空间,这个空间称为进程控制块(PCB),

  进程控制块(PCB):

   用于描述和控制进程运行的通用数据结构,也就是说每一个进程都有PCB

   记录进程当前状态和控制进程运行的全部信息

   PCB的使得进程是能够独立运行的基本单位,每个进程都依赖进程控制块去被操作系统所调度或被控制

   PCB是操作系统进行调度经常会被读取的信息

   PCB是常驻内存的,存放在系统专门开辟的PCB区域内

  块中信息如下:

  标识符:标识符是唯一标记一个进程的符号,用于区别其他进程。比如进程ID就是唯一的标识符

  状态:标记进程的进程状态,如:运行状态、阻塞状态

  程序计数器:在CPU中也有类似的设备,在这里功能也是类似的,会指向进程即将被执行的下一条指令的地址

  内存指针:程序代码、进程数据相关指针

  上下文数据:进程执行时处理器存储的数据,处理器中有相关的寄存器和高速缓存,这些数据就是进程的上下文数据

  IO状态信息:存储被进程IO操作所占用的文件列表,在Linux中所有的信息都是以文件的形式存在的,我们所操作的磁盘、
  内存、文件,都会以文件的形式存在于此

  记账信息:使用处理器时间、时钟数总和等

  ......

  总结起来可以分为四类:进程标识符、处理机状态、进程调度信息、进程控制信息

 进程与线程

  进程(Process)与线程(Thread):

   线程是操作系统进行运行调度的最小单位,线程包含在进程之中,是进程中实际运行工作的单位,线程属于进程。

   一个进程可以并发多个线程,每个线程执行不同的任务,在一个进程中任务比较庞大的时候,里面的线程可以分别完成不同的任务。

   进程的线程会共享进程资源。

   线程间通过读写同一个进程间的数据进行通讯。

 

   

 

 

 

五状态模型  

 

 就绪状态

  当进程被分配到除CPU以外所有必要的资源后,只要再获得CPU的使用权,就可以立即运行

  其他资源都准备好、只差CPU资源的状态为就绪状态。

  就绪队列:在一个系统中多个处于就绪状态的进程通常排成一个队列,如下:

 

 执行状态

  进程获得CPU,其程序正在执行称为执行状态。

  在单处理机中,在某个时刻只能有一个进程是处于执行状态。

 阻塞状态

  进程因某种原因如:其他设备未就绪而无法继续执行。

  从而放弃CPU的状态称为阻塞状态。

  阻塞状态可以由执行状态转换而来,比如缺少IO资源,若IO资源准备就绪,将会再次被转换为就绪状态。

  阻塞队列:与就绪队列相似,如下:

  

 创建状态

  创建进程时拥有PCB但其他资源尚未就绪的状态称为创建状态,若所有资源都准备好了唯独缺CPU资源就属于就绪状态。

  操作系统提供fork函数接口创建进程。

 终止状态

  进程结束由系统清理或者归还PCB的状态称为终止状态
 

进程同步

 为什么需要进程间同步?

  生产者-消费者问题

   有一群生产者进程在生产产品,并将这些产品提供给消费者进程进行消费,生产者进程和消费者,

   进程可以并发执行,在两者之间设置了一个具有n可缓冲区的缓冲池,生产者进程

   需要将所生产的产品放到一个缓冲区中,消费者进程可以从缓冲区取走产品消费。 


  

   在生活中:

   生产者往缓冲区 +1

   消费者往缓冲区-1

   生活中这种模型并没有问题

 

   在计算机中:

   缓冲是在Cache上的

   生产和消费可看做发生在寄存器中

   操作缓冲需要三个步骤

   register=count

   register=register+1

   count=register

   单从生产者程序或消费者程序去看是没问题的

   单两者并发执行时就可能出差错 

   哲学家进餐问题

   有五个哲学家,他们的生活方式是交替地进行思考和进餐,哲学家们共同使用一张圆桌,分别坐

   在周围的五张椅子上,在圆桌上有五个碗和五支筷子。平时哲学家们只进行思考,饥饿时则试图

   取靠近他们的左、右两支筷子,只有两支筷子都被他拿到的时候就能进餐,进餐完毕之后,放下

   左右筷子继续思考。

   

 

   临界资源:一次仅允许一个进程使用的资源称为临界资源,在这个问题中,想要哲学家不饿死,就需要将筷子设置为临界资源。   
   临界区:对临界资源进行访问的那段代码称为临界区。

 进程间同步的原则和方法

  产生上述问题的根源问题是彼此相互之间没有通信,如果生产者通知消费者我已经完成一件生产,哲学家向旁边哲学家说我要进餐了,

  所以我们需要进程间的同步,也就是说进程同步主要解决的是对竞争资源在多进程间进行使用次序的协调,和使得并发执行的多个进程

  之间可以有效使用资源和相互合作,这两个也是根源的需求。

  临界资源:临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。

       当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释

       放该共享资源才可重新竞争使用共享资源。

  进程同步原则

  空闲让进:资源无占用,允许使用。

  忙则等待:资源有占用,请求进程等待。

  有限等待:保证有限等待时间能够使用资源,避免僵死等待。

  让权等待:等待时,进程需要让出CPU,进程从运行状态进入阻塞状态,等待结束在重新获得CPU的使用权。

  进程同步的方法

   消息队列

   共享存储

   信号量

 线程同步

   一个进程中有多个线程,多个线程是共享进程中的资源的,所以线程间多线程也是需要同步的。

  线程同步的方法

   互斥量,是保证线程可以互斥使用临界资源的锁。

   读写锁,应对多读少写或者多写少读的情况而发明出来的锁。

   自旋锁

   条件变量

 Linux的进程管理

  Linux进程的相关概念

   进程的类型
    前台进程:前台进程就是具有(占用:无法输入其他命令)终端,可以和用户交互(输入输出)的进程。
    后台进程:与前台进程相对,没有占用终端的就是后台进程,基本不与用户进行交互,优先级较前台低
         将需要执行的命令以“&”符号结束,会获得后台进程的ID,而且仍可以操作终端shell,ctrl+c并不能停止。
         需要使用kill命令来关闭。可以使用重定向来把结果输出到它处。
    守护进程:一种特殊的后台进程,很多守护进程在系统引导的时候启动,一直运行直到系统关闭,
         如:crond、httpd、sshd、mysqld,进程名字以“d”结尾的一般都是守护进程。
   进程的标记
    进程ID(进程的唯一标识符):

    进程ID是进程的唯一标记,每个进程拥有不同的ID,表现为一个非负整数,最大值由操作系统限定。

    使用top命令查看所有的进程,可以查看PID(进程ID)。

    ID为0的进程为idle进程,是系统创建的第一个进程,ID为1的进程为init进程,是0号进程的子进程,

    用来完成系统初始化,Init进程是所有用户进程的祖先进程,所有的用户进程都由它创建而来。

    进程的层级关系:

    进程A为进程B的父进程,B为子进程。父子关系使用pstree命令来查看。

     

 

 

 

    进程的状态标记

    通过man ps来了解linux中各种进程状态中的标记

    使用ps -aux(打印进程详细的信息) | grep PID或者其他关键字 来查看某些进程的状态标记。

     

 

 

  操作Linux进程的相关命令

◆ ps命令:ps命令常用于显示当前进程的状态

     查看某用户的进程 ps -u userName

     查看某些进程的详细信息 ps -aux | grep(检索特定进程) ‘关键字,如python’

     查看进程树,可查看进程的父子状态 ps -ef --forest 

     根据进程所使用的CPU情况或内存情况进行排序 ps -aux - -sort=-pcpu ,ps -aux - -sort=-pmen

◆ top命令:可查看系统里的进程的所有的状态

◆ kill命令:用于给特定的进程发送指定的信号,kill -9(无条件停止) PID 

     只有(SIGKILL 9)信号可以无条件终止进程,其他信号进程有权忽略

     kill –l 可以查看操作系统支持的信号

   

 

   

 

 

 

 

posted @ 2019-11-19 11:18  焚舟破釜  阅读(184)  评论(0)    收藏  举报