当前位置:文档之家› 山东大学操作系统实验二

山东大学操作系统实验二

山东大学操作系统实验二
山东大学操作系统实验二

软件学院操作系统实验报告

实验题目:

实验二、线程和进程/线程管道通信实验

学号:201100300124

日期:2013年04月19日

班级:5班姓名:韩俊晓

Email:hanjunxiao188@https://www.doczj.com/doc/622920635.html,

实验目的:

通过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)-release

gcc version 4.1.2

gedit 2.18.2

OpenOffice 2.3

实验步骤:

1.实验说明:

1)与线程创建、执行有关的系统调用说明

线程是在共享内存中并发执行的多道执行路径,它们共享一个进程的资源,如进程程序段、文件描述符和信号等,但有各自的执行路径和堆栈。线程的创建无需像进程那样重新申请系统资源,线程在上下文切换时也无需像进程那样更换内存映像。多线程的并发执行即避免了多进程并发的上下文切换的开销又可以提高并发处理的效率。

Linux 利用了特有的内核函数__clone 实现了一个叫phread的线程库,__clone是fork 函数的替代函数,通过更多的控制父子进程共享哪些资源而实现了线程。Pthread是一个标准化模型,用它可把一个程序分成一组能够并发执行的多个任务。phread线程库是POSIX 线程标准

的实现,它提供了C 函数的线程调用接口和数据结构。

线程可能的应用场合包括:

● 在返回前阻塞的I/O 任务能够使用一个线程处理I/O,同时继续执行其他处理。需要及时响应多个前台用户界面操作同时后台处理的多任务场合。

● 在一个或多个任务受不确定事件影响时能够处理异步事件同时继续进行正常处理。

● 如果某些程序功能比其他功能更重要,可以使用线程以保证所有功能都出现,但那些时间密集型的功能具有更高优先级。

2)下面介绍pthread库中最基本的调用。

pthread_create系统调用语法:

#include

Intpthread_create(pthread_t *thread,pthread_attr_t *attr,void

*(*start_routine)(void *)Void *arg);

pthread_create函数创建一个新的线程。pthread_create在thread 中保存新线程的标识符。

Attr决定了线程应用那种线程属性。使用默认可给定参数NULL; (*start_routine)是一个指向新线程中要执行的函数的指针

arg是新线程函数携带的参数。

Pthread_create执行成功会返回0 并在thread 中保存线程标识符。执行失败则返回一个非0的出错代码。

pthread_exit系统调用语法:

#include

voidpthread_exit(void *retval);

pthread_exit函数使用函数pthread_cleanup_push调用任何用于该线程

的清除处理函数,然后中止当前进程的执行,返回retval。

Retval可以由父线程或其他线程通过pthread_join来检索。一个线程也可以简单地通过从其初始化函数返回来终止。

pthread_join系统调用语法:

#include

intpthread_join(pthread_tth, void **thread_return);

intpthread_detach(pthread_tth);

函数pthread_join用于挂起当前线程,直到th指定的线程终止运行为止。另一个线程的返回值如果不为NULL,则保存在thread_return指向的地址中。一个线程所使用的内存资源在对该线程应用pthread_join调用之前不会被重新分配。因而对于每个可切入的线程(默认的)必须调用一次pthread_join函数。线程必须是可切入的而不是被分离的状态,并且其他线程不能对同一线程再应用pthread_join调用。通过在

pthread_create调用创建一个线程时使用

PTHREAD_CREATE_DETACHED 属性或者使用pthread_detach可以让线程处于被分离状态。

注意不像由fork 创建的进程可以使用众多wait 等待子进程退出,在pthread多线程中似乎没有等待某个线程退出的方法。

3)管道通信机制

管道pipe 是进程间通信最基本的一种机制。在内存中建立的管道称为无名管道,在磁盘上建立的管道称为有名管道。无名管道随着进程的撤消而消失,有名管道则可以长久保存,shell 命令符| 建立的就是无名管道,而shell 命令mkfifo建立的是有名管道。两个进程可以通过管道一个在管道一端向管道发送其输出,给另一进程可以在管道的另一端从管道得到其输入.管道以半双工方式工作,即它的数据流是单方向的.因此使用一个管道一般的规则是读管道数据的进程关闭管道写入端,而写管道进程关闭其读出端。管道既可以采用同步方式工作也可以采用异步方式工作。

