山大操作系统实验-1

合集下载

山东大学linux实验1

山东大学linux实验1
实验一:Linux的基本操作和常见命令的使用(2学时)
实验要求:
1.熟悉Red Hat Linux 9系统的桌面。
2.掌握Linux常见的命令。
包括:date、cal、clear、echo、who、finger、mail、wall、write、talk、mesg、man
3.熟悉Linux常用的按键功能。
cal 1 1999
cal 1 99
显示结果不一样
__ 4. 列出系统中所有登陆用户.
who
__ 5. 显示你的登陆名.
who -m
__ 6. 显示你的用户信息.
finger myname
__ 7. 清屏.
clear
__ 8. 显示字符串'Out to lunch'.
常用的按键包括:<backspace>、<ctrl-C>、<Ctrl-d>、<ctrl-s>、<ctrl-q>、<ctrl-u>
实验内容:
一. 基本命令
__ 1. 显.
cal 2003
__ 3. 分别显示1999年1月份和99年1月份的日历. 1999年的和99年的是否是一个?
echo "Out to lunch"
__ 9. 使用wall命令进行系统广播:Good Evening everyone!
wall "Good Evening everyone"
__ 10.使用一个命令屏蔽所有消息.这个命令对所有用户都起作用吗?
二. Man 手册
__ 11. 使用man手册察看ls命令如何使用.

山东大学操作系统实验报告3进程调度算法实验

山东大学操作系统实验报告3进程调度算法实验

计算机科学与技术学院实验报告
3) 输入make命令编译连接生成可执行的
psched程序$gmake
gcc -g -c experime nt3.c
gcc psched.o -o psched
4)
执行psched程序
分析:
根据以上示例程序和独立实验程序中观察和记录的信息,说明它们反映出操作系统教材中讲解的哪些进程调度调度策略和功能?在真实的操作系统中它是怎样实现教材中讲解的进程调度效果的。

先进先出算法
算法总是把处理机分配给最先进入就绪队列的进程,一个进程一旦分得处理机,便一直执行下去,直到该进程完成或阻塞时,才释放处理机。

最高优先权(FPF)优先调度算法
该算法总是把处理机分配给就绪队列中具有最高优先权的进程。

常用以下两种方法来确定进程的优先权:
轮转法
前几种算法主要用于批处理系统中,不能作为分时系统中的主调度算法,在分时系统中,都采用时间片轮转法。

体会:
1. 实验中定义的函数一定要考虑好函数的参数问题,这样才不会出现一些不必要的错误;
2. 对于一些要忽略的信号要忽略掉,免得影响后面的响应过程。

山东大学计算机组成原理计算机原理分解实验(1)

山东大学计算机组成原理计算机原理分解实验(1)

计算机原理分解实验分解实验是为原理实验中的整机实验而进行的准备工作,从逻辑功能上讲每个实验都可以是与整机实验有关的一部分,各分解实验都能构成一个独立的逻辑功能,每个实验的逻辑规模都可以控制在实验台的限制之内。

学生通过这些分解实验可以可以掌握计算机各个组成部分的工作原理,积累一些实验经验和技巧,同时熟悉一些中、小规模器件的使用方法和性能,提高逻辑设计的能力。

这样在进行逻辑规模较大的整机实验时,学生们就不会感到束手无策。

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条件变量提供了一种对管程内并发协作进程的同步机制。

如果没有条件变量,管程就不会有很有用。

多数同步问题要求在管程中说明条件变量。

条件变量代表了管程中一些并发进程或线程可能要等待的条件。

一个条件变量管理着管程内的一个等待队列。

如果管程内某个进程或线程发现其执行条件为假,则该进程或线程就会被条件变量挂入管程内等待该条件的队列。

山东大学操作系统实验报告4进程同步实验

山东大学操作系统实验报告4进程同步实验

计算机科学与技术学院实验报告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()函数。

山东大学操作系统实验一

山东大学操作系统实验一

