操作系统笔记

发布 2021-05-13 00:29:28 阅读 2594

第一章实时操作系统基础。

1.4 基于优先级的不可剥夺内核。

1. 内核:主要功能是进行任务调度。内核中最核心的基本服务就是调度的核心—任务切换。

2. 基于优先级的调度算法:在uc/os中,可以同时有64个就绪任务,每个任务都有各自的优先级。优先级用无符号整数表示,从0~63,取值越大则优先级越低。

uc/os总是调度就绪了的、优先级最高的任务获得cpu的控制权。

3. 不可剥夺型内核和可剥夺型内核。

1.5 同步与通信。

1. 同步:有时候,一个任务完成的前提是需要另一个任务给出一个结果,任务之间的这种约束性的合作机制称为任务间的同步。

2. 互斥:共享资源称为临界资源,这种访问共享资源的排他性就是互斥。临界资源可以是全局变量,也可以是指针、缓冲区或链表等其他数据结构,也可以是如打印机、硬盘等硬件。

要做到互斥访问临界资源,操作系统可以有多种方法,uc/os采用的方法有关中断、给调度器上锁和使用信号量等。

3. 临界区:每个任务中访问共享资源的那段程序称为临界区。临界区不允许任务切换。为保证系统的实时性,临界区**必须尽量短,能够在限定时间内完成。

4. 任务事件:事件就是操作系统运行过程中发生的事情。事件处理的对象主要有信号量、互斥信号量、事件标志组、邮箱、消息队列。

5. 信号量:信号量标识了共享资源的有效可被访问次数。

6. 互斥信号量:互斥信号量用于互斥资源的访问及在使用互斥信号量管理需要解决的优先级反转问题(采用优先级继承机制)。

7. 事件标志组:事件标志组管理的条件组合可以是多个事件都发生,也可以是多个事件中有任何一个事件发生,还可以是多个事件都没有发生或多个事件中有任何一个事件没有发生。

8. 消息邮箱:邮箱中的内容不是信件本身,而是指向消息内容的地址。

9. 消息队列:消息队列是由多个消息邮箱组合形成的,是消息邮箱的集合,实质上是消息邮箱的队列。同样是采用事件控制块来指示消息的位置和标记等待消息的任务。

不同的是,消息队列自身有消息控制块这样的数据结构,事件控制块中指示的不再是消息的地址,而是消息控制块的地址,使用消息控制块可以先进先出的方式管理多条信息。

1.6 时钟、中断和内存管理。

1. 中断:中断是实时地处理内部或外部事件的一种内部机制。中断源称为异步事件,处理异步事件所使用的程序是中断服务程序。

2. 时钟中断服务:在uc/os中,通过对硬件的设置,使在10~200ms的时间间隔内产生一次时钟中断,在该时钟中断服务程序中,对延时的任务进行延时计数,检查系统中是否有高优先级任务就绪而没有得到运行,相应进行任务调度。

3. 内存管理:uc/os中采用分区的方式管理内存,即将连续的大块内存按分区来管理,每个分区又包含数个内存块,每个内存块大小相同。uc/os采用内存控制块来管理内存。

内存控制块记录了内存分区的地址、分区中内存快的大小和数量,以及控制块的数量等信息。

第二章任务管理。

操作系统内核运行后,进行一次初始化操作osinit,对操作系统的重要数据结构如任务控制块、事件控制块。就绪表等进行初始化,并创建两个系统任务(统计任务和空闲任务)。然后创建一个taskstart任务,该任务用于设置时钟中断服务程序,接着调用osstart启动多任务,开始真正多任务地执行。

2.1 任务管理数据结构。

任务管理数据结构包括任务控制块、任务空闲链表和任务就绪链表、任务优先级指针表、任务堆栈等,是uc/os-ii内核的核心部分之一。这些数据的内容完全反映了任务的运**况。

1. 任务优先级:优先级是任务的唯一标志。各个任务的优先级必须不同,因此uc/os以优先级作为事件的标志,作为任务管理的主键。

任务的优先级可以是0~63,优先级62和63被统计任务和空闲任务占用,数字越小,优先级越高。

2. 任务优先级指针表:任务优先级指针表是用来获取某优先级的任务的任务控制块地址。

任务优先级指针表的定义如下:

os_tcb *ostcbpriotbl[os_lowest_prio + 1 ]

假如创建一个优先级为5的任务,在取得任务控制块的地址之后,需要简单地把该地址赋值给ostcbpriotbl[5]。那么以后在根据优先级查找任务控制块的时候,不需要遍历就绪链表,因为ostcbpriotbl[5]中就是这个任务控制块的地址。