pipe 系统调用的语法为:

#include

int pipe(intpipe_id[2]);

pipe 建立一个无名管道,pipe_id[0]中和pipe_id[1]将放入管道两端的

描述符如果pipe 执行成功返回0。.出错返回-1.

管道读写的系统调用语法为:

#include

ssize_t read(intpipe_id,const void *buf,size_t count);

ssize_t write(intpipe_id,const void *buf,size_t count);

read 和write 分别在管道的两端进行读和写。

pipe_id是pipe 系统调用返回的管道描述符。

B uf是数据缓冲区首地址,count说明数据缓冲区以size_t为单位的长度。

read 和write 的返回值为它们实际读写的数据单位。

注意管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读者阻塞直到数据到达,反之如果管道写端有数据则写者阻塞直到数据被读走。

2.实验代码设计说明:

一个父进程创建两个子进程,这两个子进程分别执行X的计算和Y的计算,然后将计算结果写回到自己的管道中,再由父进程读取子进程的管道,将数据读到父进程的管道中,从而得到最后的结果。

3.调试过程:

1)建立experiment2.c程序,将代码写到程序中;

2)建立以下项目管理文件Makefile

srcs=experiment2.c

objs=experiment2.o

opts= -g -c

all: experiment2

experiment2: $(objs)

gcc $(objs) -o experiment2

experiment2.o: $(srcs)

gcc $(opts) $(srcs)

clean:

rm experiment2 *.o

3)输入make命令编译连接生成可执行的experiment2程序

$g make gcc -g -c experiment2.c

gccexperiment2.o -o experiment2

4)执行experiment2程序

实验总结:

1.编写递归函数的时候要看明白控制条件,不要遗漏控制条件从而

使函数出错。

2.编写程序时要理清管道之间的读写关系,这样才不会在读写的过

程中出错。

3.程序的错误可以通过打印到屏幕来调试,这也是一种要掌握的调

试技能。

操作系统实验四存储管理

师学院计算机系 实验报告 (2014—2015学年第二学期) 课程名称操作系统 实验名称实验四存储管理 专业计算机科学与技术(非师)年级2012级 学号B2012102147 姓名秋指导教师远帆 实验日期2015-05-20

图1 word运行情况 “存使用”列显示了该应用程序的一个实例正在使用的存数量。 5) 启动应用程序的另一个实例并观察它的存需求。 请描述使用第二个实例占用的存与使用第一个实例时的存对比情况: 第二个实例占用存22772K,比第一个实例占用的存大很多 4:未分页合并存。 估算未分页合并存大小的最简单法是使用“任务管理器”。未分页合并存的估计值显示在“任务管理器”的“性能”选项卡的“核心存”部分。 总数(K) :________220___________ 分页数:_____________________ 未分页(K) :_________34__________ 图2核心存

C 简单基本NTFS 30G 良好(系 统) D 简单基本NTFS 90G 良好 E 简单基本NTFS 90G 良好 F 简单基本NTFS 88 G 良好 图3磁盘情况 6:计算分页文件的大小。 要想更改分页文件的位置或大小配置参数,可按以下步骤进行: 1) 右键单击桌面上的“我的电脑”图标并选定“属性”。 2) 在“高级”选项卡上单击“性能选项”按钮。 3) 单击对话框中的“虚拟存”区域中的“更改”按钮。 请记录: 所选驱动器的页面文件大小: 驱动器:______________F_____________________ 可用空间:___________9825_____________________ MB 初始大小(MB) :_____ 2048______________________ 最大值(MB) :________4092_____________________ 所有驱动器页面文件大小的总数: 允的最小值:________16____________________ MB

操作系统实验实验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、用软中断通信实现进程同步的机理

山东大学操作系统实验五理发师问题报告

计算机科学与技术学院操作系统实验报告 实验题目:理发店问题 理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。 在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。 请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。 实验目的: 进一步研究和实践操作系统中关于并发进程同步与互斥操作的一些经典问题的解法,加深对于非对称性互斥问题有关概念的理解。观察和体验非对称性互斥问题的并发控制方法。进一步了解Linux系统中IPC进程同步工具的用法,训练解决对该类问题的实际编程、调试和分析问题的能力。 硬件环境: Inter(R)Core(TM)i5-3210M CPU @ 2.50GHz 内存:4GB 硬盘:500G 软件环境: XUbuntu-Linux 操作系统 Gnome 桌面 2.18.3 BASH_VERSION='3.2.33(1)-release gcc version 4.1.2

