线程和进程的区别 操作系统 进程 线程概念

每日一题(59)
什么是进程:
1、进程就是执行中的一段程序,也就是说,一旦程序被加载到了内存并准备执行时,它就是一个进程;
2、进程具有文本、数据、堆栈片段以及它自己的资源。资源可以是文件,对象句柄,设备,信号量,互斥量,管道等等;
3、操作系统管理进程以及它的资源,有大量信息与进程有关,这些信息保存在一个称作进程控制块的数据结构中;操作系统就是用这个进程控制块来管理进程以及它的资源;
4、当创建了一个进程的时候,就分配了一个进程空间。文本片段通过一个可执行映像初始化;
什么是线程:
1、线程是一种轻量级进程。与进程相比,线程给操作系统带来的创建、维护和管理负担要轻,因为与线程相关的信息非常少;
2、线程没有地址空间,线程包含在进程的地址空间中;线程文本包含在它的进程的文本片段中;进程拥有的资源线程都可以使用;
3、一个进程里面可以有多个线程,这些线程共享进程的资源;
两者的区别:
1、相同点:
第一:都有上下文内容;
第二:都可以发生上下文切换(发生三种状态的相互转换,运行,阻塞,就绪);
第三:都可以实现并发执行;
2、不同点:
第一:线程是一种轻量级进程;
第二:线程没有自己的线程空间,线程包含在进程的进程空间中;
第三:一个进程可以包含一个或多个线程;
线程安全:
多个线程共享进程的资源,当多个线程都执行一段代码,但是这一段代码会用到一个全局变量并会修改这个全局变量,所以这个时候会出现问题;
多个线程并发执行,当第一个线程读取这个值的时候是3,当正在处理的时候另外一个线程将这个变量的值改为了9,这个时候就可能会出现问题。
这是多个线程并发执行出现的竞争问题,所以需要用到线程的同步方法;线程同步方法,一般有互斥量,互斥量与条件变量配合使用(生产者与消费者模型),信号量,读写锁;
参考:http://blog.csdn.net/linux_ever/article/details/
上面的这些东西都是一些比较小的知识点,想彻底搞懂需要看很多介绍,下面是一些参考资料
具体参考资料:
1、现代操作系统(内容讲的很细很详细挺好,适合进程线程概念入门)
2、C++面向对象多线程编程(第2章,第3章)
3、C++多核高级编程(第5章,第6章)
第2,3这两本书挺好的,尤其是C++多核高级编程(目前只看了前7章,感觉很好)。
最下面这本操作系统的书也挺好的,非常适合操作系统概念入门,我看的第一本操作系统的书,讲的非常好。
重点大学计算机专业系列教材:操作系统 & &----谌卫军,王浩娟 著
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:67056次
积分:2030
积分:2030
排名:第15338名
原创:130篇
转载:19篇
(1)(1)(1)(11)(30)(19)(13)(30)(37)(12)操作系统概念总结_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
操作系统概念总结
上传于||文档简介
&&包​含​操​作​系​统​重​要​概​念​,​及​其​解​释
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩3页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢1665人阅读
C/C++(15)
& & &操作系统通过进程控制块(PCB)表示进程,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
通常一个PCB中包含以下几项:
进程标识符程序计数器:该计数器指明了该进程要执行的下一条指令的地址CPU寄存器:包括累加器、变址寄存器、栈指针、通用寄存器、以及条件信息等。在中断发生时必须要保存这些状态信息,便于后来进程继续正确执行。CPU调度信息:包括优先权,指向调度队列的指针等存储器管理信息:与存储相关记账信息: 包括CPU数量和实时使用量、时间限制等I/O状态信息:包括分配给该进程的I/O设备的列表、打开文件的列表等。
上下文转换:
& & 当将CPU转向另一个进程时需要保存当前进程的状态并载入为新进程存储的状态。这个状态被称为上下文转换。一个进程的上下文表示在进程的PCB中:它包括了CPU寄存器值、进程状态和内存管理信息。当上下文转换发生时,内核存储当前进程PCB中的上下文信息并载入被调度运行的新进程存储的上下文。上下文转换时间是纯粹的开销,因为在转换进行时系统不能做任何有用的工作。上下文转换是一个性能瓶颈,如果有可能,程序就会使用新的结构(线程)来避免。
进程的创建:
进程在运行期间可以创建多个新进程,被创建的新进程称为子进程。Unix系统中通过fork系统调用创建一个新进程。新进程由原始进程的地址空间的一个拷贝构成。如果父进程终止,它所有的子进程都会将init设为自己的父进程。从而子进程仍旧有一个父进程来维护他们的状态和运行统计数据。
& & & 有时被称为轻量级进程(lightweight process LWP),是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合(被中断时保存当前上下文)和栈组成。它与属于同一进程的其它线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。下图可以直观的说明传统的单线程进程和多线程进程之间的差别
(注意:多线程中“堆区”仍是多个线程共享,所以一个线程用new动态创建了新指针变量后,另一个线程也可以使用并销毁,只能被销毁一次)
使用多线程编程线程可以默认共享它们所属进程的内存和资源,进程创建所需要的昂贵的内存和资源的分配,多线程创建由于能够共享所属进程的资源,所以线程创建和上下文切换会更经济。
若干多线程问题:
1.系统调用fork和exec
如果程序中一个线程调用fork,那么新进程会复制所有线程还是新进程只有单个线程?有的unix系统有两种形式的fork,一种复制所有线程,另一种只复制调用了系统调用fork的线程。如果一个线程调用了系统调用exec,那么exec参数所指定的程序会替换整个进程,包括所有的线程。
fork的两种形式的使用与应用程序有关。如果调用fork之后立即调用exec,那么复制所有线程就没有必要。因为exec参数所指定的程序就会替换整个进程。在这种情况下,只复制调用线程比较恰当。不过,如果在fork之后另一个进程并不调用exec,那么另一个进程就应复制所有的线程。
由于子进程通过继承整个地址空间的副本,也从父进程里继承了所有的互斥量、读写锁和条件变量的状态。如果父进程包含多个线程,子进程在fork返回之后,如果不是马上调用exec的话,就需要清理锁状态。
2.信号处理
&信号在unix系统中用做通知进程某个特定事件已经发生了,根据来源和被通知信号的时间,信号可以被同步或者异步接受。不管信号是同步或是异步的,所有的信号具有同样的模式:
1. 信号是由特定的事件所发生的
2. 产生的信号要发送到进程。
3.一旦发送,信号必须要加以处理。
同步信号的例子包括非法内存访问或者被零所除。在这种情况下,如果运行程序执行这些动作中的任何一个,就会产生信号。同步信号发送到执行操作而产生信号的同一进程(这就是为什么它们被认为是同步的)。
当一个信号是由运行进程之外的事件所产生,那么进程就异步地接受这一信号。这种信号的例子包括用特殊键比如Ctrl+C或定时器事件到期以终止进程。通常,异步信号被发送到另一个进程。
单线程程序的信号处理比较直接;信号总是发送给进程,不过,对于多线程程序,发送信号就比较复杂,因为进程可能有多个线程。那么信号应该被发送到哪里呢?
通常有如下选择
1. 发送信号到信号所应用的线程
2. 发送信号到进程内的每个线程
3. 发送信号到进程内的某些线程
4.规定一个特定的线程以接受进程的所有信号
发送信号的方法依赖于所产生信号的类型。例如,同步信号需要发送到产生这一信号的线程,而不是进程中的其他线程。但是对于异步信号,有的异步信号,比如终止进程的信号Ctrl-C应该发送到所有线程。有的多线程版UNIX允许线程描述它会接受什么信号和拒绝什么信号。因此,有些异步信号只能发送给那些不拒绝它的献策很难过。不过,因为信号只能被处理一次,所以信号通常被发送到进程中不决绝它的第一个线程。Solaris2按照第四种方法处理:它在每个进程内创建了一个专门处理信号的线程。当异步信号被发送到一个进程时,它被发送到该特定的线程,进而再将信号传递给第一个不拒绝它的线程。
3. 线程池:
传统的服务器收到请求后,就创建一个独立线程处理请求,虽然创建一个独立线程要比创建一个独立进程要好,但是多线程服务器也有一些潜在问题。第一个是:处理请求之前用以创建线程的时间,以及线程在完成工作后会被丢弃。 第二个是:如果允许所有并发请求都通过新线程来处理,那么并没有限制在系统中并发执行的线程的数量。无限制的线程会用尽系统资源。
可以使用线程池解决此问题。
思想:在进程开始时创建一定数量的线程,并放到池中等待工作。当服务器收到请求时,会唤醒池中的一个线程(如果有可用线程),并将要处理的请求传递给它。一旦线程完成了它的服务,它会返回到池中再等待更多的工作。如果池中没有可用线程,那么服务器会一直等待直到有空线程为止。这样有如下好处:
1. 通常用现有线程处理请求要比等待创建新的线程要快
2.线程池限制了在任何时候可存在线程的数量。对那些不能支持大量并发线程的系统尤为重要。
Unix文件共享:
支持在不同进程间共享打开文件。为了说明文件共享,先来说明内核用于所有的数据结构。
内核使用了三种数据结构,他们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响。
每个进程在进程表中都有一个记录项,每个记录项中有一张打开文件描述符标,可将其视为一个矢量,每个描述符占用一项。与每个文件描述符相关联的是:
文件描述符标志。
指向一个文件表项的指针。
内核为所有打开文件维持一张文件表(注:两个相互独立的进程会各自维护一个文件表,有父子关系的进程共享一个文件表)。每个文件表项包含:
文件状态标志读、写、增写、同步、非阻塞等。
当前文件位移量。
指向改文件节点表项的指针。(注:对于Unix系列的操作系统,大多都有v节点。但是对于linux来说,只有通用的i节点,却没有v节点。i节点存储信息见附录)
每个代开文件或设备都有一个节点结构。节点包含了文件类型和对此文件进行各种操作的函数和指针信息。对于大多数文件,节点还包含了该文件的节点索引节点这些信息是打开文件时从盘上读入内存的,所以所有关于文件的信息都是快速可供使用的。例如,节点包含了文件的所有者、文件长度、文件所在的设备、指向文件在盘上所使用的实际数据块的指针等等。
我们忽略了某些并不影响我们讨论的视线细节。例如,打开文件描述符表通常在用户区而不在进程中。在中,此数据结构是一个链接表结构。文件表可以用多种方法实现不一定是文件表项数组。在中,节点包含了实际节点见图。对于大多数文件系统类型,将节点存放在节点中。这些视线细节并不影响我们对文件共享的讨论。
图显示了进程的三张表之间的关系。该进程有两个不同的打开文件一个文件打开为标准输入文件表述符,另一个打开为标准输出文件描述符。
从的早期半杯以来,这三张表之间的基本关系一直保存至今。这种安排对于在不同进程之间共享文件的方式非常重要。在以后的章节中述及其他的文件共享方式时还会回到这张图上来。
如果两个独立进程各自打开了同一文件,则有图中所示的安排。我们假定第一个进程使该文件在文件描述符上打开,而另一个进程则使此文件在文件描述符上打开。打开此文件的每一个进程都得到一个文件表项,但对一个给定的文件只有一个节点表项。每个进程都有自己的文件表项的一个理由:这种安排使每个进程都有它自己对该文件的当前位移量。
给出了这些数据结构后,现在对面前所述的操作作进一步说明。
在完成每一个后,在文件表项中的当前文件位移量即增加所写的字节数。如果这使当前文件位移量超过了当前文件长度,则在节点表象中的当前文件长度被设置为当前文件位移量也就是该文件加长了。
如果用标志打开一个文件,则相应标志也被设置到文件表项的文件状态标志中。每次对这种具有填写标志的文件执行写操作时,在文件表项中的当前文件位移量首先被设置为节点表项中的文件长度。这就使得每次写的数据都添加到文件的当前尾端处。
值修改文件表项中的当前文件位移量,没有进行任何操作。
若一个文件用被定位到文件当前的尾端,则文件表项中的当前文件位移量被设置为节点表项中的当前文件长度。
可能有多个文件描述符项指向同一文件表项。在后面讨论函数时,我们就能看到这一点。在后也发生同样的情况,此时父、子进程对于每一个打开的文件描述符共享同一个文件表项。
注意,文件描述符标志和文件状态标志在作用防卫方面的区别,前者指用于一个进程的一个描述符,而后者则是用于指向该给定文件表项的任何进程中的所有描述符。在后面说明函数时,我们将会了解如何存取和修改文件描述符标志和文件状态标志。
上述的一切对于多个进程读同一文件都能正确工作。每个进程都有它自己的文件表项,其中也有它自己的文件位移量。但是,当多个进程写同一文件时,则可能产生预期不到的结果。这就涉及到原子操作的概念(谓原子操作,就是该操作绝不会在执行完毕前被任何其他任务或事件打断,也就说,它的最小的执行单位,不可能有比它更小的执行单位,因此这里的原子实际是使用了物理学里的物质微粒的概念)更多内容请参照Unix环境高级编程3.10
父进程与子进程之间的文件共享:
由fork产生的进程为子进程。fork的一个特性是父进程所有的打开文件描述符都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项如图:
这种共享的方式使父、子进程对同一个文件使用了同一个文件偏移量。如果父、子进程写到同一个文件描述符,但有没有任何形式的同步,那么它们的输出就会相互混合。在fork之后处理文件描述符有两种常见的情况:
(1)父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量已经执行了相应的更新。
(2)父、子进程各自执行不同的程序段。这种情况下,在fork之后,父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符。这种方式是网络服务进程中常用的方式。
注:文件表项只有在所有引用它的fd(即文件描述符)全部关闭的情况下才会真正关闭。所以如上述情况,如果子进程关闭父、子进程共享的文件描述符后父进程仍可以使用对应的文件表项。
附录:i节点结构
struct dinode
&ushort di_&&/*文件类型+用户权限*/
&short di_&&/*文件链接数*/
&ushort di_&&/*属主用户id*/
&ushort di_&&/*属主用户组id*/
&off_t di_&&/*文件大小*/
&char di_addr[40];&/*文件数据区起点地址*/
&time_t di_&/*最后访问时间*/
&time_t di_&/*最后修改时间*/
&time_t di_&/*创建时间*/
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:80710次
排名:千里之外
原创:24篇
(2)(1)(1)(6)(10)(2)(7)(1)君,已阅读到文档的结尾了呢~~
2016新编操作系统概念答案
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
2016新编操作系统概念答案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口1847人阅读
操作系统(16)
StudyNotes(19)
操作系统概念学习笔记 10
多道程序操作系统的基础。通过在进程之间切换CPU,操作系统可以提高计算机的吞吐率。
对于单处理器系统,每次只允许一个进程运行:任何其他进程必须等待,直到CPU空闲能被调度为止。
多道程序的目标是在任何时候都有某些进程在运行,以使CPU的使用率最大化。多道程序的思想较为简单,当一个进程必须等待时,操作系统会从该进程拿走CPU的使用权,而将CPU交给其他进程。
CPU-I/O 区间周期
CPU的成功调度依赖于进程的如下属性:
进程执行由CPU执行周期和I/O等待周期组成。进程在这两个状态之间切换(CPU burst—I/O bust)。
进程执行从CPU区间(CPU burst)开始,在这之后是I/O区间(I/O burst)。接着另外一个CPU区间,然后是另外一个I/O区间,如此进行下去,最终,最后的CPU区间通过系统请求中止执行。
经过大量CPU区间的长度的测试。发现具有大量短CPU区间和少量长CPU区间。I/O约束程序通常具有很多短CPU区间。CPU约束程序可能有少量的长CPU区间。这种分布有助于选择合适的CPU调度算法。
CPU程序调度
每当CPU空闲时,操作系统就必须从就绪队列中选择一个进程来执行。进程选择由短期调度程序(short-term scheduler)或CPU调度程序执行。调度程序从内存中选择一个能够执行的进程,并为之分配CPU。
就绪队列不必是先进先出(FIFO)队列,也可为优先队列、树或简单的无序链表。不过队列中所有的进程都要排队以等待在CPU上运行。队列中的记录通常为进程控制块(PCB)。
抢占调度:
CPU调度决策可在如下4种情况环境下发生:
(1)当一个进程从运行切换到等待状态(如:I/O请求,或者调用wait等待一个子进程的终止)
(2)当一个进程从运行状态切换到就绪状态(如:出现中断)
(3)当一个进程从等待状态切换到就绪状态(如:I/O完成)
(4)当一个进程终止时
对于第1和4两种情况,没有选择而只有调度。一个新进程(如果就绪队列中已有一个进程存在)必须被选择执行。对于第2和第3两种情况,可以进行选择。
当调度只能发生在第1和4两种情况下时,称调度是非抢占的(nonpreemptive)或协作的(cooperative);否则,称调度方案为抢占的(preemptive)。采用非抢占调度,一旦CPU分配给一个进程,那么该进程会一直使用CPU直到进程终止或切换到等待状态。
抢占调度对方问共享数据是有代价(如加锁)的,需要新的机制来协调对共享数据的访问。
抢占对于操作系统内核的设计也有影响。在处理系统调用时,内核可能忙于进程活动。这些活动可能涉及要改变重要内核数据(如I/O队列)。  
因为根据定义中断能随时发生,而且不能总是被内核所忽视,所以受中断影响的代码段必须加以保护以避免同时访问。操作系统需要在任何时候都能够接收中断,否则输入会丢失或输出会被改写。为了这些代码段不被多个进程同时访问,在进入时就要禁止中断,而在退出时要重新允许中断。
分派程序(dispatch)是一个模块,用来将CPU的控制交给由短期调度程序选择的进程。
其功能包括:
切换上下文
切换到用户模式
跳转到用户程序的合适位置,以重新启动程序。
分派程序停止一个进程而启动另一个所花的时间成为分派延迟(dispatch latency)。
为了比较CPU调度算法所提出的准则:
CPU使用率 : 需要使CPU尽可能忙
吞吐量 : 指一个时间单元内所完成进程的数量
周转时间 : 从进程提交到进程完成的时间段称为周转时间,周转时间是所有时间段之和,包括等待进入内存、在就绪队列中等待、在CPU上执行和I/O执行
等待时间 : 在就绪队列中等待所花费时间之和
响应时间 : 从提交请求到产生第一响应的时间
需要使CPU使用率和吞吐量最大化,而使周转时间、等待时间和响应时间最小化。绝大多数情况下需要优化平均值,有时需要优化最大值或最小值,而不是平均值。
先到先服务调度
最简单的CPU调度算法是先到先服务算法(First-Come,First-Served scheduling):先请求CPU的进程先分配到CPU。FCFS策略可以用FIFO队列来容易实现。当一个进程进入就绪队列,其PCB链接到队列的尾部。当CPU空闲时,CPU分配给位于队列头的进程,接着运行进程从队列中删除。
FCFS策略的代码编写简单且容易理解,不过采用FCFS策略的平均等待时间通常比较长。当进程CPU区间时间变化很大,平均等待时间会变化很大。
比如以下例子
如果按照P1 P2 P3 顺序到达,Gantt图如下:
平均等待时间:(0+24+27)/3 = 17
如果按P2 P3 P1 顺序到达,
平均等待时间:(0+3+6)/3 = 3
另外考虑在动态情况下的性能,假设有一个CPU约束进程和许多I/O约束进程,CPU约束进程会移回到就绪队列并被分配到CPU。再次所有I/O进程会在就绪队列中等待CPU进程的完成。由于所有其他进程都等待一个大进程释放CPU,这称之为护航效果(convoy effect)。与让较短进程最先执行相比,这样会导致CPU和设备使用率变的很低。
FCFS调度算法是非抢占的。对于分时系统(每个用户需要定时的等待一定的CPU时间)是特别麻烦。允许一个进程保持CPU时间过长是个严重错误。
最短作业优先调度(shortest-job-first scheduling,SJF)
将每个进程与下一个CPU区间段相关联。当CPU为空闲时,它会赋给具有最短CPU区间的进程。如果两个进程具有同样长度,那么可以使用FCFS调度来处理。注意,一个更为适当地表示是最短下一个CPU区间的算法,这是因为调度检查进程的下一个CPU区间的长度,而不是其总长度。
比如以下例子
SJF: (0+3 + 9 + 16)/4 = 7
FCFS: (0+6+14+21)/4 = 10.25
SJF算法的平均等待时间最小。SJF算法的真正困难是如何知道下一个CPU区间的长度。对于批处理系统的长期(作业)调度,可以将用户提交作业时间所制定的进程时间极限作为长度。SJF调度经常用于长期调度。
它不能在短期CPU调度层次上加以实现。我们可以预测下一个CPU区间。认为下一个CPU区间的长度与以前的相似。因此通过计算下一个CPU区间长度的近似值,能选择具有最短预测CPU区间的进程来运行。下一个CPU区间通常可预测为以前CPU去剪的测量长度的指数平均(exponential average)。
SJF算法可能是抢占的或非抢占的。抢占SJF算法可抢占当前运行的进程,而非抢占的SJF算法会允许当前的进程先完成其CPU区间。抢占SJF调度有时称为最短剩余时间优先调度(shortest-remaining-time-first scheduling)。
比如以下例子
根据Gantt图:
平均等待时间:
(0+0+(5-3)+(10-1)+(17-2))/4 = 26/4 = 6.5
非抢占SJF:
(0+(8-1)+(12-3)+(17-2))/4 = 7.75
优先级调度(priority scheduling algorithm)
SJF算法可作为通用的优先级调度算法的一个特例。每个进程都有一个优先级与其关联,具有最高优先级的进程会分配到CPU。具有相同优先级的进程按FCFS顺序调度。SJF,其优先级(p)为下一个CPU区间的倒数。CPU区间越大,则优先级越小,反之亦然。
优先级通常是固定区间的数字,如0~7,但是数字大小与优先级的高低没有定论。
对于下例,假设数字越小优先级越高
平均等待时间为:
(0+1+6+16+18)/5 = 8.2
优先级可通过内部或外部方式来定义。内部定义优先级使用一些测量数据以计算进程优先级。外部优先级是通过操作系统之外的准则来定义,如进程重要性等。
优先级调度可以是抢占的或非抢占的。
优先级调度算法的一个重要问题是无限阻塞(indefinite blocking)或饥饿(starvation)。可以运行但缺乏CPU的进程可认为是阻塞的,它在等待CPU。优先级调度算法会使某个有低优先级无穷等待CPU。
低优先级进程务求等待问题的解决之一是老化(aging)。老化是一种技术,以逐渐增加在系统中等待很长时间的进程的优先级。
轮转法调度(round-robin,RR)
专门为分时系统设计。它类似于FCFS调度,但是增加了抢占以切换进程。定义一个较小的时间单元,称为时间片(time quantum,or time slice)。将就绪队列作为循环队列。CPU调度程序循环就绪队列,为每个进程分配不超过一个时间片段的CPU。
新进程增加到就绪队列的尾部。CPU调度程序从就绪队列中选择第一个进程,设置定时器在一个时间片之后中断,再分派该进程。接下来将可能发生两种情况。进程可能只需要小于时间片的CPU区间。对于这种情况,进程本身会自动释放CPU。调度程序接着处理就绪队列的下一个进程。否则,如果当前运行进程的CPU区间比时间片要长,定时器会中断产生操作系统中断,然后进行上下文切换,将进程加入到就绪队列的尾部,接着CPU调度程序会选择就绪队列中的下一个进程。
RR策略的平均等待时间通常较长
比如以下例子,使用4ms时间片
画出Gantt图:
平均等待时间:
(0+4+7+(10-4))/3 = 5.66
如果就绪,那么每个进程会得到1/n的CPU时间,其长度不超过q时间单元。每个进程必须等待CPU时间不会超过(n-1)q个时间单元,直到它的下一个时间片为止。
RR算法的性能很大程度上依赖于时间片的大小。在极端情况下,如果时间片非常大,那么RR算法与FCFS算法一样。如果时间片很小,那么RR算法称为处理器共享,n个进程对于用户都有它自己的处理器,速度为真正处理器速度的1/n。
小的时间片会增加上下文切换的次数,因此,希望时间片比上下文切换时间长,事实上,绝大多数现代操作系统,上下文切换的时间仅占时间片的一小部分。
周转时间也依赖于时间片的大小。
多级队列调度(Multilevel Queue Scheduling)
前台(交互)进程和后台(批处理)进程。这两种不同各类型的进程具有不同响应时间要求,也有不同调度需要。与后台进程相比,前台进程要有更高(或外部定义)的优先级。
多级队列调度算法将就绪队列分成多个独立队列。根据进程的属性,如内存大小等,一个进程被永久地分配到一个队列(低调度开销但是不够灵活),每个队列有自己的调度算法。前台队列可能采用RR算法调度,而后台调度可能采用FCFS算法调度。
另外,队列之间必须有调度,通常采用固定优先级抢占调度,例如前台队列可以比后台队列具有绝对优先值。另一种可能在队列之间划分时间片例如,前台队列可以有80%的时间用于在进程之间进行RR调度,而后台队列可以有20%的CPU时间采用FCFS算法调度进程。
多级反馈队列调度(Multilevel Feedback-Queue Scheduling)
与多级队列调度相反,多级反馈队列调度允许进程在队列之间移动。主要思想是根据不同CPU区间的特点以区分进程。如果进程使用过多CPU时间,那么它可能被转移到较低优先级队列。这种方案将I/O约束和交互进程留在更高优先级队列。此外,在较低优先级队列中等待时间过长的进程会被转移到更高优先级队列。这种形式的老化组织饥饿的发生。
通常,多级反馈队列调度程序可由下列参数来定义:
队列数量。
每个队列的调度算法。
用以确定何时升级到更高优先级队列的方法。
用以确定何时降级到更低优先级队列的方法。
用以确定进程在需要服务时应进入哪个队列的方法。
多处理器调度(Multiple-Processor Scheduling)
如果多个CPU,则负载分配(load sharing)成为可能。其中主要讨论处理器功能相同(或同构)的系统,可以将任何处理器用于运行队列内的任何进程。
多处理器调度方法
在一个多处理器中,CPU调度的一种方法是让一个处理器(主服务器)处理所有的调度决定、I/O处理以及其他系统活动,其他的处理器只执行用户代码。这种非对称处理(asymmetric multiprocessing)方法更为简单,因为只有一个处理器访问系统数据结构,减轻了数据共享的需要。
另一种方法是使用对称多处理(symmetric multiprocessing,SMP)方法,即每个处理器自我调度。所有进程可能处于一个共同的就绪队列中,或每个处理器都有自己的私有就绪队列。无论如何,调度通过每个处理器检查共同就绪队列并选择一个进程来执行。如果多个处理器试图访问和更新一个共同数据结构,那么每个处理器必须仔编程:必须确保两个处理器不能选择同一进程,且进程不会从队列中丢失。
处理器亲和性
进程移到其他处理器上时,被迁移的第一个处理器的缓存中的内容必须为无效,而将要迁移的第二个处理器上的缓存需重新构建。由于使缓存无效或重构的代价高,因而SMP努力的使一个进程在同一个处理器上运行,这被称为处理器亲和性,即一个进程需有一种对其他运行所在的处理器的亲和性。
处理器亲和性的几种形式:
软亲和性(soft affinity,操作系统具有设法让一个进程保持在同一个处理器上运行的策略,但不能做任何保证)
硬亲和性(hard affinity,允许进程指定它不允许移至其他处理器),如LINUX
负载平衡(load balancing)
负载平衡设法将工作负载平均地分配到SMP系统中的所有处理器上。通常只是对那些拥有自己私有的可执行的进程的处理器而言是必要的,在具有共同队列的系统中,通常不需要负载平衡,因为一旦处理器空闲,会立刻从就绪队列中取走一个可执行进程。
两种方法:push migration和pull migration,对于push migration,一个特定的任务周期性地检查每个处理器上的负载,如果发现不平衡,即通过将进程从超载处理器移到(或推送到)空闲或不太忙的处理器,从而平均地分配负载,当空闲处理器从一个忙的处理器上推送pull一个等待任务时,发生pull migration。push migration和pull migration不能互相排斥。
负载平衡会抵消处理器亲和性。
对称多线程
提供多个逻辑(而非物理的)处理器来运行几个线程,称为对称多线程(SMT),或超线程(hyperthreading)技术。
SMT的思想是在同一个物理处理器上生成多个逻辑处理器,即使系统仅有单处理器,每个逻辑处理器都有它自己的架构状态,包括通用目的和机器状态寄存器。每个逻辑处理器负责自己的中断处理,这意味着中断被送到并被逻辑处理器所处理,每个逻辑处理器共享其物理处理器的资源,如缓存或总线。
SMT是硬件而非软件提供的。硬件应该提供每个逻辑处理器的架构状态的表示以及中断处理方法。调度程序首先设法把不同线程分别调度到每个物理处理器上,而不是调度到同一个物理处理器的不同逻辑处理器上。
系统调度的是内核线程,而不是进程。用户线程由线程库管理,内核并不了解它们。用户线程最终必须映射到相应的内核级线程,尽管这种映射可能是间接的,可能使用轻量级进程(LWP)。
用户线程和内核线程的区别之一是它们是如何被调度的。在执行多对一模型和多对多模型系统上,线程库调度用户级线程到一个有效的LWP上运行,这被称为进程竞争范围(process-contention scope,PCS)方法,因为CPU竞争发生在属于相同进程的线程之间。为了决定调度哪个内核线程到CPU,内核采用系统竞争范围(system-contention scope,SCS)方法来进行,竞争CPU发生在系统所有线程中,采用一对一的模型的系统,调度仅使用SCS方法。
PCS是根据优先级完成的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:197614次
积分:3659
积分:3659
排名:第7051名
原创:86篇
评论:184条
欢迎光临我的博客,希望大家能共同学习,共同进步,写的不好的地方还请大家多多包含指正,o(≧v≦)o~~
文章:20篇
阅读:57440
阅读:34537
阅读:9408
文章:16篇
阅读:20521
阅读:6261
(1)(6)(4)(4)(4)(4)(4)(1)(5)(4)(5)(6)(8)(4)(4)(6)(6)(19)(2)
写的不好的地方还请大家通过评论,私信,qq()联系我,我会好好改正的!不要睬我的文章却不告诉我为什么,这样我也不知道不好在哪,谢谢}

我要回帖

更多关于 操作系统的概念 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信