文档库 最新最全的文档下载
当前位置:文档库 › Windows线程优先级提升

Windows线程优先级提升

Windows线程优先级提升

在Windows中,线程调度采用的是基于优先先级的抢占式多任务调度算法,依据优先级和分配时间配额来调度线程,因此调度系统总是运行优先级最高的线程。Windows系统中,可以多个线程并发运行。为了让用户感觉所有线程都在同时运行的逼真的假象,良好的线程调度策略显得十分重要。一个糟糕的调度策略会使操作系统变得十分缓慢,无法满足用户的需求。Windows操作系统为了解决系统效率问题,采用了基于优先级和分配时间配额的调度策略。

Windows系统有32种优先级,从0到31,16个实时线程优先级(16-31),实际上不是实时级别,因为它没有给出时间保证和时间期限;15个可变线程优先级(1-15);一个系统线程优先级(0),仅用于对系统中空闲物理页面进行清零的零页线程。每个线程都有一个基本优先级和当前优先级。在某种特定的情况下,一个用户线程的当前优先级可以被提高到高于基本优先级,但是不会高于

。要把线程的优先级提升到实时优先级,用户必须有升高线程优先级优先级15 的权限。如果用户进程在实时优先级运行时间过多,它将可能阻塞关键系统功能的执行,阻塞系统线程的运行;但不会阻塞硬件中断处理。

Windows还给每个线程一定的时间配额来访问处理器。时间配额是一个线程从进入运行状态到Windows检查是否有其他优先级相同的线程需要开始运行之间的时间总和。一旦时间配额被线程用完,则Windows中断该线程,让另一个具有相同优先权的线程运行。如果有一个具有更高优先级的线程准备执行,则Windows会中断当前执行线程而让优先级更高的线程运行。

Windows是根据优先级和分配时间配额来对线程进行调度的。由于有32个

。每个优先级,系统维护了一个有32个数组项的数组,分别对应优先级0到31数组项存放指向在相应优先级的线程就绪队列的表头。基本调度算法是系统按

优先级31到优先级0的顺序扫描数组,寻找非空队列,一旦找到便选出队列首线程,让其运行一个时间片。若时间被用完了,线程被换下CPU,回到原来优先级的队列末尾,系统再选出排在队列头的线程。若多个线程在最高优先级处于就绪状态时,它们每个循环执行一个时间片。如果没有线程就绪,空闲线程就开始运行。

为了改进系统吞吐量、响应时间等整体特征,解决线程调度策略中潜在的不公正性,Windows对基本调度算法作了一些修订。在某种特定条件下,一个用户的当前优先级可以被提升到高于基本优先级,但不会高于优先级15(即不会被提升到实时优先级范围)。

在下列5种情况下,Windows 会提升线程的当前优先级:

A) I/O操作完成

B) 信号量或事件等待结束

C) 前台进程中的线程完成一个等待操作

D) 由于窗口活动而唤醒图形用户接口线程

E) 线程处于就绪状态超过一定时间,但没能进入运行状态(处理机饥饿) 下面将分别讨论这5方面的提升问题:

1. I/O操作完成

当一个I/O操作完成时,Windows会给被释放的等待线程提升优先级,使

等待I/O操作的线程拥有更多的机会运行并处理得到的结果。为了避免I/0操作对某些线程造成的不公平待遇,在I/O操作完成后释放一个等待线程并将其时间配额减1。虽然可以在DDK头文件中找到推荐使用的优先级提升值(在Wdm.h 或Ntddk.h中"#define IO"处),优先级的实际提升值是由设备驱动程序决定的。在完成I/O操作后由设备驱动程序通过内核函数IoCompleteRequest来指定优先级的

提升幅度。线程优先级的提升幅度取决于I/O设备,响应时间要求越高,优先级提升幅度越大。这种思想是让I/O设备处于忙碌状态。

线程优先级是以线程的基本优先级(而不是当前优先级)为基点的,提升后的优先级不会超过15。优先级被提升后,线程在提升后的优先级上运行一个时间配额。当线程用完这个时间配额后,它将降低一个优先级,然后运行另外一个时间配额。这个流程持续地进行下去,直到线程的优先级被降低至原来的基本优先级。一个具有较高优先级的线程可以抢先被提升优先级的线程,但这个被中断的线程只会在用完它的时间配额后才降低一个优先级。

2.信号量或事件等待结束

当一个等待事件对象或信号量对象的线程完成等待后(由于SetEvent, PulseEvent, 或者ReleaseSemaphore函数调用),它的线程优先级将提升一个优先级(在DDK头文件中可以看到EVENT_ INCREMENT和

)。线程在等待事件或信号量后提升优先级的SEMAPHORE_INCREMENT 的值

原因与等待I/O操作后提升优先级的原因相同。被阻塞在事件上的线程得到的CPU时间比CPU繁忙线程得到的时间要少。这种调整有助于平衡它们之间的差异。与因等候I/O操作而提升优先级相同,提升是以线程的基本优先级为基点,且提升后的优先级不会超过15。在等待结束时,线程的时间配额被减1,优先级被提升后,线程在提升后的优先级上运行一个时间配额。当线程用完这个时间配额后,它将降低一个优先级,然后运行另外一个时间配额,直到优先级降低到初始的基本优先级。