gedit 2.18.2 OpenOffice 2.3 实验步骤: 1、问题分析: 为了解决本实验的同步问题,采用共享内存,信号量,消 息队列三种IPC 同步对象处理。 客户程序思想: 每一个客户把自己的请求当做一条消息发送到相应的消息 队列中去,并通过阻塞等待接收消息的方式来等待理发师 最终帮自己理发。每一个客户先判断sofa 是不是坐满了,如 果没有就坐在沙发上等,否者就判断waitroom 是不是坐满 了,如果没有,就坐在waitroom 等,只要有一个坐在sofa 的客户离开sofa 理发,理发师就会到waitroom 找最先来的 客户,让他进入sofa 等待。 理发师程序思想: 理发师查看sofa 上有没有人,没有就睡3 秒,然后再一次 看有没有人,如果有人,就到沙发请最先来的客户来理发。 账本互斥的实现: Semaphore mutex=1 ; Sofa 队列的长度和wait 队列的长度的实现: 在顾客进程中设置两个变量sofa_count,wait_count,分别保存沙发

山东大学操作系统实验报告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的一些行为,利用系统调用来创建共享内存区域,并设定他的长度并获取共享内存的首地址。然后设定消费者互斥与同步的信号灯,并为他们设置相应的初值。当有消费进程在运行而其他消费者请求时,相应的信号灯就会阻止它,当共享内存区域已空时,信号等也会提示生产者不能再从共享内存中取出相应的内容。 运行的消费者应该与相应的生产者对应起来,只有这样运行结果才会正确。

操作系统实验报告_实验五

实验五:管道通信 实验内容: 1.阅读以下程序: #include #include #include main() { int filedes[2]; char buffer[80]; if(pipe(filedes)<0) //建立管道,filedes[0]为管道里的读取端,filedes[1]则为管道的写入端 //成功则返回零,否则返回-1,错误原因存于errno中 err_quit(“pipe error”); if(fork()>0){ char s[ ] = “hello!\n”; close(filedes[0]); //关闭filedes[0]文件 write(filedes[1],s,sizeof(s)); //s所指的内存写入到filedes[1]文件内 close(filedes[1]); //关闭filedes[0]文件 }else{ close(filedes[1]); read(filedes[0],buffer,80); //把filedes[0]文件传送80个字节到buffer缓冲区内 printf(“%s”,buffer); close(filedes[0]); } } 编译并运行程序,分析程序执行过程和结果,注释程序主要语句。

2.阅读以下程序: #include #include #include main() { char buffer[80]; int fd; unlink(FIFO); //删除FIFO文件 mkfifo(FIFO,0666); //FIFO是管道名,0666是权限 if(fork()>0){ char s[ ] = “hello!\n”;

山大操作系统实验2

操作系统实验报告 ——线程和进/线程管道通信实验 张咪软件四班一、实验要求 设有二元函数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) 。 二、实验目的 通过 Linux 系统中线程和管道通信机制的实验,加深对于线程控制和管道通信概念的理解,观察和体验并发进/线程间的通信和协作的效果 ,练习利用无名管道进行进/线程间通信的编程和调试技术。 三、实验环境 实验环境均为Linux操作系统,开发工具为gcc和g++。 四、实验思路 要实现三个函数,要创建三个进程,两个子进程和一个父进程。一个子进程实现f(x),另一个实现f(y)。因为f(x,y)=f(x)+f(y),所以在父进程和子进程间建立通信,子进程将当前值传给父进程,父进程进行计算。而且由于父进程的f(x,y)中的x和f(x)中的x一一对应,所以这些进程应该同步的并发向前走,否则f(x,y)的值就是错的。 五、算法设计 1.创建进程,每个子进程的执行代码段实现对应函数功能。 2.建立父进程和子进程间的通信。由于管道的读写默认的通信方式为同步读写方式,即如果管道读端无数据则读命令阻塞直到数据到达,反之如果管道写端有数据则写命令阻塞直到数据被读走。所以同步并发的问题可以通过管道实现。建立两个管道,pipe1和pipe2,f(x)通过pipe1向父进程写入f(x)的值。同理f(y)通过pipe2向父进程写入f(y)的值。父进程根据这两个值实现函数f(x,y)功能。 六、实验过程: 新建一个文件夹,在该文件夹中建立以下名为ppipe.c的C语言程序。 编写代码,保存。 输入gcc ppipe.c命令, 生成默认的可执行文件a.out。 执行a.out:。 执行并调试ppipe程序。