软件学院操作系统实验报告实验题目:实验一、进程控制实验学号:201100300124日期:2013年04月12日班级:5班姓名:韩俊晓Email:hanjunxiao188@实验目的:加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

掌握进程控制的方法,了解父子进程间的控制和协作关系。

练习Linux系统中进程创建与控制有关的系统调用的编程和调试技术。

实验要求:编写一个多进程并发执行程序。

父进程首先创建一个执行ls命令的子进程然后再创建一个执行ps命令的子进程,并控制ps命令总在ls 命令之前执行。

硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:1)与进程创建、执行有关的系统调用说明进程可以通过系统调用fork()创建子进程并和其子进程并发执行.子进程初始的执行映像是父进程的一个复本.子进程可以通过exec()系统调用族装入一个新的执行程序。

父进程可以使用wait()或waitpid()系统调用等待子进程的结束并负责收集和清理子进程的退出状态。

fork()系统调用语法:#include <unistd.h>pid_t fork(void);fork成功创建子进程后将返回子进程的进程号,不成功会返回-1. exec 系统调用有一组6个函数,其中示例实验中引用了execve系统调用语法:#include <unistd.h>intexecve(const char *path, const char *argv[], const char * envp[]); path 要装入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空). envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。

山东大学操作系统课程设计代码分析及设计实现及测试报告

山东大学操作系统课程设计代码分析及设计实现及测试报告

操作系统课程设计报告班级:2012级软件工程8班团队成员:杨环张俊吴佩瑶王飞王梅瑞目录目录 (2)一、前期工作 (3)1.1平台搭建 (3)二、代码分工 (3)三、设计及实现 (3)3.1 Task1.1 KThread.join() (3)3.1.1 要求分析 (3)3.1.2 设计方案 (4)3.1.3 实现代码 (4)3.1.4 测试代码及结果 (5)3.2 Task1.2 condition2类 (7)3.2.1 要求分析 (7)3.2.2 设计方案 (7)3.2.3 实现代码 (7)3.2.4 测试代码及结果 (8)3.3 Task1.3 alram类 (11)3.3.1 要求分析 (11)3.3.2 设计方案 (11)3.3.3 实现代码 (11)3.3.4 测试代码及结果 (12)3.4 Task1.4 communicator类 (13)3.4.1要求分析 (13)3.4.2 设计方案 (13)3.4.3 实现代码 (13)3.4.4 测试代码及结果 (14)3.5 Task1.5 priority scheduler类 (17)3.5.1 要求分析 (17)3.5.2 设计方案 (17)3.5.3 实现代码 (17)3.5.4 测试代码及结果 (17)3.6 Task1.6 boat类 (22)3.6.1 要求分析 (22)3.6.2 设计方案 (23)3.6.3 实现代码 (23)3.6.4 测试代码及结果 (30)3.7 Task2.1 系统调用creat, open, read, write, close, unlink (30)3.7.1 要求分析 (30)3.7.2 设计方案 (30)3.7.3 实现代码 (31)3.7.4 测试代码及结果 (34)3.8 Task2.2 多进程内存分配及访问 (34)3.8.1 要求分析 (34)3.8.2 设计方案 (34)3.8.3 实现代码 (35)3.8.4 测试代码及结果 (38)3.9 Task2.3 系统调用exec, join, exit (41)3.9.1 要求分析 (41)3.9.2 设计方案 (41)3.9.3 实现代码 (41)3.9.4 测试代码及结果 (43)3.10 Task2.4 Lottery Schedule类 (44)3.10.1 要求分析 (44)3.10.2 设计方案 (44)3.10.3 实现代码 (45)3.10.4 测试代码及结果 (45)总结 (48)一、前期工作1.1平台搭建Nachos For Javaphrase1部分:IDE环境可采用Eclipse。

山大操作系统实验-1教程文件

