山大操作系统实验-1
- 格式:doc
- 大小:81.50 KB
- 文档页数:4
计算机科学与技术学院实验报告
3) 输入make命令编译连接生成可执行的
psched程序$gmake
gcc -g -c experime nt3.c
gcc psched.o -o psched
4)
执行psched程序
分析:
根据以上示例程序和独立实验程序中观察和记录的信息,说明它们反映出操作系统教材中讲解的哪些进程调度调度策略和功能?在真实的操作系统中它是怎样实现教材中讲解的进程调度效果的。
先进先出算法
算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。
最高优先权(FPF)优先调度算法
该算法总是把处理机分配给就绪队列中具有最高优先权的进程。
常用以下两种方法来确定进程的优先权:
轮转法
前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。
体会:
1. 实验中定义的函数一定要考虑好函数的参数问题,这样才不会出现一些不必要的错误;
2. 对于一些要忽略的信号要忽略掉,免得影响后面的响应过程。
计算机原理分解实验分解实验是为原理实验中的整机实验而进行的准备工作,从逻辑功能上讲每个实验都可以是与整机实验有关的一部分,各分解实验都能构成一个独立的逻辑功能,每个实验的逻辑规模都可以控制在实验台的限制之内。
学生通过这些分解实验可以可以掌握计算机各个组成部分的工作原理,积累一些实验经验和技巧,同时熟悉一些中、小规模器件的使用方法和性能,提高逻辑设计的能力。
这样在进行逻辑规模较大的整机实验时,学生们就不会感到束手无策。
TEC-5实验箱数字逻辑和数字系统实验区简介这部分为用户提供了通用的数字逻辑和数字系统实验平台。
它主要包括下列部分:1)实验台左半部的10个双列直插插座;2)ISP1032在线系统编程芯片及下载插座;3)6个数码管及其驱动电路;4)2个数据指示灯;5)小喇叭及其驱动电路;6)16个电平拨动开关;7)2个单脉冲按钮。
1.10个双列直插插座这一部分在实验台的左上部,实验时用于插中、小规模数字逻辑器件。
注意:插座的电源和地都没有连接。
(需做实验时同学先行连接)2.ispLSI1032 (In-System Programmable High Density PLD)在系统可编程高密度可编程逻辑器件它位于实验台的左下部,用于设计并实现复杂的数字逻辑或数字系统电路。
它有1个下载插座,下载时下载电缆的一端插在下载插座上,另一端插在PC机并行口上,下载电缆将PC机和ispLSI1032连在一起。
在PC机上运行ispEXPERT工具软件,输入数字逻辑或数字系统的设计方案,进行编译、连接和适配,然后下载到ispLSI1032中去,就构成了1个新的能实现设计功能的器件。
数字逻辑和数字系统中的综合实验,就是用ispLSI1032实现的。
3.六个数码管及其驱动电路。
为了能做较复杂的实验,比如电子时钟和数字频率计等实验,实验台上安装了6个共阳极数码管。
六个数码管位于实验台的上部中间。
右边5个数码管各由一片BCD七段译码器/驱动器74LS47驱动。
山东大学操作系统实验六HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】软件学院操作系统实验报告实验题目:实验六、死锁问题实验学号:0124日期:2013年05月23日班级:5班姓名:韩俊晓Email:实验目的:通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。
从而进一步加深对于死锁问题的理解。
掌握解决死锁问题的几种算法的编程和调试技术。
练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。
实验要求:在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。
请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。
您能构造一个管程来解决这个问题吗?硬件环境:实验室计算机软件环境:-Linux操作系统gcc version实验步骤:1.实验说明:管程-Monitor管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。
结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。
利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和Java语言中的synchronized对象都是很好的管程的例子.管程封装了并发进程或线程要互斥执行的函数。
为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量条件变量Condition Variables条件变量提供了一种对管程内并发协作进程的同步机制。
如果没有条件变量,管程就不会有很有用。
多数同步问题要求在管程中说明条件变量。
条件变量代表了管程中一些并发进程或线程可能要等待的条件。
一个条件变量管理着管程内的一个等待队列。
如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。
计算机科学与技术学院实验报告int msq_id;if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_h)) < 0 ) { if((msq_id = msgget(msq_h,msq_flg)) < 0){perror("messageQueue set error");exit(EXIT_FAILURE);}}return msq_id;}实验结果:分析:多进程的系统中避免不了进程间的相互关系。
进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。
通常的情况是两个或两个以上的进程需要同时访问某个共享变量。
我们一般将发生能够问共享变量的程序段称为临界区。
两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间有关的错误。
解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程处于同一共享变量的临界区,而且不能让任一进程无限期地等待。
进程同步是进程之间直接的相互作用,是合作进程间有意识的行为,典型的例子是公共汽车上司机与售票员的合作。
只有当售票员关门之后司机才能启动车辆,只有司机停车之后售票员才能开车门。
司机和售票员的行动需要一定的协调。
同样地,两个进程之间有时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。
信号量机制就是其中的一种。
信号灯机制即利用pv操作来对信号量进行处理。
PV操作由P操作原语和V 操作原语组成(原语是不可中断的过程),对信号量进行操作,具体定义如下: P(S):①将信号量S的值减1,即S=S-1;②如果S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量S的值加1,即S=S+1;②如果S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV操作的意义:我们用信号量及PV操作来实现进程的同步和互斥。
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (2)二Project1建立线程系统 (2)Task1.1实现KThread.join() (2)1.要求 (2)2.分析 (2)3.方案 (3)4.实现代码 (3)Task1.2利用中断提供原子性,直接实现条件变量 (4)1.要求 (4)2.分析 (5)3.方案 (5)4.实现代码 (5)Task1.3实现waitUntil (7)1.要求 (7)2.分析 (7)3.方案 (7)4.实现代码 (8)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (10)1.要求 (10)2.分析 (10)3.方案 (11)4.实现代码 (11)Task1.5完成PriorityScheduler实现优先级调度 (13)1.要求 (13)2.分析 (13)3.方案 (14)4.实现代码 (14)Task1.6 (17)1.要求 (17)2.分析 (18)3.方案 (19)4.实现代码 (19)三Project2多道程序设计 (27)Task2.1 (27)1.要求 (27)2.分析 (28)3.方案 (28)4.实现代码 (31)Task2.2 (36)1.要求 (36)2.分析 (36)3.方案 (36)4.实现代码 (38)Task2.3 (43)1.要求 (43)2.分析 (43)3.方案 (44)4.实现代码 (45)Task2.4 (47)1.要求 (47)2.分析 (48)3.方案 (48)4.实现代码 (48)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
实验作文:神奇的水水是生命之源,也是我们生活中不可或缺的物质。
然而,大家可能不知道,水还有一些神奇的特性,让我们一起来探索吧!一、水的密度变化在常温下,水的密度为1克/立方厘米,这意味着一立方厘米的水重一克。
但是,当我们改变水的温度时,水的密度也会随之改变。
当水温从0摄氏度升高到4摄氏度时,水的密度会逐渐增大;而当水温继续升高时,水的密度会逐渐减小。
这是因为水分子在温度升高时运动更加剧烈,导致体积变大,密度变小。
二、水的表面张力在一个平静的水面上撒上一些小物体,你会发现水面上会出现一个小小的水洼。
这是因为水具有表面张力,使得水面像一张弹性薄膜一样包裹着小物体。
表面张力是由于水分子之间的相互吸引力导致的,这种力使得水分子尽可能地靠在一起,形成一种薄膜状的结构。
三、水的毛细现象将一根细小的玻璃管插入水中,你会发现水会沿着玻璃管上升。
这是因为水具有毛细现象,即水分子之间的相互吸引力使得水沿着玻璃管的表面上升。
这种现象在自然界中也有很多应用,比如植物通过根系吸收水分,就是毛细现象的一种表现。
四、水的折射和反射当我们把一片树叶放入水中时,会发现树叶的影子倒立在水中。
这是因为水对光具有折射作用,即光在从一种介质进入另一种介质时会发生偏折。
我们还可以看到水中的倒影,这是因为水对光具有反射作用,即光在遇到水面时会有一部分光线被反射回来。
水是一种神奇的物质,它具有许多独特的性质和现象。
通过观察和研究这些现象,我们可以更好地了解水的特性和规律,为我们的生活和科学研究提供更多的启示和帮助。
北师大版神奇的莫比乌斯带在数学的世界里,有一个非常有趣的几何对象,叫做莫比乌斯带。
它是由德国数学家莫比乌斯发现的一种奇特的曲面。
这个曲面只有一个面,却又无限循环,这样的性质使得它在数学和物理中都有广泛的应用。
一、莫比乌斯带的制作制作莫比乌斯带并不复杂。
我们需要一张纸条,然后把纸条的一端扭转180度,之后将纸条的两个端点粘在一起。
你会发现,这个纸条只有一个面,而且是一个无限循环的面。
实验一DEBUG程序的使用一、实验目的1.学习使用DEBUG程序的各种命令。
2.利用DEBUG学习3.了解计算机取指令、执行指令的工作过程。
4.掌握用DEBUG调试自编程序的方法。
二、实验任务1.参照附录1,掌握DEBUG程序的各种命令,重点是命令R,D ,A,U,T,P,G命令的使用。
2.用命令A汇编下列指令,判断指令正误并说明原因。
(1)ROR AX,8;错误,因为ROR指令的源操作数只能是数字1或是CL。
(2)LEA DI,[AX];错误,因为LEA指令的目的操作数不能是DI。
(3)MOV DS,2010;错误,因为段寄存器和立即数不能在MOV指令间传。
(4)PUSH AL;错误,因为PUSH指令的目的操作数只能是通用寄存器或是内存。
(5)OUT 900,AL;错误,因为900已经超过了8位二进制数的范围。
(6)MOV [BX],0;错误,因为内存和立即数之间的类型没有确定。
3.用命令查看8086/8088 CPU在开机后执行的第一条指令。
4.用命令D查看DS:200~22F和F000:200~22F两内存块内容,用命令F将字符“A”分别填入这两个内存块,比较填入前后结果,了解可读写内存RAM和只读内存ROM 的区别。
5.用A命令汇编一条INT 1C指令,用命令T单步执行该指令,比较指令执行前后CS和IP、堆栈指针SP及堆栈内容变化情况,了解什么是中断向量表,中断向量和中断子程,掌握中断指令的执行过程。
6.利用T,P,G命令,执行下列指令段,注意它们的不同之处。
i.MOV DI,300MOV SI,400MOV CX,3CLDREP MOVSBINT 3ii.MOV AH,2MOV DL,41INT 21INT 3iii.先在CS:200处汇编一条RET指令,再在CS:100处汇编。
MOV BX,200CALL BXINT 3然后从MOV BX,200处开始执行。
7.用命令A汇编下列程序段,并将程序写到硬盘上,然后调试程序段,观察程序段能否完成指定功能,若不能,说明原因,并修改程序。
(完整)山东大学操作系统实验一实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)山东大学操作系统实验一实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)山东大学操作系统实验一实验报告的全部内容。
操作系统课程设计实验报告
结论分析与体会:
通过这次实验,我熟悉了操作系统实验的环境,进一步了解了Nachos的构成,对我以后顺利熟练的完成操作系统实验有很大的帮助!。
操作系统课程设计报告学院:计算机科学与技术学院专业:计算机科学与技术班级:20**级*班姓名:***学号:20**********目录一实验平台 (4)二Project1建立线程系统 (4)Task1.1实现KThread.join() (4)1.要求 (4)2.分析 (4)3.方案 (4)4.实现代码 (5)Task1.2利用中断提供原子性,直接实现条件变量 (6)1.要求 (6)2.分析 (6)3.方案 (7)4.实现代码 (7)Task1.3实现waitUntil (9)1.要求 (9)2.分析 (9)3.方案 (10)4.实现代码 (10)Task1.4用条件变量,不使用信号量,实现同步发送接收消息,speak,listen (12)1.要求 (12)2.分析 (12)3.方案 (13)4.实现代码 (13)Task1.5完成PriorityScheduler实现优先级调度 (16)1.要求 (16)2.分析 (16)3.方案 (17)4.实现代码 (17)Task1.6 (20)1.要求 (20)2.分析 (21)3.方案 (22)4.实现代码 (22)三Project2多道程序设计 (31)Task2.1 (31)1.要求 (31)2.分析 (31)3.方案 (32)4.实现代码 (35)Task2.2 (40)1.要求 (40)2.分析 (40)3.方案 (41)4.实现代码 (42)Task2.3 (48)1.要求 (48)2.分析 (49)3.方案 (49)4.实现代码 (50)Task2.4 (53)1.要求 (53)2.分析 (53)3.方案 (54)4.实现代码 (54)一实验平台开发语言:Java开发工具:Eclipse Luna操作系统:Ubuntu14.04二P roject1建立线程系统Task1.1实现KThread.join()1.要求实现Implement KThread.join()函数。
操作系统原理实验报告——实验一
张咪软件工程四班
一、实验目的
加深对于进程并发执行概念的理解。
实践并发进/线程
的创建和控制方法。
观察和体验进程的动态特性。
进
一步理解进程生命期期间创建、变换、撤销状态变换
的过程。
掌握进程控制的方法,了解父子进程间的控
制和协作关系。
练习Linux系统中进/线程创建与控制
有关的系统调用的编程和调试技术。
二、实验要求
编写一个多进程并发执行程序。
父进程每隔3秒重复建立两个子进程,首先创建的让其执行ls命令,之后创建执行让其执行ps命令,并控制ps命令总在ls命令之前执行。
三、实验软硬件环境
实验环境均为Linux操作系统,开发工具为gcc和g++。
四、实验思路
调用fock()创建子进程。
创建键盘中断信号后,使用pause()可以暂停子进程执行,继续创建新的子进程。
子进程并发执行子进程可以首先通过键盘中断信号唤醒子进程。
通过exec()调用族装入一个新的执行程序。
在建立子进程2并且唤醒子进程1后子进程sleep(seconds = 5)。
这样就可以先执行ps后执行ls。
最后就是父进程的结束,程序结束。
五、实验模型
六、调试排错
1、首先遇到的问题是,对linux的操作不熟悉,不太明白makefile怎么使用,直接用了gcc
2、在创建多个子进程上遇到了问题,在fock()后又直接跟了一个fork(),这样创建的子进程是子进程的子进程,而不是父进程创建的第二个子进程。
所以应该在else语句块后面,也就是主进程执行段继续创建。
一般情况下,fork()按如下规则编程:
main()
{ pid_t pid;
pid=fork();
if(pid<0) { // 建立子进程失败
{ printf("Create Process fail!\n");
exit(EXIT_FAILURE); }
if (pid = = 0)
//子进程代码;
//如果需要创建子进程,可以按该方法嵌套
else
//父进程代码
//如果需要创建子进程,可以按该方法嵌套
}
3、后来父进程与子进程无法重复建立,执行一次就结束了,又加了一个while循环实现重复建立,但无法退出,一直执行。
又加了一个count计数变量,执行五次后停止。
七、实验结果
父进程首先创建了子进程a,子进程1暂停。
父进程继续创建子进程b。
子进程b唤醒了子进程a,子进程a进入sleep()。
子进程2执行ps退出,子进程1执行ls。
循环五次退出。
八、代码
#include"pro.h"
int main(int argc,char *argv[])
{
int i;
int pid1,pid2;
int status1,status2;
char *args1[]={"/bin/ls","-a",NULL};
char *args2[]={"/bin/ps","-a",NULL};
signal(SIGINT,(sighandler_t)sigcat);
int count=0;
while(count<5){
if((pid1=fork())==0){
pause();
printf("%d This is child1 running\n",getpid());
status1=execve(args1[0],args1,NULL);
}
else{
pid2=fork();
if(pid2<0){
printf("Create process pid2 fail\n");
exit(EXIT_FAILURE);
}
else if(pid2==0){
printf("%d This is child2 running\n",getpid());
status2=execve(args2[0],args2,NULL);
}
else{
printf("%dFather:This is father running \n",getpid());
if(kill(pid2,SIGINT)>=0){
waitpid(pid2,&status2,0);
sleep(3);
printf("%d Father: Child2 finnished\n",getpid());
count++;
if(kill(pid1,SIGINT)>=0){
waitpid(pid1,&status1,0);
printf("%d Father: Child1 finished.\n",getpid());
}
}
}
}
}return (EXIT_SUCCESS);
}
#include<sys/types.h>
#include<wait.h>
#include<unistd.h>
#include<signal.h>
#include<stdio.h>
#include<stdlib.h>
typedef void(*sighandler_t)(int);
void sigcat(){printf("Process continue\n");}。