课程设计进程实验报告

学年论文(课程设计) 操作系统课程设计 学 院 数学与计算机学院 学科门类 工 学 专 业 网络工程 学 号 姓 名 指导教师

年 月

日 题目:

河北大学2010届本科生毕业论文(设计)

河北大学学年论文(课程设计)任务书

(指导教师用表)

线 指导教师签字:

系主任签字:

主管教学院长签字:

线河北大学2010届本科生毕业论文(设计) 河北大学学年论文(课程设计)成绩评定表 学院:数学与计算机学院

摘 要

此系统实现了存储管理、设备管理和进程管理。

存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。

设备管理主要包括设备的分配和回收。模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。

进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW 、指令寄存器IR )用全局变量模拟,中断的发现是在函数CPU 中加检测PSW 的方式来模拟,时钟的模拟通过timer 控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。

关键词:存储管理 设备管理 进程管理 时间片

ABSTRACT

The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes.

The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled.

The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5.

Key words: storage device process time

目 录

一 引言 . ....................................................................................................................................... 1

1.1 性质................................................................................................................................ 1

1.2教学目的........................................................................................................................ 1

1.3任务和要求 . .................................................................................................................. 1

1.4意义 . ................................................................................................................................ 1

1.5论文结构安排 .............................................................................................................. 1

二 系统分析与设计 ............................................................................................................ 2

2.1. 存储管理的要求 ........................................................................................................ 2

2.2设备管理的要求.......................................................................................................... 2

2.3进程管理的要求.......................................................................................................... 2

2.3.1进程控制块 ....................................................................................................... 2

2.3.2进程调度 . ........................................................................................................... 2

2.3.3进程创建 . ........................................................................................................... 3

2.3.4进程撤销 . ........................................................................................................... 3

2.3.5进程阻塞 . ........................................................................................................... 3

2.3.6进程的唤醒 ....................................................................................................... 3

2.3.7硬件工作的模拟 . ............................................................................................. 4

三 系统实现 . ............................................................................................................................. 4

3.1全局变量........................................................................................................................ 4

3.2内存分配........................................................................................................................ 5

3.3内存回收........................................................................................................................ 7

3.4创建进程........................................................................................................................ 8

3.5撤销进程...................................................................................................................... 10

3.6进程调度...................................................................................................................... 11

3.7设备申请...................................................................................................................... 12

3.8进程阻塞...................................................................................................................... 15

3.9进程唤醒...................................................................................................................... 17

3.10 CPU函数 ................................................................................................................... 19

四 结束语 . ................................................................................................................................ 25

一 引言

1.1 性质

操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。本课程使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力 ,训练分析和解决实际问题能力,为其今后在相关领域开展工作打下坚实的基础。

1.2教学目的

本科程通过模拟操作系统原理的实现,应使学生加深对操作系统工作原理和操作系统实现方法的理解,系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。

1.3任务和要求

此系统为基于时间片轮转调度算法的进程管理系统,主要实现存储管理,设备管理和进程管理。存储管理部分主要实现主存空间的分配和回收、存储保护。设备管理主要包括设备的分配和回收。进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。

1.4意义

通过本模拟系统的设计,可以加深学生对操作系统的原理的理解,明白操作系统的各项功能的具体实现和具体操作,提高学生的动手能力。

1.5论文结构安排

第二章为系统分析与设计,写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理。

第三章为系统实现,写出主要模块的实现,包括全局变量说明和主要功能的实现流程。

第四章为结束语,总结课程设计的体会。

二 系统分析与设计

2.1. 存储管理的要求

存储管理部分主要实现主存空间的分配和回收、存储保护。

模拟系统中,内存部分分为两部分,一部分是系统区,这里只存放进程控制块,一部分是用户区,这里主要是对用户区的管理。

系统区包括pcb 区域、主存空间分配表。

存储管理采用可移动的可变分区存储管理方式。

采用数组来模拟主存的用户区,每个数组元素占用一个字节。实验中主存大小为512个字节

2.2设备管理的要求

设备管理主要包括设备的分配和回收。

模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时,采用先来先服务策略。回收设备后,要注意唤醒等待设备的进程。

2.3进程管理的要求

进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。

2.3.1进程控制块

进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。本模拟系统最多容纳10个进程块。pcb 区域用数组模拟。

进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。

2.3.2进程调度

采用时间片轮转调度算法,时间片为5。

进程调度函数的主要工作是:

第一步,将正在运行的进程保存在该进程对应进程控制块中;

第二步,从就绪队列中选择一个进程;

第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU 各个寄存器内。

2.3.3进程创建

进程创建creat 的主要工作是:

第一步,申请空白进程控制块;

第二步,申请主存空间,申请成功,装入主存;

第三步,初始化进程控制块;

第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。

2.3.4进程撤销

进程撤销destory 的主要工作是:

第一步,回收进程所占内存资源;

第二步,回收进程控制块;

第三步,在屏幕上显示进程执行结果,进程撤销

2.3.5进程阻塞

进程阻塞block 的主要工作是:

第一步,保存运行进程的CPU 现场;

第二步,修改进程状态;

第三步,将进程链入对应的阻塞队列,然后转向进程调度。

2.3.6进程的唤醒

进程唤醒的主要工作是

第一步,将进程由阻塞队列中摘下;

第二步,修改进程状态为就绪;

第三步,链入就绪队列,根据情况决定是否转向进程调度。

2.3.7硬件工作的模拟

硬件工作的模拟包括中央处理器的模拟、主要寄存器的模拟、中断的模拟和时钟的模拟四方面。

①中央处理器的模拟。用函数CPU( )(该函数不能有参数) 模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。如:给x 赋值x=?;x自加x++;x自减x--; 申请设备和时间!??; 程序结束end ;

