操作系统实验1~9

操作系统实验1~9
操作系统实验1~9

实验一进程同步和互斥

(建议4学时)

一、实验目的

1.掌握临界资源、临界区概念及并发进程互斥、同步访问原理。

2.学会使用高级语言进行多线程编程的方法。

3.掌握利用VC++或Java语言线程库实现线程的互斥、条件竞争,并编码实现P、V 操作,利用P、V操作实现两个并发线程对有界临界区的同步访问。

4.通过该实验,学生可在源代码级完成进程同步互斥方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。

二、实验要求

1.知识基础:学生应在完成进程和线程及调度等章节的学习后进行。

2.开发环境与工具:

硬件平台——个人计算机。

软件平台-Windows操作系统,vc++语言或Java语言开发环境。

3.运用高级语言VC++或Java语言线程库及多线程编程技术进行设计实现。

三、实验内容

1.实现临界资源、临界区、进程或线程的定义与创建。

2.利用两个并发运行的进程,实现互斥算法和有界缓冲区同步算法。

四、实验方案指导

该实验方案由以下几个关键设计项目组成:

1.并发访问出错。即设计一个共享资源,创建两个并发线程,二者并发访问该共享资源。当没有采用同步算法设计时,线程所要完成的某些操作会丢失。

2.互斥锁。并发线程使用线程库提供的互斥锁,对共享资源进行访问。

3.软件方法。设计并编程实现计数信号量、P操作函数、V操作函数,并发线程通过调用P,V操作函数实现线程的互斥。

4.同步访问多缓冲区。利用上面的软件方法完成P,V操作,可实现两个线程对多缓冲区的同步访问。

五、实验方案实现范例

以下是对该项目中包含的部分设计功能的实现方法、实现过程、技术手段的描述,供师生参考。

1.模拟线程并发运行。

假设我们使用POSIX线程库,而POSIX并没有真正提供线程间的并发运行需求。我们设计的系统应支持符合RR调度策略的并发线程,每个线程运行一段时间后自动挂起,另一个线程开始运行。这样一个进程内所有线程以不确定的速度并发执行。

2.模拟一个竞争条件——全局变量。

创建两个线程tl和t2,父线程主函数main()定义两个全局变量accntl和accnt2,每个变量表示一个银行账户,初始化为0。每个线程模拟一个银行事务:将一定数额的资金从一个账户转到另一个账户。每个线程读入一个随机值,代表资金数额,在一个账户上做减法,在另一个账户上做加法,用两个变量记录两个账户的收支情况。良性情况下收支应平衡,即两

个全局变量之和应为0。

下面是每个线程的代码:

counter=0;

do{

tmp1=accnt1;

tmp2=accnt2;

r=random();

accnt1=tmp1+r;

accnt2=tmp2-r;

counter++;

}while(accnt1+accnt2==0);

printf(”%d”,counter);

===================================================================== 两个线程运行的代码相同,只要各自代码不被交叉执行,两个收支余额之和就应一直为如果线程被交叉执行,某个线程可能会读入一个旧的accntl值和一个新的accnt2值,或反,这样会导致某个值的丢失。当这种情况出现时,线程停止运行,并把出现情况的位置Counter的值)打印出来。

3.模拟一个竞争条件——共享文件。

主线程创建两个共享文件fl和f2,每个文件包含一个当前银行账户。线程使用随机数对文件进行读/写,方式同上。注意:文件在读/写过程中不要加互斥访问锁,以免不会出现交叉访问的情况。

4.测试出现一个竞争条件的时间。

我们的编程环境中,一般无法支持线程的RR调度,必须编程实现两个线程间在两个赋值语句之间插入以下代码:在指定区间(比如0到1)生成一个随机数,小于一个极限值(如0.1),调用线程自动挂起函数jield(),自动放弃CPU,另一运行,于是导致一个数据更新的丢失。

5.互斥锁。

POSIX线程库提供一个二值信号量,称为MUTEX,它可以加锁或解锁。如果已被另一个线程加上锁的MUTEX加锁,就会引发该线程被阻塞,MUTEX解锁时唤醒它。使用这些原语,很容易实现互斥进入CS(临界区)。进入CS区时加锁,离开CS区时解锁。系统负责阻塞或唤醒线程。

6.用软件方法实现互斥访问临界区。

用标准编程语言设置变量的值,用线程“忙等待”实现互斥访问CS。设计两线分代码如下:

===================================================================== int cl=0,c2=0,will_wait;

p1: while(l) {

cl=l;

will_wait=l;

while(c2&&(will_wait ==1)); /*忙等待*/

csl;

cl=0;

programl;

}

p2: while(l) {

c2=1;

will_wait= 2;

while(cl&&(will_wait==2); /* 忙等待*/

cs2;

c2=0;program2;

}

===================================================================== 该软件方法使用三个变量cl,c2,will_wait,解决两个线程的同步问题。两个线程分别将c1和c2设置为1,表示自己试图进入临界区,并将will_wait分别设置为1和2,以消除任何竞争条件。通过“忙等待”循环实现线程的阻塞。当线程退出CS区时,分别将变量c1和c2设置为0。

我们可以比较互斥锁和软件方法这两种解决方法的效率。可以通过重复相同的循环次数,测量各自的执行时间,尽量减少可能的外部干扰,重复测试几次,并计算平均值。

#include "iostream"

using namespace std;

#include "windows.h"

DWORD WINAPI ThreadProc1(LPVOID lpParameter);

DWORD WINAPI ThreadProc2(LPVOID lpParameter);

HANDLE hMutex;

int counter=0,accnt1=0,accnt2=0,tmp1,tmp2,r;

void main()

{

printf("开始服务:\n");

HANDLE handle1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);

HANDLE handle2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);

CloseHandle(handle1);

CloseHandle(handle2);

hMutex=CreateMutex(NULL,FALSE,NULL);

/*控制主进程运行时间*/

Sleep(5000);

printf("服务结束\n");

//getchar();//VS2008

}

DWORD WINAPI ThreadProc1(LPVOID lpParameter)

{

while (accnt1+accnt2==0)

{

WaitForSingleObject(hMutex,INFINITE);

tmp1=accnt1;

tmp2=accnt2;

r=rand();

accnt1=tmp1+r;

accnt2=tmp2-r;

counter++;

printf("账户A完成转账--%d\n",counter);

Sleep(100);

ReleaseMutex(hMutex);

}

//printf("第%d次转账发生错误",counter);

return 0;

}

DWORD WINAPI ThreadProc2(LPVOID lpParameter) {

while (accnt1+accnt2==0)

{

WaitForSingleObject(hMutex,INFINITE);

tmp1=accnt1;

tmp2=accnt2;

r=rand();

accnt1=tmp1+r;

accnt2=tmp2-r;

counter++;

printf("账户B完成转账--%d\n",counter);

Sleep(100);

ReleaseMutex(hMutex);

}

//printf("第%d次转账发生错误",counter);

return 0;

}

实验二进程及其资源管理

(建议4学时)

一、实验目的

1.理解资源共享与互斥特性,以及操作系统管理资源的基本方法。

2.学会使用高级语言进行多线程编程的方法。

3.掌握利用VC++或Java线程库实现一个管理器,用来实现操作系统对进程及其资源的管理功能。

4.通过该实验,学生可在源代码级完成进程及其资源管理方案的分析、功能设计、编程实现,控制进程间的同步、互斥关系。

二、实验要求

1.知识基础:学生应在完成对进程和线程、调度、死锁等章节的学习后进行。

2.开发环境与工具:

硬件平台——个人计算机。

软件平台——Windows操作系统,根据需要,任选安装VC++语言、java语言或C 语言开发环境。

三、实验内容

1.开发一个函数,建立进程控制块和资源控制块结构,并实现相关数据结构的初始化。

2.开发一系列操作,由进程调用这些操作,达到控制进程申请或释放各种资源的目的。

四、实验方案指导

该实验方案由以下几个关键设计项目组成:

1.进程数据结构表示。

2.资源数据结构表示。

3.进程对资源的操作。

4.调度程序。

5.用户功能shell界面。

五、实验方案实现范例