3.前台进程中的线程完成一个等待操作

当一个前台进程中的线程在一个内核对象上完成了一个等待操作时,内核函数KiUnwaitThread会提升线程的当前优先级(不是线程的基本优先级),提升幅度为变量PsPrioritySeparation的当前值。(由窗口系统决定哪个进程是前台进程)。

变量PsPrioritySeparation的值是时间配额表的索引,用于为前台进程中的线程选择时间配额,而在这种情况下,它被用作一个优先级的提升值。

这种优先级提升的原因是为了改进交互性应用的相应时间特征。当前台应用程序完成一个等待时,小幅度地提升它的优先级,这样它可以有更多的机会立即运行,特别是当在后台运行的其他线程具有相同的基本优先级时,这种方法更为有效。

与其他优先级提升方法不同,这种提升可以在所有的Windows系统中应用,而且用户不能禁止这种优先级提升,甚至是在用户已利用Win32的函数SetThreadPriorityBoost禁止了其他的优先级提升策略时,同样不行。 4. 由于窗口活动而唤醒图形用户接口线程

当拥有窗口的线程在被窗口活动唤醒(如收到窗口消息)时将得到一个幅度为2的额外优先级提升。窗口系统(Win32k.sys)在调用函数KeSetEvent时使用这种优先级提升方法,KeSetEvent函数调用设置一个事件,用于唤醒一个图形用户接口线程。这种优先级提升的原因与前台进程中的线程完成等待操作而提升优先级的原因雷斯,是为了改进交互应用的响应时间

5. 线程处于就绪状态超过一定时间,但没能进入运行状态(处理机饥饿)

设想有一个优先级为7的线程正在运行,阻止一个优先级为4获得CPU时间。而一个优先级为11的线程正在等待由优先级为4的线程锁住的资源。但由于优先级为7的线程占用了所有的CPU时间,优先级为4的线程将无法得到足够长的时间完成它的操作并释放将优先级为11的线程锁住的资源。Windows将用以下的方法处理这种情形:

“平衡集管理器(balance set manager)”(一个用于内存管理的系统线程)会每秒钟检查一次就绪队列,看是否存在一直在就绪队列中等待超过大约4秒的线程。若存在,则平衡集管理器将把它的优先级提升到15。在Windows 2000 和

Windows XP中线程的时间配额将被设置成进程时间配额的两倍。在Windows Server 2003中,时间配额将设置成4。一旦时间配额被用完,线程的优先级将立即降低为它的基本优先级。如果这个线程结束前有一个更高优先级的线程处于就绪状态,则该线程将回到就绪队列,当它等待超过另外一个4秒时,将再次得到优先级提升。

每次运行时,平衡管理器并不实际扫描所有的就绪线程。为了减少它占用CPU 的时间,它只扫描16个就绪线程。如果有更多的线程处于这个优先级,它将记住停止的位置,并在下一次开始时从当前为止开始扫描。而且,每次扫描时将最多提升10个线程的优先级——如果已找到10个线程得到了这种优先级提升(这用来描述非常繁忙的系统),它将在当前点停止扫描,并在下一次扫描时从当前位置开始。

这种算法并不能完美地解决所有问题。但通常情况下,处理机饥饿线程将得到足够的,,,时间完成处理的操作并重新进入一个等待状态。

以上这些优先级提升的方法都不是完美的,并不会适用于所有应用。如在

提高前台线程优先级的方法中存在一个问题。若前台进程中存在两个线程,一个需要的运行时间很长,一个处于计算密集期。若切换到后者时,将其

优先级提升,则后台需要长时间运行的线程将会几乎得不到CPU时间。这

时可采用增加前台线程的时间配额的方法,这样处于计算密集期的线程得

到的CPU时间会多一些,而后台线程的执行也不会被停止。所以以上5种

方法在某些特殊情况下并不适用,还需要发现问题并改进。

[NI技术] LabWindowCVI中的多线程技术

