山大操作系统实验5

合集下载

山东大学操作系统实验二

山东大学操作系统实验二

软件学院操作系统实验报告实验题目:实验二、线程和进程/线程管道通信实验学号:201100300124日期:2013年04月19日班级:5班姓名:韩俊晓Email:hanjunxiao188@实验目的:通过Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果,练习利用无名管道进行进/线程间通信的编程和调试技术。

实验要求:设有二元函数f(x,y) = f(x) + f(y)其中:f(x) = f(x-1) * x(x >1)f(x)=1(x=1)f(y) = f(y-1) + f(y-2)(y> 2)f(y)=1(y=1,2)请编程建立3个并发协作进程(或线程),它们分别完成f(x,y)、f(x)、f(y)其中由父进程(或主线程)完成:f(x,y) = f(x) + f(y)由子进程1(或线程1)完成:f(x) = f(x-1) * x(x >1)f(x)=1(x=1)由子进程2(或线程2)完成:f(y) = f(y-1) + f(y-2)(y> 2)f(y)=1(y=1,2)硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统BASH_VERSION='3.2.33(1)-releasegcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:1)与线程创建、执行有关的系统调用说明线程是在共享内存中并发执行的多道执行路径,它们共享一个进程的资源,如进程程序段、文件描述符和信号等,但有各自的执行路径和堆栈。

线程的创建无需像进程那样重新申请系统资源,线程在上下文切换时也无需像进程那样更换内存映像。

多线程的并发执行即避免了多进程并发的上下文切换的开销又可以提高并发处理的效率。

Linux 利用了特有的内核函数__clone 实现了一个叫phread的线程库,__clone是fork 函数的替代函数,通过更多的控制父子进程共享哪些资源而实现了线程。

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

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

计算机科学与技术学院实验报告实验题目:实验四、进程同步实验学号:日期:20120409 班级:计基地12 姓名:实验目的:加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果,分析与研究经典进程同步与互斥问题的实际解决方案。

了解Linux 系统中IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。

实验内容:抽烟者问题。

假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。

抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。

一个抽烟者有烟草,一个有纸,另一个有胶水。

系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。

得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。

这一过程重复进行。

请用以上介绍的IPC 同步机制编程,实现该问题要求的功能。

硬件环境:处理器:Intel® Core™i3-2350M CPU @ 2.30GHz ×4图形:Intel® Sandybridge Mobile x86/MMX/SSE2内存:4G操作系统:32位磁盘:20.1 GB软件环境:ubuntu13.04实验步骤:(1)新建定义了producer和consumer共用的IPC函数原型和变量的ipc.h文件。

(2)新建ipc.c文件,编写producer和consumer共用的IPC的具体相应函数。

(3)新建Producer文件,首先定义producer的一些行为,利用系统调用,建立共享内存区域,设定其长度并获取共享内存的首地址。

然后设定生产者互斥与同步的信号灯,并为他们设置相应的初值。

当有生产者进程在运行而其他生产者请求时,相应的信号灯就会阻止他,当共享内存区域已满时,信号等也会提示生产者不能再往共享内存中放入内容。

(4)新建Consumer文件,定义consumer的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。

山大操作系统实验5

山大操作系统实验5

进程同步实验张咪软件四班一、实验目的总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。

二、实验要求理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。

此外还有一间等候室,可容纳13位顾客等候进入理发室。

顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。

顾客理完发后,可向任何一位理发师付款。

但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。

理发师在没有顾客的时候就坐在理发椅子上睡眠。

理发师的时间就用在理发、收款、睡眠上。

请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。

三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g++。

四、实验思路约束:1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。

count>20时,就不进入理发店。

7<count<20时,count++,顾客申请等候室,进入等候室等待,用一个room信号量控制。

然后等待申请沙发,用一个sofa信号量控制。

然后申请椅子。

3<count<7时,count++,顾客坐在沙发上等待,等待申请椅子。

count<3时,count++,顾客坐在椅子上等待理发。

2.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待。

山东大学操作系统实验六完整版

山东大学操作系统实验六完整版

山东大学操作系统实验六HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】软件学院操作系统实验报告实验题目:实验六、死锁问题实验学号:0124日期:2013年05月23日班级:5班姓名:韩俊晓Email:实验目的:通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。

从而进一步加深对于死锁问题的理解。

掌握解决死锁问题的几种算法的编程和调试技术。

练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。