操作系统实验二

操作系统实验 实验二进程管理 学号 1215108019 姓名李克帆 学院信息学院 班级 12电子 2

实验目的 1、理解进程的概念,明确进程和程序的区别。 2、理解并发执行的实质。 3、掌握进程的创建、睡眠、撤销等进程控制方法。 实验内容与要求 基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。 实验报告内容 1、进程、进程控制块等的基本原理。 进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。 进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下: I/完时间片 进程调 I/请

由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。 进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。当创建一个进程时,实际上就是为其建立一个进程控制块。 在通常的操作系统中,PCB应包含如下一些信息: ①进程标识信息。为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。 ②位置信息。指出进程的程序和数据部分在内存或外存中的物理位置。 ③状态信息。指出进程当前所处的状态,作为进程调度、分配CPU的依据。 ④进程的优先级。一般根据进程的轻重缓急其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。就 执行阻塞 程度为进程指定一个优先级,优先级用优先数表示。 ⑤进程现场保护区。当进程状态变化时(例如一个进程放弃使用CPU),它需要将当时的CPU现场保护到内存中,以便再次占用CPU时恢复正常运行,有的系统把要保护的CPU 现场放在进程的工作区中,而PCB中仅给出CPU现场保护区起始地址。 ⑥资源清单。每个进程在运行时,除了需要内存外,还需要其它资源,如I/O设备、外存、数据区等。这一部分指出资源需求、分配和控制信息。 ⑦队列指针或链接字。它用于将处于同一状态的进程链接成一个队列,在该单元中存放下一进程PCB首址。 ⑧其它信息。 这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。 2、程序流程图。

山大操作系统实验-1

操作系统原理实验报告——实验一 张咪软件工程四班 一、实验目的 加深对于进程并发执行概念的理解。实践并发进/线程 的创建和控制方法。观察和体验进程的动态特性。进 一步理解进程生命期期间创建、变换、撤销状态变换 的过程。掌握进程控制的方法,了解父子进程间的控 制和协作关系。练习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。循环五次退出。

操作系统实验报告4

《操作系统》实验报告 实验序号: 4 实验项目名称:进程控制

Printf(“child Complete”); CloseHandle(pi.hProcess); CloseHandle(pi hThread); ﹜ 修改后: #include #include int main(VOID) { STARTUPINFO si; PROCESS_INFORMA TION pi; ZeroMemory(&si,sizeof(si)); si.cb=sizeof(si); ZeroMemory(&pi,sizeof(pi)); if(!CreateProcess(NULL, "c:\\WINDOWS\\system32\\mspaint.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si,&pi)) { fprintf(stderr,"Creat Process Failed"); return -1; } WaitForSingleObject(pi.hProcess,INFINITE); printf("child Complete"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } 在“命令提示符”窗口运行CL命令产生可执行程序4-1.exe:C:\ >CL 4-1.cpp

实验任务:写出程序的运行结果。 4.正在运行的进程 (2)、编程二下面给出了一个使用进程和操作系统版本信息应用程序(文件名为4-5.cpp)。它利用进程信息查询的API函数GetProcessVersion()与GetVersionEx()的共同作用。确定运行进程的操作系统版本号。阅读该程序并完成实验任务。 #include #include

操作系统实验五

操作系统 实验报告 哈尔滨工程大学

一、实验概述 1. 实验名称 进程的同步 2. 实验目的 1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。 2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。 3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。 3. 实验类型 验证 二、实验环境 OS Lab 三、实验过程 3.1 准备实验 按照下面的步骤准备本次实验: 1. 启动OS Lab。 2. 新建一个EOS Kernel项目。 3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。 4. 新建一个EOS应用程序项目。 5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。 3.2 使用EOS的信号量解决生产者-消费者问题 按照下面的步骤查看生产者-消费者同步执行的过程: 1. 使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。 2. 按F7生成修改后的EOS应用程序项目。 3. 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“否”,继续执行。 5. 立即激活虚拟机窗口查看生产者-消费者同步执行的过程。 6. 待应用程序执行完毕后,结束此次调试。 3.3 调试EOS信号量的工作过程 3.3.1 创建信号量 按照下面的步骤调试信号量创建的过程:

1. 按F5启动调试EOS应用项目。OS Lab会首先弹出一个调试异常对话框。 2. 在调试异常对话框中选择"是",调试会中断。 3. 在main函数中创建Empty信号量的代码行(第77行) EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点。 4. 按F5继续调试,到此断点处中断。 5. 按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemaphoreObject函数来创建信号量对象。 6. 按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。 7. 在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。 8. 按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。 9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开"调用堆栈"窗口,查看函数的调用层次。 3.3.2 等待、释放信号量 等待信号量(不阻塞) 生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试: 1. 删除所有的断点(防止有些断点影响后面的调试)。 2. 在eosapp.c文件的Producer函数中,等待Empty信号量的代码行 (144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 3. 按F5继续调试,到断点处中断。 4. WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。 5. 按F5继续调试,到断点处中断。 6. 按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。 如图所示,empty的初始值为10。 在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。 释放信号量(不唤醒) 1. 删除所有的断点(防止有些断点影响后面的调试)。

山大操作系统实验5

进程同步实验 张咪 软件四班一、实验目的 总结和分析示例实验和独立实验中观察到的调试和运行信息,说明您对与解决非对称性互斥操作的算法有哪些新的理解和认识?为什么会出现进程饥饿现象?本实验的饥饿现象是怎样表现的?怎样解决并发进程间发生的饥饿现象?您对于并发进程间使用消息传递解决进程通信问题有哪些新的理解和认识?根据实验程序、调试过程和结果分析写出实验报告。 二、实验要求 理发店问题:假设理发店的理发室中有3个理发椅子和3个理发师,有一个可容纳4个顾客坐等理发的沙发。此外还有一间等候室,可容纳13位顾客等候进入理发室。顾客如果发现理发店中顾客已满(超过20人),就不进入理发店。在理发店内,理发师一旦有空就为坐在沙发上等待时间最长的顾客理发,同时空出的沙发让在等候室中等待时间最长的的顾客就坐。顾客理完发后,可向任何一位理发师付款。但理发店只有一本现金登记册,在任一时刻只能记录一个顾客的付款。理发师在没有顾客的时候就坐在理发椅子上睡眠。理发师的时间就用在理发、收款、睡眠上。请利用linux系统提供的IPC进程通信机制实验并实现理发店问题的一个解法。 三、实验环境 实验环境均为Linux操作系统,开发工具为gcc和g++。 四、实验思路 约束: 1.设置一个count变量来对顾客进行计数,该变量将被多个顾客进程互斥地访问并修改,通过一个互斥信号量mutext来实现。 count>20时,就不进入理发店。 7

操作系统实验四

青岛理工大学课程实验报告

算法描述及实验步骤 功能:共享存储区的附接。从逻辑上将一个共享存储区附接到进程的虚拟地址空间上。用于建立调用进程与由标识符shmid指定的共享内存对象之间的连接。 系统调用格式:virtaddr=shmat(shmid,addr,flag) 该函数使用头文件如下: #include #include #include (8)shmdt( ) 功能:用于断开调用进程与共享内存对象之间的连接,成功时返回0,失败返回-1。 系统调用格式: int shmdt(shmaddr) char *shmaddr;/*采用shmat函数的返回值*/ (9)shmctl( ) 功能:共享存储区的控制,对其状态信息进行读取和修改。用于对已创建的共享内存对象进行查询、设置、删除等操作。 系统调用格式:shmctl(shmid,cmd,buf) 该函数使用头文件如下: #include #include #include 2、步骤: (1)定义进程变量(2)定义两个字符数组 (3)创建管道(4)如果进程创建不成功,则空循环(5)如果子进程创建成功,pid为进程号(6)锁定管道 (7)给Outpipe赋值(8)向管道写入数据 (9)等待读进程读出数据(10)解除管道的锁定 (11)结束进程等待子进程结束(12)从管道中读出数据 (13)显示读出的数据(14)父进程结束 创建jincheng.c 插入文字

调 试 过 程 及 实 验 结 果 运行: 运行后: 总 结 (对实验结果进行分析,问题回答,实验心得体会及改进意见) 虽然对pipe()、msgget()、msgsnd()、msgrcv()、msgctl()、shmget()、shmat()、 shmdt()、shmctl()的功能和实现过程有所了解,但是运用还是不熟练,过去没 见过,所以运行了一个简单的程序。 利用管道机制、消息缓冲队列、共享存储区机制进行进程间的通信,加深了对 其了解。 (1)管道通信机制,同步的实现过程:当写进程把一定数量的数据写入pipe, 便去睡眠等待,直到读进程取走数据后,再把它唤醒。当读进程读一空pipe 时,也应睡眠等待,直到写进程将数据写入管道后,才将之唤醒,从而实现进 程的同步。 管道通信的特点:A管道是半双工的,数据只能向一个方向流动;需要双方通 信时,需要建立起两个管道;B. 只能用于父子进程或者兄弟进程之间(具有亲 缘关系的进程);C.单独构成一种独立的文件系统:管道对于管道两端的进程而

操作系统实验指导及实验五个

操作系统实验指导及实验五个 前言 1.实验总体目标 通过学生自己动手设计实验验证理论知识,使学生掌握操作系统特征和功能,掌握不同调度算法下进程的调度、进程控制、进程调度与死锁,并必须掌握作业管理、存储器管理、设备管理和文件管理的主要原理。加深对操作系统基本原理理解。 ⒉适用专业 计算机科学与技术 ⒊先修课程 C语言程序设计、计算机组成原理、数据结构 ⒋实验课时分配

⒌ 有70台中等配置的计算机组成的小型局域网的实验室环境。计算机的具体要求:(1)Pentium 133Hz以上的CPU;(2)建议至少256MB的内存;(3)建议硬盘至少2GB,并有1GB空闲空间。(4)安装Windows操作系统及C语言编译程序或Linux虚拟环境。 ⒍实验总体要求 培养计算机专业的学生的系统程序设计能力,是操作系统课程的一个非常重要的环节。通过操作系统上机实验,可以培养学生程序设计的方法和技巧,提高学生编制清晰、合理、可读性好的系统程序的能力,加深对操作系统课程的理解。使学生更好地掌握操作系统的基本概念、基本原理、及基本功能,具有分析实际操作系统、设计、构造和开发现代操作系统的基本能力。 实验要求做到: 1)详细描述实验设计思想、程序结构及各模块设计思路; 2)详细描述程序所用数据结构及算法; 3)明确给出测试用例和实验结果; 4)为增加程序可读性,在程序中进行适当注释说明; 5)认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;

6)实验报告撰写要求结构清晰、描述准确逻辑性强; 7)实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。 ⒎本实验的重点、难点及教学方法建议 重点:理解进程调度中PCB的设计,以实现对进程的调度。 难点:进程调度程序的设计,设备管理程序的设计。 教学方法建议:力争在本指导书的帮助下,独立设计程序以加深理解。

操作系统实验报告

操作系统实验报告 Document number:NOCG-YUNOO-BUYTT-UU986-1986UT

许昌学院 《操作系统》实验报告书学号: 姓名:闫金科 班级: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的镜像文件,如图所示:

操作系统实验4

操作系统 实验报告 学号: 姓名: 提交日期: 成绩: 内蒙古大学计算机学院

实验四进程管理 一、实验目的 1. 加深对进程概念的理解,明确进程和程序的区别; 2. 进一步认识并发执行的实质; 3. 分析进程争用资源的现象,学习解决进程互斥的方法; 二、实验内容 1. 进程的创建; 2. 进程的控制; 3. 进程并发执行结果分析; 三、主要实验步骤 1. 编制一段程序,使用系统调用fork()创建两个子进程,在此程序运行时,系 统中就有一个父进程和两个子进程在活动。让每一个进程在屏幕上显示一个字符:父进程显示字符a,子进程分别显示字符b和子符c。试观察、记录并分析屏幕上进程调度的情况。若在程序中使用系统调用nice()来改变各进程的优先级,会出现什么现象? (1)使用vi创建forktest.c源文件 (2)编写程序

