操作系统原理实验四

合集下载

操作系统原理实验四

操作系统原理实验四

实验4 进程控制1、实验目的(1)通过对WindowsXP进行编程,来熟悉和了解系统。

(2)通过分析程序,来了解进程的创建、终止。

2、实验工具(1)一台WindowsXP操作系统的计算机。

(2)计算机装有Microsoft Visual Studio C++6.0专业版或企业版。

3、预备知识(3)·CreateProcess()调用:创建一个进程。

(4)·ExitProcess()调用:终止一个进程。

4、实验编程(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。

阅读该程序,完成实验任务。

源程序如下:# include < stdio.h ># include < windows.h >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实验任务:写出程序的运行结果。

操作系统原理实验报告

操作系统原理实验报告

操作系统原理实验报告操作系统原理实验报告一、课程设计的题目:根据“操作系统原理”课程的课堂教学内容,结合自己的知识积累情况,题目可从下述拟题中选择,亦可自定。

二、实验设计的内容:在Linux或Windows操作系统下,用C语言进行操作系统相关的设计开发,内容可关于“并发程序设计”、“处理机管理”、“用户接口”、“存储管理”、“文件系统管理”、“设备管理”等等。

三、参考资料:1、清华大学出版,张尧学《计算机操作系统教程》配套的《习题解答与实验指导书》中范例;2、清华大学出版,任爱华《操作系统实用教程》中的实例设计;3、《Linux下C语言编程入门教程》、《Linux软件工程师(C 语言)实用教程》等;4、网上与操作系统设计与开发相关的文献资料。

四、重要操作环节1、步骤:选题(2~3人一小组)--→提交小组名单--→分析、编写程序--→上机调试--→分析结果--→评价结果--→写出设计报告2、设计报告的主要内容:①、设计说明:设计主要完成的任务、解决的主要问题;②、工作原理:找出教材中的相关工作原理并简要说明;③、详细设计:包括调用的主要系统函数说明、程序流程图、程序代码、关键语句注释;④、运行结果:要求写出运行结果或抓图给出;⑤、分析结果:要求用操作系统原理有关理论解释说明;⑥、调试步骤以及调试过程中出现的问题及解决方法;⑦、参考文献:5篇以上;⑧、以学年论文格式提交文档资料,要有统一的封面和实验心得体会。

五、成绩评定1、各小组轮流演示小组作品,演示完毕,由其他小组的同学提2个以上问题,回答完毕打分;3、打分遵循原则如下:注意:①以下必做实验每小组都要做②以下选做实验,1个实验题目至多允许2个小组选,各小组也可以自拟题目必做实验(四个,都要做)实验一1. 实验名称:Linux登录、注销、关机和基本操作一。

2. 实验要求:掌握Linux系统的登录、注销、关机方法;掌握列出文件清单命令的使用方法:ls;掌握目录的切换命令的使用:cd;掌握目录的建立、删除命令的使用:mkdir、rmdir;掌握文件的拷贝、删除、移动命令的使用:cp、rm、mv 。

操作系统原理实验报告

操作系统原理实验报告

《操作系统原理》实验报告班级::学号:指导老师:目录:实验题目:实验一线程创建与撤销 (2)实验题目:实验二线程同步 (6)实验题目:实验三线程互斥 (11)实验题目:实验四进程通信 (17)实验题目:实验五读者-写者问题 (22)实验题目:实验六进程调度 (38)实验题目:实验七存储管理之动态库 (52)实验题目:实验八存储管理之存分配 (57)实验题目:实验九存储管理之页面置换算法 (70)实验题目:实验十设备管理 (85)实验题目:实验十一文件管理之文件读写 (99)实验题目:实验一线程创建与撤销完成人:XXX报告日期:2018年3月31日一、实验容简要描述(1)熟悉VC++、Visual Studio开发环境。

(2)使用相关函数创建和撤销线程。

(3)在一个进程中创建3个线程,名字分别为threada、threadb、threadc。

threada输出“hello world! ”。

threadb输出“My name is …”。

threadc输出“Please wait…”,然后sleep 5秒钟,接着输出“I wake up”。

二、程序设计1、设计思路该函数创建一个在调用进程的地址空间中执行的线程。

2、主要数据结构HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);VOID ExitThread(DWORD dwExitCode);VOID Sleep(DWORD dwMilliseconds);VOID Sleep(DWORD dwMilliseconds);三、实验结果1、基本数据lpThreadAttributes:指向一个SECURITY_ATTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。

