您的位置:首页 > 其它

进程&线程小结

2015-10-14 23:07 141 查看
进程
一. 进程的基本概念

进程是系统进行资源分配的基本单位(竞争计算机资源的基本单位)
一个进程就是一个程序在内存中的执行实例,其包括PC、寄存器和变量的当前值等
一个进程可以包含多个程序,它是关于某个数据集合的一次运行活动
每一个进程有独立的地址空间和控制线程
任意一段时间会有多个进程在运行,但任意时刻只有一个进程在运行

二. 进程的创建
有4种主要事件导致进程的创建:

系统初始化
执行了正在运行的进程所调用的进程创建系统调用
用户请求创建一个进程
一个批处理作业的初始化

三. 进程的状态



1. 进程有三种状态:

运行态:该时刻进程实际占用CPU
就绪态:可运行,但因为其他进程正在运行而暂时停止
阻塞态:除非某种外部事件发生,否则进程不能运行

2. 状态之间的转换:

运行->阻塞:当操作系统发现进程不能运行下去时,进程阻塞,如一个进程因为等待键盘输入而阻塞
运行->就绪:进程调度程序认为一个运行进程占用处理器的时间已经过长,决定让其他进程使用CPU时间,会发生此转换
就绪->运行:进程调度程序认为已经让其他所有进程享有了它们应有的公平待遇而重新轮到第一个进程再次占用CPU时发生此转换
阻塞->就绪:当进程等待一个外部事件发生时,发生此转换

四. 进程的实现
为了实现进程模型,操作系统维护者一张表格(即进程表,一个结构数组)。每个进程占用一个进程表项(即进程控制块PCB)。该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配情况、所打开的文件状态、账号和调度信息,以及其他在进程中由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证进程随后能再次启动,就像从未被中断过一样。
如下为进程表表项的一些字段,可见进程表项中的字段是与系统密切相关的:



线程
一. 线程的基本概念

线程是CPU进行分派与调度的基本单位,线程也叫轻量级进程
每个线程有其自己的堆栈,里面包括PC、寄存器、堆栈、状态等
一个进程中总是存在若干线程
线程可与同属一个进程的其他线程共享进程所拥有的全部资源,同一个进程中的多个线程可以并发执行
一个线程可以创建和撤销另一个线程

二. 线程模型
线程模型试图实现的是,共享一组资源的多个线程的执行能力,以便这些线程可以为完成某一任务而共同工作,如下图所示,第一列给出了在一个进程中所有线程共享的内容,第二列给出了每个线程自己的内容:



进程与线程的区别

进程是线程的容器,一个进程可以包含若干线程
进程间相互独立,拥有不同的代码和数据空间,而位于同一进程下的线程共享进程的数据空间
线程轻量级,力度小,故线程上下文开销比进程小
进程创建的目的是竞争系统资源,线程创建的目的是合作完成某种任务。
进程用于把资源集中到一起,而线程则是在CPU上被调度执行的实体;进程在获得CPU时间后,线程就会在地址空间内利用进程的资源完成某种任务

IPC进程间通信方式