[NI技术] LabWindows™/CVI中的多线程技术 多任务、多线程和多处理这些术语经常被交替地使用,但是它们在本质上是不同的概念。多任务是指操作系统具有在任务间快速切换使得这些任务看起来是在同步执行的能力。在一个抢占式多任务系统中,应用程序可以随时被暂停。使用多线程技术,应用程序可以把它的任务分配到单独的线程中执行。在多线程程序中,操作系统让一个线程的代码执行一段时间(被称为时间片)后,会切换到另外的线程继续运行。暂停某个线程的运行而开始执行另一个线程的行为被称为线程切换。通常情况下,操作系统进行线程切换的速度非常快,令用户觉得有多个线程在同时运行一样。多处理指的是在一台计算机上使用多个处理器。在对称式多处理(SMP)系统中,操作系统自动使用计算机上所有的处理器来执行所有准备运行的线程。借助于多处理的能力,多线程应用程序可以同时执行多个线程,在更短的时间内完成更多的任务。 单线程应用程序移植到多核处理器上运行不会获得性能上的改进,这是因为它们只能在其中一个处理器上运行,而不能像多线程应用程序那样在所有的处理器上同时运行。而且单线程应用程序需要承受操作系统在处理器间切换所需要的开销。为了在多线程操作系统和/或多处理器计算机上获得最优异的性能,我们必须使用多线程技术来编写应用程序。 目录 1. 进行多线程编程的原因 2. 选择合适的操作系统 3. LabWindows/CVI中的多线程技术简介 4. 在LabWindows/CVI的辅助线程中运行代码 5. 保护数据 6. 避免死锁 7. 监视和控制辅助线程 8. 进程和线程优先级 9. 消息处理 10. 使用线程局部变量 11. 在线程局部变量中存储动态分配的数据 12. 在独立线程中运行的回调函数 13. 为线程设定首选的处理器 1. 进行多线程编程的原因 在程序中使用多线程技术的原因主要有四个。最常见的原因是多个任务进行分割,这些任务中的一个或多个是对时间要求严格的而且易被其他任务的运行所干涉。例如,进行数据采集并显示用户界面的程序就很适合使用多线程技术实现。在这种类型的程序中,数据采集是时间要求严格的任务,它很可能被用户界面的任务打断。在LabWindows/CVI程序中使用单线程方法时,程序员可能需要从数据采集缓冲区读出数据并将它们显示到用户界面的曲线上,然后处理事件对用户界面进行更新。当用户在界面上进行操作(如在图表上拖动光标)时,线程将继续处理用户界面事件而不能返回到数据采集任务,这将导致数据采集缓冲区的溢出。而在LabWindows/CVI程序中使用多线程技术时,程序员可以将数据采集操作放在一个线程中,

Windows下多线程同步机制

多线程同步机制 Critical section(临界区)用来实现“排他性占有”。适用范围是单一进程的各线程之间。它是: ·一个局部性对象,不是一个核心对象。 ·快速而有效率。 ·不能够同时有一个以上的critical section被等待。 ·无法侦测是否已被某个线程放弃。 Mutex Mutex是一个核心对象,可以在不同的线程之间实现“排他性占有”,甚至几十那些现成分属不同进程。它是: ·一个核心对象。 ·如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息。 ·可以使用Wait…()等待一个mutex。 ·可以具名,因此可以被其他进程开启。 ·只能被拥有它的那个线程释放(released)。 Semaphore Semaphore被用来追踪有限的资源。它是: ·一个核心对象。 ·没有拥有者。 ·可以具名,因此可以被其他进程开启。 ·可以被任何一个线程释放(released)。 Ev ent Object Ev ent object通常使用于overlapped I/O,或用来设计某些自定义的同步对象。它是: ·一个核心对象。 ·完全在程序掌控之下。 ·适用于设计新的同步对象。 · “要求苏醒”的请求并不会被储存起来,可能会遗失掉。 ·可以具名,因此可以被其他进程开启。 Interlocked Variable 如果Interlocked…()函数被使用于所谓的spin-lock,那么他们只是一种同步机制。所谓spin-lock是一种busy loop,被预期在极短时间内执行,所以有最小的额外负担(overhead)。系统核心偶尔会使用他们。除此之外,interlocked variables主要用于引用技术。他们:·允许对4字节的数值有些基本的同步操作,不需动用到critical section或mutex之类。 ·在SMP(Symmetric Multi-Processors)操作系统中亦可有效运作。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

深入浅出Win32多线程程序设计之基本概念

深入浅出Win32多线程程序设计之基本概念 引言 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。 理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。许多程序员从来没有学习过嵌入式系统领域著名的操作系统VxWorks,但是立马就能在上面做开发,大概要归功于平时在Win32多线程上下的功夫。 因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。 从单进程单线程到多进程多线程是操作系统发展的一种必然趋势,当年的DOS系统属于单任务操作系统,最优秀的程序员也只能通过驻留内存的方式实现所谓的"多任务",而如今的Win32操作系统却可以一边听音乐,一边编程,一边打印文档。 理解多线程及其同步、互斥等通信方式是理解现代操作系统的关键一环,当我们精通了Win32多线程程序设计后,理解和学习其它操作系统的多任务控制也非常容易。因此,学习Win32多线程不仅对理解Win32本身有重要意义,而且对学习和领会其它操作系统也有触类旁通的作用。 进程与线程 先阐述一下进程和线程的概念和区别,这是一个许多大学老师也讲不清楚的问题。 进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。 线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。 线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共

自学考试《网络操作系统02335》简答题汇总(包括答案)