操作系统原理

操作系统原理

《操作系统原理》实验指导书张晓翊编江汉大学商学院2007年目录实验一安装Windows 2000 Professional (1)实验二操作系统的计算环境 (5)实验三 Windows 2000 系统管理 (7)实验四Windows“任务管理器”的进程管理 (11)实验五 Windows 2000编程 (15)实验六 Windows 2000进程的“一生” (21)实验七提高Windows 2000内存性能 (30)实验八 Windows鼠标处理 (35)实验九优化Windows 2000磁盘子系统 (39)实验一安装Windows 2000 Professional(实验估计时间:120分钟)背景知识计算机执行的任何程序都必须首先读入内存,CPU通过内存来访问程序。

而所谓安装操作系统,实际上是把存放在光盘上的操作系统执行代码存入硬盘的过程。

因为硬盘是PC 机的固定外部存储设备,从硬盘上加载程序到内存很方便。

另外,操作系统中的文件系统主要是靠硬盘提供物理支持。

因此,安装操作系统到硬盘,实际上有两方面的作用:·在硬盘上建立文件系统;·把操作系统的全部内容事先存放在硬盘上以备使用。

当使用计算机时,从硬盘上加载操作系统到内存,然后将机器控制权转给操作系统内核来执行。

在本实验中,我们通过Windows 2000 Professional的安装,来了解Windows操作系统的安装及配置,包括安装前的准备工作、驱动程序的配置以及系统的设定等内容。

可以认为Windows 2000是Windows NT 4.0的后续,它一共有四个版本,即Windows 2000 Professional、Windows 2000 Server、Windows 2000 Advanced Server和Windows 2000 Datacenter Server,它们的差别在于功能以及支持CPU、RAM数量上的不同。

操作系统原理实验报告

操作系统原理实验报告

[键入文字]操作系统原理实验报告学院:专业:班级:学号:姓名:2011-2012学年第2学期目录实验1 进程管理 (2)实验2 进程通信 (9)实验3 存储管理 (15)实验4 文件系统 (24)实验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. 记录并分析程序运行结果。

四、程序说明和程序流程图实验1管道通信——所涉及的流程图:实验2软中断信号——所涉及的流程图:五、程序代码/*expe1_1.c*/#include <stdio.h>void main( ){int i, r, p1, p2, fd[2];char buf[50], s[50];pipe(fd); /* 父进程建立管道*/while ((p1=fork())==-1); /* 创建子进程P1,失败时循环*/ if (p1==0) /* 由子进程P1返回,执行子进程P1 */{lockf(fd[1], 1, 0); /* 加锁锁定写入端*/sprintf(buf, "Child process P1 is sending messages! \n");printf("Child process P1! \n");write(fd[1], buf, 50); /* 把buf中的50个字符写入管道*/ sleep(5); /* 睡眠5秒,让父进程读*/lockf(fd[1], 0, 0); /* 释放管道写入端*/exit(0); /* 关闭P1*/}else /* 从父进程返回,执行父进程*/{while ((p2=fork())==-1); /* 创建子进程P2,失败时循环*/ if (p2==0) /* 从子进程P2返回,执行子进程P2 */ {lockf(fd[1], 1, 0); /* 锁定写入端*/sprintf(buf, "Child process P2 is sending messages! \n");printf("Child process P2! \n");write(fd[1], buf, 50); /* 把buf中的字符写入管道*/sleep(5); /* 睡眠5秒,让父进程读*/lockf(fd[1], 0, 0); /* 释放管道写入端*/exit(0); /* 关闭P2*/}wait(0);if ((r=read(fd[0], s, 50))== -1)printf("cannot read pipe! \n");else printf("%s", s);wait(0);if ((r=read(fd[0], s, 50))== -1)printf("cannot read pipe! \n");else printf("%s", s);exit(0);}}/*exp1-2.c*/#include<stdio.h>#include<stdlib.h>#include<signal.h>int p1,p2;void main(){void ppdo();void p1do();void p2do();signal(SIGINT,ppdo);p1=fork();if(p1==0){signal(SIGUSR1,p1do);for(;;);}else {p2=fork();if(p2==0) {signal(SIGUSR2,p2do);for(;;);}}wait(0);wait(0);printf("\nParent process is killed!\n");exit(0);}void ppdo(){kill(p1,SIGUSR1);kill(p2,SIGUSR2);}void p1do(){printf("\nChild process p1 is killed by parent!\n"); exit(0);}void p2do(){printf("\nChild process p2 is killed by parent!\n"); exit(0);}六、程序运行结果及分析实验1管道通信运行结果截图实验1管道通信结果分析父进程建立后,创建了子进程P1,P2,然后P1,P2分别向管道中写入字符串“Child process p1 is sending message!”和“Child process p2 is sending message!”,父进程从管道中读取字符串。