CPU 只能解释指令寄存器IR 中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。

②主要寄存器的模拟用全局变量模拟重要寄存器,如cpu 重要寄存器,程序状态寄存器PSW 、指令寄存器IR ,程序计数器PC ,数据缓冲寄存器DR 等。

③中断的模拟。中断的发现应该是硬件的工作,这里在函数CPU 中加检测PSW 的方式来模拟。在CPU ()函数中,每执行一条指令之前,先检查PSW ,判断有无中断,若有进行中断处理,然后再运行解释指令。CPU 函数应该不断循环执行的。

模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end 形成的中断,软中断):将结果写入文件out ,其中包括文件路径名和x 的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转为就绪,重新进程调度。

④时钟的模拟。系统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时间。

这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位,例如使用vb 中的时钟控件实现,每触发一次timer 事件,绝对时钟增1,表示增加一个时间单位,绝对时钟减1。

三 系统实现

3.1全局变量

系统代码中定义了一些全局变量 public struct PCB {

public int ProcessID; //进程块的编号(0-9) public string ProcessName; //使用该进程块的进程名 public int PageAdress; //页表的首地址

public int Sum; //页表的长度 public int PC; //各个寄存器的状态 public string IR; public int DR;

public Interrupt PSW;

public int Pri; //优先级

public int WaitTime; //要使用设备多长时间 public int GetDeviceTime; //获得设备的时间 public int ExecuteTime; //开始执行的时间

public DeviceType NeedDevice; //申请失败的设备类型 public DeviceType HaveDevice; //正在使用的设备类型 public int DN; //使用的是哪个设备 public string BlockReason; //阻塞的原因 public int Next; }

class CPU {

public int PC; public int DR;

public string IR; public Interrupt PSW; public Interrupt PSW1;

public PCB[] PCBArray=new PCB[10]; public DateTime XTTime; public int XDTime; public int White; public int Ready; public int Block; public int Execute;

private DeviceType type; private int time;

public OS.ClassFolder.MainRam ram = new MainRam(); public OS.ClassFolder.Device Dev = new Device();

3.2内存分配

可变分区方式的内存分配流程如图3-1所示。

图3-1 可变分区最优分配算法流程图

3.3内存回收

归还内存区域的流程如图3-3所示。

图3-3 可变分区回收流程图

内存回收后颜色恢复。如图3-4所示。

图3-4 内存回收后的界面显示

3.4创建进程

当执行可执行文件时,把指令传过来,调用creat 函数。 //Creat函数,创建进程 //

public void Creat(string Name,string str) {

//

//申请PCB ,a>10,则申请失败

//

int a = GetOneFromWhite(); int b;

if (str.Length > 0) {

int sum = (str.Length + 15) / 16; if (a

if (ram.Judge(sum) == true) {

//

//分配内存并加载到内存 //

b = ram.Allocate(sum); ram.LoadContent(str, b); //

//初始化PCB //

PCBArray[a].ProcessName = Name; PCBArray[a].PageAdress = b; PCBArray[a].Sum = sum; PCBArray[a].PC = 0; PCBArray[a].IR = ""; PCBArray[a].DR = 0;

PCBArray[a].PSW = Interrupt.No; PCBArray[a].WaitTime = -10;

PCBArray[a].Pri = 1024 / str.Length; PCBArray[a].ExecuteTime = 0;

PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].HaveDevice = DeviceType.no; PCBArray[a].GetDeviceTime = 0; PCBArray[a].DN = -1;

PCBArray[a].BlockReason = ""; InsertOneToReady(a); //

//是否转向进程调度 //

int c = JudgeAttemper(); if (c

Attemper(c); }

} else

{

InsertOneToWhite(a);

MessageBox.Show("内存不足或文件太长,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else {

MessageBox.Show("PCB块不足,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else {

MessageBox.Show("文件为空, 不能创建进程"," 错误",MessageBoxButtons.OK,MessageBoxIcon.Error); } }

3.5撤销进程

进程结束时,即读到end 指令后,传递指向当前正在运行的指针,撤销当前进程。 //Destroy函数,撤销程序 //

public void Destory(int a) {

//

//回收内存 //

int p = PCBArray[a].PageAdress; int sum = PCBArray[a].Sum; ram.DeAllocate(p,sum); //

//回收PCB 块 //

InsertOneToWhite(a); Execute = 10; //

//显示结果 // // // //

}

3.6进程调度

当前一进程结束时,CPU 会调度就绪队列中的进程。

//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10

//

public int JudgeAttemper() {

//

// //

int k;

if (Ready

int p = Ready;

int a = PCBArray[Ready].Pri;

k = Ready; //块号

while (PCBArray[p].Next

if (PCBArray[PCBArray[p].Next].Pri > a) {

a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }

p = PCBArray[p].Next; } } else {

return 10; } //

// //

if (Execute

if (PCBArray[k].Pri > PCBArray[Execute].Pri) {

选出就绪链表中优先级最高 跟执行链表内的PCB 块进行比较 优先级最高的

return k; } else {

return 10; } } else {

return k; } } //

//进程调度函数 //

public void Attemper(int a) {

//

//保护CPU 现场 //

if (Execute

PCBArray[Execute].PC = PC; PCBArray[Execute].IR = IR; PCBArray[Execute].DR = DR; InsertOneToReady(Execute); } //

//选择一个进程,初始化CPU 中的寄存器 //

GetOneFromReady(a); Execute = a;

PC = PCBArray[a].PC; IR = PCBArray[a].IR; DR = PCBArray[a].DR;

}

3.7设备申请

进程的指令申请设备时,读到进程所要申请的设备,调用AppEquip 函数 public void AppEquip(char equipment, int r, int t)

{

int i;

for (i = 0; i

if (eq[i].name == equipment && eq[i].flag == 0) {

eq[i].flag = 1; pcb[r].eq = equipment; if (timer4.Enabled == false) {

timer4.Enabled = true;//设备时间片开始执行 }

if (i == 0) //设备区域显示~ {

ETIME[0] = t;

textBox001.Text = pcb[r].name.ToString(); textBox011.Text = ETIME[0].ToString(); }

else if (i == 1) {

ETIME[1] = t;

textBox002.Text = pcb[r].name.ToString(); textBox012.Text = ETIME[1].ToString(); }

else if (i == 2) {

ETIME[2] = t;

textBox003.Text = pcb[r].name.ToString(); textBox013.Text = ETIME[2].ToString(); }

else if (i == 3) {

ETIME[3] = t;

textBox004.Text = pcb[r].name.ToString(); textBox014.Text = ETIME[3].ToString(); }

else if (i == 4) {

ETIME[4] = t;

textBox005.Text = pcb[r].name.ToString(); textBox015.Text = ETIME[4].ToString(); }

else if (i == 5) {

ETIME[5] = t;

textBox006.Text = pcb[r].name.ToString(); textBox016.Text = ETIME[5].ToString(); } return; } }

//没有申请到设备,调用阻塞函数 block(r, equipment);

}

申请设备到设备后设备区域会显示相应设备的占用进程名和占用时间。如图3-6所示。

图3-6 申请设备后的界面显示

3.8进程阻塞

进程申请设备不够时,则阻塞该进程。 //BlockProcess函数,阻塞进程 //

public void BlockProcess(int a,DeviceType b,int time) {

//

//保护CPU 现场 //

PCBArray[a].PC = PC; PCBArray[a].IR = IR; PCBArray[a].DR = DR; //

//判断申请设备是否成功,根据不同情况填写BlockReason 项 //

bool d = Dev.JudgeDevice(b); if (d == false) {

PCBArray[a].NeedDevice = b;

PCBArray[a].HaveDevice = DeviceType.no;

PCBArray[a].BlockReason = "申请" + b + "设备失败"; PCBArray[a].PC = PCBArray[a].PC - 4; } else {

PCBArray[a].DN = Dev.Allocate(b); PCBArray[a].HaveDevice = b;

PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].GetDeviceTime = XDTime; PCBArray[a].WaitTime = time;

PCBArray[a].BlockReason = "等待IO 输入输出"; if (DeviceStateChange != null) {

DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs();

e.DN = PCBArray[a].DN;

e.type = b;

e.processname = PCBArray[a].ProcessName; e.needtime = time; e.Atime = XDTime;

DeviceStateChange(null,e); } } //

//修改进程状态 //

InsertOneToBlock(a); Execute = 10; //

//转向进程调度 //

int c = JudgeAttemper(); if (c

Attemper(c); }

由于缺少设备进程被阻塞后,在阻塞队列区域显示阻塞的进程名和阻塞原因。如图3-7所示。

图3-7 进程阻塞后的界面显示

3.9进程唤醒

占有某设备的进程归还设备时,要唤醒阻塞队列中等待该设备的进程

//WakeUp函数,唤醒进程 //

public void WakeUp(int ID,DeviceType device) {

//

//唤醒自己 //

int d = Block; if (Block == ID) {

Block = PCBArray[ID].Next; InsertOneToReady(ID); } else {

while (PCBArray[d].Next

if (PCBArray[d].Next == ID) {

PCBArray[d].Next = PCBArray[ID].Next; InsertOneToReady(ID); break; }

d = PCBArray[d].Next; } } //

//检查第一个节点 //

while(Block

int h = Block;

Block = PCBArray[h].Next; InsertOneToReady(h); } //

//检查其他节点 //

if(Block

int a = Block;

while (PCBArray[a].Next

if (PCBArray[PCBArray[a].Next].NeedDevice == device) {

int h = PCBArray[a].Next;

PCBArray[a].Next = PCBArray[PCBArray[a].Next].Next; InsertOneToReady(h); } else {

a = PCBArray[a].Next; } } }

int c = JudgeAttemper(); if (c

Attemper(c); } } //

//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10

//

public int JudgeAttemper() {

//

//选出就绪链表中优先级最高 //

int k;

if (Ready

int p = Ready;

int a = PCBArray[Ready].Pri;

k = Ready; //优先级最高的块号

while (PCBArray[p].Next

if (PCBArray[PCBArray[p].Next].Pri > a) {

a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }

p = PCBArray[p].Next; } } else {

return 10; } //

//跟执行链表内的PCB 块进行比较 //

if (Execute

if (PCBArray[k].Pri > PCBArray[Execute].Pri) {

return k; } else {

return 10; } } else {

return k; } }

3.10 CPU函数

public void cpu() {

if (true) {

switch (PSW)

{

case Interrupt.End: {

//

//写入out 文件 //

//

//撤销进程,进行进程调度 //

Destory(Execute);

int a = JudgeAttemper(); if (a

Attemper(a); }

PSW = Interrupt.No; break; }

case Interrupt.IO: {

BlockProcess(Execute,type,time); PSW = Interrupt.No; break; } default: {

break; } }

switch (PSW1) {

case Interrupt.IO: {

int b = Block; while (b

if (XDTime - PCBArray[b].GetDeviceTime - 1 == PCBArray[b].WaitTime)

{

Dev.DeAllocate(PCBArray[b].HaveDevice, PCBArray[b].DN);

WakeUp(b, PCBArray[b].HaveDevice); PCBArray[b].DN = -1;

PCBArray[b].GetDeviceTime = 0;

PCBArray[b].HaveDevice = DeviceType.no; PCBArray[b].WaitTime = -10; }

b = PCBArray[b].Next; }

PSW1 = Interrupt.No; break; } default: {

break; } }

if (Execute

IR = ram.SendToIR(PCBArray[Execute].PageAdress, PC); PC = PC + 4;

bool str = ram.JudgeIR(IR); if (str == true) {

switch (IR[1]) {

case '=': {

DR = Convert.ToInt32(IR[2].ToString()); break; }

case '+': {

DR++; break; }

case '-': {

DR--; break; }

case 'a': case 'A': {

type=DeviceType.a;

time=Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO;

break; }

case 'b': case 'B': {

type = DeviceType.b;

time = Convert.ToInt32(IR[2].ToString());

PSW = Interrupt.IO; break; }

case 'c': case 'C': {

type = DeviceType.c;

time = Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO; break; }

case 'n': {

PSW = Interrupt.End; break; } }

PCBArray[Execute].ExecuteTime++; if (FinishIR != null) {

EventArgs e = new EventArgs(); FinishIR(null, e); } } else {

Destory(Execute);

int b = JudgeAttemper(); if (b

Attemper(b); }

if (ErrorIR != null) {

EventArgs e = new EventArgs(); ErrorIR(null,e); }

} } else {

//

//do nothing //

if (this.ExecuteIsWhite != null) {

EventArgs e = new EventArgs(); ExecuteIsWhite(null,e); } }

int k = Block; while (k

if (XDTime - PCBArray[k].GetDeviceTime == PCBArray[k].WaitTime) {

PSW1 = Interrupt.IO; }

k = PCBArray[k].Next; }

if (QueueChange != null) {

EventArgs e = new EventArgs(); QueueChange(null, e); }

XDTime++; IR = ""; } } } }

整体界面显示如图3-11所示。

图3-11 系统整体界面

四 结束语

通过操作系统课程设计,我更加明白了操作系统内部的工作原理,能够更清楚的理解一些操作的原因,理解了操作系统的实现方法,明白了遇到问题时应该系统的分析,运用自己学过的理论知识来解决问题,而不是马上着手进行设计。另外,遇到问题时,应该思考一下问题出现在什么地方,不能漫无目的的查找错误,思考应该全面一些,想到会出现的种种情况,系统分析后再改变代码。遇到原理不理解的地方应该查找资料,把原理弄明白了才可以设计好程序。

参考文献

[1] 王煜,张明,刘振鹏. 操作系统(第二版). 北京:中国铁道出版社, 2007

[2] 王煜,张明,刘振鹏. 操作系统习题解答与实验指导. 北京:中国铁道出版社, 2007

[3] 万科,覃剑. Visual C# .NET程序设计基础与上机指导. 北京:清华大学出版社, 2007

学年论文(课程设计) 操作系统课程设计 学 院 数学与计算机学院 学科门类 工 学 专 业 网络工程 学 号 姓 名 指导教师

年 月

日 题目:

河北大学2010届本科生毕业论文(设计)

河北大学学年论文(课程设计)任务书

(指导教师用表)

线 指导教师签字:

系主任签字:

主管教学院长签字:

线河北大学2010届本科生毕业论文(设计) 河北大学学年论文(课程设计)成绩评定表 学院:数学与计算机学院

摘 要

此系统实现了存储管理、设备管理和进程管理。

存储管理部分主要实现主存空间的分配和回收。存储管理采用可移动的可变分区存储管理方式。采用数组来模拟主存,大小为512个字节。

设备管理主要包括设备的分配和回收。模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时采用采用先来先服务策略。设备回收时唤醒等待设备的进程。

进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。其中硬件中的中央处理器用不断循环的函数CPU( )模拟,重要寄存器(如:程序状态寄存器PSW 、指令寄存器IR )用全局变量模拟,中断的发现是在函数CPU 中加检测PSW 的方式来模拟,时钟的模拟通过timer 控件实现。进程控制块的模拟通过数组,本系统最多容纳10个。进程调度时采用时间片轮转调度算法,时间片为5。

关键词:存储管理 设备管理 进程管理 时间片

ABSTRACT

The system has storage management, equipment management and process management. The storage management has achieved the allocation and recovery of the main memory space. Variable storage management is used as storage management .We simulate the main memory by array, whose size is 512 bytes.

The device management, including the distribution and recovery of devicet. We simulate three devices ,A,B,C. the numbers of them are 3,2,1. The distribution of device used to adopt first-come first-service strategy. It awakes the blocking process when the device is recycled.

The process management, including scheduling ,creating revocation ,blocking and waking up the process, the realization of the interruption.We simulate the central processing unit by the cycling function named CPU(),simulate the important register by global variable, simulate the recovering of interruption by checking PSW in the function of CPU(),simulate the clock by the timer control. The simulation of the process control block by array, whose number is up to 10. When the scheduling of the process happens, we use the algorithm of time piece rotation scheduling, and the time piece is 5.

Key words: storage device process time

目 录

一 引言 . ....................................................................................................................................... 1

1.1 性质................................................................................................................................ 1

1.2教学目的........................................................................................................................ 1

1.3任务和要求 . .................................................................................................................. 1

1.4意义 . ................................................................................................................................ 1

1.5论文结构安排 .............................................................................................................. 1

二 系统分析与设计 ............................................................................................................ 2

2.1. 存储管理的要求 ........................................................................................................ 2

2.2设备管理的要求.......................................................................................................... 2

2.3进程管理的要求.......................................................................................................... 2

2.3.1进程控制块 ....................................................................................................... 2

2.3.2进程调度 . ........................................................................................................... 2

2.3.3进程创建 . ........................................................................................................... 3

2.3.4进程撤销 . ........................................................................................................... 3

2.3.5进程阻塞 . ........................................................................................................... 3

2.3.6进程的唤醒 ....................................................................................................... 3

2.3.7硬件工作的模拟 . ............................................................................................. 4

三 系统实现 . ............................................................................................................................. 4

3.1全局变量........................................................................................................................ 4

3.2内存分配........................................................................................................................ 5

3.3内存回收........................................................................................................................ 7

3.4创建进程........................................................................................................................ 8

3.5撤销进程...................................................................................................................... 10

3.6进程调度...................................................................................................................... 11

3.7设备申请...................................................................................................................... 12

3.8进程阻塞...................................................................................................................... 15

3.9进程唤醒...................................................................................................................... 17

3.10 CPU函数 ................................................................................................................... 19

四 结束语 . ................................................................................................................................ 25

一 引言

1.1 性质

操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。本课程使学生掌握操作系统的基本概念、基本原理、设计方法和实现技术,具有初步分析实际操作系统的能力 ,训练分析和解决实际问题能力,为其今后在相关领域开展工作打下坚实的基础。

1.2教学目的

本科程通过模拟操作系统原理的实现,应使学生加深对操作系统工作原理和操作系统实现方法的理解,系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。

1.3任务和要求

此系统为基于时间片轮转调度算法的进程管理系统,主要实现存储管理,设备管理和进程管理。存储管理部分主要实现主存空间的分配和回收、存储保护。设备管理主要包括设备的分配和回收。进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。

1.4意义

通过本模拟系统的设计,可以加深学生对操作系统的原理的理解,明白操作系统的各项功能的具体实现和具体操作,提高学生的动手能力。

1.5论文结构安排

第二章为系统分析与设计,写出系统要求,分析出包含哪些功能模块、每个模块的计划采用的实现方法和原理。

第三章为系统实现,写出主要模块的实现,包括全局变量说明和主要功能的实现流程。

第四章为结束语,总结课程设计的体会。

二 系统分析与设计

2.1. 存储管理的要求

存储管理部分主要实现主存空间的分配和回收、存储保护。

模拟系统中,内存部分分为两部分,一部分是系统区,这里只存放进程控制块,一部分是用户区,这里主要是对用户区的管理。

系统区包括pcb 区域、主存空间分配表。

存储管理采用可移动的可变分区存储管理方式。

采用数组来模拟主存的用户区,每个数组元素占用一个字节。实验中主存大小为512个字节

2.2设备管理的要求

设备管理主要包括设备的分配和回收。

模拟系统中有A 、B 、C 三种独占型设备,A 设备3个,B 设备2个,C 设备1个。设备分配时,采用先来先服务策略。回收设备后,要注意唤醒等待设备的进程。

2.3进程管理的要求

进程管理主要包括进程调度,进程的创建和撤销、进程的阻塞和唤醒,中断作用的实现。

2.3.1进程控制块

进程控制块内容包括进程标识符、主要寄存器内容、进程状态、阻塞原因等等。本模拟系统最多容纳10个进程块。pcb 区域用数组模拟。

进程控制块根据内容的不同组成不同的队列,空白进程控制块链、就绪队列和阻塞队列,正在运行的进程只有一个,系统初始时只有空白进程控制块链。

2.3.2进程调度

采用时间片轮转调度算法,时间片为5。

进程调度函数的主要工作是:

第一步,将正在运行的进程保存在该进程对应进程控制块中;

第二步,从就绪队列中选择一个进程;

第三步,将这个进程中进程控制块中记录的各寄存器内容恢复到CPU 各个寄存器内。

2.3.3进程创建

进程创建creat 的主要工作是:

第一步,申请空白进程控制块;

第二步,申请主存空间,申请成功,装入主存;

第三步,初始化进程控制块;

第四步,将进程链入就绪队列,根据情况决定是否转向进程调度。

2.3.4进程撤销

进程撤销destory 的主要工作是:

第一步,回收进程所占内存资源;

第二步,回收进程控制块;

第三步,在屏幕上显示进程执行结果,进程撤销

2.3.5进程阻塞

进程阻塞block 的主要工作是:

第一步,保存运行进程的CPU 现场;

第二步,修改进程状态;

第三步,将进程链入对应的阻塞队列,然后转向进程调度。

2.3.6进程的唤醒

进程唤醒的主要工作是

第一步,将进程由阻塞队列中摘下;

第二步,修改进程状态为就绪;

第三步,链入就绪队列,根据情况决定是否转向进程调度。

2.3.7硬件工作的模拟

硬件工作的模拟包括中央处理器的模拟、主要寄存器的模拟、中断的模拟和时钟的模拟四方面。

①中央处理器的模拟。用函数CPU( )(该函数不能有参数) 模拟中央处理器。该函数主要负责解释“可执行文件”中的命令。如:给x 赋值x=?;x自加x++;x自减x--; 申请设备和时间!??; 程序结束end ;

CPU 只能解释指令寄存器IR 中的指令。一个进程的运行时要根据进程执行的位置,将对应的指令存放到指令寄存器中。

②主要寄存器的模拟用全局变量模拟重要寄存器,如cpu 重要寄存器,程序状态寄存器PSW 、指令寄存器IR ,程序计数器PC ,数据缓冲寄存器DR 等。

③中断的模拟。中断的发现应该是硬件的工作,这里在函数CPU 中加检测PSW 的方式来模拟。在CPU ()函数中,每执行一条指令之前,先检查PSW ,判断有无中断,若有进行中断处理,然后再运行解释指令。CPU 函数应该不断循环执行的。

模拟中断的种类有如下几种:程序结束、时间片到、I/O中断。程序结束(执行指令end 形成的中断,软中断):将结果写入文件out ,其中包括文件路径名和x 的值,调用进程撤销原语撤销进程,然后进行进程调度;I/O中断(设备完成输入输出):将输入输出完成的进程唤醒,将等待该设备的一个进程同时唤醒。时钟中断:进程时间片用完,转为就绪,重新进程调度。

④时钟的模拟。系统中的绝对时钟和相对时钟用全局变量模拟。系统时钟用来记录开机以后的时间。

这里的系统时钟并不是计算机的真正的时钟,这里所说的时间只是一个单位,例如使用vb 中的时钟控件实现,每触发一次timer 事件,绝对时钟增1,表示增加一个时间单位,绝对时钟减1。

三 系统实现

3.1全局变量

系统代码中定义了一些全局变量 public struct PCB {

public int ProcessID; //进程块的编号(0-9) public string ProcessName; //使用该进程块的进程名 public int PageAdress; //页表的首地址

public int Sum; //页表的长度 public int PC; //各个寄存器的状态 public string IR; public int DR;

public Interrupt PSW;

public int Pri; //优先级

public int WaitTime; //要使用设备多长时间 public int GetDeviceTime; //获得设备的时间 public int ExecuteTime; //开始执行的时间

public DeviceType NeedDevice; //申请失败的设备类型 public DeviceType HaveDevice; //正在使用的设备类型 public int DN; //使用的是哪个设备 public string BlockReason; //阻塞的原因 public int Next; }

class CPU {

public int PC; public int DR;

public string IR; public Interrupt PSW; public Interrupt PSW1;

public PCB[] PCBArray=new PCB[10]; public DateTime XTTime; public int XDTime; public int White; public int Ready; public int Block; public int Execute;

private DeviceType type; private int time;

public OS.ClassFolder.MainRam ram = new MainRam(); public OS.ClassFolder.Device Dev = new Device();

3.2内存分配

可变分区方式的内存分配流程如图3-1所示。

图3-1 可变分区最优分配算法流程图

3.3内存回收

归还内存区域的流程如图3-3所示。

图3-3 可变分区回收流程图

内存回收后颜色恢复。如图3-4所示。

图3-4 内存回收后的界面显示

3.4创建进程

当执行可执行文件时,把指令传过来,调用creat 函数。 //Creat函数,创建进程 //

public void Creat(string Name,string str) {

//

//申请PCB ,a>10,则申请失败

//

int a = GetOneFromWhite(); int b;

if (str.Length > 0) {

int sum = (str.Length + 15) / 16; if (a

if (ram.Judge(sum) == true) {

//

//分配内存并加载到内存 //

b = ram.Allocate(sum); ram.LoadContent(str, b); //

//初始化PCB //

PCBArray[a].ProcessName = Name; PCBArray[a].PageAdress = b; PCBArray[a].Sum = sum; PCBArray[a].PC = 0; PCBArray[a].IR = ""; PCBArray[a].DR = 0;

PCBArray[a].PSW = Interrupt.No; PCBArray[a].WaitTime = -10;

PCBArray[a].Pri = 1024 / str.Length; PCBArray[a].ExecuteTime = 0;

PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].HaveDevice = DeviceType.no; PCBArray[a].GetDeviceTime = 0; PCBArray[a].DN = -1;

PCBArray[a].BlockReason = ""; InsertOneToReady(a); //

//是否转向进程调度 //

int c = JudgeAttemper(); if (c

Attemper(c); }

} else

{

InsertOneToWhite(a);

MessageBox.Show("内存不足或文件太长,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else {

MessageBox.Show("PCB块不足,创建进程失败", "消息", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else {

MessageBox.Show("文件为空, 不能创建进程"," 错误",MessageBoxButtons.OK,MessageBoxIcon.Error); } }

3.5撤销进程

进程结束时,即读到end 指令后,传递指向当前正在运行的指针,撤销当前进程。 //Destroy函数,撤销程序 //

public void Destory(int a) {

//

//回收内存 //

int p = PCBArray[a].PageAdress; int sum = PCBArray[a].Sum; ram.DeAllocate(p,sum); //

//回收PCB 块 //

InsertOneToWhite(a); Execute = 10; //

//显示结果 // // // //

}

3.6进程调度

当前一进程结束时,CPU 会调度就绪队列中的进程。

//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10

//

public int JudgeAttemper() {

//

// //

int k;

if (Ready

int p = Ready;

int a = PCBArray[Ready].Pri;

k = Ready; //块号

while (PCBArray[p].Next

if (PCBArray[PCBArray[p].Next].Pri > a) {

a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }

p = PCBArray[p].Next; } } else {

return 10; } //

// //

if (Execute

if (PCBArray[k].Pri > PCBArray[Execute].Pri) {

选出就绪链表中优先级最高 跟执行链表内的PCB 块进行比较 优先级最高的

return k; } else {

return 10; } } else {

return k; } } //

//进程调度函数 //

public void Attemper(int a) {

//

//保护CPU 现场 //

if (Execute

PCBArray[Execute].PC = PC; PCBArray[Execute].IR = IR; PCBArray[Execute].DR = DR; InsertOneToReady(Execute); } //

//选择一个进程,初始化CPU 中的寄存器 //

GetOneFromReady(a); Execute = a;

PC = PCBArray[a].PC; IR = PCBArray[a].IR; DR = PCBArray[a].DR;

}

3.7设备申请

进程的指令申请设备时,读到进程所要申请的设备,调用AppEquip 函数 public void AppEquip(char equipment, int r, int t)

{

int i;

for (i = 0; i

if (eq[i].name == equipment && eq[i].flag == 0) {

eq[i].flag = 1; pcb[r].eq = equipment; if (timer4.Enabled == false) {

timer4.Enabled = true;//设备时间片开始执行 }

if (i == 0) //设备区域显示~ {

ETIME[0] = t;

textBox001.Text = pcb[r].name.ToString(); textBox011.Text = ETIME[0].ToString(); }

else if (i == 1) {

ETIME[1] = t;

textBox002.Text = pcb[r].name.ToString(); textBox012.Text = ETIME[1].ToString(); }

else if (i == 2) {

ETIME[2] = t;

textBox003.Text = pcb[r].name.ToString(); textBox013.Text = ETIME[2].ToString(); }

else if (i == 3) {

ETIME[3] = t;

textBox004.Text = pcb[r].name.ToString(); textBox014.Text = ETIME[3].ToString(); }

else if (i == 4) {

ETIME[4] = t;

textBox005.Text = pcb[r].name.ToString(); textBox015.Text = ETIME[4].ToString(); }

else if (i == 5) {

ETIME[5] = t;

textBox006.Text = pcb[r].name.ToString(); textBox016.Text = ETIME[5].ToString(); } return; } }

//没有申请到设备,调用阻塞函数 block(r, equipment);

}

申请设备到设备后设备区域会显示相应设备的占用进程名和占用时间。如图3-6所示。

图3-6 申请设备后的界面显示

3.8进程阻塞

进程申请设备不够时,则阻塞该进程。 //BlockProcess函数,阻塞进程 //

public void BlockProcess(int a,DeviceType b,int time) {

//

//保护CPU 现场 //

PCBArray[a].PC = PC; PCBArray[a].IR = IR; PCBArray[a].DR = DR; //

//判断申请设备是否成功,根据不同情况填写BlockReason 项 //

bool d = Dev.JudgeDevice(b); if (d == false) {

PCBArray[a].NeedDevice = b;

PCBArray[a].HaveDevice = DeviceType.no;

PCBArray[a].BlockReason = "申请" + b + "设备失败"; PCBArray[a].PC = PCBArray[a].PC - 4; } else {

PCBArray[a].DN = Dev.Allocate(b); PCBArray[a].HaveDevice = b;

PCBArray[a].NeedDevice = DeviceType.no; PCBArray[a].GetDeviceTime = XDTime; PCBArray[a].WaitTime = time;

PCBArray[a].BlockReason = "等待IO 输入输出"; if (DeviceStateChange != null) {

DeviceStateChangeEventArgs e=new DeviceStateChangeEventArgs();

e.DN = PCBArray[a].DN;

e.type = b;

e.processname = PCBArray[a].ProcessName; e.needtime = time; e.Atime = XDTime;

DeviceStateChange(null,e); } } //

//修改进程状态 //

InsertOneToBlock(a); Execute = 10; //

//转向进程调度 //

int c = JudgeAttemper(); if (c

Attemper(c); }

由于缺少设备进程被阻塞后,在阻塞队列区域显示阻塞的进程名和阻塞原因。如图3-7所示。

图3-7 进程阻塞后的界面显示

3.9进程唤醒

占有某设备的进程归还设备时,要唤醒阻塞队列中等待该设备的进程

//WakeUp函数,唤醒进程 //

public void WakeUp(int ID,DeviceType device) {

//

//唤醒自己 //

int d = Block; if (Block == ID) {

Block = PCBArray[ID].Next; InsertOneToReady(ID); } else {

while (PCBArray[d].Next

if (PCBArray[d].Next == ID) {

PCBArray[d].Next = PCBArray[ID].Next; InsertOneToReady(ID); break; }

d = PCBArray[d].Next; } } //

//检查第一个节点 //

while(Block

int h = Block;

Block = PCBArray[h].Next; InsertOneToReady(h); } //

//检查其他节点 //

if(Block

int a = Block;

while (PCBArray[a].Next

if (PCBArray[PCBArray[a].Next].NeedDevice == device) {

int h = PCBArray[a].Next;

PCBArray[a].Next = PCBArray[PCBArray[a].Next].Next; InsertOneToReady(h); } else {

a = PCBArray[a].Next; } } }

int c = JudgeAttemper(); if (c

Attemper(c); } } //

//判断是否需要进行进程的调度,若需要则返回进程块号(0-9),不需要则返回10

//

public int JudgeAttemper() {

//

//选出就绪链表中优先级最高 //

int k;

if (Ready

int p = Ready;

int a = PCBArray[Ready].Pri;

k = Ready; //优先级最高的块号

while (PCBArray[p].Next

if (PCBArray[PCBArray[p].Next].Pri > a) {

a = PCBArray[PCBArray[p].Next].Pri; k = PCBArray[p].Next; }

p = PCBArray[p].Next; } } else {

return 10; } //

//跟执行链表内的PCB 块进行比较 //

if (Execute

if (PCBArray[k].Pri > PCBArray[Execute].Pri) {

return k; } else {

return 10; } } else {

return k; } }

3.10 CPU函数

public void cpu() {

if (true) {

switch (PSW)

{

case Interrupt.End: {

//

//写入out 文件 //

//

//撤销进程,进行进程调度 //

Destory(Execute);

int a = JudgeAttemper(); if (a

Attemper(a); }

PSW = Interrupt.No; break; }

case Interrupt.IO: {

BlockProcess(Execute,type,time); PSW = Interrupt.No; break; } default: {

break; } }

switch (PSW1) {

case Interrupt.IO: {

int b = Block; while (b

if (XDTime - PCBArray[b].GetDeviceTime - 1 == PCBArray[b].WaitTime)

{

Dev.DeAllocate(PCBArray[b].HaveDevice, PCBArray[b].DN);

WakeUp(b, PCBArray[b].HaveDevice); PCBArray[b].DN = -1;

PCBArray[b].GetDeviceTime = 0;

PCBArray[b].HaveDevice = DeviceType.no; PCBArray[b].WaitTime = -10; }

b = PCBArray[b].Next; }

PSW1 = Interrupt.No; break; } default: {

break; } }

if (Execute

IR = ram.SendToIR(PCBArray[Execute].PageAdress, PC); PC = PC + 4;

bool str = ram.JudgeIR(IR); if (str == true) {

switch (IR[1]) {

case '=': {

DR = Convert.ToInt32(IR[2].ToString()); break; }

case '+': {

DR++; break; }

case '-': {

DR--; break; }

case 'a': case 'A': {

type=DeviceType.a;

time=Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO;

break; }

case 'b': case 'B': {

type = DeviceType.b;

time = Convert.ToInt32(IR[2].ToString());

PSW = Interrupt.IO; break; }

case 'c': case 'C': {

type = DeviceType.c;

time = Convert.ToInt32(IR[2].ToString()); PSW = Interrupt.IO; break; }

case 'n': {

PSW = Interrupt.End; break; } }

PCBArray[Execute].ExecuteTime++; if (FinishIR != null) {

EventArgs e = new EventArgs(); FinishIR(null, e); } } else {

Destory(Execute);

int b = JudgeAttemper(); if (b

Attemper(b); }

if (ErrorIR != null) {

EventArgs e = new EventArgs(); ErrorIR(null,e); }

} } else {

//

//do nothing //

if (this.ExecuteIsWhite != null) {

EventArgs e = new EventArgs(); ExecuteIsWhite(null,e); } }

int k = Block; while (k

if (XDTime - PCBArray[k].GetDeviceTime == PCBArray[k].WaitTime) {

PSW1 = Interrupt.IO; }

k = PCBArray[k].Next; }

if (QueueChange != null) {

EventArgs e = new EventArgs(); QueueChange(null, e); }

XDTime++; IR = ""; } } } }

整体界面显示如图3-11所示。

图3-11 系统整体界面

四 结束语

通过操作系统课程设计,我更加明白了操作系统内部的工作原理,能够更清楚的理解一些操作的原因,理解了操作系统的实现方法,明白了遇到问题时应该系统的分析,运用自己学过的理论知识来解决问题,而不是马上着手进行设计。另外,遇到问题时,应该思考一下问题出现在什么地方,不能漫无目的的查找错误,思考应该全面一些,想到会出现的种种情况,系统分析后再改变代码。遇到原理不理解的地方应该查找资料,把原理弄明白了才可以设计好程序。

参考文献

[1] 王煜,张明,刘振鹏. 操作系统(第二版). 北京:中国铁道出版社, 2007

[2] 王煜,张明,刘振鹏. 操作系统习题解答与实验指导. 北京:中国铁道出版社, 2007

[3] 万科,覃剑. Visual C# .NET程序设计基础与上机指导. 北京:清华大学出版社, 2007


相关文章

  • 环境工程专业培养方案
  • 山东农业大学 本科专业人才培养方案 UNDERGRADUATE EDUCATION PROGRAM OF SHANDONG AGRICULTURAL UNIVERSITY 环境工程 山东农业大学教务处编制 二○一二年十月 山东农业大学本科专 ...查看


  • 磁盘调度实验报告
  • 磁盘调度 一 .实验目的: 磁盘是高速.大容量.旋转型.可直接存取的存储设备.它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求.系统可采用一种策略,尽可能按最佳次序执行访 ...查看


  • 数学与应用数学培养方案doc
  • 山东农业大学 本科专业人才培养方案 UNDERGRADUATE EDUCATION PROGRAM OF SHANDONG AGRICULTURAL UNIVERSITY 数学与应用数学 山东农业大学教务处编制 二○一二年十月 山东农业大学 ...查看


  • 操作系统课程设计-对处理机的调度
  • 福建农林大学金山学院 课程设计报告 课程名称: 课程设计题目: 姓 名: 系: 专 业: 年 级: 学 号: 指导教师: 职 称: <操作系统> 对处理机的调度 信息与机电工程系 计算机科学与技术 李盼盼 助教 2013年12月 ...查看


  • 兽医基础课程教学设计方案
  • 兽医基础课程教学设计方案 一.课程概况 <兽医基础>是中央广播电视大学为教育部"一村一名大学生计划"畜牧兽医专业开设的一门必修课.课内学时90学时,5学分. 兽医基础是研究畜禽疾病发生发展规律以及疾病诊断方法 ...查看


  • 最新版软件开发实训课程设计教学大纲编写模板
  • 实践教学环节类别:课程设计 实践教学环节编号:073411236 总周数:2 实践学分:2 开课单位:自动化工程学院 软件开发实训课程设计教学大纲 一.课程设计目的和要求 1.课程设计目的 软件开发实训是测控技术与仪器专业的一个重要的实践性 ...查看


  • 进程调度模拟设计--先来先服务.最高响应比优先调度算法
  • 课 程 设 计 题 目 学 院 专 业 班 级 姓 名 指导教师 进程调度模拟设计-先来先服务.最高响应比优先调度算法 计算机科学与技术学院 计算机科学与技术专业 计算机科学与技术0902班 庞竞强 郭羽成 2011 年 01 月 12 日 ...查看


  • [教育研究方法]教学大纲
  • <教育研究方法>教学大纲 二.课程性质.地位和任务 <教育研究方法>是西南大学教师教育选修课程之一,它在顺应时代要求.形成学生合理的专业知识基础和能力结构等方面起着十分重要的作用.其在培养方案中的地位.作用至为重要. ...查看


  • 哈工大电气培养方案
  • 电气工程及其自动化专业本科生培养方案 一. 培养目标 本专业培养具备电气工程领域相关的基础理论.专业技术和实践能力,具有宽广的自然科学基础和良好的人文素养,富于创新精神,能在电机与电器.电力系统.工业自动化以及电气装备制造等领域从事科学研究 ...查看


热门内容