自学考试《网络操作系统》简答题 1.网络操作系统与网络用户之间有哪两类接口?它们的作用各是什么? 答:网络操作系统为网络用户提供了两类接口: 1) 操作命令接口。用户通过键盘或鼠标键入或点击各种操作命令来控制、操纵、管理和使用网络。这种接口采用交互式。 2) 编程接口。通过网络操作系统提供的一组系统调用来实现。此外网络操作系统还为用户提供了一系列应用程序接口。 2.简述共享打印机的功能。 答:1)支持多个用户同时打印。网络上的用户需要输出要打印的信息时,打印信息首先送至磁盘共享打印缓冲区,然后由共享打印机逐个打印输出。 2)建立连接和拆除连接。在共享打印前,首先要建立工作站和共享打印机之间的连接。建立了连接之后,工作站的用户就可以像使用本地打印机一样使用网络共享打印机。打印完后,不再需要打印时拆除工作站与打印机的共享连接。 3)连接多台打印机作为共享打印机。可连接网络中多台打印机,这些共享打印机可以是类型相同的,也可以是类型不同的。 4)提供多种多样的打印方式。 3.简述FTP的主要功能及操作步骤。 答:FTP的主要功能:1)浏览Internet上其它远程机的文件系统。 2)在Internet上的主机之间进行文件传输。 FTP的操作步骤:1)确定需要访问的主机。即确定访问Internet上哪一台远程计算机,了解其主机名或I P地址。 2)在远程主机和本地机间建立一个FTP连接。 3)把远程主机上所需要的文件传输到本地机上,或将本地机上的文件传输到远程主机上。 4)当文件传输结束后,拆除已建立的连接,并退出FTP。 4.从操作系统的角度看,Netware的主要构件有哪些?它们之间的关系如何? 答:从操作系统的角度看,服务器操作系统Netw are由四个主要构件组成:装载程序、Netware内核、N LM环境和和应用服务。这四个主要构件从层次上看,应用服务处于最高层(外层),装载程序处于最低层,离硬件最近,中间层是NLM环境和内核。其层次关系如下图所示: 应用服务 NLM环境 Netware各构件之间的关系 内核 装载程序 5.简述Windows NT中对象、对象类的概念、对象的组成以及各组成部分是由谁来管理的。 答:Windows NT采用对象模型。对象是个抽象数据结构,在Windows NT中用以表示所有资源。具有相同特性的对象可归为一个对象类,对象是对象类的一个实例。 对象是用来表示资源的,而对象类是描述资源类型的。 每个对象由两个部分组成:对象头和对象体。对象管理程序控制对象头,其它执行体部件控制它们自己创建的对象体。 6.简述操作系统在计算机系统中的地位及作用。 答:操作系统在计算机系统中处于硬件层之上,是硬件层的第一次扩充。在这一层上实现了操作系统的全部功能,并提供了相应的接口。 操作系统的作用是:1)提高计算机系统的效率。 2)提高计算机系统资源的利用率。 3)方便用户使用计算机。 7.简述Windows NT的I/O系统由哪些部分组成。 答:Windows NT的I/O系统由以下部件组成:1) I/O管理程序; 2)文件系统;3)设备驱动程序;4)缓冲存储管理程序; 5)网络驱动程序。 8.简述在单机系统中进程如何利用信箱进行相互通信。 答:在单机操作系统中,可以使用信箱实现两个进程之间的通信。在操作系统中,一个进程要与另一个进程进行通信,接收消息的进程必须为自己创建一个信箱。进程调用send原语发送信件前,必须组织好信件,然后调用send原语,并在调用时给出参数:信箱名和信件内容或信件存放起始地址。同样,接收进程也要调用receive原语,给出参数:信箱名和信件取出后的存放地址。通信原语的形式是: send (boxname msg) receive (boxname msg) 9.简述紧耦合与松耦合处理机的主要区别。 答:紧耦合与松耦合处理机系统的主要区别在于

OllyDbg完全教程

OLLYDBG完全教程(一) 一,什么是 OllyDbg? OllyDbg 是一种具有可视化界面的 32 位汇编-分析调试器。它的特别之处在于可以在没有源代码时解决问题,并且可以处理其它编译器无法解决的难题。 Version 1.10 是最终的发布版本。这个工程已经停止,我不再继续支持这个软件了。但不用担心:全新打造的 OllyDbg 2.00 不久就会面世! 运行环境: OllyDbg 可以以在任何采用奔腾处理器的 Windows 95、98、ME、NT 或是 XP(未经完全测试)操 作系统中工作,但我们强烈建议您采用300-MHz以上的奔腾处理器以达到最佳效果。还有,OllyDbg 是极占内 存的,因此如果您需要使用诸如追踪调试[Trace]之类的扩展功能话,建议您最好使用128MB以上的内存。 支持的处理器: OllyD的数据格式,但是不支持SSE2指令集。bg 支持所有 80x86、奔腾、MMX、3DNOW!、Athlon 扩展指令集、SSE指令集以及相关 配置:有多达百余个(天呀!)选项用来设置 OllyDbg 的外观和运行。 数据格式: OllyDbg 的数据窗口能够显示的所有数据格式:HEX、ASCII、UNICODE、16/32位有/无符号/HEX 整数、32/64/80位浮点数、地址、反汇编(MASM、IDEAL或是HLA)、PE文件头或线程数据块。 帮助:此文件中包含了关于理解和使用 OllyDbg 的必要的信息。如果您还有Windows API 帮助文件的话( 由于版权的问题 win32.hlp 没有包括在内),您可以将它挂在 OllyDbg 中,这样就可以快速获得系统函数的 相关帮助。 启动:您可以采用命令行的形式指定可执行文件、也可以从菜单中选择,或直接拖放到OllyDbg中,或者重新

Windows线程优先级提升

Windows线程优先级提升 在Windows中,线程调度采用的是基于优先先级的抢占式多任务调度算法,依据优先级和分配时间配额来调度线程,因此调度系统总是运行优先级最高的线程。Windows系统中,可以多个线程并发运行。为了让用户感觉所有线程都在同时运行的逼真的假象,良好的线程调度策略显得十分重要。一个糟糕的调度策略会使操作系统变得十分缓慢,无法满足用户的需求。Windows操作系统为了解决系统效率问题,采用了基于优先级和分配时间配额的调度策略。 Windows系统有32种优先级,从0到31,16个实时线程优先级(16-31),实际上不是实时级别,因为它没有给出时间保证和时间期限;15个可变线程优先级(1-15);一个系统线程优先级(0),仅用于对系统中空闲物理页面进行清零的零页线程。每个线程都有一个基本优先级和当前优先级。在某种特定的情况下,一个用户线程的当前优先级可以被提高到高于基本优先级,但是不会高于 。要把线程的优先级提升到实时优先级,用户必须有升高线程优先级优先级15 的权限。如果用户进程在实时优先级运行时间过多,它将可能阻塞关键系统功能的执行,阻塞系统线程的运行;但不会阻塞硬件中断处理。 Windows还给每个线程一定的时间配额来访问处理器。时间配额是一个线程从进入运行状态到Windows检查是否有其他优先级相同的线程需要开始运行之间的时间总和。一旦时间配额被线程用完,则Windows中断该线程,让另一个具有相同优先权的线程运行。如果有一个具有更高优先级的线程准备执行,则Windows会中断当前执行线程而让优先级更高的线程运行。 Windows是根据优先级和分配时间配额来对线程进行调度的。由于有32个 。每个优先级,系统维护了一个有32个数组项的数组,分别对应优先级0到31数组项存放指向在相应优先级的线程就绪队列的表头。基本调度算法是系统按

线程优先级

线程优先级 每个线程都有一个“优先级”,范围是0~31,0为最低优先级,31为最高优先级。当系统决定哪个线程需要调度的时候,首先查看是否存在优先级为31的可调度线程,如果存在,就从中选择一个进行调度。当该线程的时间片到达之后,系统查看是否存在另一个优先级为31的可调度线程,如果存在,就调度它。 只要有一个可调度的优先级为31的线程存在,那么系统绝对不会调度优先级为0~30的线程,这样会导致其他线程“饥饿”。 高优先级线程往往“打断”低优先级线程的执行。比如,当一个优先级为15的线程正在运行,如果此时系统发现一个优先级比15高的线程可以调度,那么该高优先级线程会“打断”那个低优先级线程的执行,哪怕低优先级的时间片才过了一半。 另外,当系统引导的时候,系统创建一个特殊的线程,称为“zero page”(0页)线程,该线程是整个系统中唯一一个优先级为0(最低)的线程。当系统没有任何线程需要执行的时候,该线程负责将系统中所有RAM页面清零(也就是资源回收)。 线程优先级有一个抽象层的概念。 由于一些历史的原因,微软并没有将线程调度程序的行为完全固定下来。微软没有让应用程序充分利用调度程序的特性。微软宣称这个调度程序的行为是变化,在编程的时候需要注意。 由这几点可见,你的应用程序可以有自己的调度特性。 Windows API充分反映了系统调度的一个抽象层。如此,就不会直接与系统的调度程序通信,相反,可以调用API函数,根据系统的版本的不同转换这些参数。这一层,就是线程优先级的抽象层。 下面详细叙述这个抽象层究竟有哪些内容。 对于进程而言,Windows有一个“优先级类”的概念。这些优先级类作用与进程中的所有线程。Windows 2000/XP/2003/Vista支持6个“优先级类”: 1、Real-time:实时 2、High:高 3、Above normal:高于标准 4、Normal:标准 5、Below normal:低于标准 6、Idle:空闲。 一个进程应该避免使用“实时”优先级类,因为使用该优先级类会导致其他进程中的线程很难被调度,甚至会打断或者抢占系统线程的执行。“高”优先级类也应该尽量避免,除非有特殊的工作需要使用这个优先级。 当一个进程的“优先级类”被确定以后,就只需要考虑该进程内部各个线程之间的优先级关系。 对于进程中的线程而言,有一个“相对线程优先级”的概念,这可以决定一个进程中多个线程之间的优先级关系。 Windows支持7种“相对线程优先级”: 1、Time-critical:关键时间(最高的相对线程优先级) 2、Heightest:最高(翻译是这么翻译,但是并不是最高的相对线程优先级) 3、Above normal:高于标准 4、Normal:标准 5、Below normal:低于标准