以下是对该项目中包含的设计功能的实现方法、实现过程、技术手段的描述,供师生参考。

1.进程数据结构表示。

使用结构类型设计实现进程PCB表,它包含以下成员:①进程ID——进程的唯一标识,供其他进程引用该进程;②内存——是一个指针链表,它在创建进程时已申请完毕,可用链表实现;③其他资源——表示除去内存之外的所有资源;④进程状态——包括两个数据类型,一个是状态码,另一个是状态队列链表指针;⑤生成树——包括两个数据类型,本进程的父进程和本进程的子进程;⑥优先级——供进程调度程序使用,用来确定下一个运行进程,可以设定为静态整数。

2.资源数据结构。

每个资源都用一个称为资源控制块的数据结构表示。使用结构类型设计实现资源控制块RCB。资源控制块包括以下字段成员:①RID-资源的唯一标识,由进程引用;②资源状态——空闲/已分配;③等待队列——是被本资源阻塞的进程链表,本资源正被其他所有资源都设定为静态数据,系统启动时初始化。

3.进程管理及进程对资源的操作。

进程操作及进程状态转换归纳如下:①进程创建——(无)→就绪;②申请

行→阻塞;③资源释放——阻塞→就绪;④删除进程——(任何状态)→(无);

——就绪→运行或运行→就绪。

具体实现步骤如下:

(1)根据上述数据结构,用高级语言设计相应函数,分别实现创建进程、删除进程、

挂起进程、唤醒进程等功能。

(2)设计一个函数,实现调度程序,在每个进程操作执行完毕后,自动调用执行。

(3)实现两个资源操作:申请资源和释放资源。

相关参考算法如下:

===================================================================== request(RID) /*申请资源算法*/