(3)保存程序并退出

(4)使用gcc编译源文件生成可执行文件forktest (5)执行文件,输入./forktest回车 (6)结果分析

2. 编制一段程序要求父进程创建子进程,在子进程中分别用exec函数与system 函数执行“dir -a”。并分析其区别。 3. 分析以下程序框架,修改并上机运行后回答下列问题。 #include #include #include V oid main() {① pid=fork(); ② if(pid==0){ ........ sleep(3); .......... printf("ddd\n"); exit(0); } else { ............ sleep(7); ........... printf("aaa\n"); wait(0); printf("bbb\n"); } printf("ccc\n"); }

操作系统实验

《操作系统》 实验指导书 班级:0 9专升本(2)班学号:20091105 姓名: 宿州学院计算机科学与技术系 2010-06

目录 实验一进程调度 (1) 实验二银行家算法 (3) 实验三虚拟存储管理 (5) 实验四磁盘调度算法 (6) 要求:(说明,看后删除!) 1、四个实验均需要写; 2、“实验目的”—“实验结论”的格式均已经 写好,可以进行增删及修改。学生需要根据 “实验内容”独立完成相应的“算法设计” 部分,并将代码粘贴在这部分;其中“测试 实例”部分,学生自己进行测试实例的选取, 程序运行的结果需要附上相应的窗口截图, 以验证结果。 3、实验报告书,写好之后自行打印装订,于17 周前(这周为13周)交给学习委员,学习委 员统一上交。 实验一进程调度

实验目的 进程调度是处理机管理的核心内容。本实验要求用C语言编写和调试一个简单的进程调度程序。通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转两种调度算法结合使用的具体实施办法。本实验的设计思想是,先从就绪队列里选择最高优先数的进程投入运行,运行一个时间片,若执行完毕,进入完成状态;否则重新在就绪队列中选择新进程。 实验设备 ⑴ PC兼容机 ⑵ Windows、DOS系统 ⑶TC语言 实验内容和要求 ⑴设计进程控制块PCB表结构,每个进程有一个进程控制块(PCB)表示。考虑到本实验仅演示优先数调度算法和时间片轮转调度算法,进程控制块作简单化处理,只包含如下信息:进程标识(ID)、优先数(PRIORITY)、需要运行时间(ALLTIME)、已用CPU时间 ⑵进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。 ⑶每个进程的状态可以是就绪W(Wait)、运行R(Run)、或完成F(Finish)三种状态之一。就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。 每进行一次调度程序都打印一次运行进程、就绪队列、以及各个进程的PCB,以便进行检查。 输出内容参照格式: 输出运行进程和就绪队列 RUNNING PROG: ID0 READY_QUEUE:->id1->id2 输出各PCBi,格式为 ID:Idi(0≤i≤4) PRIORITY:xx CPUTIME:xx ALLTIME:xx STATE:xx ⑷重复以上过程,直到所要进程都完成为止。

山大网络教育-操作系统B

《操作系统原理》模拟卷 一, 选择题 1.( D )不是基本的操作系统. A,批处理操作系统 B,分时操作系统 C,实时操作系统 D,网络操作系统 2.( C )不是分时系统的基本特征: A,同时性 B,独立性 C,实时性 D,交互性 3.处理器执行的指令被分成两类,其中有一类称为特权指令,它只允许( C )使用. A,操作员 B,联机用户 C,操作系统 D,目标程序 4.当用户程序执行访管指令时,中断装置将使中央处理器( B )工作. A,维持在目态 B,从目态转换到管态 C,维持在管态 D,从管态转换到目态 5.进程所请求的一次打印输出结束后,将使进程状态从( D ) A,运行态变为就绪态 B,运行态变为等待态 C,就绪态变为运行态 D,等待态变为就绪态 6.采用动态重定位方式装入的作业,在执行中允许( C )将其移动. A,用户有条件地 B,用户无条件地 C,操作系统有条件地 D,操作系统无条件地 7.分页式存储管理中,地址转换工作是由( A )完成的. A,硬件