3. 任务控制块(ostcbtbl):任务控制块是任务管理的核心数据结构,操作系统在启动的时候,首先要在内存中创建一定数量的任务控制块。任务控制块的数量等于操作系统能同时管理的最多任务数。

每个任务都有自己的任务控制块。

a) uc/os将任务控制块划分为两个链表:就绪链表和空闲链表。创建任务的时候就从空闲链表中取出一个空闲的任务控制块。

b) tybedef struct os_tcb{;}os_tcb;

定义了新的类型 os_tcb ,代表结构体struct os_tcb。

c) uc/os-ii是以结构体数组的形式生成了任务控制块的实体,声明如下:os_tcb ostcbtbl[os_max_tasks + os_n_sys_tasks],在定义了结构体的实体后,控制块的0地址就存储了任务堆栈的栈顶地址。

d) 任务控制块实体的声明的程序**定义了系统任务总数个任务控制块数组,于是这些控制块对应的数组元素为ostcbtbl[0]~ostcbtbl[os_max_tasks + os_n_sys_tasks - 1],它们占用连续的内存空间。

e) 任务状态(ostcbstat)取值范围。

f) #define os_stat_pend_any (os_stat_sem | os_stat_mbox | os_stat_q | os_stat_mutex | os_stat_flag)

g) 任务控制块事件等待标志ostcbstatpend

4. 空闲链表和就绪链表:

1) 创建一个新任务,前提条件就是系统中还有空闲任务块。

2) 这两个链表在操作系统的初始化程序osinit中创建的。

3) ostcbfreelist永远指向空闲链表的表头,如果为0,说明没有空闲任务控制块了;ostcblist永远指向就绪链表的表头,如果它为0,说明没有就绪任务了。

4) 空闲表是单向链表,就绪表是双向链表。向就绪链表中插入一个任务控制块,放在就绪链表的表头。

5. 任务堆栈:为了满足任务切换或响应中断时保存cpu寄存器中的内容,以及存取任务私有数据的需要,每个任务都有自己的堆栈。

1) 任务堆栈在操作系统中的定义如以下程序所示:

#define task_stk_size 512

typedef unsigned int os_stk ;

os_stk taskstk[os_max_tasks][task_stk_size] ;

task_stk_size是每个任务堆栈的大小,根据具体情况做移植时需修改此值。os_max_tasks是用户任务的数量,根据移植的系统需要进行修改。

统计任务和空闲任务的堆栈是单独定义的,分别是ostaskstatstk和ostaskidlestk。

2) 任务堆栈根据地址的增长方向,分为向下增长型和向上增长型。

3) 如果堆栈是向下增长的,也就是高地址向低地址增长,栈顶为taskstk[0][511],栈底为taskstk[0][0]。

4) 如果堆栈是向上增长的,也就是低地址向高地址增长,栈顶为taskstk[0][0],栈底为taskstk[0][511]。

5) 由此可知,在任务控制块中,ostcbstkptr是指向任务堆栈栈顶的指针,ostcbstkbottom是指向任务堆栈栈底的指针,ostcbstksize是任务堆栈的大小,如果ostcbstkptr与ostcbstkbottom相等,说明堆栈已经满了。

6. 任务就绪表和就绪组:

typedef unsigned char int8u

define os_rdy_tbl_size ( os_lowest_prio) /8 + 1 )

int8u osrdygrp ;

int8u osrdytbl [os_rdy_ybl_size] ;

操作系统 软件 操作系统作业

1 信号量的物理含义是什么?2 处于执行状态的进程若同时发生了下列两种情况 1 对某信号量执行p操作后,信号量的值变为负数。2 该进程的时间片到时产生中断。试问,该进程将由执行状态变迁为就绪态,还是阻塞态?简述理由。3 设有n个进程共享一临界区,对于下述情况,说明信号量的初值 含义,并用pv操作写出...

操作系统试卷

全国2002年4月高等教育自学考试。操作系统试题。课程 02326 一 单项选择题 每小题1分,共20分 在每小题列出的四个选项中,选出一个正确答案,并将正确答案的号码写在题干后面的括号内。1.关于操作系统的叙述 是不正确的。a.管理资源的程序b.管理用户程序执行的程序 c.能使系统资源提高效率的程...

操作系统试卷

a 联机b 脱机c 假脱机d 自动。13 作业调度选中一个作业后,按作业控制说明书中第一个作业步的要求创建该作业的进程,并使进程的状态为。a 就绪b 运行c 等待d 收容。14 为两个相互独立源程序进行编译的两个进程,它们之间的关系正确的是。a 它们可以并发执行,两者逻辑上有依赖关系。b 它们可以并...