{ r=get_RCB(RID); /*获取资源控制块首地址*/

if (r->status= =?free? ) {/*资源可用*/

r->status=?allocated?;/*分配给调用进程,*/

insert(self->other_resources,r); } /*插入一个RCB指针指向进程资源链表;*/ else { /*资源不可用*/

self->status.type=?blocked?;/*记录阻塞*/

self->status.list=r; /*指向所请求资源的RCB*/ . remove(RL,self); /*将进程从就绪队列中删除*/

insert(r->waiting_list,self); } /*插入资源等待队列*/

scheduler( ); /*调度程序运行选择下一个运行进程*/ release(RID) /*释放资源算法*/

{ r=get_RCB(RID); /*获取资源控制块首地址*/

remove(self->other_resource,r); /*从进程资源链表中删除该资源*/

if(waiting_list==NULL) r->status=?free?; /*等待队列为空,置资源状态为空闲*/

else { /*等待队列不为空*/

remove(r->waiting_list,q); /*从等待队列中移出一个进程q*/

q->status.type=?ready?; /*将进程q的状态设为就绪*/

q->status.list=RL; /*进程q的状态指针指向就绪队列*/

insert(RL,q); } /*进程q插入就绪队列*/

scheduler( ); /*调度程序运行选择下一个运行进程*/

===================================================================== 4.调度程序。

调度策略采用固定优先级和可剥夺优先级调度算法。即调度程序必须维护n个不同优先级的就绪队列,各就绪队列可为空,也可包含多个进程。0级进程优先级最低,n-l级进程优先级最高。创建进程时就赋予了固定的优先级,并在进程的生存期内保持不变。当新进程创建或阻塞进程被唤醒时,它就被插入同级的就绪队列中。

调度程序按“先来先服务”和优先级“从高到低”的方式处理就绪队列。即从最高优先级的非空就绪队列的队首选择一个进程进入运行态。这样的调度策略很容易导致"饥饿",进程出现。因为对进程q来说,只有当优先级高于自己的所有进程都运行完毕,或都进入阻塞状态时,它才能得到运行权。

为了简化调度程序,我们假定系统中至少有一个进程处于就绪态。为确保这一点,设计一个特殊进程init,该进程在系统初始化时自动创建,并赋予最低优先级0级。init进程有两个作用:充当闲逛进程,该进程运行时不申请任何资源,以免被阻塞;作为第一个被创建的进程,它没有父进程,可创建比自己优先级高的其他进程。所以init进程是进程生成树的根进程。

采用优先级策略的调度程序的常见结构知下所示:

===================================================================== scheduler()

{ 找出最高优先级进程p;

If(self->prioritypriority)||self->status.type!=?running?||self= nil)

preempt(p,self); /*调度进程p,替换当前进程self*/

}

===================================================================== 每当任一进程的操作执行完毕,必须执行进程调度程序,它是当前运行进程的一部分。进程调用该函数,后者决定该进程是继续执行还是被其他进程剥夺运行权。作出判断的依据是:是否存在高优先级进程p,如果存在,p将剥夺self的运行权。当前进程的运行权被剥

夺的情况有以下两种:①当前进程刚刚完成release(操作,由此被唤醒进程的优先级可能高于当前进程。②当前进程刚刚完成create()操作,新创建进程的优先级可能高于当前进程。

在以下两种情况下,新挑选的进程必须剥夺当前进程的运行权:①当前进程刚刚完成reques()操作,并且申请的资源timeout则当前进程的状态就改为“阻塞”;或者由于分时运行进程的需要,调度程序被一个timeout操作调用运行。在timeout操作中当前进程的状态改为“就绪”。在上述情况中,当前进程的状态都不是“运行”。所以当前进程必须停止运行,此时就绪队列中最高优先级的进程p得到执行。②当进程刚刚完成destroy操作,进程自己删除自身,它的PCB表不再存在。此时调度程序被执行,从就绪队列中选出最高优先级的进程p,并令其执行。

剥夺操作包括以下工作:将选中的最高优先级进程p的状态改为“运行"。如果当前进程依然存在且没CPU,则将其状态改为“就绪”,以便随后能得到执行。最后,进行上下文切换,保留当前CPU的各个寄存器值,放入PCB表。装入中选进程p的寄存器值。

本实现方案没有对实际的CPU进行访问来保存或恢复寄存器的值,因此上下文切换的任务只是将正在运行进程的名字显示在终端屏幕上。从这一点可以认为,用户终端屏幕开始扮演当前运行进程功能的角色。

5.用户shell界面。

为RCB试和演示管理器的CPU能,本方案设计开发一个shell界面,它可以重复接受终端输入的命令,唤醒管理器执行相应的功能,并在屏幕上显示结果。

使用上述系统,终端就能展示当前进程。只要输入一个命令,就中断当前进程序的执行,shell界面调用进程资源管理器中的函数F,并传递终端输入的参数。该函数执行后将改变PCB、RCB及其他数据结构中的信息。当调度程序执行时,决定下一个要运行的进程,并改变其状态值。保存当前进程的CPU各寄存器值(虚拟CPU),然后恢复中选进程的值。调度程序将系统状态信息显示在屏幕上,提示下一步操作。特别地,它始终提示正在运行的进程是什么,即终端和键盘正在为哪个进程服务。另外,函数F也可能返回一个错误码,shell 也将它显示在屏幕上。

shell命令的语法格式规定如下:

命令名参数

例如,执行命令行“crA1”时将调用对应的管理器函数create(A,1),即创建一个名为A、优先级为1的进程。同理,命令“rq R”将调用函数request(R)执行。

以下显示说明shell界面的交互内容(假定进程A的优先级为1,并且正在运行)。由“*”开始的行视为shell的输崮结果。提示符“>”后面是提示用户输入的命令。

……

* process A is running

> cr B 2

* process B is running

> cr C 1

* process B is running

> re q R1

* process B is blocked;process A is running

……

6.进程及资源管理器的升级版。

可对上述基本型进程功能资源管理器进行功能扩展,使管理器能够处理时钟到时中断和I/O处理完成中断。

(1)相对时钟到时中断。假设系统提供一个硬件时钟。周期性产生一个时钟到时中断。

引发调用函数timeout()的执行。

(2) 110处理完成中断。使用名为IO的资源表示所有的I/O设备。该资源的RCB由以下两部分组成:

IO

Waiting_list

(3)扩展shell。显示当前运行进程,并添加一个系统调用request_100。终端也能表示硬件,用户能够模拟两种类型的中断:时钟到时、I/O完成处理。为了实现以上功能,必须添加新的shell命令,调用以下三个系统调用:request_IO(),IO_ competion,timeout()。

实验三存储管理

(建议4学时)

一、实验目的

1.掌握内存管理的基本功能和分区法内存分配的基本原理。

2.学会Linux操作系统下使用c语言函数和系统调用进行编程的方法。

3.利用c语言设计实现分区法内存分配算法。

4.验证无虚存的存储管理机制。

二、实验要求

1.学生应完成如下章节的学习:进程和线程、调度、存储管理。

2.安装Linux操作系统,使用c语言编程,调用相关系统调用进行设计实现。

三、实验内容

1.创建空闲存储管理表和模拟内存。

2.设计并实现一个内存分配程序,分配策略可以分别采用最先适应算法、最佳适应算

法和最坏适应算法等,并评价不同分配算法的优劣。

3.提供一个用户界面,利用它用户可输入不同的分配策略。

4.进程向内存管理程序发出申请、释放指定数量的内存请求,内存管理程序调用对应函数,响应请求。

四、实验方案指导

该实验方案由以下几个关键设计项目组成。

1.设计实现一个空闲分区表。

2.设计实现模拟内存。考虑实现的便利,本方案不访问真正的内存。定义一个字符数组char mm[mem_size]或使用Linux系统调用mm=malloc(mem_size),用来模拟内存。利用指针对模拟内存进行访问。

3.设计一组管理物理内存空间的函数。用户接口由以下三个函数组成:

void*mm_request(int n)

申请n个字节的内存空间。如申请成功,则返回所分配空间的首地址;如不能满足申请,则返回空值。

void mm_release(void*p)

释放先前申请的内存。如果释放的内存与空闲区相邻,则合并为一个大空闲区;如果与空闲区不相邻,则成为一个单独的空闲区。

void*mm_init(int mem_size)

内存初始化。返回mm指针指向的空闲区。

4.设计实现不同策略的内存分配程序。

对于采用不同分配策略的内存管理程序,从以下两个方面进行调度程序性能的比对:内存利用率以及找到一个合适的分配空间所需查找的步骤。

设置一个模拟实验。分别构建一个随机生成的请求与释放队列。释放队列中的操作总是得到满足,队列总为空;请求队列的操作能否被满足,取决于空闲区能否满足申请的空间大小。若不能满足,则该操作在队列中等待相应释放操作唤醒。请求队列采用FIFO管理,以避免饥饿现象的发生。

内存管理程序应对内存初始化,随机设定内存空间的占有、空闲情况,随机设定申请和释放的操作队列。调用释放操作开始运行,调用申请操作,如能满足,则分配空间,否则等待释放操作唤醒。

下面给出一个模拟内存管理的程序框架(伪码形式)。可对性能数据指标进行统计。===================================================================== for(i=0;i

do{ /*循环调用请求操作,直到请求不成功*/ get size n of next request; /*设定请求空间大小*/

mm_request(n); /*调用请求操作*/

}while(request successful); /*请求成功,循环继续*/

record memory utilization; /*统计内存使用率*/

select block p to be release; /*释放某空间p*/

release(p); /*调用释放操作*/

=====================================================================

以上程序由主循环控制固定次数的模拟步骤。每次循环,程序完成如下处理步骤:内循

环尽可能多地满足内存请求,请求内存大小值随机生成。一旦请求失败,挂起内存管理程序,直至释放操作被执行。此时进行系统内存利用率的统计、计算,随机挑选一个内存分配空间完成释放操作。本次主循环执行完毕,开始下一次循环。

需要在程序中完成以下设计:确定请求分配空间大小,统计性能数据,选择一个内存区释放。

实验四页面置换算法

(建议4学时)

一、实验目的

1.掌握内存管理基本功能和请求分页式管理的基本原理以及页面置换算法。

2.学会在Linux操作系统下使用C函数和系统调用的编程方法。

3.掌握利用C语言设计实现不同置换策略的页面置换算法。

4.验证虚存存储管理机制及其性能。对于生成的引用串,计算、比对不同页面置换算法的缺页率。

二、实验要求

1.学生应完成如下章节的学习:进程和线程、调度、存储管理。

2.安装Linux操作系统,使用C语言编程,利用相关系统调用实现设计。

三、实验内容

1.创建空闲存储管理表、模拟内存、页表等。

2.提供一个用户界面,用户利用它可输入不同的页面置换策略和其他附加参数。

3.运行置换程序,输出缺页率结果。

四、实验方案指导

熟悉页面置换算法及其实现,了解计算机系统性能评价方法,编制页面置换算法的模拟程序。方案设计重点提示如下。

1.假定系统有固定数目的内存块F,物理块号依次为O~F-l。进程的大小为P页,其逻辑页号依次为O~P-l。随机生成一个引用串RS,即从O~P-l组成的整数序列。定义一个整型数组int M[F]表示所有物理块,如果M[i]=n,表示逻辑页n存放在物理块i中。

2.生成引用串。用随机数方法产生页面走向,页面走向长度为L。

3.根据页面走向,分别采用FIFO和LRU算法进行页面置换,设计一个函数自动统计缺页率。

4.假定可用内存块和页表长度(进程的页面数)分别为m和k。初始时,进程的页面都不在内存。

5.参考其他设计项目,将不同置换算法设计实现为函数,能在界面上方便调用执行。

实验五进程调度

(建议4学时)

一、实验目的

1.掌握进程调度程序的功能和调度程序采用的调度算法。

2.学会在Linux操作系统下使用C函数和系统调用的编程方法。

3.掌握利用C语言设计实现不同调度策略的进程调度算法。

4.验证不同进程调度算法对性能的影响。

二、实验要求

1.学生应完成如下章节的学习:进程和线程、调度。

2.安装Linux操作系统,使用C语言编程,利用相关系统调用完成设计实现。

三、实验内容

1.定义、初始化进程数据结构及其就绪队列。

2.提供一个用户界面,用户利用它可输入不同的分配策略及相关参数。

3.设计实现调度程序,调用下面的功能函数。

4.设计函数,实现计算平均周转时间,实现不同调度算法。

四、实验方案指导

关键设计内容如下,供参考。

1.用C语言的结构类型及其链表,完成PCB表数据结构设计,并动态生成一组进程组成的就绪队列链表。每个进程都由PCB记录运行时间,优先级、到达系统时间等数据。也可根据需要,自行添加不同调度算法需要的数据。

2.设计实现不同调度算法的函数,如先来先服务法、短作业优先法、优先级法等。设计一个函数,计算出这组进程的平均周转时间。

3.设计总控函数,实现进程调度程序。根据用户界面的输入,调用相应的调度算法,实现进程调度,计算调度性能指标。

实验六银行家算法

(建议4学时)

一、实验目的

1.理解死锁概念、银行家算法及安全性检测算法。

2.学会在Linux操作系统下…使用C语言函数和指针进行编程的方法。

3.掌握利用C语言设计实现银行家算法的基本过程。

4.验证银行家算法对于避免死锁的作用。

二、实验要求

1.学生应完成如下章节的学习:进程和线程的调度。死锁。

2.安装Linux操作系统,使用C语言编程完成设计实现。

三、实验内容

1.定义并初始化进程及其资源数据结构。

2.提供一个用户界面,用户利用它可动态输入进程和资源种类等相关参数

3.设计实现安全状态检测和银行家死锁避免算法的功能函数。

四、实验方案指导

以如下几组初始数据为例,设计相应程序,判断下列状态是否安全。

1.3个进程共享12个同类资源

状态a下:allocation=(1,4,5),max=(4,4,8)。判断系统是否安全。

状态b下:allocation=(1,4,6),max=(4,6,8)。判断系统是否安全。

2. 5个进程共享多类资源

状态c下:判断系统是否安全?若安全,给出安全序列。若进程2请求(0,4,2,0),可否立即分配?

分配矩阵最大需求矩阵可用资源矩阵

0 0 1 2 0 0 1 2 1 5 2 0

1 0 0 0 1 7 5 0

1 3 5 4

2

3 5 6

0 6 3 2 0 6 5 2

0 0 1 4 0 6 5 6

实现方案的主要作是如何输入,如何初始数据,如何调用对应功能函数,如何输出结果。下面给出一个实现方案,供参考。

1.开发一个交互程序,首先从文件中读入系统描述信息,包括进程的数目、资源的种类和数量、每个进程的最大资源请求。程序自动根据文件内容创建一个当前系统描述例如,每类资源的数目用…维数组R[m]描述,m为资源的种类。每个R[j]记录资源Rj的数量。进程的最大需求矩阵用P[n][m]表示,P[il[j]记录进程Pi对资源Rj的最人需求。分配矩阵和请求矩阵可使用二维数组表示。

2. 用户输入一个请求,格式类似:resquest(i,j,k),或release(i,j,k),在这里,i表示进程Pi,j 表示资源Rj,k是申请/释放的数量。对每一个请求,系统回应是满足要求还是拒绝分配。

3.设定一个申请和释放序列,无任何检测和避免死锁的算法,分配会导致死锁。

4.设定一个申请和释放序列,按照安全性算法进行设计,回应系统是否安全。然后实现银行家算法,确保没有死锁的分配。

实验七磁盘调度算法

(建议4学时)

一、实验目的

1.理解文件读/写基本原理和磁盘调度算法的作用。

2.学会在Linux操作系统下使用C语言函数和指针进行编程的方法。

3.利用C语言设计实现不同磁盘调度算法,如FIFO,SSTF,SCAN等算法。

4.验证不同磁盘调度算法对性能的影响。

二、实验要求

1.学生应完成如下章节的学习:进程和线程、调度、存储管理、I/O管理。

2.安装Linux操作系统,使用C语言编程完成设计实现。

三、实验内容

1.设计一个函数,其功能是动态创建I/O请求队列及其相关参数,如磁道号等。

2.提供一个用户界面,用户可输入不同的分配策略以相关参数。

3.设计相应程序计算平均移臂距离。

四、实验方案指导

实现本实验的关键内容如下,供参考。

1.实现电梯算法。

2.实现FIFO,SSTF算法。

3.写一个驱动程序,测试不同的算法。设置多次循环,每次循环中,驱动程序随机调用函数request(n)和release()。如果执行request(n),系统会将n转换成1~T之间的一个随机值,T是磁盘的磁道数。对每种算法,计算平均移臂距离。

实验八设备处理程序设计

(建议4学时)

一、实验目的

1.理解设备处理程序的一般设计过程,加深对缓冲和中断概念的理解。

2.学会在Linux操作系统下使用C语言编程与有关进程的系统调用方法。

3.掌握利用C语言设计实现键盘缓冲区的读/写操作的方法。

4.验证键盘缓冲区和中断处理程序是否同步。

二、实验要求

1.学生应完成如下章节的学习:进程和线程、调度、存储管理、I/O管理。

2.安装Linux操作系统,使用C语言和相关系统调用,编程完成设计实现。

三、实验内容

1.主程序实现键盘读/写、键盘中断处理程序。

2.可修改缓冲区数目,运行此程序。

四、实验方案指导

1.将主程序看成消费者进程,将中断程序看成生产者进程,两者通过什么方法取缛d 步?其数据结构是什么?

2.当缓冲区数目分别为2,5,10时,运行此程序,是否发生输入字符没有被显示携情 况(加快输入速度)?为什么?

若在主程序显示字符子程序中加入一段延迟程序,对整个程序有何影响?和问题) k=A 讨论,并做实验。以上设计方案供读者选择。两个程序的流程为图A-l 所示。

图A-l 键盘缓冲区读/写与中断处理程序的同步

实验九 文件系统

( 建议4学时)

一、实验目的

1.理解并实现文件的构造、命名、存取、使用、保护等功能,加深对文件操作、文件 存储的理解。

2.掌握文件系统的功能,通过数据结构定义文件系统,并完成相应操作。

3.学会在Linux 操作系统下使用C 语言编程和有关文件的系统调用的方法。

4.掌握利用C 语言设计实现文件读/写等操作的方法。

5.验证文件存储空间管理功能,验证磁盘调度算法的实现。

二、实验要求

1.用c 语言中链表结构模拟定义I 节点数据结构及其相关数据块数据结构。

2.设计函数,实现随机大小的文件的磁盘空间分配,并显示分配结果。

3.设计函数,实现文件指定磁盘空间的查找,并显示结果。

三、实验内容

中断处理程序 读键盘输入程序 译码转换成字符 送字符到缓冲区

恢复现场 中断返回 主程序 转到中断处理程序 读键盘缓冲区 缓冲区是否空 取字符并显示

1.设计一个用户界面,用户可输入不同的参数,表示运行不同的函数功能。如空闲存锗空间、磁盘调度分配策略等。

2.设计一个函数,实现空闲存储空间的管理。

3.设计一个函数,实现I节点方式的文件存储。

4.设计多个函数,实现按不同调度策略计算平均移臂距离。

四、实验方案指导

空闲存储空间的管理与实现。以成组链接法为例,编程模拟实现磁盘空闲区的管理。空闲块成组链接如图6-22所示。

有以下几个关键实验步骤:

(1)用c语言链表结构自动生成以上空闲块成组链接表。

(2)设计实现空闲块成组链接法空闲块分配函数,函数功能是对超级块进行以下操作:重复进行栈深减1操作,取出磁盘块号。当栈深为1时,堆栈当前指针指向本组第一块,即正好取(3)一个组的组长盘块号,将其内容写入堆栈,重复栈深减1的操作,继续分配磁盘块。

(3)设计实现空闲块成组链接法空闲块释放函数,函数功能是对超级块进行以下操作:重复进行栈深加l操作,存入磁盘块号。当栈深为50时,此时又释放一个磁盘块,并将当前栈中内容写入该磁盘块(组长),并将栈深设定为1,堆栈的第一个索引位置(0)填入该磁盘块块号,它是新一组的组长块。此时如继续释放,进行栈深加1操作(2)存入磁盘块号(1)。

(4)随机对成组链表初始化,调用分配函数或回收函数,输出成组链表结果。验证分配和回收的正确性。

读者可能会问:一个文件在存储设备上如何存放?采用哪种存取方法?文件的存储分配涉及以下三个问题:①创建新文件时,是否一次性分配所需的最大空间?②为文件分配的空间是否连续?③为了记录分配给各个文件的磁盘空间,应该使用何种数据结构来记录?

已知每个文件有一个I节点,其中列出了文件属性和文件分配的各块号,存放物理块号的方式如下:开始的10个磁盘块号放在I节点中(直接块),对于稍大的文件,I节点中有一个一次间接地址,指向存放磁盘块地址的磁盘块(间接块),如果文件更大,I节点中有一个二次间接地址,指向一次间接地址块,再由它们指向存放磁盘块地址的盘块。如图6-19所示。

嵌入式操作系统实验报告

中南大学信息科学与工程学院实验报告 姓名:安磊 班级:计科0901 学号: 0909090310

指导老师:宋虹

目录 课程设计内容 ----------------------------------- 3 uC/OS操作系统简介 ------------------------------------ 3 uC/OS操作系统的组成 ------------------------------ 3 uC/OS操作系统功能作用 ---------------------------- 4 uC/OS文件系统的建立 ---------------------------- 6 文件系统设计的原则 ------------------------------6 文件系统的层次结构和功能模块 ---------------------6 文件系统的详细设计 -------------------------------- 8 文件系统核心代码 --------------------------------- 9 课程设计感想 ------------------------------------- 11 附录-------------------------------------------------- 12

课程设计内容 在uC/OS操作系统中增加一个简单的文件系统。 要求如下: (1)熟悉并分析uc/os操作系统 (2)设计并实现一个简单的文件系统 (3)可以是存放在内存的虚拟文件系统,也可以是存放在磁盘的实际文件系统 (4)编写测试代码,测试对文件的相关操作:建立,读写等 课程设计目的 操作系统课程主要讲述的内容是多道操作系统的原理与技术,与其它计算机原理、编译原理、汇编语言、计算机网络、程序设计等专业课程关系十分密切。 本课程设计的目的综合应用学生所学知识,建立系统和完整的计算机系统概念,理解和巩固操作系统基本理论、原理和方法,掌握操作系统开发的基本技能。 I.uC/OS操作系统简介 μC/OS-II是一种可移植的,可植入ROM的,可裁剪的,抢占式的,实时多任务操作系统内核。它被广泛应用于微处理器、微控制器和数字信号处理器。 μC/OS 和μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II嵌入到开发的产品中。μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。μC/OS-II 已经移植到了几乎所有知名的CPU 上。 严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。没有提供输入输出管理,文件系统,网络等额外的服务。但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全 可以由用户自己根据需要分别实现。 uC/OS-II目标是实现一个基于优先级调度的抢占式的实时内核,并在这个内核之上提供最基本的系统服务,如信号量,邮箱,消息队列,内存管理,中断管理等。 uC/OS操作系统的组成 μC/OS-II可以大致分成核心、任务处理、时间处理、任务同步与通信,CPU的移植等5个部分。如下图:

操作系统实验报告--实验一--进程管理

实验一进程管理 一、目的 进程调度是处理机管理的核心内容。本实验要求编写和调试一个简单的进程调度程序。通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。 二、实验内容及要求 1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。可根据实验的不同,PCB结构的内容可以作适当的增删)。为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。 2、系统资源(r1…r w),共有w类,每类数目为r1…r w。随机产生n进程P i(id,s(j,k),t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。 3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。建立进程就绪队列。 4、编制进程调度算法:时间片轮转调度算法 本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。 三、实验环境 操作系统环境:Windows系统。 编程语言:C#。 四、实验思路和设计 1、程序流程图

2、主要程序代码 //PCB结构体 struct pcb { public int id; //进程ID public int ra; //所需资源A的数量 public int rb; //所需资源B的数量 public int rc; //所需资源C的数量 public int ntime; //所需的时间片个数 public int rtime; //已经运行的时间片个数 public char state; //进程状态,W(等待)、R(运行)、B(阻塞) //public int next; } ArrayList hready = new ArrayList(); ArrayList hblock = new ArrayList(); Random random = new Random(); //ArrayList p = new ArrayList(); int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数 //r为可随机产生的进程数(r=m-n) //a,b,c分别为A,B,C三类资源的总量 //i为进城计数,i=1…n //h为运行的时间片次数,time1Inteval为时间片大小(毫秒) //对进程进行初始化,建立就绪数组、阻塞数组。 public void input()//对进程进行初始化,建立就绪队列、阻塞队列 { m = int.Parse(textBox4.Text); n = int.Parse(textBox5.Text); a = int.Parse(textBox6.Text); b = int.Parse(textBox7.Text); c = int.Parse(textBox8.Text); a1 = a; b1 = b; c1 = c; r = m - n; time1Inteval = int.Parse(textBox9.Text); timer1.Interval = time1Inteval; for (i = 1; i <= n; i++) { pcb jincheng = new pcb(); jincheng.id = i; jincheng.ra = (random.Next(a) + 1); jincheng.rb = (random.Next(b) + 1); jincheng.rc = (random.Next(c) + 1); jincheng.ntime = (random.Next(1, 5)); jincheng.rtime = 0;

操作系统实验实验1

广州大学学生实验报告 1、实验目的 1.1、掌握进程的概念,明确进程的含义 1.2、认识并了解并发执行的实质 2.1、掌握进程另外的创建方法 2.2、熟悉进程的睡眠、同步、撤消等进程控制方法 3.1、进一步认识并发执行的实质 3.2、分析进程竞争资源的现象,学习解决进程互斥的方法 4.1、了解守护进程 5.1、了解什么是信号 5.2、INUX系统中进程之间软中断通信的基本原理 6.1、了解什么是管道 6.2、熟悉UNIX/LINUX支持的管道通信方式 7.1、了解什么是消息 7.2、熟悉消息传送的机理 8.1、了解和熟悉共享存储机制 二、实验内容 1.1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统 中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 1.2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及 'son ……',父进程显示'parent ……',观察结果,分析原因。 2.1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容 2.2、利用wait( )来控制进程执行顺序 3.1、修改实验(一)中的程序2,用lockf( )来给每一个进程加锁,以实现进程之间的互斥 3.2、观察并分析出现的现象 4.1、写一个使用守护进程(daemon)的程序,来实现: 创建一个日志文件/var/log/Mydaemon.log ; 每分钟都向其中写入一个时间戳(使用time_t的格式) ; 5.1、用fork( )创建两个子进程,再用系统调用signal( )让父进程捕捉键盘上来的中断信号(即按^c键);捕捉到中断信号后,父进程用系统调用kill( )向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止: Child process1 is killed by parent! Child process2 is killed by parent! 父进程等待两个子进程终止后,输出如下的信息后终止: Parent process is killed! 5.2、用软中断通信实现进程同步的机理

实时操作系统报告

实时操作系统课程实验报告 专业:通信1001 学号:3100601025 姓名:陈治州 完成时间:2013年6月11日

实验简易电饭煲的模拟 一.实验目的: 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,基于多任务的模式的编程方法。锻炼综合应用多任务机制,任务间的通信机制,内存管理等的能力。 二.实验要求: 1.按“S”开机,系统进入待机状态,时间区域显示当前北京时间,默认模式“煮饭”; 2.按“C”选择模式,即在“煮饭”、“煮粥”和“煮面”模式中循环选择; 3.按“B”开始执行模式命令,“开始”状态选中,时间区域开始倒计时,倒计时完成后进入“保温”状态,同时该状态显示选中,时间区域显示保温时间; 4.按“Q”取消当前工作状态,系统进入待机状态,时间区域显示北京时间,模式为当前模式; 5.按“X”退出系统,时间区域不显示。 6.煮饭时长为30,煮粥时长为50,煮面时长为40. 三.实验设计: 1.设计思路: 以老师所给的五个程序为基础,看懂每个实验之后,对borlandc的操作有了大概的认识,重点以第五个实验Task_EX为框架,利用其中界面显示与按键扫描以及做出相应的响应,对应实现此次实验所需要的功能。 本次实验分为界面显示、按键查询与响应、切换功能、时钟显示与倒计时模块,综合在一起实验所需功能。 2.模块划分图: (1)界面显示: Main() Taskstart() Taskstartdispinit() 在TaskStartDispInit()函数中,使用PC_DispStr()函数画出界面。

(2)按键查询与响应: Main() Taskstart() 在TaskStart()函数中,用if (PC_GetKey(&key) == TRUE)判断是否有按键输入。然后根据key 的值,判断输入的按键是哪一个;在响应中用switch语句来执行对应按键的响应。 (3)切换功能: l计数“C”按 键的次数 M=l%3 Switch(m) M=0,1,2对应于煮饭,煮粥,煮面,然后使用PC_DispStr()函数在选择的选项前画上“@”指示,同时,在其余两项钱画上“”以“擦出”之前画下的“@”,注意l自增。 四.主要代码: #include "stdio.h" #include "includes.h" #include "time.h" #include "dos.h" #include "sys/types.h" #include "stdlib.h" #define TASK_STK_SIZE 512 #define N_TASKS 2 OS_STK TaskStk[N_TASKS][TASK_STK_SIZE]; OS_STK TaskStartStk[TASK_STK_SIZE]; INT8U TaskData[N_TASKS];

操作系统实验_实验1

广州大学学生实验报告 开课学院及实验室:计算机科学与工程实验室 2015年11月11日 实验课 操作系统成绩 程名称 实验项 进程管理与进程通信指导老师陈康民目名称 (***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***) 进程管理 (一)进程的创建实验 一、实验目的 1、掌握进程的概念,明确进程的含义 2、认识并了解并发执行的实质 二、实验内容 1、编写一段程序,使用系统调用fork( )创建两个子进程。当此程序运行时,在系统中有一 个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……', 父进程显示'parent ……',观察结果,分析原因。 三、实验步骤 1、编写一段程序,使用系统调用fork( )创建两个子进程。 代码: #include main( ) { int p1,p2; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) putchar('b'); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) putchar('c'); else putchar('a'); } } 运行结果:

bca,bac, abc ,……都有可能。 2、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。 代码:#include main( ) { int p1,p2,i; while((p1=fork( ))= = -1); /*创建子进程p1*/ if (p1= =0) for(i=0;i<10;i++) printf("daughter %d\n",i); else { while((p2=fork( ))= = -1); /*创建子进程p2*/ if(p2= =0) for(i=0;i<10;i++) printf("son %d\n",i); else for(i=0;i<10;i++) printf("parent %d\n",i); } } 结果:

上海大学操作系统(二)实验报告(全)

评分: SHANGHAI UNIVERSITY 操作系统实验报告 学院计算机工程与科学 专业计算机科学与技术 学号 学生姓名

《计算机操作系统》实验一报告 实验一题目:操作系统的进程调度 姓名:张佳慧学号 :12122544 实验日期: 2015.1 实验环境: Microsoft Visual Studio 实验目的: 进程是操作系统最重要的概念之一,进程调度又是操作系统核心的主要内容。本实习要求学生独立地用高级语言编写和调试一个简单的进程调度程序。调度算法可任意选择或自行设计。例如,简单轮转法和优先数法等。本实习可加深对于进程调度和各种调度算法的理解。实验内容: 1、设计一个有n个进程工行的进程调度程序。每个进程由一个进程控制块(PCB)表示。进程控制块通常应包含下述信息:进程名、进程优先数、进程需要运行的时间、占用CPU的时间以及进程的状态等,且可按调度算法的不同而增删。 2、调度程序应包含2~3种不同的调度算法,运行时可任意选一种,以利于各种算法的分析比较。 3、系统应能显示或打印各进程状态和参数的变化情况,便于观察诸进程的调度过程。 操作过程: 1、本程序可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行R(run)、就绪W(wait)和完成F(finish)三种状态之一,并假设起始状态都是就绪状态W。为了便于处理,程序进程的运行时间以时间片为单位计算。进程控制块结构如下: 进程控制块结构如下: PCB 进程标识数 链指针 优先数/轮转时间片数 占用 CPU 时间片数 进程所需时间片数 进程状态 进程控制块链结构如下:

其中:RUN—当前运行进程指针; HEAD—进程就绪链链首指针; TAID—进程就绪链链尾指针。2、算法与框图 (1) 优先数法。进程就绪链按优先数大小从高到低排列,链首进程首先投入运行。每过一个时间片,运行进程所需运行的时间片数减 1,说明它已运行了一个时间片,优先数也减 3,理由是该进程如果在一个时间片中完成不了,优先级应该降低一级。接着比较现行进程和就绪链链首进程的优先数,如果仍是现行进程高或者相同,就让现行进程继续进行,否则,调度就绪链链首进程投入运行。原运行进程再按其优先数大小插入就绪链,且改变它们对应的进程状态,直至所有进程都运行完各自的时间片数。 (2) 简单轮转法。进程就绪链按各进程进入的先后次序排列,进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项(相当于优先数法的优先数记录项位置)。每过一个时间片,运行进程占用处理机的时间片数加 1,然后比较占用处理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达轮转时间,应将现运行进程排到就绪链末尾,调度链首进程占用处理机,且改变它们的进程状态,直至所有进程完成各自的时间片。 (3) 程序框图

操作系统实验一

本科实验报告 课程名称:操作系统 学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院

实验(实验一) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。 【操作要求】安装Linux操作系统,版本不限。 Linux发行版本: Linux内核版本:

【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机 4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标

【操作步骤2】主菜单 【操作步骤3】个人用户主目录 【操作步骤4】启动字符终端

嵌入式实时操作系统vxworks实验教程[1]

???VxWorks 偠 ? Laboratory Tutorial for Embedded Real ˉtime Operating System VxWorks ?? ? ? ? ? ? ? 2003 10

???VxWorks 偠 ? ? 1 ???? (1) 1.1 ?? (1) 1.2 ??? (7) 2 ? MPC860 (16) 3 ???VxWorks ? ? Tornado (25) 3.1 ???VxWorks (25) 3.2 Tornado? ? (43) 4 VxWorks?BootRom (48) 5 偠 (55) 5.1 偠??Tornado??? (55) 5.2 偠?? ??? ? ? (74) 5.3 偠?? ? ? ?? (78) 5.4 偠 ?? ??? (101) 5.5 偠?? ?????? ?? (110) 5.6 偠 ? ?????? ?? (116) ? A hwa-xpc860 偠 (120)

1 ???? ?? ?? 催? ?? ??? ?? ? ? ?? ??Ё?????? ? ?? ?? ? ? ?? ?? (Embebdded computer) Ё??? ?? ? ??? ⑤?20??60 ?? ????? ? ????? ? 1.1.1 ???? ??? ?? ? Н? ??? ????? ?? ?? ???? ???? ?? ?? ?? ?? ???? ??? ????? ? ?????BIOS? ? ? ???? ?催 ? ? ? ㄝ???? ? ??? ? ? ? ?????????? ???? ?? ? ? ? ? ???? ?? ? ? ???? ?ㄝ???? ???? ??? ? ? ??? ? ???? ? ? ?? ㄝ ?? ? ??? ? ?? ? (control)???Mointer) ??(Managemet)ㄝ ?? 1.1.2 ? ?????? ? ? 1.1. 2.1 ? ?? ? ?? ??4?? ? 1? ? ? ? ?? ? ? ???Ё ????? ???? ?? ? ? ?? ?2? ? ??? ?? ?????? ? ????? ??? П? ??? ??????? ? ?? ???? ? 3? ? ? ? ????? ?? ? 催 ? ? ? 4? ? 乏 ? ?? ?? ? ? ? ??? ? ? Ё??∴??? ?? ?? ?? ? mW??uW??1.1.2.2 ? ???? ???? ?? ?? ? ? ?? ? ??? ?? ? ? ? ? ???1000 ??????? 30 ?? ?

操作系统实验3答案

实验三操作系统进程管理 一、实验目的 1) 掌握系统进程的概念,加深对Linux / UNIX进程管理的理解。 2) 学会使用ps命令和选项。 3) 列出当前shell中的进程。 4) 列出运行在系统中的所有进程。 5) 根据命令名搜索特定的进程。 6) 使用kill命令终止进程。 7) 根据用户名查找和终止进程。 二、实验内容和相应的答案截图,三、实验结果分析 步骤1:创建一个普通用户(参见实验二),以普通用户身份登录进入GNOME。 步骤2:打开一个“终端”窗口(参见实验二)。 步骤3:回顾系统进程概念,完成以下填空: 1) Linux系统中,几乎每一个启动的进程,都会由内核分配一个唯一的__PID__进程标识符,用于跟踪从进程启动到进程结束。 2) 当启动新进程的时候,内核也给它们分配系统资源,如__内存_和__CPU_。 3) 永远不向父进程返回输出的进程叫做__僵进程__。 4) 由父进程派生出来的进程叫做____子___进程。 5) ___父_进程是一个派生另一个进程的进程。 6) 运行用于提供服务的Linux系统进程是_______________。 7) 如果父进程在子进程之前结束,它创建了一个______________进程。 步骤4:回顾ps命令和信息。基本的ps命令显示当前shell中的进程信息,用户只能够查看当前终端窗口中初始化的进程。输入ps命令,将结果填入表3-3中。 表3-3 实验记录 下面,在当前终端窗口中,练习使用给出的每个选项的ps命令。