操作系统原理课内实验指导书

操作系统原理课内实验指导书

操作系统原理课内实验指导书实验一:用户接口实验准备知识为了使用户通过操作系统完成各项管理任务,操作系统必须为用户提供各种接口来实现人机交互。

经典的操作系统理论将操作系统的接口分为控制台命令和系统调用两种。

前者主要提供给计算机的操作人员对计算机进行各种控制;而后者则提供个程序员,使他们可以方便地使用计算机的各种资源。

1.控制台命令接口操作系统向用户提供一组控制台命令,用户可以通过终端输入命令的方式获得操作系统的服务,并由此来控制自己作业的运行。

一般来讲,控制台命令应该包含:一组命令、终端处理程序以及命令解释程序。

1)bash的由来当登录Linux或者打开一个xterm时,当前默认的shell就是bash。

Bash是GNU Project 的shell。

GNU Project是自由软件基金会(Free Software Foundation)的一部分。

它对Linux 下的许多编程工具负责。

Bash(Bourne Again Shell)是自由软件基金会发布的Bourne shell 的兼容程序。

它包含了其他有些shell的许多良好的特性,功能非常的全面。

很多Linux版本都供bash。

2)bash的大致原理bash处理自己的脚本时,先找到需要处理的命令名称,进而在当前用户的默认命令目录中找到对应的命令,这些默认目录一般是/usr/bin、/bin或/sbin。

在执行这些命令时,先使用进程创建系统调用fork(),在使用exex()来执行这些命令。

3)建立bash脚本➢编辑文件可以用最熟悉的编辑器来编辑这个文本文件,比如文件名为script,在shell下输入:$ vi script#! /bin/bashEcho Hello World!然后保存,退出。

➢测试脚本。

使用指令:$ source script➢更改脚本属性使用指令:$ chmod a+x script将脚本程序设置为可执行。

➢执行脚本使用指令:$ ./script4)关键字参考Echo 在终端上显示Bash 特殊变量1~9,保存当前进程或脚本的前9个参数。

操作系统原理实验4-进程控制

操作系统原理实验4-进程控制

《操作系统原理》实验报告
实验序号:4 实验项目名称:进程控制
一、实验目的及要求
1. 加深对进程信号量的理解。

2. 理解进程同步与互斥机制。

3. 掌握Linux操作系统下的进程控制编程。

二、实验设备(环境)及要求
1.虚拟机VMware Workstation、Ubuntu操作系统和C语言编程。

2.编写一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Ctrl C键),当捕捉到中断信号后,父进程调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下面信息后终止:
child process 1 is killed by parent!
child process 2 is killed by parent!
父进程等待两个子进程终止后,输出以下信息后终止:
parent process is killed!
三、实验内容与步骤
代码:
在终端上进行测试
四、实验结果与数据处理
五、分析与讨论
了解了计算机进程的管理以及signal()函数的作用。

六、教师评语成绩。

操作系统原理_实验报告

操作系统原理_实验报告

一、实验目的1. 理解操作系统基本原理,包括进程管理、内存管理、文件系统等。

2. 掌握操作系统的基本命令和操作方法。

3. 通过实验加深对操作系统原理的理解和掌握。