无名管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
高级管道(popen):将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。
有名管道 (named pipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

进程同步方式

临界区:对共享内存进行访问的程序片段。通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占。
信号量:它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目 .信号量对象对线程的同步方式与前面几种方法不同,信号允许多个线程同时使用共享资源,这与操作系统中的PV操作相同。它指出了同时访问共享资源的线程最大数目。它允许多个线程在同一时刻访问同一资源,但是需要限制在同一时刻访问此资源的最大线程数目。
互斥量:采用互斥对象机制。 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥对象只有一个,所以能保证公共资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享 .互斥量比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。
事件:通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。

进程调度策略
一. 调度介绍
在操作系统中,完成进程选择工作的这一部分称为调度程序,该程序使用的算法称为调度算法。为了选取正确的进程运行,调度程序还要考虑CPU的利用率,因为进程切换的代价是比较高昂的。首先用户态必须切换到内核态(控制权由用户转到操作系统);然后要保存当前进程的状态,包括在进程表中存储寄存器值以便以后重新装载。在许多系统中,内存映像(如页表内的内存访问位)也必须保存;接着,通过运行调度算法选定一个新进程;之后,应该将新进程的内存映像重新装入MMU;最后新进程开始运行。除此之外,进程切换还要使整个内存高速缓存失效,强迫缓存从内存中动态重新装入两次(进入内核一次,离开内核一次)。总之,如果每秒钟切换进程的次数太多,会耗费大量CPU时间。

二. 进程行为
某些进程花费了绝大多数时间在计算上,而其他进程则在等待I/O上花费了绝大多数时间。前者称为计算密集型,后者称为I/O密集型。

三. 何时调度:

在创建一个进程后,需要决定是运行父进程还是运行子进程
在一个进程退出时必须做出调度决策
在一个进程阻塞在I/O和信号量上或由于其他原因阻塞时,必须选择另外一个进程运行

四. 调度算法
1. 两个重要概念:

抢占式:当一个新进程到达就绪队列而当前有进程正在执行时,如果与当前运行的进程相比,新进程可能有一个更短的CPU区间,它会抢占当前运行的进程。
非抢占式:当一个新进程到达就绪队列而当前有进程正在执行时,如果与当前运行的进程相比,新进程可能有一个更短的CPU区间,它会先允许当前进程完成其CPU区间,然后才会被调度。

2. 进程调度算法
(1)FCFS(先到先服务调度):

基本概念:先请求CPU的进程先分配到CPU。当一个进程进入到就绪队列,其PCB链接到队列的尾部,当CPU空闲时,CPU分配给位于队列头的进程,接着该运行进程从队列中删除
存在问题:FCFS简单好理解,公平,易于实现,但当所有其他进程都等待一个大进程释放CPU时,会产生护航效果。与让较短进程最先执行相比,这样会导致CPU和设备的利用率变得更低

(2)SJF(最短作业优先调度):

基本概念:这一算法将每个进程与其下一个CPU区间段相关联(在这里,下一个CPU区间通常可预测为当前CPU区间的测量长度的指数平均)。当CPU空闲时,它会赋给具有最短CPU区间的进程,如果两个进程具有同样长度,那么可以使用FCFS调度来处理。
抢占式SJF:SJF分为抢占式和非抢占式,抢占式SJF调度有时称为最短剩余时间优先调度。

(3)PSA(优先级调度):

基本概念:每个进程都有一个优先级与其关联,具有最高优先级的进程会分配到CPU。具有相同优先级的进程按FCFS顺序调度。SJF算法可作为通用优先级调度算法的一个特例。
存在问题:无穷阻塞或饥饿,优先级调度算法会使某个低优先级进程无穷等待CPU。
解决方法:老化技术,以逐渐增加在系统中等待很长时间的进程的优先级。

(4)RR(轮转法调度):

基本概念:给每一个进程分配一段CPU时间,称作它的时间片,即该进程允许运行的时间。
存在问题:性能依赖于时间片大小的设置。时间片设得太短会导致过多的上下文切换,增加系统开销;而设得太长就演变成了FCFS调度,可能引起对短的交互请求的响应变差。
解决方案:将时间片设为100毫秒通常是一个比较合理的折衷。

(5)MQSA(多级队列调度):

基本概念:将就绪队列分成多个独立队列,根据进程的属性,如内存大小、进程优先级、进程类型,一个进程被永久分配到一个队列。每个队列有自己的调度算法。另外,队列之间必须有调度,通常采用固定优先级抢占调度。
存在问题:进程并不从 一个队列转移到另一个队列,这种设置的优点是低调都开销,缺点是不太灵活。

(6)MFQSA(多级反馈队列调度):

基本概念:多级反馈队列调度算法允许进程在队列之间移动。主要思想是根据不同CPU区间的特点以区分进程,如果进程使用过多CPU时间,那么它会被转移到更低优先级队列。此外,在较低优先级队列中等待时间过长的进程会被转移到更高优先级队列,这种形式的老化阻止饥饿的发生。
存在问题:需要一些方法来选择参数以定义最佳的调度策略,显得太过复杂
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: