欢迎来到天天文库
浏览记录
ID:20415944
大小:81.72 KB
页数:7页
时间:2018-10-12
《线程的基本概念和调度策略》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、一、线程的基本概念 进程(process)和文件(files)是UNIX/Linux操作系统两个最基本的抽象。进程是处于执行期的程序和它所包含的资源的总和,也就是说一个进程就是处于执行期的程序。一个线程(thread)就是运行在一个进程上下文中的一个逻辑流,不难看出,线程是进程中最基本的活动对象。 在传统的系统中,一个进程只包含一个线程。但在现代操作系统中,允许一个进程里面可以同时运行多个线程,这类程序就被称为多线程程序。所有的程序都有一个主线程(mainthread),主线程是进程的控制流或执行线程,见图1。在多线程程序中,主线程可以创建一个或多个对等线程(pee
2、rthread),从这个时间点开始,这些线程就开始并发执行,见图2。主线程和对等线程的区别仅在于主线程总是进程中第一个运行的线程。从某种程度上看,线程可以看作是轻量级的进程(lightweightprocess)。在Linux操作系统中,内核调度的基本对象是线程,而不是进程,所以进程中的多个线程将由内核自动调度。 每个线程都拥有独立的线程上下文(threadcontext),线程ID(ThreadID,TID),程序计数器(pc),线程栈(stack),一组寄存器(register)和条件码。其中,内核正是通过线程ID(TID)来识别线程,进行线程调度的。
3、图1多线程进程的控制流 图2并发线程执行模型 线程和进程在很多方面是相似的。相同点主要表现在如下几方面: 1)比如都具有ID,一组寄存器,状态,优先级以及所要遵循的调度策略。 2)每个进程都有一个进程控制块,线程也拥有一个线程控制块(在Linux内核,线程控制块与进程控制块用同一个结构体描述,即structtask_struct),这个控制块包含线程的一些属性信息,操作系统使用这些属性信息来描述线程。 3)线程和子进程共享父进程中的资源。 4)线程和子进程独立于它们的父进程,竞争使用处理器资源。 5)线程和子进程的创建者
4、可以在线程和子进程上实行某些控制,比如,创建者可以取消、挂起、继续和修改线程和子进程的优先级。 6)线程和子进程可以改变其属性并创建新的资源 除了这些相同点,在很多方面也存在着差异: 1)主要区别:每个进程都拥有自己的地址空间,但线程没有自己独立的地址空间,而是运行在一个进程里的所有线程共享该进程的整个虚拟地址空间 2)线程的上下文切换时间开销比进程上下文切换时间开销要小的多 3)线程的创建开销远远小于进程的创建 4)子进程拥有自己的地址空间和数据段的拷贝,因此当子进程修改它的变量和数据时,它不会影响父进程中的数据,但线程可以直接访问它进程中
5、的数据段 5)进程之间通讯必须使用进程间通讯机制,但线程可以与进程中的其他线程直接通讯 6)线程可以对同一进程中的其他线程实施大量控制,但进程只能对子进程实施控制 7)改变主线程的属性可能影响进程中其他的线程,但对父进程的修改不影响子进程。 二、进程和线程的优先级 进程优先级只是线程优先级的前身。当调用 fork() 子例程时,会创建一个进程和一个要在其中运行的线程。线程的优先级归结于进程。 内核为每个线程维护一个优先级值(有时称为调度优先级)。优先级值是一个正整数且与关联线程的重要性的变化方向相反。也就是说,较小的优先级值表示一个相对重
6、要的线程。当调度程序寻找线程进行分派时,它选择具有较小优先级值的可分派线程。 线程可以有固定的优先级或不固定的优先级。优先级固定的线程的优先级值是一个常量,而优先级不固定的线程的优先级值根据用户线程最小优先级级别(常量40)、线程的nice值(缺省值是20,可随意由nice或renice命令进行设置)和其处理器使用的损失而变化。 线程的优先级可以固定成某个值,如果用 setpri() 子例程设置(固定)它们的优先级的话,它们可以具有小于40的优先级值。这些线程不会受到调度程序重算算法的影响。如果它们的优先级值固定且小于40,这些线程将在可以运行所有用户线程之前运行和
7、完成。例如,一个具有固定值10的线程将在具有固定值15的线程之前运行。 用户可以应用nice命令使线程的不固定优先级变低。系统管理员可将一个负的nice值应用给线程,这样就给了它较好的优先级。 下图显示了一些可以更改优先级值的方法。 图1.如何确定优先级值.插图显示了如何能在执行过程中或应用了nice命令之后更改线程调度优先级值。优先级值越小,线程优先级越高。开始时,nice值缺省为20而基本优先级缺省为40。执行中发生了处理器损失后,nice的值仍然保持20,基本优先级仍
此文档下载收益归作者所有