二、实验环境1. 操作系统:Linux2. 编程语言:C语言3. 开发工具:Eclipse三、实验内容本次实验主要分为以下几个部分:1. 进程管理实验2. 内存管理实验3. 文件系统实验四、实验步骤及结果1. 进程管理实验实验步骤:- 使用C语言编写一个简单的进程管理程序,实现进程的创建、调度、同步和通信等功能。

- 编写代码实现进程的创建,通过调用系统调用创建新的进程。

- 实现进程的调度,采用轮转法进行进程调度。

- 实现进程同步,使用信号量实现进程的互斥和同步。

- 实现进程通信,使用管道实现进程间的通信。

实验结果:- 成功创建多个进程,并实现了进程的调度。

- 实现了进程的互斥和同步,保证了进程的正确执行。

- 实现了进程间的通信,提高了进程的效率。

2. 内存管理实验实验步骤:- 使用C语言编写一个简单的内存管理程序,实现内存的分配、释放和回收等功能。

- 实现内存的分配,采用分页存储管理方式。

- 实现内存的释放,通过调用系统调用释放已分配的内存。

- 实现内存的回收,回收未被使用的内存。

实验结果:- 成功实现了内存的分配、释放和回收。

- 内存分配效率较高,回收内存时能保证内存的连续性。

3. 文件系统实验实验步骤:- 使用C语言编写一个简单的文件系统程序,实现文件的创建、删除、读写等功能。

- 实现文件的创建,通过调用系统调用创建新的文件。

- 实现文件的删除,通过调用系统调用删除文件。

- 实现文件的读写,通过调用系统调用读取和写入文件。

实验结果:- 成功实现了文件的创建、删除、读写等功能。

- 文件读写效率较高,保证了数据的正确性。

五、实验总结通过本次实验,我对操作系统原理有了更深入的理解和掌握。

以下是我对实验的几点总结:1. 操作系统是计算机系统的核心,负责管理和控制计算机资源,提高计算机系统的效率。

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

实验4 进程控制1、实验目的(1)通过对WindowsXP进行编程,来熟悉和了解系统。

(2)通过分析程序,来了解进程的创建、终止。

2、实验工具(1)一台WindowsXP操作系统的计算机。

(2)计算机装有Microsoft Visual Studio C++6.0专业版或企业版。

3、预备知识(3)·CreateProcess()调用:创建一个进程。

(4)·ExitProcess()调用:终止一个进程。

4、实验编程(1)编程一利用CreateProcess()函数创建一个子进程并且装入画图程序(mspaint.exe)。

阅读该程序,完成实验任务。

源程序如下:# include < stdio.h ># include < windows.h >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<windows.h>#include<iostream>//利用进程和操作系统的版本信息的简单示例Void main()﹛//提取这个进程的ID号DWORD dwIdThis=::GetCurrentProcessId();//获得这一进程和报告所需的版本,也可以发送0以便指明这一进程DWORD dwVerReq=::GetProcessVersion(dwIdThis);WORD wMajorReq=::(WORD)dwVerReq>16);WORD wMinorReq=::(WORD)dwVerReq & oxffff);std::cout< <”Process ID:”< <dwIdThis< <”,requires OS:”< <wMajorReq< <wMinorReq< <std::endl;//设置版本信息的数据结构,以便保存操作系统的版本信息OSVERSIONINFOEX osvix;::ZeroMemory(&osvix,sizeof(osvix));Osvix.dwOSVersionInfoSize=sizeof(osvix);//提取版本信息和报告::GetVersionEx(reinterpret cast<LPOSVERSIONINFO>(&osvix));Std::cout< <”Running on OS:”< <osvix.dwMajorVersion< <”.”< <osvix.dwMinorVersion< <std::endl;//如果是NTS(Windows2000)系统,则提高其优先权If(osvix.dwPlatformld==VER PLATFORM WIN32 NT& &Osvix.dwMajorVersion>=5﹛//改变优先级::SerPriorityClass(::GetCurrentProcess() //利用这一进程HIGH PRIORITY CLASS); //改变为high//报告给用户Std::cout< <”Task Manager should now now indicate this”“process is high priority.”< <std::endl;﹜﹜实验参考:①在Visual C++窗口的工具栏中单击“打开”按钮,在“打开“对话框中找到并打开4-2.cpp源程序。