实验要求:在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。

请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。

您能构造一个管程来解决这个问题吗?硬件环境:实验室计算机软件环境:-Linux操作系统gcc version实验步骤:1.实验说明:管程-Monitor管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。

结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。

利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和Java语言中的synchronized对象都是很好的管程的例子.管程封装了并发进程或线程要互斥执行的函数。

为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量条件变量Condition Variables条件变量提供了一种对管程内并发协作进程的同步机制。

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

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

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

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

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

山东大学操作系统实验一

山东大学操作系统实验一

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

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

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

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

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

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

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

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

硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统gcc 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>int execve(const char *path, const char *argv[], const char * envp[]); path 要装入的新的执行文件的绝对路径名字符串.argv[] 要传递给新执行程序的完整的命令参数列表(可以为空). envp[] 要传递给新执行程序的完整的环境变量参数列表(可以为空). Exec执行成功后将用一个新的程序代替原进程,但进程号不变,它绝不会再返回到调用进程了。

山东大学操作系统实验报告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操作来实现进程的同步和互斥。

(完整)山东大学操作系统实验一实验报告

(完整)山东大学操作系统实验一实验报告

(完整)山东大学操作系统实验一实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)山东大学操作系统实验一实验报告)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)山东大学操作系统实验一实验报告的全部内容。

操作系统课程设计实验报告
结论分析与体会:
通过这次实验,我熟悉了操作系统实验的环境,进一步了解了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()函数。

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

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

山东大学操作系统实验报告HEN system office room 【HEN16H-HENS2AHENS8Q8-HENH1688】操作系统实验报告计算机科学与技术学院目录一、进程控制实验实验目的加深对于进程并发执行概念的理解。

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

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

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

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

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

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

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

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

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

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

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

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

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

西北工业大学-操作系统实验报告-实验五

西北工业大学-操作系统实验报告-实验五

实验五进程管理一、实验目的(1)加深对进程概念的理解,明确进程和程序的区别;(2)进一步认识并发执行的实质;(3)了解FreeBSD系统中进程通信的基本原理。

二、实验内容与要求1、掌握进程的概念,明确进程的含义;2、编写一段程序,使用系统调用fork( )创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。

试观察记录屏幕上的显示结果(多次运行,查看结果是否有变化),并分析原因;3、修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象(多次运行,查看结果是否有变化),并分析原因;4、如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象;5、对整个实验过程进行分析总结,给出详细步骤;三、实验过程1、进程的概念与含义狭义:进程就是一段程序的执行过程。

广义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。

它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。

进程的概念主要有两点:第一,进程是一个实体。

每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。

第二,进程是一个“执行中的程序”。

程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。

进程是操作系统中最基本、重要的概念。

是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。

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

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

操作系统课程设计报告班级: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。

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

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

计算机科学与技术学院操作系统实验报告学院:专业:班级:姓名:学号:日期:Email:目录实验一进程控制实验 (4)1.1实验目的 (4)1.2实验题目 (4)1.3实验步骤 (4)1.4结论分析与体会 (5)1.5附录:本实验全部程序源代码及注释 (5)1.5.1Pctl.c (5)1.5.2pctl.h (9)1.5.3makefile (10)实验三进程调度算法实验 (10)3.1实验目的 (10)3.2实验题目 (11)3.3实验步骤 (11)3.4结论分析与体会 (12)3.5附录:本实验全部程序源代码及注释 (12)3.5.1Psched.c (12)3.5.2Psched.h (14)3.5.3Makefile (16)实验四进程同步实验 (16)4.1实验目的 (16)4.2实验题目 (16)4.3实验步骤 (17)4.4结论分析与体会 (24)4.5附录:本实验全部程序源代码及注释 (24)4.5.1Ipc.c (24)4.5.2Ipc.h (32)4.5.3Consumer (35)4.5.4Producer (41)4.5.5makefile (50)实验七内存页面置换算法实验 (51)7.1实验目的 (51)7.2实验题目 (51)7.3实验步骤 (52)7.4附录:本实验全部程序源代码及注释 (55)7.4.1Vmrp.h (55) (57)7.5.3makefile (73)实验八磁盘移臂调度算法实验 (74)7.2实验目的 (74)8.2实验题目 (74)8.3实验步骤 (75)8.4附录:本实验全部程序源代码及注释 (76)8.4.1Dask.h (76) (78)8.4.3Makefile (94)实验一进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。

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

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

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

