基于线程的多任务调度系统的设计与实现实验报告
操作系统 实验 进程调度 银行家算法 多线程编程 存储管理 磁盘调度

实验一进程调度实验学时:2学时实验类型:设计实验要求:必修一、实验目的多道程序设计中,经常是若干个进程同时处于就绪状态,必须依照某种策略来决定那个进程优先占有处理机。
因而引起进程调度。
本实验模拟在单处理机情况下的处理机调度问题,加深对进程调度的理解。
二、实验内容1.优先权法、轮转法简化假设1)进程为计算型的(无I/O)2)进程状态:ready、running、finish3)进程需要的CPU时间以时间片为单位确定2.算法描述1)优先权法——动态优先权当前运行进程用完时间片后,其优先权减去一个常数。
2)轮转法三、流程图四、实验程序代码package进程调度;/***@author**/public class CPCB {private String name;private int time;private int count;public int getCount() {return count;}public void setCount(int count) { this.count = count;}public String getName() {return name;}public void setName(String name) { = name;}public int getTime() {return time;}public void setTime(int time) {this.time = time;}}package进程调度;/***@author**/class PCB{private String name;private int time ;private int priority ;public int getTime(){return time;}public void setTime(int time){this.time = time;}public int getPriority(){return priority;}public void setPriority(int priority){ this.priority = priority;}public String getName() {return name;}public void setName(String name) { = name;}}package进程调度;import java.util.LinkedList;/***@author**/class process{private final static int nap_time = 500;private LinkedList<PCB> queue = new LinkedList<PCB>();private LinkedList<CPCB> cqueue = new LinkedList<CPCB>();//优先权算法public void go(int p_Num) throws Exception{for(int i = 0;i<p_Num;i++){PCB pcb = new PCB();int time = (int)(Math.random()*20+1);int pri = (int)(Math.random()*20+4);pcb.setName("进程"+i);pcb.setTime(time);pcb.setPriority(pri);queue.add(pcb);}queue = this.sort(queue);int i=0;while(queue.size()!=0){PCB pcb = (PCB)queue.getFirst();System.out.println(i+"\t\t"+pcb.getName()+"运行\t"+"优先级:"+pcb.getPriority()+"---所需时间:"+pcb.getTime());// Thread.sleep(nap_time);int pre = pcb.getPriority() - 3;int time = pcb.getTime() - 1;if(time<=0){System.out.println(pcb.getName()+"\t\t进程运行结束");PCB p = (PCB)queue.removeFirst();System.out.println("移除队列的进程是\t\t"+p.getName()+"\n队列中还有"+queue.size()+"个进程\n");}else{queue.remove();pcb.setPriority(pre);pcb.setTime(time);// System.out.println("运行后:"+i+"----"+pcb.getName()+"---优先级:"+pcb.getPriority()+"---所需时间:"+pcb.getTime());queue.add(pcb);queue = this.sort(queue);}i++;}}//时间片轮转调度算法public void cycle(int p_Num) throws Exception{final int time = 3; //定义轮转时间片数for(int i = 0;i<p_Num;i++){CPCB cpcb = new CPCB();cpcb.setTime((int)(Math.random()*20)+1);cpcb.setName("进程"+i);cpcb.setCount(0);cqueue.add(cpcb);}while(cqueue.size()!=0){CPCB cpcb = (CPCB)cqueue.getFirst();while(cpcb.getCount()!=time){// Thread.sleep(nap_time);cpcb.setTime(cpcb.getTime() - 1);cpcb.setCount(cpcb.getCount()+1);for(int i=0;i<cqueue.size();i++)//输出进程运行情况{CPCB cpcb1 = (CPCB)cqueue.get(i);System.out.println(cpcb1.getName()+"\t\t所需时间片数"+cpcb1.getTime()+"\t\t已占用CPU时间片数"+cpcb1.getCount());}if(cpcb.getTime()==0){System.out.println(cpcb.getName()+"运行结束\n"+"-------------移除队列的是"+cpcb.getName()+"-------------");cqueue.removeFirst();System.out.println("-------------队列中还有"+cqueue.size()+"个进程--------------");break;}if(cpcb.getCount()==time){// cqueue.remove();System.out.println("----因为"+cpcb.getName()+"占用CPU时间片数"+cpcb.getCount()+"="+time);System.out.println(cpcb.getName()+"时间片运行结束"+cpcb.getCount()+cpcb.getTime());CPCB p = (CPCB)cqueue.removeFirst();cqueue.add(p);cpcb.setCount(0);break;}}}}public LinkedList<PCB> sort(LinkedList<PCB> processes){for(int i=0;i<processes.size();i++){PCB thread = new PCB();thread = processes.get(i);for(int j=i+1;j<processes.size();j++){if(thread.getPriority() < processes.get(j).getPriority()){PCB mythread = new PCB();mythread = thread;//thread = processes.get(j);processes.set(i, processes.get(j));processes.set(j, mythread);}}}return processes;}}package 进程调度;import java.io.BufferedReader;import java.io.InputStreamReader;/**** @author 邱福文**/public class MainFun{public void FPF(){}public static void main (String[] args) throws Exception{Integer n2;do{System.out.print("请输入进程数:");BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));String str = sin.readLine();Integer n = Integer.parseInt(str);System.out.print("请输入调度算法:\n"+"1为优先权\n"+"2为轮转法\n"+"0 退出\n");BufferedReader sin2 = new BufferedReader(new InputStreamReader(System.in));String str2 = sin2.readLine();process p = new process();// do{n2 = Integer.parseInt(str2);switch(n2){case 0:break;case 1:p.go(n);break;case 2:p.cycle(n);break;default:System.out.print("输入有误请重新输入");break;}}while(n2!=0);}}五、实验结果请输入进程数:3请输入调度算法:1为优先权2为轮转法0 退出10 进程0运行优先级:19---所需时间:181 进程1运行优先级:19---所需时间:152 进程0运行优先级:16---所需时间:173 进程1运行优先级:16---所需时间:144 进程0运行优先级:13---所需时间:165 进程1运行优先级:13---所需时间:136 进程2运行优先级:10---所需时间:87 进程0运行优先级:10---所需时间:158 进程1运行优先级:10---所需时间:129 进程2运行优先级:7---所需时间:710 进程0运行优先级:7---所需时间:1411 进程1运行优先级:7---所需时间:1112 进程2运行优先级:4---所需时间:613 进程0运行优先级:4---所需时间:1314 进程1运行优先级:4---所需时间:1015 进程2运行优先级:1---所需时间:516 进程0运行优先级:1---所需时间:1217 进程1运行优先级:1---所需时间:918 进程2运行优先级:-2---所需时间:419 进程0运行优先级:-2---所需时间:1120 进程1运行优先级:-2---所需时间:821 进程2运行优先级:-5---所需时间:322 进程0运行优先级:-5---所需时间:1023 进程1运行优先级:-5---所需时间:724 进程2运行优先级:-8---所需时间:225 进程0运行优先级:-8---所需时间:926 进程1运行优先级:-8---所需时间:627 进程2运行优先级:-11---所需时间:1 进程2 进程运行结束移除队列的进程是进程2队列中还有2个进程28 进程0运行优先级:-11---所需时间:829 进程1运行优先级:-11---所需时间:530 进程0运行优先级:-14---所需时间:731 进程1运行优先级:-14---所需时间:432 进程0运行优先级:-17---所需时间:633 进程1运行优先级:-17---所需时间:334 进程0运行优先级:-20---所需时间:535 进程1运行优先级:-20---所需时间:236 进程0运行优先级:-23---所需时间:437 进程1运行优先级:-23---所需时间:1 进程1 进程运行结束移除队列的进程是进程1队列中还有1个进程38 进程0运行优先级:-26---所需时间:339 进程0运行优先级:-29---所需时间:240 进程0运行优先级:-32---所需时间:1进程0 进程运行结束移除队列的进程是进程0队列中还有0个进程请输入进程数:3请输入调度算法:1为优先权2为轮转法0 退出2进程0 所需时间片数8 已占用CPU时间片数1 进程1 所需时间片数6 已占用CPU时间片数0 进程2 所需时间片数13 已占用CPU时间片数0 进程0 所需时间片数7 已占用CPU时间片数2 进程1 所需时间片数6 已占用CPU时间片数0 进程2 所需时间片数13 已占用CPU时间片数0 进程0 所需时间片数6 已占用CPU时间片数3 进程1 所需时间片数6 已占用CPU时间片数0 进程2 所需时间片数13 已占用CPU时间片数0 ----因为进程0占用CPU时间片数3=3进程0时间片运行结束36进程1 所需时间片数5 已占用CPU时间片数1 进程2 所需时间片数13 已占用CPU时间片数0 进程0 所需时间片数6 已占用CPU时间片数0 进程1 所需时间片数4 已占用CPU时间片数2 进程2 所需时间片数13 已占用CPU时间片数0 进程0 所需时间片数6 已占用CPU时间片数0 进程1 所需时间片数3 已占用CPU时间片数3 进程2 所需时间片数13 已占用CPU时间片数0 进程0 所需时间片数6 已占用CPU时间片数0 ----因为进程1占用CPU时间片数3=3进程1时间片运行结束33进程2 所需时间片数12 已占用CPU时间片数1 进程0 所需时间片数6 已占用CPU时间片数0 进程1 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数11 已占用CPU时间片数2 进程0 所需时间片数6 已占用CPU时间片数0 进程1 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数10 已占用CPU时间片数3 进程0 所需时间片数6 已占用CPU时间片数0----因为进程2占用CPU时间片数3=3进程2时间片运行结束310进程0 所需时间片数5 已占用CPU时间片数1 进程1 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数10 已占用CPU时间片数0 进程0 所需时间片数4 已占用CPU时间片数2 进程1 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数10 已占用CPU时间片数0 进程0 所需时间片数3 已占用CPU时间片数3 进程1 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数10 已占用CPU时间片数0 ----因为进程0占用CPU时间片数3=3进程0时间片运行结束33进程1 所需时间片数2 已占用CPU时间片数1 进程2 所需时间片数10 已占用CPU时间片数0 进程0 所需时间片数3 已占用CPU时间片数0 进程1 所需时间片数1 已占用CPU时间片数2 进程2 所需时间片数10 已占用CPU时间片数0 进程0 所需时间片数3 已占用CPU时间片数0 进程1 所需时间片数0 已占用CPU时间片数3 进程2 所需时间片数10 已占用CPU时间片数0 进程0 所需时间片数3 已占用CPU时间片数0 进程1运行结束-------------移除队列的是进程1--------------------------队列中还有2个进程--------------进程2 所需时间片数9 已占用CPU时间片数1 进程0 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数8 已占用CPU时间片数2 进程0 所需时间片数3 已占用CPU时间片数0 进程2 所需时间片数7 已占用CPU时间片数3 进程0 所需时间片数3 已占用CPU时间片数0 ----因为进程2占用CPU时间片数3=3进程2时间片运行结束37进程0 所需时间片数2 已占用CPU时间片数1 进程2 所需时间片数7 已占用CPU时间片数0 进程0 所需时间片数1 已占用CPU时间片数2 进程2 所需时间片数7 已占用CPU时间片数0 进程0 所需时间片数0 已占用CPU时间片数3 进程2 所需时间片数7 已占用CPU时间片数0 进程0运行结束-------------移除队列的是进程0--------------------------队列中还有1个进程--------------进程2 所需时间片数6 已占用CPU时间片数1进程2 所需时间片数4 已占用CPU时间片数3----因为进程2占用CPU时间片数3=3进程2时间片运行结束34进程2 所需时间片数3 已占用CPU时间片数1进程2 所需时间片数2 已占用CPU时间片数2进程2 所需时间片数1 已占用CPU时间片数3----因为进程2占用CPU时间片数3=3进程2时间片运行结束31进程2 所需时间片数0 已占用CPU时间片数1进程2运行结束-------------移除队列的是进程2--------------------------队列中还有0个进程--------------请输入进程数:实验二银行家算法一、实验目的死锁会引起计算机工作僵死,因此操作系统中必须防止。
用VC++实现多线程的调度和处理

用VC++实现多线程的调度和处理
毋小省
【期刊名称】《焦作大学学报》
【年(卷),期】2001(015)001
【摘要】详述了在Window95/98NT下的多任务、多进程和多线程的含义,基于MFC的用户界面线程和工作者线程的建立及终止,进程和线程的优先级问题以及多线程间的同步问题.
【总页数】3页(P57-59)
【作者】毋小省
【作者单位】焦作大学
【正文语种】中文
【中图分类】TP316.86
【相关文献】
1.基于VC++串口多线程通信的实现 [J], 岳明;何波贤;余博超;牟健
2.基于VC++的多线程聊天程序的设计与实现 [J], 潘军;张诗楠;王晓
3.MFC类库实现多线程的调度和处理 [J], 刘思程;余彬
4.MFC类库实现多线程的调度和处理 [J], 刘思程
5.基于VC++的多线程《计算机图形学》教学演示系统设计与实现 [J], 赵辉煌;魏书堤;陈坚祯;唐佳伟
因版权原因,仅展示原文概要,查看原文内容请购买。
毕业设计(论文)-基于java的mp3播放器jmplayer[管理资料]
![毕业设计(论文)-基于java的mp3播放器jmplayer[管理资料]](https://img.taocdn.com/s3/m/d62b9a9925c52cc58ad6be43.png)
基于JA V A的Mp3播放器JMPlayer作者姓名专业计算机科学与技术指导教师姓名专业技术职务讲师山东轻工业学院本科毕业设计(论文)原创性声明本人郑重声明:所呈交的毕业论文,是本人在指导教师的指导下独立研究、撰写的成果。
论文中引用他人的文献、数据、图件、资料,均已在论文中加以说明,除此之外,本论文不含任何其他个人或集体已经发表或撰写的成果作品。
对本文研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示了谢意。
本声明的法律结果由本人承担。
毕业论文作者签名:年月日山东轻工业学院关于毕业设计(论文)使用授权的说明本毕业论文作者完全了解学校有关保留、使用毕业论文的规定,即:学校有权保留、送交论文的复印件,允许论文被查阅和借阅,学校可以公布设计论文的全部或部分内容,可以采用影印、扫描等复制手段保存本论文。
指导教师签名:毕业设计(论文)作者签名:年月日年月日目录摘要 (III)ABSTRACT (IV)第一章引言 (1)课题研究背景及意义 (1)音乐播发器的发展及历史 (1)系统开发目标 (2)本文的主要内容和结构 (2)第二章相关工具及技术介绍 (1)Eclipse简介 (3)Java Thread简介 (4)JavaSound简介 (5)Java Swing简介 (6)Java Properties简介 (7)第三章需求分析 (9)工作流程分析 (9)评价具体需求分析 (9)系统功能结构图 (9)功能详细描述 (10)Mp3播放 (10)播放控制 (10)播放信息控制 (10)Mp3列表管理 (11)歌词 (11)其他 (11)第四章总体设计 (12)系统要求 (12)系统功能描述 (12)系统运行环境 (13)系统设计思想 (13)总体流程设计 (13)Mp3播放设计 (14)播放模式设计 (15)Mp3文件列表管理设计 (15)歌词设计 (16)皮肤切换设计 (17)显示模式设计 (18)第五章详细设计 (19)界面设计 (19)系统关键类设计 (20)系统类结构 (22)第六章软件功能实现 (23)播放Mp3实现 (23)Mp3文件解析实现 (23)Mp3列表控制类实现 (23)Mp3歌词解析及显示控制实现 (23)结束语 (25)参考文献 (24)致谢 (27)摘要随着java 语言的出现,软件的跨平台性已经能被更进一步的解决和处理,随着Internet的发展,软件的跨平台性又被提高到另一个新的要求。
基于Windows+RTX的CNC实时多任务调度设计

但是传统数控系统把所有核心功能任务 ( 包括译 码、 刀具补偿 、 插补及位置控制等) 均划为控制类任务 , 未进行实时任务和非实时任务 的划分 , 所有任务运行
在 同一环境下 , 主要 由低级语言和专用硬件来完成 , 不 利于实现系统功能的实时性和互操作性 。因此 , 如何 完 成具 有 实时性 的多任 务 调度 就 成 为 采用 基 于 P C的
基 于 Widw + T n o s R X的 C C实 时多任务 调度 设计 N
・3 l 1・
基于 Wi o s T n w +R X的 C C实时 多任务 调度设 计 d N
刘 寰 , 现生 , 秦 蒋明桔 , 田青 山
707 ) 10 2 ( 西北工业 大学 机电学院 , 陕西 西安
Ab ta t A a i p o oy e o otC y tm s b i a e n W i d w . ET d v lp n lt r a d r - s r c : b sc r ttp f f NC s se i u l b s d o n o s N e e o me t a o m n e s t p f
开放式数控系统架构。Wi o sN n w . T操作系统是非抢 d 先式多任务调度机制H , 且其线程优先 级太少 , J 中断 活 动不 遵循 线 程 优 先 级 J不 能 完 成 实 时 任 务 , 以 , 所 采用具有完全抢 占式线程调度机制的 R X作 为 Wi T n - dw 实时扩展 , os 以保证完成数控系统的高实时性任
务; 组件是指系统中可替换的物理单元 , 该单元封装了 模块的实现细节并提供了一组实现 的接 口 , 采用组 件设计思想开发核心功能模块 , 用以满足开放式数控 系统的可重构 、 可扩展等要求 。
基于事件驱动的单片机多任务程序设计

嵌 入式系统 最常见 的软件 架构一般有 两种川:前 后台系统和多任务 实时操作 系统 ,单片机应用系统广
要 ,将多任务机制 引入单 片机系统 ,可 以大大提高现
有单片机系统的工作效率 ,满足多任务要求。
泛使 用的是前后系统 。在这种架构下 ,应 用程序~般
是一个无限循环 ,循环 中调用相应 的函数完成相应 的
计 算 机 系 统 应 用
ht:ww . Sa r. t l wc ・. gc pl - o a
21 0 2年 第 2 卷 第 7 期 1
基于事件驱动的单 片机多任务程序设
周富相 ,陈德毅 ,郑晓 晶
( 总参通信训练基 地,宣化 0 5 0 ) 7 10
摘Hale Waihona Puke 要 :利用单片机 进行嵌入式系统开发 时,经常会面 临同时处理多个任务 的要求 。为了在 资源紧缺 的单片机
l 单片机多任务系统 内核设计
单片机 多任务系统分 为两个 部分,多任 务内核和 用户应用程序 。多任务 内核是整个单片机软件 系统的 核心部分 ,负责进行任务管理 、 任务调度及事件处理; 用户应用程序在 多任务 内核的调度 下通 过解析 事件 来 执行相应 处理,完 成相应 功能 。因此,主要对 多任务 内核的设计进行论述 ,而用户应用程序这里不再详细
论述。
操 作 。这种程序 设计方 法就是单任务机 制 ,单任务系 统具有简单直观 、易于控制的优点 。然而 由于程序 只
能按顺序依 次执行 ,缺乏灵活性,只能使用 中断函数 实时地处理~些较 短的任 务,在 较复杂的应用 中使用 极为不便 ,嵌入 式多任务实时操作系统的 出现解 决了 这个 问题 【。在多任 务系统 中,可 以同时执行多 个并 2 1
vxWorks多任务编程初探(转)

vxWorks多任务编程初探(转)进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位。
程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体。
而进程则不同,它是程序在某个数据集上的执行,是一个动态实体。
它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消,反映了一个程序在一定的数据集上运行的全部动态过程。
线程(Thread)是进程的一个实体,是CPU调度和分派的基本单位。
线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一内存空间,当进程退出时该进程所产生的线程都会被强制退出并清除。
线程可与属于同一进程的其它线程共享进程所拥有的全部资源,但是其本身基本上不拥有系统资源,只拥有一点在运行中必不可少的信息(如程序计数器、一组寄存器和栈)。
根据进程与线程的设置,操作系统大致分为如下类型:1、单进程、单线程:MS-DOS大致是这种操作系统;2、多进程、单线程:多数UNIX(及类Unix的Linux)是这种操作系统;3、多进程、多线程:Windows NT(以及基于NT内核的Windows 2000、XP等)、Solaris 2.x和OS/2都是这种操作系统;4、单进程、多线程:vxWorks就是这种操作系统。
vxWorks只有一个进程(内存空间和资源分配),其任务的概念与线程大致相当,所有任务之间共享内存和其它资源。
vxWorks由一个体积很小的内核及一些可以根据需要进行定制的系统模块组成。
vxWorks 内核最小为8KB,即便加上其它必要模块,所占用的空间也很小,且不失其实时、多任务的系统特征。
vxWorks的内核主要包括:1、多任务:为满足真实世界事件的异步性,现代操作系统需提供多任务支持,由系统内核分配CPU给多个任务并发执行。
关于单片机系统中的多任务多线程机制的探究

3 RTOS
用户所 用 的单片 机 , 常常 是一个 单一 流程和 任务 。 需 要一个 操作 如何 安排
调 度分 配任 务 , 这 一 点很 重要 , 就是 ( Re a l -T i me Op e r a t i n g S y s t e m,R T O S )
实施 者 系统 , 用它 来进 行管理 和维护 , t ! [ J C P U调度 管理模 式 , R T O S 实现 多任务 实 时处理 是一件 很简单 的事 。 而 出于一 些 实际情况 , 比如 技术 和成本上 的原 因 , 这类 软件 不需要将 应用软 件和处 理系 统软件分 开处理 , 所 以没选 配实时多 任务
就 是在 特定 时 间片上处 理特 定程 序而 其他程 序排 队轮 询处理 , 因此 , 将使 处理
以后 的操 作将提 出我们 队系统多 任务多下 的数据维 护和管理 。 这是 整个单片 机 多任务 运行 情 况下所 必须 而不 可避免 的 问题 。 在多 进程 管理 的长期 发展过程 中, 多进程 多任 务运行 , 时 间片轮询 是个 比 较较好 的处理 方式 , 但C P U任务量 较多 时候 , 多任务 的运行将 会成 为系统 的调 用任务 的 负载 , 针对 于高优 先级 别的设 定 , 包 括在抢 占中对于 空闲任务 和统 计
的最 大的难题 , 即是 在对任务 和线程 的标 记后 , 系 统按照相 应标记运行 , 若 是各
数据库大学生实习报告

数据库大学生实习报告•相关推荐数据库大学生实习报告时间过得真快,一段时间的实习生活已经结束了,这次实习让你有什么心得呢?为此就要认真思考实习报告如何写了。
但是相信很多人都是毫无头绪的状态吧,以下是小编为大家整理的数据库大学生实习报告,供大家参考借鉴,希望可以帮助到有需要的朋友。
数据库大学生实习报告1一、实习目的认识实习是本科教学计划中非常重要的实践性教学环节,其目的是使学生了解和掌握电力生产知识、印证、巩固和丰富已学过的计算机专业课程内容,培养学生理论联系实际,提高其在生产实践中调查研究、观察问题、分析问题以及解决问题的能力和方法,为后续专业课程的学习打下基础。
通过认识实习,还应使学生了解现电力生产方式,培养热爱软件工程专业思想。
二、实习内容为了达到上述实习目的,实习主要内容应包括:1、参观浦东软件园;2、上海市高新技术产业展;3、四场高水平的技术讲座。
三、实习过程1、参观浦东软件园进入主体大楼后,上海浦东软件园和它的图标赫然放置在最显眼的门口处,我们跟随着老师的步伐,一路向内层走去。
在路上我们注意到了墙上贴出来的优秀学员的照片,以及关于软件园的人才和研制软件对于国家信息技术的贡献,可以称之为一条荣誉回廊。
迈过这条回廊,我们走到了一个广阔的教室,里面整整齐齐摆放了数十台计算机,看其规模,我猜想这应该是一个大型的计算机学习教室,供里面的学员进行专业方面的开发和探索。
之后我们便各自找好座位,等待浦东软件园的老师给我们做一下关于软件园的介绍并阐述对我们未来工作的需求。
我们坐好后,一场对未来的探索之旅马上就开始了,浦软的老师非常厚道的给我们观看了两场激动人心的宣传视频,详细的介绍了浦软的来由,发展和辉煌以及对整个软件业的展望。
首先,上海浦东软件园做为第一批国家软件产业基地和第一批国家软件出口基地是与北京中关村,大连和西安这四个软件园是齐名的,并且是全国第一家软件园区,这三个一,奠定了浦东软件园在全国软件开发中无论是人才量还是创作量都处于不可动摇的位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4 线程的同步与互斥
在这个系统中是采用记录型信号量机制来实现同步与互斥 的,实现的方法: 采用P ,V操作,设置两个信号量:一个为互斥信号量,一 个为临界资源数目;
5利用消息缓冲队列的线程间通信
线程间的通信,关键采用send()与receive()来实现,通 过发送一个文本信息来显示通信的过程,其过程为: send()函数:消息的发送者需要提供接收者的标识符,消 息的长度以及消息正文的起始地址等信息,然后在发送原语里 申请一空闲的消息缓冲区,用相应的信息来装配该消息缓冲 区,并把它插入到接收者的消息队列中去。 Receive()函数:消息的接受者必须给出发送者的标识 符,接受区的起始地址等信息,然后从自己的消息队列中取得 相应的发送者发送来的消息缓冲区,将消息正文复制到接受区 中,并释放相应的消息缓冲区。
12224506 5班
功能设计 1 线程的创建和撤销
线程的创建过程关键就是对私有堆栈和TCB初始化的过 程,其过程如下: i, 为新线程分配一空闲的线程控制块 ii, 为新线程的私有堆栈分配内存空间(因为对 等线程共享程序段和数据段空间,所以创建 线程时不必像创建进程那样再为程序段和数 据段分配内存空间) iii, 初始化新线程的私有堆栈,即按CPU调度时现 场信息的保存格式布置堆栈。 初始化线程控制块,即填入线程的外部标识符,设置好线程私 有堆栈的始址,段址和栈顶指针,将线程的状态置为就绪状态
基于线程的多任务调度系统的设计与实现实验报 告 姓名 陈振辉 学号 班级 1 实验要求
(1)线程的创建、撤消和CPU切换。 掌握线程的定义和特征,线程的基本状态,线程的私 有堆栈,线程控制块TCB,理解线程与进程的区别,实现线程 的创建、撤消和CPU切换。 (2)时间片轮转调度 理解各种调度算法、调度的原因,完成时钟中断的截 取,具体实现调度程序。 (3)最高优先权优先调度 理解优先权的概念,并实现最高优先权优先调度策 略。 (4)利用记录型信号量实现线程的同步 理解同步的相关概念,掌握记录型信号量的概念及 应用,并用记录型信号量实现生产者和消费者问题。 (5)消息缓冲队列通信机制 理解进程(线程)通信的基本概念,并用消息缓冲队 列实现线程间的通信。
源代码及解析如下
#include <stdlib.h> #include <stdio.h> #include <dos.h> #define GET_INDOS 0x34 #define GET_CRIT_ERR 0x5d06 /*定义四个状态*/
#define #define #define #define
2 线程的调度
引起CPU调度原因主要是有三种情况:时间片到时,线程 执行完毕或正在执行的线程因等待某种事件而不能继续执行。 由这些原因,调度程序可以通过两个函数分别处理不同原因引 起的调度: New_int8()函数主要是处理因时间片到时引起的调度该调 度可以通过截取时钟中断(int 08)来完成; Swtch()函数主要是处理因其他原因引起的调度; New_int8()函数因为是通过截取时钟中断来实现,可以知道其 是属于系统调度,由于涉及到系统调度的函数 都是需要对DOS 状态进行判断,以防止出现系统数据混乱等情况的发生(从 Dos的不可重入性来得出),而Swtch()函数是处理因其他原因 引起的调度,所以它所涉及到的仅仅是用户级的函数调度,没 有涉及到系统级的函数调度,因此Swtch()函数不需要对Dos状 态进行判断。
p=p+stacklen pt=(struct int_regs*)p; pt--; pt->flags=0x200; 位*/ 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); /*撤销线程代码的段址*/ /*撤销线程代码的偏移地 /*数据段的段地址*/ /*附加数据段的段地址 /*代码段的段地址*/ /*代码段的段内偏移地址 /*flags寄存器的允许中断
else return (-1); } /************InitTcb函数的实现*************/ /*对TCB进行初始化*/ void InitTcb(void){ int i; for(i=1;i<NTCB;i++){ tcb[i].stack=NULL; tcb[i].state=finished; strcpy(tcb[i].name,'\0'); tcb[i].mq=NULL; tcb[i].sm.value=0; /*消息队列计 数信号量*/ tcb[i].mutex.value=1; /*缓冲区的互斥 信号量*/ } } /*************create函数的实现****************/ /*创建一对应于函数name(外部标识符)的线程*/ int create(char *name,codeptr code, int stacklen){ int i; char *p; struct int_regs *pt; /*第一步:寻找空白的TCB*/ for(i=1;i<NTCB;i++){ if(tcb[i].state==finished) break; } /*第二步:申请线程的私有堆栈内存空间,分配stacklen 个字节长度的内存空间,利用malloc函数返回内存地址指针指向 该内存空间, 所返回的值是该内存空间的起始地址*/ p=(char *)malloc(stacklen*sizeof(char)); /*获得堆栈的内存空间的高地址指针*/
void over(void); /*撤销线程,归还所 占资源*/ void interrupt(*old_int8)(void); /*原来的时间中 断程序,需要先声明*/ void interrupt new_int8(void); /*因时间片到时而 引起的调度由new_int8()函数来完成*/ void interrupt swtch(void); /*其他原因引起的CPU调度 由函数swtch()完成*/ void tcb_state(void); /*输出所有线程的状态信息 */ int all_finished(void); void p(semaphore *sem); /*信号量P操作*/ void v(semaphore *sem); /*信号量V操作*/ /*********************函数的实现*********************/ /*******InitInDos函数的实现********/ void InitInDos(void){ union REGS regs; struct SREGS segregs; /*获得INDOS flag 的地址*/ regs.h.ah=GET_INDOS; intdosx(®s,®s,&segregs), indos_ptr=MK_FP(segregs.es,regs.x.bx); /*get the address of CRIT_ERR flag*/ if(_osmajor<3) crit_err_ptr=indos_ptr+1; else if(_osmajor==3 && _osminor==0) crit_err_ptr=indos_ptr-1; else{ regs.x.ax=GET_CRIT_ERR, intdosx(®s,®s,&segregs); crit_err_ptr=MK_FP(segregs.ds,regs.x.si); } } /*************DosBusy函数的实现************/ int DosBusy(void){ if(indos_ptr&&crit_err_ptr) return (*indos_ptr|| *crit_err_ptr);
ቤተ መጻሕፍቲ ባይዱ
finished 0 running 1 ready 2 blocked 3 /*设置TL(时间片)时间为3*/ /*NTCB是系统允许的最多任务数也
#define TL 3 #define NTCB 10 就是进程数*/ #define NBUF 5 #define NTEXT 30
/**********************声明变量********************/ char far *indos_ptr=0; char far *crit_err_ptr=0; int current; /*全部变量,始终等于正在执行的 线程的内部标识符*/ int timecount=0; /*全局变量,等于上次调度至今的 时间,在每次时钟中断发生时,timecount+1,通过它与TL课判 断时间片是否到时,从而决定是否进行CPU调度*/ /********************定义数据结构********************/ typedef int (far *codeptr)(void);/*定义codeptr函数指针 */ /*定义记录型信号量的数据结构*/ typedef struct { int value; struct TCB *wq; }semaphore; semaphore mutexfb={1,NULL}; semaphore sfb={NBUF,NULL}; 信号量*/ /*消息缓冲区的数据结构*/ struct buffer
3 线程的阻塞与唤醒
线程的阻塞:主要是当某一线程需要阻塞的时候,将其插 入阻塞队列中,等待唤醒进程唤醒,所以其过程为:首先,将
线程的状态置为阻塞态,然后将线程插入指定的阻塞队列末 尾,并重新进行CPU调度。 线程的唤醒:主要是唤醒阻塞队列里面的线程,所以其过 程是:把阻塞队列头上的第一个线程的TCB取下来,并将其状 态改为就绪状态,等待CPU调度