进程管理
Posted yuanzhijing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程管理相关的知识,希望对你有一定的参考价值。
1.进程
进程(Process)是计算机已运行程序的实体。
程序本身只是指令的集合,进程才是程序(那些指令)的真正运行。用户下达运行程序的命令后,就会产生进程。同一程序可产生多个进程(一对多关系),以允许同时有多位用户运行同一程序,却不会相互冲突。进程需要一些资源才能完成工作,如CPU使用时间、存储器、文件以及I/O设备,且为依序逐一进行,也就是任何时间内仅能运行一项进程。
通常进程有如下5种状态,其中前3种是进程的基本状态。
1)运行状态(执行窗台):进程正在处理器上运行。在单处理器环境下,每一时刻最多只有一个进程处于运行状态。
2)就绪状态:进程已处于准备运行的状态,即进程获得了除处理器之外的一切所需资源,一旦得到处理器即可运行。
3)阻塞状态:进程正在被创建,尚未转到就绪状态。
4)结束状态:进程正在从系统消失,可能是进程正常结束或其他原因中断退出运行。
进程的三个基本状态之间是可以相互转换的:
当一个就绪进程获得处理机时,其状态由就绪变为执行;
当一个运行进程被剥夺处理机时,如用完系统分给它的时间片、出现更高优先级别的其他进程,其状态由运行变为就绪;
当一个运行进程因某事件受阻时,如所申请资源被占用、启用I/O传输未完成,其状态由执行变为阻塞;
当所等待事件发生时,如得到申请资源、I/O传输完成,其状态由阻塞变为就绪。如下图所示:
进程与程序的区别:
1)进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序、离开程序的进程没有存在的意义。从静态角度看,进程是由程序、数据和进程控制块(PCB)三部分组成的。而程序是一组有序的指令集合,是一种静态的概念。
2)进程是程序的一次执行过程,它是动态地创建和消亡的,具有一定的生命期,是暂时存在的;而程序则是一组代码的集合,它是永久存在的,可长期保存。
3)一个进程可以执行一个或几个程序,一个程序也可以构成多个进程。进程可创建进程,而程序不可能形成新的程序。
4)进程与程序的组成不同。进程的组成包括程序、数据和进程控制块。
创建新进程时会创建新的地址空间:子进程是父进程的复制品,在fork之后子程序获得父进程的数据空间、堆和栈的复制品,而线程使用当前的地址空间。
2.线程
线程,有时被称为轻量级进程(Lightweight Process, LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈(stack)组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的资源。
线程共享的进程环境包括:进程代码段、进程的公有数据(如全局变量,利用这些共享的数据,线程很容易的实现相互之间的通信)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。线程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:
1)线程ID
每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。
2)寄存器组的值
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有线程的寄存器集合的状态进行保存,以便将来该线程在被重新切换时能得以恢复。
3)线程的堆栈(stack)
堆栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所有线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。在一个进程的线程共享堆区(heap)。
4)错误返回码
5)线程的信号屏蔽码
6)线程的优先级
一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。
线程也有就绪、阻塞和运行三种基本状态。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
引入线程后,进程的内涵发生了改变,进程只作为除CPU以外系统资源的分配单元,线程则作为处理器的分配单元。在同一进程中,线程的切换不会引起进程的切换,但从一个进程中的线程切换到另一进程中的线程时,将会引起进程的切换。
问题:线程与进程的区别?
1)调度:在传统操作系统中,拥有资源和独立调度的基本单位都是进程。引入线程后,线程是独立调度的基本单位,进程是拥有资源的基本单位。在同一进程中,线程的切换不会引起进程切换。在不同进程中进行的线程切换,则会引起进程切换。
2)拥有资源:不论是传统的还是引入线程的操作系统,进程都是拥有资源的基本单位,线程不拥有资源(也有一点必不可少的资源),但线程可以共享其隶属进程的系统资源。
3)并发性:在引入线程的操作系统中,不仅进程可以并发执行,而且同一进程内的多个线程也是并发执行,从而使操作系统具有更好的并发性,大大提高了系统吞吐量。
4)系统开销:创建和撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,因此操作系统所付出的开销远大于创建或撤销线程的开销。类似地,在进程切换时,涉及当前执行进程CPU环境的保存以及新调度的进程CPU环境的设置;而线程切换时只需保存和设置少量寄存器内容,因此开销很小。另外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间同步与通信比较容易实现,甚至无需操作系统的干预。
5)地址空间和其他资源(如打开的文件):进程的地址空间之间相互独立,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
6)通信方面:进程间通信需要借助操作系统,而线程间可以直接读/写进程数据段(如全局变量)来进行通信。
3.进程通信与进程同步
多个进程可以共享系统中的各种资源,但其中许多资源只能为一个进程使用,我们把一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。对于临界资源的访问,必须互斥的进行,在每个进程中,访问临界资源的那段代码称为临界区(Critical Section)。
进程通信与同步有如下一些目的:
1)数据传输:一个进程需要将它的数据发送给另一个进程;
2)共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到;
3)通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程);
4)资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制;
5)进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
Linux下进程间通信的几种主要手段简介:
1)管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名通信克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;
2)信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction;
3)Message(消息队列):消息队列是消息的链表,包括Posix消息队列System V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
4)共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步及互斥。
5)信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
6)套接口(Socket):更为一般的进程间通信机制,可用于不用机器之间的进程间通信。起初是由UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字。
Linux线程间通信:互斥体(互斥量),信号量,条件变量。
Windows进程间通信:管道、共享内存、消息队列、信号量、socket。
Windows线程间通信:临界区(Critical Section)、互斥量(Mutex)、信号量(信号灯)(Semaphore)、事件(Event)。
临界区(Critical Section)与互斥体(Mutex)的区别:
1)临界区只能用来同步本进程内的线程,而不可用来同步多个进程中的线程:互斥量(Mutex),信号量(Semaphore)、事件(Event)都可以被跨越进程使用来进行同步数据操作。
2)临界区是非内核对象,只在用户态进行锁操作,速度快;互斥体是内核对象,在核心态进行锁操作,速度慢。
3)临界区和互斥体在Windows平台下都可用,Linux下只有互斥体可用。
4.调度算法
调度的基本准则包括CPU利用率、系统吞吐量、周转时间、等待时间、响应时间等。
系统吞吐量表示单位时间内CPU完成作业的数量。
周转时间为作业完成时刻减去作业到达的时刻。
等待时间是指进程处于等处理器状态的时间之和,等待时间越长,用户满意度越低。
响应时间是指从用户提交请求到系统首次产生响应所用的时间。
典型调度算法包括:先来先服务算法(FCFS)、短作业优先算法(SJF)、优先级调度算法、高响应优先调度算法、时间片轮算法、多级反馈队列调度算法。其中SJF的平均等待时间、平均周转时间最少。
5.死锁
死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都无法向前推进。现实生活中简单的例子:交通阻塞,两股相向而行的车流都想通过已被对方占用的道路,结果双方都不能前进。
死锁产生的原因:
1)系统资源的竞争
2)进程推进顺序非法
死锁产生的必要条件:
产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。
互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
不剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
请求和保持条件:又称为部分分配条件。进程每次申请它所需要的一部分资源,在等待新资源的同时,进程继续占有已分配到的资源。
循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
死锁处理策略:
1)预防死锁:设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个。
2)避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态。银行家算法是著名的死锁避免算法。
3)死锁的检测及解除:无须采取任何限制措施,允许进程在运行过程中发生死锁,通过系统的检测机制及时地检测出死锁的发生,然后采取某种措施解除死锁。死锁的检测可利用资源分配图来描述。死锁的解除主要方法如下:
(1)资源剥夺法;
(2)撤销进程法;
(3)进程回退法。
以上是关于进程管理的主要内容,如果未能解决你的问题,请参考以下文章
操作系统 王道考研2019 第二章:进程管理 -- 进程调度的时机(临界资源临界区)切换与过程调度方式调度算法的评价指标(CPU利用率,系统吞吐量周转时间等待时间响应时间)