B,地址转换程序 C,用户程序 D,装入程序 二,多项选择题。在每小题列出的五个选项中有二至五个选项是符合题目要求的,请将正确选项的字母填在题干中的括号内.多选,少选,错选均无分. 1.利用记录的成组与分解操作能( ABE ) A,有效地实现信息转储 B,提高存储介质的利用率 C,减少操作系统的程序量 D,增加启动外设的次数 E,提高文件的存取速度 2.对UNIX中的trap指令,下列说法中( AD )是正确的. A,可供用户使用 B,UNIX的例外处理程序也可使用trap指令 C,trap指令是特权指令 D,trap指令是在管态下运行 E,UNIX的例外处理也是从trap指令进入的 3.引入多道程序设计的主要目的在于( BD ) A,提高实时响应速度 B,充分利用处理机,减少处理机空闲时间 C,有利于代码共享 D,充分利用外围设备 E,减少存储器碎片 三, 填空题 1.在批处理兼分时的系统中,往往由分时系统控制的作业称为前台作业,而由批处理系统控制的作业称为后台作业. 2.操作系统为用户提供两种类型的使用接口,它们是操作员接口和程序员接口. 3.操作系统中,进程可以分为系统进程和用户进程两类. 4.用户调用建立和打开文件操作来申请对文件的使用权. 5.在响应比最高者优先的作业调度算法中,当各个作业等待时间相同时, 计算时间短的作业将得到优先调度;当各个作业要求运行的时间相同时, 等待时间长的作业得到优先调度. 四, 简答题 1.进程调度中"可抢占"和"非抢占"两种方式,哪一种系统的开销更大为什么 1.可抢占式会引起系统的开销更大. 可抢占式调度是严格保证任何时刻,让具有最高优先数(权)的进程占有处理机运行,因此增加了处理机调度的时机,引起为退出处理机的进程保留现场,为占有处理机的进程恢复现场等时间(和空间)开销增大. (注:不写空间开销也可.)

操作系统原理实验报告(终版)

操作系统原理实验报告(终版)

————————————————————————————————作者:————————————————————————————————日期:

[键入文字] XX学校 实验报告 课程名称: 学院: 专业班: 姓名: 学号: 指导教师: 2011 年3 月

目录 实验1 进程管理 (3) 一、实验目的 (3) 二、实验内容 (3) 三、实验要求 (3) 四、程序说明和程序流程图 (4) 五、程序代码 (5) 六、程序运行结果及分析 (7) 七.指导教师评议 (8) 实验2 进程通信 (9) 一、实验目的 (9) 二、实验内容 (9) 三、实验要求 (9) 四、程序说明和程序流程图 (9) 五、程序代码 (11) 七.指导教师评议 (14) 实验3 存储管理 (15) 一、实验目的 (15) 二、实验内容 (15) 三、实验要求 (15) 四、程序说明和程序流程图 (16) 六、程序运行结果及分析 (23)

七.指导教师评议 (23) 实验4 文件系统 (24) 一、实验目的 (24) 二、实验内容 (24) 三、实验要求 (24) 四、程序说明和程序流程图 (24) 五、程序代码 (26) 六、程序运行结果及分析 (26) 七.指导教师评议 (27)

实验1 进程管理 一、实验目的 1. 弄清进程和程序的区别,加深对进程概念的理解。 2. 了解并发进程的执行过程,进一步认识并发执行的实质。 3. 掌握解决进程互斥使用资源的方法。 二、实验内容 1. 管道通信 使用系统调用pipe( )建立一个管道,然后使用系统调用fork( )创建2个子进程p1和p2。这2个子进程分别向管道中写入字符串:“Child process p1 is sending message!”和“Child process p2 is sending message!”,而父进程则从管道中读出来自两个子进程的信息,并显示在屏幕上。 2. 软中断通信 使用系统调用fork( )创建2个子进程p1和p2,在父进程中使用系统调用signal( )捕捉来自键盘上的软中断信号SIGINT(即按Ctrl-C),当捕捉到软中断信号SIGINT后,父进程使用系统调用kill( )分别向2个子进程发出软中断信号SIGUSR1和SIGUSR2,子进程捕捉到信号后分别输出信息“Child process p1 is killed by parent!”和“Child process p2 is killed by parent!”后终止。而父进程等待2个子进程终止后,输出信息“Parent process is killed!”后终止。 三、实验要求 1. 根据实验内容编写C程序。 2. 上机调试程序。 3. 记录并分析程序运行结果。

相关主题
文本预览
相关文档 最新文档