山大自考强化实践能力培养实验五 邮件服务器配置

山大自考强化实践能力培养实验五  邮件服务器配置

实验五邮件服务器配置一、配置POP3服务。

1.点击“开始”→“管理工具”→“POP3服务”,打开“POP3服务”窗口。

2.新建域。

在窗口左侧“POP3服务”下的本机主机名上右击,选择“新建”→“域”。

在弹出的“添加域”对话框中输入自己需要建立的邮件服务器的主机名,即邮箱地址中“@”后面的部分,如:。

点击“确定”按钮完成域的创建。

如下图:3.新建邮箱。

在窗口左侧选择刚刚创建好的新域,如,右击,选择“新建”→“邮箱”,在弹出的“添加邮箱”对话框中设置自己的邮箱。

如:邮箱名为fffgg,密码为uju。

点击“确定”按钮完成。

如果需要在本域下创建多个邮箱,则重复进行操作即可。

至此邮箱创建完毕。

如下图:二、配置SMTP服务。

1.选择“开始”→“管理工具”→“Internet信息服务(IIS)管理器”。

2.在“Internet信息服务(IIS)管理器”窗口的左侧选择“默认SMTP虚拟服务器”,右击,选择“属性”。

3.在“属性”对话框中的“常规”选项卡中,将IP地址设置为本邮件服务器的IP地址。

也可以对最大连接数和日志记录等进行设置,我们保持默认。

然后点击“确定”完成配置。

如下图:至此,我们已经用WindowsServer2003搭建好了一个简单的邮件服务器,下面的任务,就是用Outlook等邮件客户端工具来进行连接。

配置Outlook等客户端工具的方法如下1.打开OutlookExpress,添加一个新账户。

如下图:2.在“电子邮件地址”中填入之前设置的邮件地址,如:hhjj@。

如下图:3.在“电子邮件服务器”中进行设置,“接收邮件服务器”和“发送邮件服务器”处均填入邮件服务器的IP地址,如:123.444.333.22如下图:4.在“Internet邮件登陆”中填入之前设置的用户名和密码。

例如Aaron 设置的用户名和密码均为“ooo”。

另外,“使用安全密码验证登陆”一项一定要选中,否则在连接时会报错。

如下图:5.接下来,点击“完成”,就可以用新的邮件服务器收发邮件了。

山大操作系统课程设计

山大操作系统课程设计

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

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

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

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

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

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

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

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

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

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

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

山西大学网络操作系统实验5

山西大学网络操作系统实验5

山西大学计算机与信息技术学院学生实验报告课程名称:网络操作系统姓名:张浩田专业:计算机科学与技术学号: 2014241027【实验步骤、过程】1.在Windows 2003上创建域控制器(域名sxu.local)并修改计算机名2.把一台xp虚拟机(计算机名改为xf1)作为客户机加入域3. 把另一台xp虚拟机(计算机名改为xf2)作为客户机加入域4.在域控制器上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“考勤”5.在“xf1”虚拟机上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“工作表”6. 在“xf2”虚拟机上创建一个文件夹,里面随意放置一个文件,将该文件夹设置为共享,共享名设置为“会议纪要”7.把域控制器中的共享文件夹发布到域中8.把客户机(xf1)中的共享文件夹发布到域中,并且通过“查找”功能查找到该文件夹9.把客户机(xf2)中的共享文件夹发布到域中,并且通过“查找”功能查找到该文件夹10.创建域账户域使用人员:网管1人(zhao)主任1人(qian)秘书1人(sun)工作人员2人(li、zhou)11.对各账户分配资源对资源的使用要求:完全管理网管考勤表,完全控制主任考勤表,只读网管、秘书、工作人员工作表,读+写秘书、工作人员中的li会议纪要,读+写主任、秘书12.创建组账户(主任,秘书,工作人员),类型为安全组—全局13.用户账户规划:用户账户密码隶属于说明Administrator 空Administrators 内置的最高管理员zhao abc,123 Domain Admins 赵网管qian abc,123 主任钱主任sun abc,123 秘书孙秘书li abc,123 工作人员李zhou abc,123 工作人员周14.访问域共享资源在客户机上用域帐户登录到域,用“网上邻居”访问各个共享资源,注意用不同帐户登录在资源访问上有什么不同,是否可以实现不同账户对不同网络资源的访问权限。

山东大学操作系统实验六

山东大学操作系统实验六

软件学院操作系统实验报告实验题目:实验六、死锁问题实验学号:201100300124日期:2013年05月23日班级:5班姓名:韩俊晓Email:实验目的:通过本实验观察死锁产生的现象,考虑解决死锁问题的方法。

从而进一步加深对于死锁问题的理解。

掌握解决死锁问题的几种算法的编程和调试技术。

练习怎样构造管程和条件变量,利用管程机制来避免死锁和饥俄问题的发生。

实验要求:在两个城市南北方向之间存在一条铁路,多列火车可以分别从两个城市的车站排队等待进入车道向对方城市行驶,该铁路在同一时间,只能允许在同一方向上行车,如果同时有相向的火车行驶将会撞车。

请模拟实现两个方向行车,而不会出现撞车或长时间等待的情况。

您能构造一个管程来解决这个问题吗?硬件环境:实验室计算机软件环境:Ubuntu08.4-Linux操作系统gcc version 4.1.2gedit 2.18.2OpenOffice 2.3实验步骤:1.实验说明:管程-Monitor管程是一种高级抽象数据类型,它支持在它的函数中隐含互斥操作。

结合条件变量和其他一些低级通信原语,管程可以解决许多仅用低级原语不能解决的同步问题。

利用管程可以提供一个不会发生死锁或饥饿现象的对象;哲学家就餐问题和Java语言中的synchronized对象都是很好的管程的例子.管程封装了并发进程或线程要互斥执行的函数。

为了让这些并发进程或线程在管程内互斥的执行,进入管程的进/线程必须获取到管程锁或二值信号量条件变量Condition Variables条件变量提供了一种对管程内并发协作进程的同步机制。

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

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

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

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

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

如果管程内另外的进程或线程满足了这个条件,则它会通过条件变量再次唤醒等待该条件的进程或线程,从而避免了死锁的产生。

山东大学操作系统课设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完成运行后重新运行。

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

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

计算机科学与技术学院实验报告实验题目: 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)。

进程同步实验张咪软件四班一、实验目的总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。

二、实验要求理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。

此外还有一间等候室,可容纳13位顾客等候进入理发室。

顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。

在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。

顾客理完发后,可向任何一位理发师付款。

但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。

理发师在没有顾客的时候就坐在理发椅子上睡眠。

理发师的时间就用在理发、收款、睡眠上。

请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。

三、实验环境实验环境均为Linux操作系统,开发工具为gcc和g++。

四、实验思路约束:1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。

count>20时,就不进入理发店。

7<count<20时,count++,顾客申请等候室,进入等候室等待,用一个room信号量控制。

然后等待申请沙发,用一个sofa信号量控制。

然后申请椅子。

3<count<7时,count++,顾客坐在沙发上等待,等待申请椅子。

count<3时,count++,顾客坐在椅子上等待理发。

2.只有在理发椅空闲时,顾客才能做到理发椅上等待理发师理发,否则顾客便必须等待;只有当理发椅上有顾客时,理发师才可以开始理发,否则他也必须等待。

可通过信号量empty 和full来控制。

3.理发师为顾客理发时,顾客必须等待理发的完成,并在理发完成后理发师唤醒他,使用一个信号量finish来控制;4.顾客理完发后必须向理发师付费,并等理发师收费后顾客才能离开;而理发师则需等待顾客付费,并在收费后唤醒顾客以允许他离开,这可分别通过两个信号量payment和receipt 来控制。

初值:计数int count=0信号量empty=3;full=0;room=13;sofa=4;finish=0;pay=0;receipt=0;mutex=1;理发师进程while(1){wait(full); //等待理发椅上有顾客剪头发signal(finish); //通知顾客理发完成wait(pay); //等待顾客付费wait(mutex);//在任一时刻只能记录一个顾客的付款收费signal(mutex);signal(receipt); //通知顾客收费完毕}顾客进程wait(mutex); //count既用于判断,也要修改,所以为临界资源,用mutex管理互斥if(count>20) {//顾客大于20人signal(mutex);离开理发店}else{//顾客小于20人count=count+1;//进入理发店if(count>7) { //count>7,说明理发椅和沙发上都有人,需要到等待室等待signal(mutex);wait(room);//申请进入等待室在等待室等wait(sofa); //申请沙发signal(room);//释放等待室坐在沙发上等wait(empty);//等待理发椅为空申请到理发椅signal(sofa); //释放沙发}else if(count>3){//说明理发椅上都有人,需要坐到沙发上等待signal(mutex);wait(sofa);//申请沙发坐在沙发上等wait(empty);//等待理发椅为空申请到理发椅signal(sofa);//释放沙发}else{//count<3,可以坐到理发椅上等待signal(mutex);wait(empty); //申请理发椅}坐在理发椅上等待理发signal(full); //通知理发师开始理发理发wait(finish); //等待理发完毕付款signal(payment); //通知理发师已付款wait(receipt); //等待理发师收款理发师收费完成,顾客离开理发椅signal(empty); //释放理发椅wait(mutex); //对count 临界资源操作,用mutex完成互斥count=count-1; //离开理发店signal(mutex);}七、调试及实验结果1、创建makefile文件hdrs = ipc.hopts = -g -cc_src = cons.c ipc.cc_obj = cons.o ipc.op_src = bar.c ipc.cp_obj = bar.o ipc.oall: producer consumerconsumer: $(c_obj)gcc $(c_obj) -o consumercons.o: $(c_src) $(hdrs)gcc $(opts) $(c_src)producer: $(p_obj)gcc $(p_obj) -o producerbar.o: $(p_src) $(hdrs)gcc $(opts) $(p_src)clean:rm cons bar *.o2.执行make命令,结果出现了许多由于粗心造成的编译错误3、修改程序后编译成功,打开两个终端,先运行producer.c,再运行consumer.c4、若按ctrl+c停止producer进程,则出现如下图结果。

沙发坐满后顾客将进入等候室等待5、若再次执行producer进程,将陆续唤醒在等待的顾客,结果如下图6、若再停止producer,让等待室的人也满,则顾客会离开理发店,结果如下图七、心得与收获1、本次试验,使我基本掌握了怎样用消息队列控制和堵塞进程,实现对共享内存的有序访问。

2、msgrcv/msgsnd为linux系统中异步或进程间通信的一种机制,msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列。

int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg); msgflg:这个参数依然是是控制函数行为的标志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息队列为空,则返回一个ENOMSG,并将控制权交回调用函数的进程。

3、不仅加深了对进程互斥的理解,还使我加深了对理发师算法的理解,找到了它与读者写者问题的共同之处:(1).进程间的互斥(2).理发师类似读者进程,顾客类似写者进程。

4、编写程序时要细心,对于编译过程中出现的错误,要有耐心去解决。