c语言多线程的三种实现方式

c语言多线程的三种实现方式 1 C语言多线程实现 C语言语言既可以用于创建单线程应用程序,也可以用于创建多线程应用程序。它的多线程实现有三种方式:POSIX线程库(Pthread),Windows API,以及共享内存。 1.1 POSIX线程库(Pthread) POSIX线程库(Pthread)是Linux系统的一种线程API,它由标 准POSIX提供,以实现多线程程序设计。它提供许多函数用于创建、 销毁线程,设置线程属性,等待线程完成以及通信功能等。Pthread在多线程编程中被使用广泛,它更易于操纵,可以让多线程编程更加容 易和有趣。 1.2 Windows API Windows API 也是可用于C语言多线程编程的方式之一。Windows API提供许多功能:创建线程,挂起线程,等待线程结束,分离线程,设置线程优先级等等。Windows API也提供了很多函数和常量用于控制线程。它与POSIX线程库不同,Windows API不使用POSIX线程库,而使用Windows API实现多线程程序时,同一应用程序可以具有多个线程。

1.3 共享内存 共享内存是指多个进程可以访问同一个内存区域,从而使它们能 够共享数据,实现常见的多线程编程任务。在C语言中,可以使用mmap()函数将共享内存映射成文件描述符,在一定范围内允许多个 进程对共享内存的随机读写访问。这是一种实现多线程的方式,能够 极大地提高程序的效率。 以上就是C语言中多线程实现的三种方式。POSIX线程库(Pthread)可以简易实现,更能让多线程编程更加容易和有趣;Windows API也可以实现多线程编程,可以让同一应用程序有多个线程;共享内存是一种实现多线程的方法,能够极大地提高程序的效率。

线程调度算法

线程调度算法 线程调度算法是计算机系统内部的一种重要的资源分配策略,它是在多处理器系统上使用的一种重要的高级进程管理策略。它被用来决定什么时候启动某个线程以及停止某个线程,以实现系统的负载均衡和线程的操作公平。本文以“线程调度算法”为主题,从概念和历史概览、现状和发展趋势、调度算法类型以及调度算法示例等几个方面来综述和分析线程调度算法的概念、发展和研究进展。 二、概念和历史概览 线程调度是一种将系统资源分配给用户线程的算法,它实现了操作系统处理多个线程的功能,并获得最优的性能。线程调度通常用于控制线程的执行顺序,避免资源竞争,有效地将系统资源分配给用户线程,并保证每个线程可以安全,可靠地运行。不同的操作系统线程调度算法也不尽相同,但它们的目的都是一致的:有效地将多个用户线程分配到多个处理器,以达到最优性能。 提出调度算法最早可以追溯到20世纪50年代,其发展至今也持续了几十年的时间。它最早是在多用户系统中使用的。在实际系统中,典型的线程调度算法最先是由英国的计算机科学家J.N.Buxton、M.K.Smith和P.O.L.Smith提出的“先来先服务”(FCFS)算法,它是一种静态算法,即每个线程都有一个优先级,新线程按照优先级顺序排列,由最高优先级的线程优先执行。后来,根据实际应用需要,研究人员又进一步提出了其他种类和各种算法,如最短进程优先算法(SPF)、最短剩余时间优先算法(SRTF)和优先权算法(PRI)等。

三、现状和发展趋势 线程调度已经成为多处理器系统实现操作系统进程调度的重要 技术,近年来随着计算机科学的不断发展,线程调度算法也在不断地发展。目前,研究人员已经提出了很多种不同类型的线程调度算法,它们能够在不同的多处理器架构中胜任不同的任务,以满足众多用户的需求。 在未来,为了满足计算能力的需求,多处理器系统的开发将以更快的速度继续发展,并且将不断发展出更多先进的技术。对于线程调度算法而言,将会有更多的算法及其变体出现,以适应未来的处理器架构,以满足用户对性能、安全性和可靠性的变化需求。 四、调度算法类型 1.先来先服务(FCFS)算法。 先来先服务(FCFS)算法是为了解决多用户系统中作业调度问题 而提出的一种线性算法。它的核心思想是:对于多用户系统中的作业,应该按照提交作业的先后顺序依次执行,先提交的作业被服务的时间先于后提交的作业,也就是说,每个作业应当按照其到达系统的先后顺序依次执行。 2.最短进程优先算法(SPF) 最短进程优先(SPF)算法是一种改进的多处理器系统调度算法,用于解决多处理器系统中多个用户线程的调度问题。该算法将等待队列中的进程按其运行时间的长短进行排序,总是优先给处于等待队列最前面的最短进程调度CPU,以保证最短作业优先的服务特性。

提高程序优先级的措施-概述说明以及解释