输入ps -f 命令,显示运行在系统中的某个进程的完全信息,填入表3-4中。 表3-4 实验记录 步骤5:列出系统中运行的所有进程。 输入ps -ef 命令,显示运行在系统中的各个进程的完全信息。执行该命令,并与ps –f 命令的输出结果对照,一致吗?有何不同? 答:不一致,后者显示了所有进程的完全可用信息,多了很多。 分析当前终端窗口中的输出结果,记录下来用于写实验报告。 a. 显示了多少个进程?答:59 b. 进程ID的PID是什么? c. 启动进程的命令(CMD) 是什么?答:sched d. 请观察,什么命令的PID号是1?答:init[5] e. 执行ps –ef >aaa命令,将ps命令的输出送到文本文件aaa。再次运行cat aaa | wc命令,计算进程的数目。其中,cat是显示文本文件命令。“|”是管道命令,就是将前一个命令的输出作为后一个命令的输入。wc 命令用来计算文本的行数,第一个数字显示的是行的数目,可以用来计算进程的数目。计算出进程数目并做记录。 执行man ps命令,可以打开Linux用户命令手册。了解ps命令的用法。输入wq命令可退出用户手册的阅读。man命令可以执行吗?结果如何? 答:Man ps时出现

操作系统实验心得(精选多篇)