八、源代码Ipc.h:#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <sys/msg.h>#define BUFSZ 256#define MAXVAL 100#define STRSIZ 8#define WRITERQUEST 1#define READERQUEST 2#define FINISHED 3//写请求标识//读请求标识//读写完成标识typedef union semuns { int val;} Sem_uns;typedef struct msgbuf { long mtype;int mid;} Msg_buf;//信号量key_t costomer_key; int costomer_sem;key_t account_key;int account_sem;int sem_val;int sem_flg;//消息队列int wait_quest_flg;key_t wait_quest_key; int wait_quest_id;int wait_respond_flg;key_t wait_respond_key;int wait_respond_id;int sofa_quest_flg;key_t sofa_quest_key;int sofa_quest_id;int sofa_respond_flg;key_t sofa_respond_key;int sofa_respond_id;int get_ipc_id(char *proc_file,key_t key);char *set_shm(key_t shm_key,int shm_num,int shm_flag); int set_msq(key_t msq_key,int msq_flag);int set_sem(key_t sem_key,int sem_val,int sem_flag);int down(int sem_id);int up(int sem_id);Ipc.c:#include "ipc.h"int get_ipc_id(char *proc_file,key_t key) {FILE *pf;int i,j;char line[BUFSZ],colum[BUFSZ];if((pf = fopen(proc_file,"r")) == NULL){ perror("Proc file not open");exit(EXIT_FAILURE);}fgets(line, BUFSZ, pf);while(!feof(pf)){i = j = 0;fgets(line, BUFSZ,pf);while(line[i] == ' ') i++;while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';if(atoi(colum) != key) continue;j=0;while(line[i] == ' ') i++;while(line[i] !=' ') colum[j++] = line[i++]; colum[j] = '\0';i = atoi(colum);fclose(pf);return i;}fclose(pf);return -1;}int down(int sem_id){struct sembuf buf;buf.sem_op = -1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if((semop(sem_id,&buf,1)) <0) { perror("down error ");exit(EXIT_FAILURE);}return EXIT_SUCCESS;}int up(int sem_id){struct sembuf buf;buf.sem_op = 1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if((semop(sem_id,&buf,1)) <0) {perror("up error ");exit(EXIT_FAILURE);}return EXIT_SUCCESS;}int set_sem(key_t sem_key,int sem_val,int sem_flg){int sem_id;Sem_uns sem_arg;//测试由sem_key 标识的信号灯数组是否已经建立if((sem_id = get_ipc_id("/proc/sysvipc/sem",sem_key)) < 0 ) {//semget 新建一个信号灯,其标号返回到sem_idif((sem_id = semget(sem_key,1,sem_flg)) < 0){perror("semaphore create error");exit(EXIT_FAILURE);//设置信号灯的初值sem_arg.val = sem_val;if(semctl(sem_id,0,SETVAL,sem_arg) <0){perror("semaphore set error");exit(EXIT_FAILURE);}}return sem_id;}char * set_shm(key_t shm_key,int shm_num,int shm_flg){int i,shm_id;char * shm_buf;//测试由shm_key 标识的共享内存区是否已经建立if((shm_id = get_ipc_id("/proc/sysvipc/shm",shm_key)) < 0 ){//shmget 新建一个长度为shm_num 字节的共享内存,其标号返回到shm_idif((shm_id = shmget(shm_key,shm_num,shm_flg)) <0)perror("shareMemory set error");exit(EXIT_FAILURE);}//shmat 将由shm_id 标识的共享内存附加给指针shm_bufif((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0){perror("get shareMemory error");exit(EXIT_FAILURE);}for(i=0; i<shm_num; i++) shm_buf[i] = 0; //初始为0}//shm_key 标识的共享内存区已经建立,将由shm_id 标识的共享内存附加给指针shm_bufif((shm_buf = (char *)shmat(shm_id,0,0)) < (char *)0){perror("get shareMemory error");exit(EXIT_FAILURE);}return shm_buf;}int set_msq(key_t msq_key,int msq_flg){int msq_id;//测试由msq_key 标识的消息队列是否已经建立if((msq_id = get_ipc_id("/proc/sysvipc/msg",msq_key)) < 0 ) {//msgget 新建一个消息队列,其标号返回到msq_idif((msq_id = msgget(msq_key,msq_flg)) < 0){perror("messageQueue set error");exit(EXIT_FAILURE);}}return msq_id;}Bar.c:#include "ipc.h"int main(int argc,char *argv[]){// int i;int rate;Msg_buf msg_arg;//可在在命令行第一参数指定一个进程睡眠秒数,以调解进程执行速度if(argv[1] != NULL) rate = atoi(argv[1]);else rate = 3;//一个请求消息队列wait_quest_flg = IPC_CREAT| 0644;wait_quest_key = 101;wait_quest_id = set_msq(wait_quest_key,wait_quest_flg);//一个响应消息队列wait_respond_flg = IPC_CREAT| 0644;wait_respond_key = 102;wait_respond_id = set_msq(wait_respond_key,wait_respond_flg);//一个请求消息队列sofa_quest_flg = IPC_CREAT| 0644;sofa_quest_key = 201;sofa_quest_id = set_msq(sofa_quest_key,sofa_quest_flg);//一个响应消息队列sofa_respond_flg = IPC_CREAT| 0644;sofa_respond_key = 202;sofa_respond_id = set_msq(sofa_respond_key,sofa_respond_flg);//信号量使用的变量costomer_key = 301;//顾客同步信号灯键值account_key = 302;//账簿互斥信号灯键值sem_flg = IPC_CREAT | 0644;//顾客同步信号灯初值设为0sem_val = 0;//获取顾客同步信号灯,引用标识存costomer_semcostomer_sem = set_sem(costomer_key,sem_val,sem_flg);//账簿互斥信号灯初值设为1sem_val = 1;//获取消费者同步信号灯,引用标识存cons_semaccount_sem = set_sem(account_key,sem_val,sem_flg);int pid1, pid2;pid1=fork();if(pid1==0) {while(1) {// wait_quest_flg=IPC_NOWAIT;printf("%d号理发师睡眠\n", getpid());wait_quest_flg=0;/*msgrcv()可以从消息队列中读取消息,msgsnd()将一个新的消息写入队列msgtyp等于0 则返回队列的最早的一个消息。

相关文档
最新文档