用户级线程库课程设计报告_第1页
用户级线程库课程设计报告_第2页
用户级线程库课程设计报告_第3页
用户级线程库课程设计报告_第4页
用户级线程库课程设计报告_第5页
已阅读5页,还剩4页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计报告书题目:用户级线程库的实现

教师评语教师签名:日期:成绩评定备注

用户级线程库的实现目录TOC\o"1-3"\h\u6600用户级线程库的实现 320407一、设计目标 315546二、线程库的具体内容 39069三、实现过程 46029四、结果分析 828215五、课程设计总结 9一、设计目标本次课程设计的目标是开发一个用户级线程库,功能包括完整的线程创建/删除/joining,互斥锁,条件变量,以及一个基于优先级的调度器。完成此用户级线程库,可以使用该线程库编写多线程的应用,替代linux中的pthreads.二、线程库的具体内容使用线程库前首先要调用uthread_init()。这个函数只执行一次,负责初始化数据结构,比如全局uthreads矩阵和ut_curthr(当前正在执行的线程)。uthread_init()中有一些特殊的代码,处理当前正在执行的进程的上下文(即调用uthread_init()的进程),使其成为一个有效的uthread,并设置ut_curthr为该uthread,这个uthread被称为主线程或0号线程。所有事情初始化后,可以使用线程uthread_create()创建线程。一旦创建好线程,线程库能够调度这些线程。若线程需要暂时yield处理器给另一个线程(仍然是可执行的,即处于就绪态),则需要调用uthread_yield()。线程可以通过uthread_block()进入睡眠态,也可以通过uthread_wake()被唤醒。uthread_switch()函数负责选择另一个线程运行。调度器调度时,采用优先级调度算法,线程优先级可以由uthread_setprio()设置,数字越大优先级越高,相同优先级的线程则轮流使用CPU。每个优先级一个队列,相关的数据结构见uthread_sched.c中的runq_table。Uthreads中的线程有6种状态,定义如下:typedef

enum

{

UT_NO_STATE,

/*

无效的线程状态

*/

UT_ON_CPU,

/*

线程正在执行

*/

UT_RUNNABLE,

/*

线程可运行,就绪

*/

UT_WAIT,

/*

线程被阻塞

*/

UT_ZOMBIE,

/*

线程处于

zombie

状态,即已结束,但需要回收资源

*/

UT_TRANSITION,

/*

线程处于创建状态

*/

UT_JOINABLE,

//线程结束时需要一个线程回收其资源

UT_DETACHABLE,

//线程结束时,不需要一个线程回收其资源

UT_NUM_THREAD_STATES

//线程状态数目}

uthread_state_t;图SEQ图\*ARABIC1Uthread状态转换图在uthreads中永远不会有多于一个线程同时执行,但线程可被抢占。在uthreads中,使用uthread_makecontext()创建线程的机器上下文。如果需要改变当前正在执行线程,需要调用uthread_swapcontext(),这使得当前CPU上下文被保存,新的上下文被执行。保存的上下文作为newctx参数在之后调用uthread_swapcontext()时被重新执行。Uthread中有一个线程称之为Reaper线程,也就是1号线程,负责清理已结束线程占用的资源。值得注意的是reaper并不清理已经结束但还没有joined的non-detached线程,而是让uthread_join()去完成。三、实现过程需要实现的函数如下(更具体的实现思路请看源代码的注释)。uthread_yield:当前正在运行的线程让出CPU,线程仍然处于可运行状态,即UT_RUNNABLE。调用此函数时,当前线程加入到就绪队列,如果当前线程大于系统中已有的最高优先级线程,则直接从uthread_yield返回;否则放弃CPU,转去执行最高优先级的线程。uthread_wake:唤醒指定的线程,使其可再次被执行(注意:线程有可能已经处于就绪态)。所作的事情:改变状态,将其放入就绪队列。uthread_setprio:改变指定线程的优先级。注意,如果线程已处于UT_RUNNABLE状态(可执行,但没有占有cpu),则应该改变其优先级队列,如果该指定线程的优先级高于当前调用者,则调用者还要放弃CPU;如果线程状态为UT_TRANSITION,则它是一个刚创建的线程(即将第一次被放入就绪队列),将其状态改为UT_RUNNABLE。成功时返回1,否则返回0。图SEQ图\*ARABIC2uthread_yield()示意图uthread_switch:找到最高优先级的可运行线程,然后使用uthread_swapcontext()切换到它(注意设置UT_ON_CPU线程状态和当前线程)。如果调用线程本身就是最高优先级线程,则切换回调用线程。主要工作:找出系统中优先级最高的线程,并切换(必须要有可执行线程)。图SEQ图\*ARABIC3uthread_switch()示意图uthread_init:这个函数只在用户进程启动时调用一次,用于初始化所有的全局数据结构和变量。这个函数需要设置每一个线程的ut_state和ut_id,简单起见,本系统中选择线程数组的下标作为ut_id。uthread_create:创建一个线程执行指定的函数<func>,函数的参数为<arg1>和<arg2>,优先级为<prio>。首先,使用uthread_alloc找到一个有效的id,找不到时,返回合适的错误;然后,为线程分配栈,分配不成功时返回合适的错误;使用uthread_makecontext()创建线程的上下文;按照新发现的线程id,设置uthread_t结构,调用uthread_setprio设置线程的优先级,在<uidp>中返回线程id。不成功时返回0。uthread_exit:结束当前的线程(注意设置uthread_t中的标志)。如果线程是UT_DETACHABLE,则通过调用make_reapable()将其放入清理线程(reaper)清理队列并唤醒清理清理线程。如果线程是UT_JOINABLE,则唤醒等待的线程。然后调用uthread_switch()切换线程。图SEQ图\*ARABIC4uthread_exit()示意图uthread_join:等待指定的线程结束,如果线程没有结束执行,调用线程需要阻塞,直到线程结束。主要工作:如果要等待的线程还没有结束,则置线程的等待线程为当前线程,线程状态改为UT_WAIT,切换线程;如果成功地等到了线程结束,则调用make_reapable唤醒清理线程reaper将其彻底清理。错误条件及对应的errorcode参考pthread_join的manpage。图SEQ图\*ARABIC5uthread_join()示意图uthread_self:返回当前正在执行的线程的id。uthread_alloc:找到一个自由的uthread_t,返回其id(uthread_id_t)。uthread_destroy:清理指定的线程。uthread_cond_init:初始化指定的条件变量。uthread_cond_wait:等待指定的条件变量。改变当前线程的状态,释放当前线程占有的锁,并将当前线程放入条件变量的等待队列中,切换线程。uthread_cond_broadcast:唤醒等待于此条件变量的所有线程。uthread_cond_signal:唤醒等待于此条件变量的一个线程。uthread_mtx_init:初始化指定的mutex。uthread_mtx_lock:如果没有线程占有该锁,则将锁的拥有者改为当前线程,否则,当前阻塞,让出CPU。uthread_mtx_trylock:试图上锁mutex,得到锁时返回1,否则返回0。uthread_mtx_unlock:释放锁。如

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论