提高程序优先级的措施-概述说明以及解释 1.引言 1.1 概述 概述部分的内容可以从以下几个方面来展开: 在计算机系统中,程序的优先级是指操作系统对不同程序或进程进行分配资源和调度执行的优先级别。程序的优先级可以影响到程序的执行效率和响应速度,因此提高程序的优先级是一项重要的任务。 本文将探讨提高程序优先级的几种措施,旨在通过合理的资源分配和调度,提高程序的优先级,从而提高程序的执行效率和响应速度。在下文中,将详细介绍这些措施,并分析它们的影响和应用场景。 同时,本文还将进一步探讨提高程序优先级的意义和目标。通过提高程序优先级,可以优化计算机系统的资源利用率,提高系统的整体性能。而在特定的应用场景下,提高程序优先级还可以确保关键任务的及时执行,提升用户体验。 在接下来的章节中,我们将详细介绍提高程序优先级的具体措施,并对其进行分析和讨论。通过深入研究这些措施,我们可以更好地理解程序优先级的提升方法,从而为实际应用提供有效的指导和建议。

总之,提高程序优先级是一个具有重要意义的课题。通过有效的资源分配和调度,可以提高程序的优先级,从而提升计算机系统的性能和用户体验。在接下来的章节中,我们将详细介绍相关的措施和方法,以及它们的应用场景和实际效果。希望本文能为读者提供有价值的信息和启示。 1.2 文章结构 文章结构部分的内容包括对整篇文章的结构和组成部分的简要介绍。在这里,我们将介绍文章的章节组织并提供读者对文章内容的整体认识。 2. 正文 本文的正文部分将详细介绍提高程序优先级的措施。其中包括两个主要措施:第一节将介绍提高程序优先级的措施1,第二节将介绍提高程序优先级的措施2。通过这些措施的讲解,读者将能够了解如何提高程序在计算机系统中的运行优先级,以便更好地满足特定的需求。 3. 结论 结论部分将对整篇文章进行总结,并展望未来可能的发展方向。在总结部分,将对提高程序优先级的措施进行简要回顾,并强调它们的重要性和效果。在展望部分,将提出可能的研究方向和改进方法,以进一步提高程序优先级的效果,使其更好地适应不断发展的计算机应用领域。 通过以上章节组织,本文将全面介绍提高程序优先级的措施,并对其

操作系统教程 习题答案 作者 宗大华 宗涛 第7章习题解答.doc

第七章习题解答 一、填空 1.一个操作系统的可扩展性,是指该系统能够跟上先进计算技术发展的能力。 2.在引入线程的操作系统中,线程是进程的一个实体,是进程中实施调度和处理机分派 的基本单位。 3.一个线程除了有所属进程的基本优先级外,还有运行时的当前优先级。 4.在Windows 2000中,具有1~15优先级的线程称为可变型线程。它的优先级随着时间配额的用完,会被强制降低。 5.Windows 2000在创建一个进程时,在内存里分配给它一定数量的页帧,用于存放运行 时所需要的页面。这些页面被称为是该进程的“工作集”。 6.Windows 2000采用的是请求调页法和佳fL法相结合的取页策略,把页面装入到内存 的页帧里的。 7.分区是磁盘的基本组成部分,是一个能够被格式化和单独使用的逻辑单元。 8.MFT是一个数组,是一个以数组元素为记录构成的文件。 9.只要是存于NTFS卷上的文件,在MFT里都会有一个元素与之对应。 10.在Windows 2000的设备管理中,整个I/O处理过程都是通过I/O请求包(IRP)来驱 动的。 二、选择 1.在引入线程概念之后,一个进程至少要拥有D个线程。 A. 4 B. 3 C. 2 D. 1 2.在Windows 2000中,只有A状态的线程才能成为被切换成运行状态,占用处理器执行。 A.备用 B.就绪 C.等待 D.转换 3.Windows 2000是采用C来实现对线程的调度管理的。 A.线程调度器就绪队列表 B.线程调度器就绪队列表、就绪位图 C.线程调度器就绪队列表、就绪位图、空闲位图 D.线程调度器就绪队列表、空闲位图 4.在Windows 2000里,•个线程的优先级,会在A时被系统降低。 A.时间配额用完 B.请求I/O C.等待消息 D.线程切换 5.在单处理机系统,当要在进程工作集里替换•页时,Windows2000实潇的是B页面淘 汰策略。 A. FIFO (先进先出) B. LRU (最近最久未用) C. LFU (最近最少用) D. OPT (最优) 6.在页帧数据库里,处于下面所列A状态下的页帧才可以变为有效状态。 A.初始化 B.备用 C.空闲 D.修改 7.当属性值能够直接存放在MFT的元素里时,称其为B。 A.非常驻属性 B.常驻属性 C.控制属性 D.扩展属性 8.在NTFS文件系统中,文件在磁盘上存储时的物理结构是采用C的。 A.连续式 B.链接式 C.索引式 D.组合式 9.在Windows 2000的设备管理中,I/O请求包(IRP)是由D建立的。 A.用户应用程序 B.文件系统驱动程序

RTX技术详细分析