操作系统实验心得 每一次课程设计度让我学到了在平时课堂不可能学到的东西。所以我对每一次课程设计的机会都非常珍惜。不一定我的课程设计能够完成得有多么完美,但是我总是很投入的去研究去学习。所以在这两周的课设中,熬了2个通宵,生物钟也严重错乱了。但是每完成一个任务我都兴奋不已。一开始任务是任务,到后面任务就成了自己的作品了。总体而言我的课设算是达到了老师的基本要求。总结一下有以下体会。 1、网络真的很强大,用在学习上将是一个非常高效的助手。几乎所有的资料都能够在网上找到。从linux虚拟机的安装,到linux的各种基本命令操作,再到gtk的图形函数,最后到文件系统的详细解析。这些都能在网上找到。也因为这样,整个课程设计下来,我浏览的相关网页已经超过了100个(不完全统计)。当然网上的东西很乱很杂,自己要能够学会筛选。不能决定对或错的,有个很简单的方法就是去尝试。就拿第二个实验来说,编译内核有很多项小操作,这些小操作错了一项就可能会导致编译的失败,而这又是非常要花时间的,我用的虚拟机,编译一次接近3小时。所以要非常的谨慎,尽量少出差错,节省时间。多找个几个参照资料,相互比较,慢慢研究,最后才能事半功倍。 2、同学间的讨论,这是很重要的。老师毕竟比较忙。对于课程设计最大的讨论伴侣应该是同学了。能和学长学姐讨论当然再好不过了,没有这个机会的话,和自己班上同学讨论也是能够受益匪浅的。

