1. 进程
程序本身只是指令的集合,是静态实体,不能和其他程序并发执行。引入进程的目的就是为了能够使多个程序能够并发执行。进程是程序的一次执行,有两个基本属性:① 进程是一个可拥有资源的独立单位; ② 进程同时又是一个可独立调度和分派的基本单位。正是由于进程有这两个基本属性,才使之成为一个能独立运行的基本单位,从而构成了进程并发执行的基础。
进程的特征:
1) 结构特征:为使程序能独立运行,应为之配置一进行控制块,即PCB,而由程序段、相关数据段和PCB三部分构成进程实体。所谓创建进程、撤销进程,实质上是创建、撤销进程实体中的PCB。
2) 动态性:进程是进程实体的一次执行过程,有一定的生命期。
3) 并发性:多个进程实体同存在于内存中,且能在一段时间内同时运行。
4) 异步性:进程按各自独立的、不可预知的速度向前推进,即按异步方式运行。
进程的5种状态,前3种是基本状态:
1) 运行状态:进程在处理器上运行。单处理器每一时刻最多只有一个进程处于运行状态
2) 就绪状态:进程处于准备运行的状态,即进程已获得除处理器之外的一切所需资源,一旦得到处理器即可运行
3) 阻塞状态:进程正在等待某一时间而暂停运行,如等待某资源为可用(不包括处理器)或等待输入、输出完成。即使处理器空闲,该进程也不能运行。
4) 创建状态:进程正在被创建,尚未被转移到就绪状态
5) 结束状态:进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。
进程的三个基本状态之间是可以相互转换的,如图所示。当一个就绪进程获得处理器时,其状态由就绪变为执行。当一个运行进程被剥夺处理器时,如用完系统分给它的时间片、出现更高优先级别的其他进程,其状态由运行变为就绪。当一个运行进程因某件事件受阻时,如所申请资源被占用、启动I/O传输未完成,其状态由执行变为阻塞。当所等待事件发生时,如得到申请资源、I/O传输完成,其状态由阻塞变为就绪。
进程和程序的区别:
1) 进程是一个动态概念,是程序及其数据在计算机上的一次运行活动。而程序是一个静态概念,是一组有序的指令集合。
2) 进程是程序的一次执行过程,是动态地创建和消亡的,具有一定的生命期,暂时存在的;程序是一组代码的集合,永久存在的,可长期保存。
3) 一个进程可以执行一个或几个程序,一个程序也可以构成多个进程。进程可以创建进程,但程序不能形成新的程序。
4) 进程和程序的组成不同。进程的组成包括程序、数据和进程控制块。
2. 线程
操作系统中引入进程的目的,是为了使多个程序能并发执行,以提高资源利用率和系统吞吐量,那么在操作系统中再引入线程,则是为了减少程序在并发执行时所付出的时空开销,使OS具有更好的并发性。
进程是并发的基础,为使程序能并发执行,系统还必须进行以下的一系列操作:
1) 创建进程:系统在创建一个进程时,必须为它分配其所必需的、除处理器以外的所有资源,如内存空间、I/O设备,以及建立相应的PCB
2) 撤销进程:系统在撤销进程时,必需先对其所占有的资源执行回收操作,然后再撤销其PCB
3) 进程切换:在对进程进行切换时,由于要保留当前进程的CPU环境和设置新选中进程的CPU环境,因此需花费不少的处理机时间
换言之,由于进程是一个系统资源拥有者,因而在创建、撤销和切换中,系统必须为之付出较大的时空开销。为了能使多个程序更好的并发执行同时又尽量减少系统的开销,可以将进程的上述两个属性由操作系统分开处理,进而引入线程,以线程作为调度和分派的基本单位。线程被称为轻量级进程,通常一个进程拥有若干个线程,至少也有一个线程。
下面从以下几个方面对线程和进程进行比较:
1) 调度:在引入线程的操作系统中,把线程作为调度和分派的基本单位,而进程作为资源拥有的基本单位,即把传统的进程的两个属性分开,使线程基本上不拥有资源,这样线程轻装前进,从而可显著地提高系统的并发程度。
2) 并发性:不仅进程之间可以并发执行,在一个进程中的多个线程之间亦可以并发执行,使得操作系统具有更好的并发性。
3) 拥有资源:进程是系统中拥有资源的基本单位,而线程不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可以访问其隶属进程的资源。
4) 系统开销:创建或撤销进程时,系统都要为之创建和回收PCB,分配或回收资源,如内存空间和I/O设备等,操作系统所付出的开销明显大于线程创建或撤销时的开销。类似地,进程切换时,涉及到当前进程CPU环境的保存及新被调度运行进程的CPU环境的设置,而线程的切换仅需保存和设置少量寄存器内容,不涉及存储管理方面的操作。
5) 地址空间和其他资源:进程的地址空间之间相互独立,同一进程的各线程共享内存地址空间即共现进程的资源,某进程内的线程对于其他进程不可见。
6) 通信方面:进程间通信需要借助操作系统,而线程间可以直接读/写进程数据段(如全局变量)来进程通信。
3. 进程同步
在OS中引入进程后,虽然提高了资源的利用率和系统的吞吐量,但由于进程的异步性,也会给系统造成混乱,尤其是他们争用临界资源时。例如:当多个进程去争用一台打印机时,有可能使多个进程的输出结果交织在一起,难以区分;当多个进程去争用共享变量、表格、链表时,有可能致使数据处理出错。进程同步的主要任务是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互,从而使程序的执行具有可再现性。
临界资源:多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程使用,我们把一次仅允许一个进程使用的资源称为临界资源。每个进程中,访问临界资源的那段代码称为临界区。
同步机制应遵循的规则:空闲让进;忙则等待;有限等待;让权等待。
四种解决进程同步和互斥的方法:
1) 临界区:在任意时刻只允许一个线程对共享资源进行访问。假如有多个线程试图同时访问临界区,那么在有一个线程进入后其他任何试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区的同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。
2) 互斥量:跟临界区很相似。只有拥有互斥对象的线程才具备访问资源的权限,由于互斥对象只有一个,因此就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完成之后应将拥有的互斥对象交出,以便其他线程在获得后以访问资源。互斥量比临界区复杂。因为使用互斥不但仅能够在同一进程不同线程中实现资源的安全共享,而且还能在不同进程的线程之间实现对资源的安全共享。
3) 信号量:允许多个线程同时使用共享资源。指出了同时访问共享资源的线程最大数目。允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
4) 事件:事件对象也能够通过通知操作的方式来保持线程的同步,并能够实现不同进程中的线程同步操作。
区别:临界区只能用来同步本进程内的线程,而不可用来同步多个进程中的线程;互斥量、信号量、事件都可以被跨越进程使用来进行同步数据操作。
4. 进程间的通信:
1) 管道:所谓“管道”是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,又名pipe文件。发送进程和接收进程是利用管道进行通信的故称为管道通信。
2) 消息队列:是有消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
3) 信号量:是一个计数器,可以用来控制多个进程对共享资源的访问,常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。
4) 信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
5) 共享内存:相互通信的进程共享某些数据结构或共享存储区,进程之间能够通过这些空间进行通信。
6) 套接字(socket):也是一种进程间通信机制,与其他通信机制不同的是,它可以用于不同机器之间的进程通信。