求嵌入式操作系统调度模块中线程的数据结构设计的程序~~

来源:百度知道 编辑:UC知道 时间:2024/05/15 23:30:57
我们的课程设计~~不会做啊~~求求大虾们帮忙~~~
完成一个嵌入式操作系统调度模块中线程的数据结构设计,从而熟练地掌握和应用线性表、堆栈、队列、排序、查找等已学数据结构知识。
老师给的资料~~~:::例如:在一个典型的系统中,等待调度的准备队列由4个优先级的队列组成:由高到低分别为KERNEL,HIGH,NORMAL和IDLE。调度程序将会选择处于优先级别最高的准备队列中的线程去执行完成,如中途因时间片用完则会将其再次放入相应优先级别的准备队列末尾,然后选择下一个线程去调度执行。在准备队列中采用的是简单的FCFS先到先服务的调度方法。采用FCFS调度策略可以说是最简单的调度算法,平均等待时间尽管不是最小,但是实现较为简单。
当一个线程希望进入睡眠时,线程将会被放入到睡眠队列中,并根据该线程的参数设置其睡眠时间。睡眠队列是由线程按需要睡眠的时间的多少,由小到大排列组成的队列。当位于队列前面的线程的睡眠时间结束后,就会从睡眠队列放回到原优先级的准备队列;同时将睡眠队列中的剩余线程按睡眠时间长短进行重新调整。当系统中所有的任务运行完毕时,系统将进入休眠。整个系统的唤醒将由睡眠队列中最早睡眠时间到期的线程所决定。
当线程在等待一个mutex互斥量,或者等待一个semaphore信号量的时候,线程将处于挂起状态(BLOCKED),线程将会被放入到mutex队列或是semaphore队列中,直到等待的资源获得满足,线程才能从mutex队列或是semaphore队列中放回到准备队列中等待新的调度。
基本提示:线性表中的每个线程项都包含了:堆栈的当前指针(sp)、基址指针(stack)和堆栈大小(stacksize)、线程的函数地址指针、线程的优先级和保存线程所用设备数量的变量、还有当线程加入到睡眠队列或是挂起队列时用来指向下一个线程的指针。因线程的上下文切换所需要保存的寄存器值等信息所需空间较大,因而采用只有当线程被分配成功后才为其上下文切换开辟存储堆栈的方式,大小由应用线程在创建时设定。

拜托了,就此拜谢~~~~

nt!_KTHREAD
struct _KTHREAD, 73 elements, 0x1c0 bytes
+0x000 Header : struct _DISPATCHER_HEADER, 6 elements, 0x10 bytes
+0x000 Type : UChar
+0x001 Absolute : UChar
+0x002 Size : UChar
+0x003 Inserted : UChar
+0x004 SignalState : Int4B
+0x008 WaitListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x004 Blink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x010 MutantListHead : struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes
+0x000 Flink : Ptr32 to struct _LIST_ENTRY, 2 elements, 0x8 bytes