大家都在研究同样的问题,讨论起来,更能够把思路理清楚,相互帮助,可以大大提高效率。 3、敢于攻坚,越是难的问题,越是要有挑战的心理。这样就能够达到废寝忘食的境界。当然这也是不提倡熬夜的,毕竟有了精力才能够打持久战。但是做课设一定要有状态,能够在吃饭,睡觉,上厕所都想着要解决的问题,这样你不成功都难。 4、最好在做课设的过程中能够有记录的习惯,这样在写实验报告时能够比较完整的回忆起中间遇到的各种问题。比如当时我遇到我以前从未遇到的段错误的问题,让我都不知道从何下手。在经过大量的资料查阅之后,我对段错误有了一定的了解,并且能够用相应的办法来解决。 在编程中以下几类做法容易导致段错误,基本是是错误地使用指针引起的 1)访问系统数据区,尤其是往系统保护的内存地址写数据,最常见就是给一个指针以0地址 2)内存越界(数组越界,变量类型不一致等) 访问到不属于你的内存区域 3)其他 例如: <1>定义了指针后记得初始化,在使用的时候记得判断是否为 null <2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等 <3>在变量处理的时候变量的格式控制是否合理等

嵌入式实时操作系统实验报告

嵌入式实时操作系统实验报告 任务间通信机制的建立 系别计算机与电子系 专业班级***** 学生姓名****** 指导教师 ****** 提交日期 2012 年 4 月 1 日