山大操作系统实验-1教程文件
山大操作系统实验-1
操作系统原理实验报告——实验一
张咪软件工程四班
一、实验目的
加深对于进程并发执行概念的理解。实践并发进/线程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习Linux系统中进/线程创建与控制有关的系统调用的编程和调试技术。
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);
printf("%d Father: Child2 finnished\n",getpid());
count++;
if(kill(pid1,SIGINT)>=0){
waitpid(pid1,&status1,0);
printf("%d Father: Child1 finished.\n",getpid());
八、代码
#include"pro.h"
int main(int argc,char *argv[])
{
int i;
int pid1,pid2;
int status1,status2;
char *args1[]={"/bin/ls","-a",NULL};

山东大学操作系统实验三实验报告

山东大学操作系统实验三实验报告

软件学院实验报告:3实验题目:信号量同步问题班级:2011级3班日期:2013-11-10 学号:201100300038 姓名:陶旭涛E-mail:1595242630@实验目的:1.在本次实验中,通过使用信号量,在原有的程序框架的基础上添加关键代码实现生产者/消费者同步问题。

2.深入理解Nachos的信号量的使用以及实现.3.理解生产者/消费者问题是如何用信号量实现的以及在Nachos中是如何创建线程,实现多线程。

硬件环境:Ubuntu12.04软件环境:Nachos,Mips,GDB实验步骤:1.首先初始化三个信号量,代码如下:mutex = new Semaphore("mutux",1);信号量初始化为1,才能起到加锁功能nfull = new Semaphore("full",0);nfull的大小在生产者没生产前为0 nempty = new Semaphore("empty",BUFF_SIZE);nempty的大小应该为buffer的大小2.首先考虑生产者进程,首先要查看buffer是否有空, nempty->P();if nempty>0,nempty=nempty -1,当对缓冲区操作时必须要加锁:mutex->P();加锁. 然后向ring中放入message信息,其次还要解锁mutex->V();解锁.最后通知消费者buffer有新信息, nfull->V();nfull=nfull+1;具体实现代码如下:3.考虑消费者进程,像生产者进程一样,查看buffer中是否有信息nfull->P();if nfull>0,nfull-1;取消息时也要上锁,即:mutex->P();加锁. 然后从ring buffer中取出信息;其次mutex->V();解锁;最后通知生产者bufferr有空nempty->V();nempty=nempty+1,具体代码如下:4.创建线程生成一个生产者的代码:producers[i] = new Thread(prod_names[i]);producers[i] -> Fork(Producer,i);4.创建线程生成一个消费者的代码:producers[i] = new Thread(prod_names[i]);producers[i] -> Fork(Producer,i);关键代码:voidProducer(_int which){int num;slot *message = new slot(0,0);for (num = 0; num < N_MESSG ; num++) { //这是消息创建的代码m essage->thread_id=which;message->value=num;//p,v 操作nempty->P();mutex->P();ring->Put(message);//p,v 操作mutex->V();nfull->V();}}voidConsumer(_int which){char str[MAXLEN];char fname[LINELEN];int fd;slot *message = new slot(0,0);sprintf(fname, "tmp_%d", which);// create a file. Note that this is a UNIX system call.if ( (fd = creat(fname, 0600) ) == -1){perror("creat: file create failed");Exit(1);}for (; ; ) {// p,v,操作n full->P();m utex->P();ring->Get(message);// p,v,操作mutex->V();nempty->V();// form a string to record the messagesprintf(str,"producer id --> %d; Message number --> %d;\n", message->thread_id,message->value);//把信息写入文件if ( write(fd, str, strlen(str)) == -1 ) {perror("write: write failed");Exit(1);}}}//---------------------------------------------------------------------- // ProdCons// 初始化信号量以及需要的生产者消费者线程//----------------------------------------------------------------------voidProdCons(){int i;DEBUG('t', "Entering ProdCons");// 初始化信号量,包括一个访问互斥信号量,初值为1;//一个nempty信号量,初值为缓冲区的大小//一个nfull的信号量,初值为0mutex=new Semaphore("mutex",1);nempty=new Semaphore("nempty",BUFF_SIZE);nfull=new Semaphore("nfull",0);// 新建一个缓冲区ring=new Ring(BUFF_SIZE+1);// create and fork N_PROD of producer threadsfor (i=0; i < N_PROD; i++){// this statemet is to form a string to be used as the name for// produder i.sprintf(prod_names[i], "producer_%d", i);// 创建生产者线程producers[i]=new Thread(prod_names[i]);producers[i]->Fork(Producer,i);};// create and fork N_CONS of consumer threadsfor (i=0; i < N_CONS; i++){// this statemet is to form a string to be used as the name for// consumer i.sprintf(cons_names[i], "consumer_%d", i);//创建消费者线程consumers[i]=new Thread(cons_names[i]);consumers[i]->Fork(Consumer,i);};}调试记录:在源代码中exit(0)没有大写,调试过程发现了这个问题改正,在使用Linux系统调用写入文件时,有一个头文件没有引入,因而需要修改#include <stdio.h>#include "copyright.h"#include "system.h"#include <unistd.h>#include <fcntl.h>而且对于新添加的头文件的方法其中源文件使用的一个方法是废弃的,所以改成相应的方法write(fd, str, strlen(str)),实验结果:生成两个文件分别代表两个消费者取得的产品的记录。

山大操作系统课程设计

山大操作系统课程设计

山大操作系统课程设计一、课程目标知识目标:1. 掌握操作系统的基本概念、功能、类型及发展历程;2. 理解进程与线程的区别与联系,掌握进程管理的基本方法;3. 了解内存管理的基本原理,掌握虚拟内存和分页/分段存储技术;4. 理解文件系统的工作原理,掌握文件的组织、存储和访问控制方法;5. 了解设备管理的基本原理,掌握I/O调度策略和中断处理机制。

技能目标:1. 能够编写简单的进程调度算法,分析其性能;2. 能够运用内存分配算法,解决内存碎片和内存不足问题;3. 能够设计简单的文件系统,实现对文件的基本操作;4. 能够分析设备管理策略,提高I/O设备的利用率;5. 能够运用所学知识解决实际操作系统相关问题。

情感态度价值观目标:1. 培养学生热爱操作系统学科,增强学习兴趣;2. 培养学生具备良好的团队协作精神和沟通能力;3. 培养学生具备严谨的科学态度和批判性思维;4. 培养学生关注我国操作系统发展,增强国家意识;5. 培养学生具备创新意识和实践能力,为我国计算机事业贡献力量。

课程性质:本课程为计算机科学与技术专业的核心课程,旨在使学生掌握操作系统的基本原理和实现方法,培养具备实际操作系统设计与开发能力的人才。

学生特点:学生已具备一定的计算机专业基础知识,具有较强的逻辑思维能力和动手实践能力。

教学要求:结合课本内容,注重理论与实践相结合,通过案例分析和实际操作,使学生能够深入理解操作系统的核心概念和关键技术。

同时,关注学生的情感态度价值观培养,提高其综合素质。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 操作系统概述:介绍操作系统的基本概念、功能、类型和发展历程,对应课本第一章内容。

- 操作系统的定义和功能- 操作系统的类型与特点- 操作系统发展历程及现状2. 进程管理:讲解进程与线程的概念、进程调度算法、同步互斥等,对应课本第二章内容。

- 进程与线程的基本概念- 进程调度算法分析- 进程同步互斥机制3. 内存管理:介绍内存管理的基本原理、虚拟内存技术、分页分段存储等,对应课本第三章内容。

山东大学操作系统课设nachos

山东大学操作系统课设nachos

操作系统课程设计实验报告——对Nachos系统的完善班级:计软13.4分组:第八组Phase 0一、写在前面二、需要明确的是:Run nachos → ThreadKernel is called to create nachos kernel → initialize() initializes nachos kernel → selfTest() tests this kernel → run() is supposed to run user programs latterSome Crucial requirements:1. Only modify nachos.conf according to the project specifications.2. Do not modify any classes in the nachos.machine package, the nachos.ag package, or the nachos.security package.3. Do not add any new packages to your project.4.Do not modify the API for methods that the autograder uses.5.Do not directly use Java threads (the ng.Thread class).6. Do not use the synchronized keyword in any of your code.7. Do not directly use Java File objects (in the java.io package).Phase 1:Build a thread system for kernel processes Task 1.1Implements Join() method一、问题描述1. Note that another thread does not have to call join(), but if it is called, it must be called only once.2. A thread must finish executing normally whether or not it is joined.二、解决方案线程B在线程A运行的过程中调用join方法,阻塞线程A的运行获取运行权,此时线程A 等待线程B完成运行后重新运行。

山东大学操作系统实验报告

山东大学操作系统实验报告

操作系统实验报告计算机科学与技术学院目录一、进程控制实验实验目的加深对于进程并发执行概念的理解。

实践并发进程的创建和控制方法。

观察和体验进程的动态特性。

进一步理解进程生命期期间创建、变换、撤销状态变换的过程。

掌握进程控制的方法,了解父子进程间的控制和协作关系。

练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。

示例实验实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。

实验演示结果独立实验实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。

实验步骤算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。

While(1)在死循环里无限进行当前操作。

即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。

开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为的C语言程序;再建立以下名为的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次执行带有子进程指定执行命令的 pctl 程序。

思考与分析1.反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。

对于进程概念和并发概念有哪些新的理解和认识子进程是如何创建和执行新程序的答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。

而程序只是进程的一个组成部分,进程是程序的执行过程。

程序是静态的指令集合,而进程是动态的过程实体,是动态的产生、发展和消失。

山东大学操作系统实验六实验报告

山东大学操作系统实验六实验报告

计算机科学与技术学院实验报告实验题目: Nachos User Programs and System学号: 201100300038 Calls日期:2013-11-27 班级: 11级03 姓名:陶旭涛Email: 1595242630@实验目的:实验并熟悉Nachos中的用户程序,你需要实现Nachos系统调用的代码。

其目的是理解如何将用户进程启动通过系统调用与操作系统内核如何将用户进程交互硬件环境:Mem:3.9GDisk:15.5 GB软件环境:System:ubuntu12.04LST i386gcc: (Ubuntu 4.6.3-1ubuntu5) 4.6.3nachos system实验步骤:1: ../test 中现有 5 个 C 语言用户源程序,可以通过 make 命令一次性编译连接生成它们的可执行文件和其在该目录中的符号链接2:进入../userprog 目录,使用 make 命令生成带有基本内存管理功能的 Nachos 内核。

现在我们就可以使用新的内核执行用户程序了。

例如,为了执行../test 目录中的 halt.noff 程序,可以输入命令:$./nachos –x ../test/halt.noff$./nachos –d ../test/halt.noff3:为了能够了解 Nachos 中多用户程序驻留内存的情况,可以在 AssSpace类中增加以下打印成员函数 Print:4:最小的用户程序 halt.c 会占用 10 页的内存空间。

如果你想验证系统能否分配更多的内存页,可以在用户程序中说明一些较大的数组。

例如,修改 halt.c,在其中说明一个静态数组 a:#include "syscall.h"static int a[40];intmain(){Halt();/* not reached */}再次执行../test 目录中的 make,并再次进入../userprog 目录,使用 make 命令生成带有输出用户程序页分配信息的 Nachos 内核。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统原理实验报告——实验一
张咪软件工程四班
一、实验目的
加深对于进程并发执行概念的理解。

实践并发进/线程
的创建和控制方法。

观察和体验进程的动态特性。


一步理解进程生命期期间创建、变换、撤销状态变换
的过程。

掌握进程控制的方法,了解父子进程间的控
制和协作关系。

练习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");}。

相关文档
最新文档