操作系统实验考试要点整理.doc_第1页
操作系统实验考试要点整理.doc_第2页
操作系统实验考试要点整理.doc_第3页
操作系统实验考试要点整理.doc_第4页
全文预览已结束

下载本文档

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

文档简介

创建线程过程(create函数的实现) /*创建一对应于函数name(外部标识符)的线程*/TCB的结构:Struct TCB unsigned char *stack;堆栈始址 unsigned ss; 堆栈段针 unsigned sp; 堆栈指针 char state; 进程状态 char name10;外部标识tcbNTCB ;首先是一些基本的定义和声明int create(char *name,codeptr code, int stacklen)int i;char *p;struct int_regs *pt;/*第一步:寻找空白的TCB*/for(i=1;iflags=0x200;/*flags寄存器的允许中断位*/pt-cs=FP_SEG(code);/*代码段的段地址*/pt-ip=FP_OFF(code);/*代码段的段内偏移地址*/pt-ds=_DS;/*数据段的段地址*/pt-es=_ES;/*附加数据段的段地址*/pt-off=FP_OFF(over);/*撤销线程代码的偏移地址*/pt-seg=FP_SEG(over);/*撤销线程代码的段址*/*第四步:初始化线程的控制块TCB*/strcpy(,name); /*填入线程的外部标识符*/tcbi.state=ready;/*将线程的状态置成就绪态*/tcbi.stack=p-stacklen;/*私有堆栈的起始地址*/tcbi.ss=FP_SEG(pt);/*当前线程的段地址*/tcbi.sp=FP_OFF(pt);/*当前线程的栈顶指针*/return i;/*返回线程的内部标示符*/终止线程的过程 (over函数的实现) /*撤销线程,收回被撤销线程的资源*/void over(void)disable();/*通过disable()与enable()来实现在执行该代码段时防止中断,确保原子性*/*撤销当前线程所申请的TCB内存空空间,因为一个线程在它执行完毕之后就需要撤销自己,所以是要用到current(当前)线程*/free(tcbcurrent.stack);/*堆栈指针的释放*/strcpy(,0);/*将线程的外部标示符置空*/tcbcurrent.state=finished;/*将状态置为终止态*/swtch();/*在线程撤销后,需要重新进行CPU调度*/enable();FCFS的现场保存(swtch函数实现)/*swtch()调度,手工调度才能运行,处理因其他因素引起的中断*/CPU现场保存信息cs,ip 专用寄存器(方式:函数调用)flags ss,sp 保存TCB中,其他都保存在栈(方式:手动保存)es,dsax,bx,cx,dx 通用寄存器(方式:编译器保存)si,di,bpvoid interrupt swtch(void) int i;i=Find();if(i=TL)/*时间片到时*/if(DosBusy()/*如果Dos忙*/return;disable();/*关中*/*保护正在执行的线程current的现场,暂停它的执行*/tcbcurrent.ss=_SS;tcbcurrent.sp=_SP;if(tcbcurrent.state=running)/*将执行状态变为就绪状态,暂停执行*/tcbcurrent.state=ready;/*找到以新的就绪线程*/for(i=1;i=NTCB)if(tcbcurrent.state=ready)tcbcurrent.state=running;enable();return;/*如果超出了NTCB则恢复现场然后返回*/*如果找到就绪线程,那么恢复线程i的现场,把CPU分配给它*/_SS=tcbi.ss;_SP=tcbi.sp;tcbi.state=running;/*置线程i为现有线程,并且重新开始计时*/current=i;timecount=0;enable();/*开中*/return;其他考试要点:1.在现场和恢复中常用到的一个数据结构是: Struct int-regs unsigned bp, di, si, ds, es, dx, cx, bx, ax, ip,cs, flags;2.引起CPU调度原因主要是有三种情况:时间片到时,线程执行完毕或正在执行的线程因等待某种事件而不能继续执行。3. 调度程序可以通过两个函数分别处理不同原因引起的调度:New_int8()函数主要是处理因时间片到时引起的调度该调度可以通过截取时钟中断(int 08)来完成;Swtch()函数主要是处理因其他原因引起的调度;New_int8()函数因为是通过截取时钟中断来实现,可以知道其是属于系统调度,由于涉及到系统调度的函数 都是需要对DOS状态进行判断,以防止出现系统数据混乱等情况的发生(从Dos的不可重入性来得出),而Swtch()函数是处理因其他原因引起的调度,所以它所涉及到的仅仅是用户级的函数调度,没有涉及到系统级的函数调度,因此Swtch()函数不需要对Dos状态进行判断。4. 线程的阻塞与唤醒线程的阻塞:主要是当某一线程需要阻塞的时候,将其插入阻塞队列中,等待唤醒进程唤醒,所以其过程为:首先,将线程的状态置为阻塞态,然后将线程插入指定的阻塞队列末尾,并重新进行CPU调度。 线程的唤醒:主要是唤醒阻塞队列里面的线程,所以其过程是:把阻塞队列头上的第一个线程的TCB取下来,并将其状态改为就绪状态,等待CPU调度5利用消息缓冲队列的线程间通信线程间的通信,关键采用send()与receive()来实现,通过发送一个文本信息来显示通信的过程,其过程为:send()函数:消息的发送者需要提供接收者的标识符,消息的长度以及消息正文的起始地址等信息,然后在发送原语里申请一空闲的消息缓冲区,用

温馨提示

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

评论

0/150

提交评论