一、实验目的 掌握在基于嵌入式实时操作系统μC/OS-II的应用中,任务使用信号量的一般原理。掌握在基于优先级的可抢占嵌入式实时操作系统的应用中,出现优先级反转现象的原理及解决优先级反转的策略——优先级继承的原理。 二、实验内容 1.建立并熟悉Borland C 编译及调试环境。 2.使用课本配套光盘中第五章的例程运行(例5-4,例5-5,例5-6),观察运行结果,掌握信号量的基本原理及使用方法,理解出现优先级反转现象的根本原因并提出解决方案。 3.试编写一个应用程序,采用计数器型信号量(初值为2),有3个用户任务需要此信号量,它们轮流使用此信号量,在同一时刻只有两个任务能使用信号量,当其中一个任务获得信号量时向屏幕打印“TASK N get the signal”。观察程序运行结果并记录。 4. 试编写一个应用程序实现例5-7的内容,即用优先级继承的方法解决优先级反转的问题,观察程序运行结果并记录。 5.在例5-8基础上修改程序增加一个任务HerTask,它和YouTask一样从邮箱Str_Box里取消息并打印出来,打印信息中增加任务标识,即由哪个任务打印的;MyTask发送消息改为当Times为5的倍数时才发送,HerTask接收消息采用无等待方式,如果邮箱为空,则输出“The mailbox is empty”, 观察程序运行结果并记录。 三、实验原理 1. 信号量 μC/OS-II中的信号量由两部分组成:一个是信号量的计数值,它是一个16位的无符号整数(0 到65,535之间);另一个是由等待该信号量的任务组成的等待任务表。用户要在OS_CFG.H中将OS_SEM_EN开关量常数置成1,这样μC/OS-II 才能支持信号量。

操作系统实验报告

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级:14物联网工程 成绩: 2016年02月

实验一Linux的安装与配置 一、实验目的 1.熟悉Linux系统的基本概念,比如Linux发行版、宏内核、 微内核等。 2.掌握Linux系统的安装和配置过程,初步掌握Linux系统的 启动和退出方法。 3.熟悉Linux系统的文件系统结构,了解Linux常用文件夹的 作用。 二、实验内容 1.从网络上下载VMware软件和两个不同Linux发行版镜像文 件。 2.安装VMware虚拟机软件。 3.在VMware中利用第一个镜像文件完成第一个Linux的安装, 期间完成网络信息、用户信息、文件系统和硬盘分区等配 置。 4.在VMware中利用第二个镜像文件完成第二个Linux的安装, 并通过LILO或者GRUB解决两个操作系统选择启动的问题。 5.启动Linux系统,打开文件浏览器查看Linux系统的文件结 构,并列举出Linux常用目录的作用。 三、实验过程及结果 1、启动VMware,点击新建Linux虚拟机,如图所示:

2、点击下一步,选择经典型,点击下一步在选择客户机页面选择Linux,版本选择RedHatEnterpriseLinux5,如图所示: 3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示: 4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小10GB,如图所示: 5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM(IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点击“浏览”,找到Linux的镜像文件,如图所示: 6点击确定按钮后,点击启动虚拟机按钮,来到Linux的安装界面,如图所示: 7、到此页面之后,等待自动检测安装,如图所示: 8、等到出现如图所示页面后点击“skip”按钮,跳过检测,直接进入安装设置界面,如图所示: 9、安装设计界面如图所示: 10、点击Next按钮进入设置语言界面,设置语言为“简体中文”,如图所示: 11、点击Nest按钮进入系统键盘设置按钮,设置系统键盘为“美国英语式”,如图所示: 12、点击下一步按钮,弹出“安装号码”对话框,选择跳

操作系统实验报告.

学生学号0121210680225 实验课成绩 武汉理工大学 学生实验报告书 实验课程名称操作系统 开课学院计算机科学与技术学院 指导老师姓名刘军 学生姓名李安福 学生专业班级软件sy1201 2014 — 2015 学年第一学期

《操作系统》实验教学大纲 课程编号: 课程名称:操作系统/Operating System 实验总学时数:12学时 适应专业:计算机科学与技术、软件工程 承担实验室:计算机科学与技术学院实验中心 一、实验教学的目的和任务 通过实验掌握Linux系统下常用键盘命令、系统调用、SHELL编程、后台批处理和C程序开发调试手段等基本用法。 二、实验项目及学时分配 序号实验项目名称实验学时实验类型开出要求 01 Linux键盘命令和vi 2 设计必开 02 Linux下C编程 2 设计必开 03 SHELL编程和后台批处理 2 设计必开 04 Linux系统调用(time) 2 设计必开 05 Linux进程控制(fork) 4 设计必开 三、每项实验的内容和要求: 1、Linux键盘命令和vi 要求:掌握Linux系统键盘命令的使用方法。 内容:见教材p4, p9, p40, p49-53, p89, p100 2、Linux下的C编程 要求:掌握vi编辑器的使用方法;掌握Linux下C程序的源程序编辑方法;编译、连接和运行方法。 内容:设计、编辑、编译、连接以及运行一个C程序,其中包含键盘输入和屏幕输出语句。 3、SHELL编程和后台批处理 要求:掌握Linux系统的SHELL编程方法和后台批处理方法。 内容:(1) 将编译、连接以及运行上述C程序各步骤用SHELL程序批处理完成,前台运行。 (2) 将上面SHELLL程序后台运行。观察原C程序运行时输入输出情况。 (3) 修改调试上面SHELL程序和C程序,使得在后台批处理方式下,原键 盘输入内容可以键盘命令行位置参数方式交互式输入替代原键盘输入内容, 然后输出到屏幕。 4、Linux系统调用使用方法。

操作系统实验报告

实验报告 实验课程名称:操作系统 实验地点:南主楼七楼机房 2018—2019学年(一)学期 2018年 9月至 2019 年 1 月 专业: 班级: 学号: 姓名: 指导老师:刘一男

实验一 实验项目:分时系统模拟 实验学时:2实验日期: 2018-10-25 成绩: 实验目的利用程序设计语言模拟分时系统中多个进程按时间片轮转调度算法进行进程调度的过程; 假设有五个进程A,B,C,D,E,它们的到达时间及要求服务的时间分别为:进程名 A B C D E 到达时间0 1 2 3 4 服务时间 4 3 4 2 4 时间片大小为1,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:BDACE

(1)修改时间片大小为2,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间。 轮转调度:ADBCE (2)修改时间片大小为4,利用程序模拟A,B,C,D,E五个进程按时间片轮转的调度及执行过程并计算各进程的周转时间及带权周转时间.

顺序:ABCDE 1、思考 时间片的大小对调度算法产生什么影响?对计算机的性能产生什么影响?答:通过对时间片轮转调度算法中进程最后一次执行时间片分配的优化,提出了一种改进的时间片轮转调度算法,该算法具有更好的实时性,同时减少了任务调度次数和进程切换次数,降低了系统开销,提升了CPU的运行效率,使操作系统的性能得到了一定的提高。 A B C D E 时间片为1 周转时间12 9 14 8 13 3 3 3.5 4 3.25 带权周转 时间 时间片为2 周转时间8 12 13 7 13 2 4 3.25 3.5 3.25 带权周转 时间 时间片为4 周转时间 4 6 9 10 13 1 2 2.25 5 3.25 带权周转 时间

操作系统实验报告

实验二进程调度 1.目的和要求 通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。 2.实验内容 阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。 编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。假设初始状态为:有 n 个进程处于就绪状态,有m个进程处于阻塞状态。采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过 t 个时间片系统释放资源,唤醒处于阻塞队列队首的进程。 程序要求如下: 1)输出系统中进程的调度次序; 2)计算CPU利用率。 3.实验环境 Windows操作系统、VC++6.0 C语言

4 设计思想: (1)程序中进程可用PCB表示,其类型描述如下: struct PCB_type { int pid ;// 进程名 int state ;// 进程状态 2——表示“执行”状态 1——表示“就绪”状态 0——表示“阻塞”状态 int cpu_time ; //运行需要的CPU寸间(需运行的时间片 个数) } 用PCB来模拟进程; (2)设置两个队 列,将处于“就绪”状态的进程PCB挂在队列readyxx ;将处于“阻塞”状态的进程 PCB挂在队列blockedxx。 队列类型描述如下: struct QueueNode{

struct PCB_type PCB; Struct QueueNode *next; } 并设全程量: struct QueueNode *ready_head=NULL,//ready 队列队首指针 *ready_tail=NULL , //ready 队列队尾指针 *blocked_head=NULL,//blocked 队列队首指 针 *blocked_tail=NULL; //blocked 队列队尾指 针 (3)设计子程序: start_state(); 读入假设的数据,设置系统初始状态,即初始化就绪队列和 阻塞队列 dispath(); 模拟调度,当就绪队列的队首进程运行一个时间片后,放到就绪队列末尾,每次都是队首进程进行调度,一个进程运行结束 就从就绪队列中删除,当到 t 个时间片后,唤醒阻塞队列队首进程。

实时操作系统实验报告2

实时操作系统实验报告 专业:11通信工程 学号:20110306136 姓名: 王帅 指导老师:申屠浩

实验二 任务管理实验 实验目的: 1、理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程; 2、掌握μC/OS -II 中任务管理的基本方法(挂起、解挂); 3、熟练使用μC/OS -II 任务管理的基本系统调用。 实验要求与思路: 为了体现任务的各个基本状态及其变迁过程,本实验设计了T0、T1和T3三个任务,它们交替运行,如图2-2所示。 T0 T1 T2 T3 T4 T5 T6 T7 T8 图2-2 注意: 图中的栅格并不代表严格的时间刻度,而仅仅表现各任务启动和执行的相对先后关系。 说明: 在系统完成初始化后,可以先创建并启动优先级最低的TaskStart ,由它创建其他3个应用任务T0、T1和T2,之后整个系 T0 T2 T1 T0 T1 T2 T1 T0

统的运行流程如下: 1)优先级最高的T0开始执行,之后T0挂起自己; 2)然后系统调度选中T1开始执行,之后T1挂起自己; 3)接着系统调度选中T2,之后唤醒T0; 4)如此循环 实现提示: 在启动任务中创建三个任务后,应挂起任务1和任务2。 在每个任务恢复其它任务并挂起自己之前,显示当前三个任务的状态,并延时1秒。 函数说明: void PC_GetDateTime (char *s); 获取"YYYY-MM-DD HH:MM:SS"格式的时间字串存放在字符串s中,s的长度最少为21字节。 void PC_DispStr (INT8U x, INT8U y, INT8U *s, INT8U color); 在y行x列以color颜色值显示字串s,注意color由背景色和前景色两种颜色构成。 INT8U OSTimeDlyHMSM (INT8U hours, INT8U minutes, INT8U seconds, INT16U milli); 按时、分、秒、毫秒设置进行延时。 void OSTimeDly (INT16U ticks) 按ticks值进行延时,1 ticks一般为10ms。 INT32U OSTimeGet (void)

操作系统实验一

. 本科实验报告 课程名称:操作系统 学号: 姓名: 专业: 班级: 指导教师: 课内实验目录及成绩 信息技术学院

实验(实验一) 1 实验名称:基本shell命令及用户管理 2 实验目的 2.1 掌握安装Linux操作系统的方法。 2.2 掌握Linux操作系统的基本配置。 2.3 了解GNOME桌面环境。 2.4 掌握基本shell命令的使用。 3 实验准备 3.1 下载VMware Workstation虚拟机软件(版本不限)。 3.2 准备Linux操作系统的安装源(内核版本和发行版本均不限)。 注:实验准备、实验内容4.1和4.2作为回家作业布置,同学们利用课余时间可在私人计算机上完成。 4 实验要求、步骤及结果 4.1 安装虚拟机软件。 【操作要求】安装VMware Workstation虚拟机软件,并填写以下4.1.1和4.1.2的内容。 4.1.1【VMware Workstation虚拟机版本号】 4.1.2【主要配置参数】 4.2 安装Linux操作系统。 【操作要求】安装Linux操作系统,版本不限。

Linux发行版本: Linux内核版本: 【主要操作步骤:包括分区情况】 1、创建一台虚拟机安装操作系统时客户机操作系统选择Linux 2、修改虚拟机的安装路径。 3、建一个新的虚拟磁盘,磁盘的空间20GB,并且将单个文件存储虚拟磁盘。 4、设置分区完毕,安装虚拟机 4.3 了解Linux操作系统的桌面环境之一GNOME。 【操作要求】查看桌面图标,查看主菜单,查看个人用户主目录等个人使用环境。【操作步骤1】桌面图标

【操作步骤2】主菜单 【操作步骤3】个人用户主目录 【操作步骤4】启动字符终端

相关文档
最新文档