第六讲线程与调度.ppt

Download Report

Transcript 第六讲线程与调度.ppt

课前回顾
• 实时操作系统的概述
• 相关操作系统的概念
• eCos的配置环境的建立
• 引导器redboot
学习目标
• 学习配置线程相关函数
• 学习配置线程的控制
• 学习配置调度策略
学习指南
• 线程是任务
• 多线程是eCos的特点
• 多线程需要调度
• 多线程调度基于优先级
难重点
• 线程的相关函数
• 位图调度的概念
• 多级队列调度的概念
第3章线程与调度
大纲要求:当前关键词:难重点:
• eCos是一个抢占式多任务实时操作系
统
• 系统中的线程可以具有不同的优先级,同
一优先级的线程以时间片轮转的方式调度
运行
• 为允许多个线程之间的协同工作和它们对
资源的竞争,需要提供一种同步和通信机
制。典型的同步机制是采用互斥、条件变
量和信号量,eCos也同样采用了这些
方法
第章
大纲要求:当前关键词:难重点:
• 线程的创建 线程是eCos的基本运行单位
• 函数cyg thread create用于创
•
•
•
建一个新的线程
大多数系统中,只在系统初始化的时候使用该
函数创建线程,并对线程所需要的数据进行动
态分配
新创建的线程处于挂起状态
创建线程的 API函数定义于头文件<cyg
/kernel/kapi.h>内
第章
调试时用的
容易跟踪
大纲要求:当前关键词:难重点:
• void cyg_thread_create(
•
cyg_addrword_t
sched_info,
•
cyg_thread_entry_t *entry,
•
cyg_addrword_t
entry_data,
•
char
*name,
•
void
*stack_base,
•
cyg_ucount32
stack_size,
•
cyg_handle_t
*handle,
•
cyg_thread
*thread
• );
/* scheduling info (eg pri) */
/* entry point function
*/
/* entry data
*/
/* optional thread name
*/
/* stack base, NULL = alloc */
/* stack size, 0 = default */
/* returned thread handle */
/* put thread here
*/
线程I
D
• 参数entry和entry data分别是线程的入口函数和入口
函数的参数,stack base和stacksize分别是分配
给该线程的栈和栈大小
• void cyg_thread_create(
•
cyg_addrword_t
sched_info,
•
cyg_thread_entry_t *entry,
•
cyg_addrword_t
entry_data,
•
char
*name,
•
void
*stack_base,
•
cyg_ucount32
stack_size,
•
cyg_handle_t
*handle,
•
cyg_thread
*thread
• );
/* scheduling info (eg pri) */
/* entry point function
*/
/* entry data
*/
/* optional thread name
*/
/* stack base, NULL = alloc */
/* stack size, 0 = default */
/* returned thread handle */
/* put thread here
*/
• 参数entry和entry data分
别是线程的入口函数和入口函数的参数,
stack base和stacksiz
e分别是分配给该线程的栈和栈大小。参
数sched info提供了线程的优先
级信息
第章
大纲要求:当前关键词:难重点:
第章
大纲要求:当前关键词:难重点:
線程入口函數
• 线程创建函数中的第二个参数指定了新线
程的入口函数。线程入口函数的格式如下:
• void cyg_thread_entry_t(cyg_addrword_t
data);
• 其参数data是线程创建函数的第三个
参数。
線程的優先級
• 线程创建函数的第一个参数sched info给调度
•
•
器提供了一些有关该线程的优先级信息。信息的详细内容
与使用的调度器相关。
对于位图调度器和多级队列调度器,它是一个小的整数,
通常是0~31之间的一个值,表示该线程的优先级,其
中0的优先级最高。最低优先级CYG THREAD M
IN PRIORITY通常只有系统的空闲线程使用。
优先级的具体数目可以通过内核配置选项CYGNUM
KERNEL SCHED PRIORITIES进行控
制。
在使用位图调度器时,同一优先级不能有两个线程。
• 在开发eCos应用程序时,必须了解系
统中的各种线程(包括eCos包所产生
的线程),并且要保证所有的线程都以适
当的优先级运行。内核提供了三个 API
函数:cyg thread set priorit
y、cyg thread get priority和
cygthread get current prio
rity,用于对线程的优先级进行操作。
線程相關API
• 对线程进行
操作时,有
时需要了解
线程相关的
一些信息
• 線程的控制
• 線程的終止
• void cyg_thread_kill(cyg_handle_t thread);/*该
•
•
•
函数用于杀死另外的一个线程*/
/* It may be necessary to arrange for the victim
to run for it to disappear */
cyg_bool_t cyg_thread_delete(cyg_handle_t
thread); /* false if NOT deleted */
void cyg_thread_exit(void);/*该函数允许线程自
己退出*/
线程优先级
• 与 UNIX一样,
优先级的值越小
其优先级越高
• 配 置 选 项 CY
G THREAD
MINPRIO
RITY指定的
优先级是最低优
先级,它的值与
所使用的调度器
有关
cyg_thread_get_priority
• /* Get the normal priority, ie without any applied mutex inheritance
•
•
•
•
•
•
•
•
•
or
* ceiling protocol. */
externC cyg_priority_t cyg_thread_get_priority(cyg_handle_t thread)
{
#ifdef CYGIMP_THREAD_PRIORITY
return ((Cyg_Thread *)thread)->get_priority();
#else
return 0;
#endif
}
线程数据
• 线程专用的空间
• 存储线程的信息
• externC cyg_ucount32 cyg_thread_new_data_index()
• {
•
Cyg_Thread::cyg_data_index index = Cyg_Thread::new_data_index();
•
CYG_ASSERT(index >= 0, "failed to allocate data index" );
•
return index;
• }
线程析构
• 释放被该线程所占用的资源
• 这种支持必须使用配置选项 CYGPKG KERN
EL THREADSDESTRUCTORS对其
进行使能
线程析构
•
•
•
•
•
•
__externC cyg_bool_t
cyg_thread_add_destructor( cyg_thread_destructor_fn fn,
cyg_addrword_t data )
{
return Cyg_Thread::self()->add_destructor( fn, data );
}
•
•
•
•
•
•
__externC cyg_bool_t
cyg_thread_rem_destructor( cyg_thread_destructor_fn fn,
cyg_addrword_t data )
{
return Cyg_Thread::self()->rem_destructor( fn, data );
}
线程析构在配置器中
线程信息
• typedef struct
• {
•
cyg_handle_t
handle;
•
cyg_uint16
id;
•
cyg_uint32
state;
•
char
*name;
•
cyg_priority_t
set_pri;
•
cyg_priority_t
cur_pri;
•
cyg_addrword_t
stack_base;
•
cyg_uint32
stack_size;
•
cyg_uint32
stack_used;
• } cyg_thread_info;
調度
• eCos内核的核心是调度器
• 当前版本的eCos具有二个调度器:①
位图(bitmap)调度器。② 多级队
列(MLQ)调度器。
• 位图调度器使用一个位图(bitmap)
来表示所有的线程,位图中的每一位都对
应于一个可运行的线程,每一个线程的优
先级是惟一的。
多级队列调度器
• 多级队列调度器是一种具有优先级的 FI
FO调度策略。它具有多个线程优先级,
允许多个线程具有相同的优先级。因此,
只要有足够可用的内存,系统所允许的线
程数目是没有限制的。像查找最高优先级
线程这样的操作在多级队列调度机制中的
开销要比位图调度器中的开销要大。多级
队列调度器支持优先级继承
時間片設定
調度操作及其API
• eCos通过对计数器Schedule
r::sched lock的管理来实现
这一机制。当该计数器的值不为0时,它
阻止再次调度的发生。当前线程通过调用
cyg scheduler lock()
函数对其进行锁定,计数器加1,阻止其
他调度操作。cyg scheduler
unlock()函数使计数器减1,如
果计数器为0,就允许继续进行调度操作
调度相关API
Bitmap.hxx
调度相关函数
• void cyg_scheduler_start(void)
• void cyg_scheduler_lock(void)
• void cyg_scheduler_unlock(void)
调度相关函数
Start(void)
调度相关函数
• lock
调度相关函数
• unlock
调度相关函数
本课小结
• 线程与调度
• 线程的状态迁移
• 位图调度
• 多级队列调度
讨论及课后习题
• 继续做好第二次的作业
• 建立好交叉编译环境
• 完成引导器redboot的编译和模拟