②单击Build菜单中的Compile 4-2.cpp命令,再单击“是”按钮确认。

系统对4-2.cpp 源程序进行编译。

③编译完成后,单击Build菜单中的Build 4-2.exe命令,建立4-2.exe可执行文件。

④在工具栏单击Execute Program(执行程序)按钮,执行4-2.exe程序。

实验任务:写出程序运行后的以下几项结果。

当前PID信息。

当前操作系统版本。

系统提示信息。

5、终止进程(3)编程三下面给出了一个终止进程的应用程序(文件名为4-3.cpp),它先创建一个子进程,然后命令它发出“自杀弹”互斥体去终止自身的运行。

阅读该程序并完成实验任务。

#include<windows.h>#include<iostream>#include<stdio.h>satic LPCTSTR g szMutexName=”w2kdg.ProcTerm.mutex.Suicide”;//创建当前进程的克隆进程的简单方法V oid StartClone()﹛//提取当前可执行文件的文件名TCHAR szFilename﹝MAX PATH﹞::GetModuleFileName(NULL,szFilename,MAX PATH);//格式化用于子进程的命令行,指明它是一个EXE文件和子进程TCHAR szCmdLine﹝MAX PATH﹞;::sprintf(szCmdLine,”\”%s\”child”,szFilename);//子进程的启动信息结构STARTUPINFO si;::ZeroMemory(reinterpret cast<void * >(&si),sizeof(si));si.cb=sizeof(si); //应当是此结构的大小//返回的用于子进程的进程信息PROCESS INFORMATION pi;//用同样的可执行文件名和命令行创建进程,并指明它是一个子进程BOOL bCreateOK=::CreateProcess(SzFilename, //产生的应用程序名称(本EXE文件) SzCmdLine, //告诉人们这是一个子进程的标志NULL, //用于进程的默认的安全性NULL, //用于线程的默认安全性FALSE, //不继承句柄CREATE NEW CONSOLE, //创建新窗口,使输出更直观NULL, //新环境NULL, //当前目录&si, //启动信息结构&pi); //返回的进程的信息//释放指向子进程的引用if(bCreateOK)﹛::CloseHandle(pi.hProcess);::CloseHandle(pi.hThread);﹜﹜Void Parent()﹛//创建“自杀”互斥程序体HANDLE hMutexSuicide=::CreatgeMutex(NULL, //默认的安全性TRUE, //最初拥有的g szMutexName); //为其命名if(hMutexSuicide !=NULL)﹛//创建子进程std::cout< <”Creating the child process.”< <std :: endl;::StartClone();//暂停::sleep(5000);//指令子进程“杀”掉自身std::cout< <”Telling the child process to quit.”< <std::endl;::ReleaseMutex(hMutexSuicide);//消除句柄::CloseHandle(hMutexSuicide);﹜﹜Void Child()﹛//打开“自杀”互斥体HANDLE hMutexSuicide=::OpenMutex(SYNCHRONIZE,//打开用于同步FALSE, //不需要向下传递g szMutexName); //名称if ( hMutexSuicide !=NULL)﹛//报告正在等待指令Std::cout< <”Child waiting for suicide instructions.”< <std::endl;::WaitForSingleObject(hMutexSuicide,INFINITE);//报告准备好终止,消除句柄Std:cout< <”Child quiting.”< <std::endl;::CloseHandle(hMutexSuicide); ::sleep(1000);﹜﹜int main(int arqc,char * argv﹝﹞)﹛//决定其行为是父进程还是子进程if(argc>1 & & ::strcmp(argv﹝1﹞,”child”)==0)﹛Child();﹜else﹛Parent();﹜Return 0;﹜分析:程序4-3.cpp说明了一个进程从“生”到“死”的整个一生,第一次执行时,它创建一个子进程,其行为如同“父亲”。

在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。

当创建子进程时,就打开了互斥体并在其他线程中进行别的处理工作,同时等待着父进程使用ReleaseMutex()API发出“死亡”信号。

然后用Sleep()API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。

当调用ExitProcess()时要小心,进程中的所有线程都被立刻通知停止。

在设计应用程序时,必须让主线程在正常的C++运由期关闭(这是由编译器提供默认行为)之后来调用这一函数。

相关文档
最新文档