1.win32与RTX通过共享内存传输数据时,他们之间如何知道共享内存中现在有新数据? 是这样的,RTX不存在这类API函数,可以直接检测共享内存中的数据是否更新。数据的更新是由用户来控制的。目前最常用的方法是通过发送“事件体”来实现的,用到的API函数有RtWaitForSingleObject()和RtSetEvent()。一般是这样实现滴: 譬如P1是一个RTX进程,P2是一个Win32进程。 P2等待P1向共享内存中更新数据,它使用RtWaitForSingleObject(),就是说等另一个进程给他发送一个对象(这里是事件体),此时P2处于挂起状态,不占用CPU资源。 如果P1向共享内存中写入数据完毕,它将发送RtSetEvent(),将事件体传送给系统,系统将这个事件体派发给P2,P2就知道数据更新成功了。接下来RtWaitForSingleObject() 处于激活状态,他就可以继续执行RtWaitForSingleObject()下面的API函数了,譬如叠代运算什么的。 2.我现在只会用vc的rtx向导建立rtx的应用程序,现在想做个界面,读那个rtx的应用程序的共享内存,但是RtCreateSharedMemory在界面程序里面用不了,似乎要进行一些设置,不知道怎么把rtx加到界面程序中,请大家指点。不知道该发到哪里,就是这了,我说的rtx 不是腾汛的那个,是RTX6.0。 3.RTX能将一部分内存对Windwos隐藏,而只供RTX自己使用吗?如果可以,怎么实现? 可以。 1)boot.ini中可以使用/MAXMEM:n 选项来设置最大内存。 2)可以使用RTX的API RtMapMemory() 和RtUnmapMemory()。 RtMapMemory 在用户虚拟地址空间和物理地址空间建议一个映射,给予用户直接访问物理内存的能力。典型地,这将用来访问外设的寄存器或者映射到PC物理地址空间的缓冲区。最大的地址必须是合法的,比如32位的机器上,最大0XFFFFFFFF。 在Win32或者RTSS应用程序中,物理地址的范围限制为64MB。通过注册表可以修改这个限制 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Rtx\MapMemorySizeBound 。 4.Ardence RTX 当前存在的BUGS" RtMapMemory uses ZwMapViewOfSection on the Windows side and MMMapIOSpace on the RTX side to allow for mappings larger than 64 MB.This can cause Windows to sometimes fail when trying to map an address that RTX had previously mapped (2871, 5992). RtMapMemory在Windows端使用ZwMapV iewOfSection函数,而在RTX端使用MMMapIOSpace函数,从从而允许映射大于64MB的空间。如果映射到一个RTX已经映射过的地址,这可能导致Windows在某些时候映射失败。

了解 Windows Vista 内核:第一部分

了解Windows Vista 内核:第一部分 概览: 线程优先级和计划 基于文件的符号链接 取消I/O 操作 这是系列文章的第一部分,探讨的是Windows Vista 内核中的新增内容。在这一期中,我将着重说明在进程、线程和I/O 方面的更改;在将来几期内容中将涉及到内存管理、启动和关闭、可靠性和恢复以及安全性方面的内容。 本文的范围仅限于对Windows Vista™内核的更改,尤其是对Ntoskrnl.exe 和与其紧密关联的组件的更改。请记住,在Windows Vista 中还存在许多其他重大更改,但这些却超出了内核的范围,因此本文将不予以说明。其中包括对外壳(如集成的桌面搜索)、网络(如新的IPv6 堆栈和双向防火墙)和下一代图形模型(如Aero™Glass、Windows®Presentation Foundation、桌面窗口管理器和新图形驱动程序模型)的改进。而且未涉及的内容还包括新的Windows 用户模式和内核模式驱动程序框架(UMDF 和KMDF),因为在较早的Windows 版

本上它们在后级别才是可安装的。 CPU 时钟周期计数 Windows Vista 包含了进程和线程方面的大量增强功能,其中包括使用CPU 时钟周期计数器以较公平地进行CPU 分配,以及使用新的多媒体类计划程序服务(MMCSS),它有助于媒体应用程序提供稳定的播放。 所有Windows NT®版本,包括Windows Vista 程序在内,大约在每10 ms 或15 ms(毫秒)执行一次间隔计时器中断例程,间隔取决于硬件平台。该例程查看它所中断的线程并更新线程的CPU 使用统计数据,就好像该线程在整个间隔期间都在运行,而事实上,线程可能仅在间隔就要结束前才开始执行。而且,从技术上讲,可能已经为线程分配了CPU,但却一直没有机会运行,因为执行的是硬件和软件中断例程。 虽然对于报告线程和进程CPU 使用情况的诊断工具来说,基于时钟的时间计算是一个好方法,但是,若由线程计划程序使用该方法将导致不公平的CPU 分配。默认情况下,Windows 客户端版本上的线程最多可运行2 个时钟节拍(如果是在前台中运行则为6 个时钟节拍)。然而,根据线程在系统上的行为和其他活动,线程实际上可能在CPU 上根本没有时间或是最多得到6 个时钟节拍(如果是在前台中运行则为18 个时钟节拍)。 图1 显示了两个具有相同优先级的线程同时准备好运行时发生

相关文档