操作系统进程管理

进程、线程、程序

进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的系统资源管理实体。

进程具有三个特性,即动态性、独立性和并发性。所谓动态性,指的是进程表示动态执行的程序,每时每刻进程的状态都是在变化的。所谓独立性,指的是进程和进程之间一般不会相互影响,每一个进程都有自己独立的逻辑的状态,如寄存器在某时刻的值。所谓并发性,指的是在宏观意义上将,多个进程在一个CPU上可以实现并发运行,如果存在多个CPU核则可以实现真正的并行运算。

在一次完整的执行过程中,一个进程可能处于三种状态之一:运行态、就绪态和阻塞态。所谓运行态指的是进程占据CPU,使用CPU进行程序运行的过程。就绪态指的是CPU由于某种原因不能执行当前的进程,该进程已准备就绪,随时等待CPU执行的状态。而阻塞态指的是进程由于在等待某种事件(如IO输入等)而处于暂停状态,此时即使给它CPU使用权限也无法运行该进程。这三种状态可以相互转化(除了就绪态不能直接转到阻塞态,阻塞态不能直接转到运行态)。

操作系统中可能有多个进程并发运行,每个进程又有三种状态。为了解决不同进程、不同状态的管理,操作系统设立了一组队列来表示系统中所有进程的状态。处于运行态的进程构成运行队列,处于就绪态的进程构成就绪队列,处于阻塞态的进程构成阻塞队列。随着操作系统对进程的调度,某个进程依照状态的变化被移除某个队列并加入到另一个队列中。

线程一般运行于进程内部,它与进程最主要的区别就是对系统资源的占有。一个线程基本上不占有系统资源,其所使用的资源归属于线程所在的进程,而这个进程中的各个线程都可以共享这些资源。同一个进程中的线程可以共享的资源主要有:大部分进程管理信息(进程的ID/状态/优先级等)、存储信息(代码段、数据段、堆)和文件管理信息(进程打开的文件)。另外,每一个线程还包含部分独享信息,主要有逻辑寄存器和栈。

这样就可以得出结论:进程拥有完整的一套资源平台,是系统资源的分配单位;而线程只独享少量必须的资源,是CPU的调度单位,进程的三种状态及转换同时也适用于线程。

用户线程和内核线程

根据操作系统内核是否对线程可感知,可以把线程分为内核线程和用户线程。

内核线程建立和销毁都是由操作系统辅助、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况作出调度决定。如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。

和内核线程相对应的是用户线程,用户线程指不需要内核支持而在用户程序中实现的线程,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。

用户线程的优点:
(1)可以在不支持线程的操作系统中实现。
(2)创建和销毁线程、线程切换等线程管理的代价比内核线程少的多。
(3)允许每个进程定制自己的调度算法,线程管理比较灵活
(4)线程能够利用的表空间和堆栈空间比内核级线程多。

用户线程的缺点:
操作系统内核并不了解这种线程,而依然采用对进程的调度方式,这样一旦进程中的用户线程发生了阻塞,那么整个进程也将被阻塞,起不到并发的作用

内核线程的优缺点刚好跟用户线程相反。实际上,操作系统可以使用混合的方式来实现线程。

进程间通信

进程间通信方式基本上分为低级通信和高级通信两类。前者可以在进程间传递少量的控制信息,通常为一个字节或整型变量,方式有信号或信号量等;后者可以在进程间传递大量的数据,如一个文件或缓冲区内容,可以通过共享内存、消息传递和管道等。

  • 共享内存是操作系统提供的一种功能。操作系统采用虚拟存储管理技术,每个进程都有自己的独立内存地址空间,操作系统再将这些地址空间映射到实际的物理内存中去。操作系统可以提供一些API,使得进程将一部分地址空间共享出来映射到同一块物理内存,实现进程间信息的交流和共享。
  • 消息传递是进程间通过发送和接收消息来交换信息。首先需要在两个进程之间建立一个通信链路,然后调用发送和接受操作交换信息。
  • 管道是链接在两个进程之间的打开的共享文件,发送进程从一端写入数据,读取进程从另一端读出数据。这种方式涉及到了文件操作,因此比共享内存慢一些。

进程的互斥

当两个或多个进程对同一块数据进行读写时,若运行的事件和顺序不同,那么最后的结果可能不同,这种状态被称作竞争状态。解决这个问题的一个有效方法就是在同一时刻只允许一个进程访问共享数据。访问共享数据的程序称为临界区,被访问的共享数据称为共享资源。
关于临界区:
(1)如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入;
(2)任何时候,处于临界区内的进程不可多于一个。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待;
(3)进入临界区的进程要在有限时间内退出,以便其它进程能及时进入自己的临界区;
(4)如果进程不能进入自己的临界区,则应让出CPU,避免进程出现“忙等”现象。

进程同步

进程间同步的主要方法有原子操作、信号量机制、自旋锁、管程、会合、分布式系统等。
信号量:
定义一个初始值为0的信号量,在进程A执行结束前进行V操作,在进程B的最开始执行P操作,这样可以确保B在A执行之前不会启动。

进程调度

一般进程的调度有两种方法:不可抢占调度和可抢占调度,前者一旦一个进程被选中,在它被阻塞或主动交出CPU之前不会被中止,后者可能随时被调度程序打断。

在批处理系统中,采用的调度算法主要有先来先服务法和短作业优先法。在交互式系统中的调度算法主要有时间片轮转法、优先级算法、多级队列算法和多级反馈队列算法等。

死锁

 在两个或多个并发进程中,如果每个进程持有某种资源而又都等待别的进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗地讲,就是两个或多个进程被无限期地阻塞、相互等待的一种状态。

 产生死锁的必要条件:

  (1)互斥(mutualexclusion),一个资源每次只能被一个进程使用;

  (2)不可抢占(nopreemption),进程已获得的资源,在未使用完之前,不能强行剥夺;

  (3)占有并等待(hold andwait),一个进程因请求资源而阻塞时,对已获得的资源保持不放;

  (4)环形等待(circularwait),若干进程之间形成一种首尾相接的循环等待资源关系。

  这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

  死锁的解除与预防:理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态的情况下占用资源。因此,对资源的分配要给予合理的规划。

  死锁的处理策略:鸵鸟策略、预防策略、避免策略、检测与恢复策略。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值