天津科技大学计算机操作系统实验报告-实验二
- 格式:doc
- 大小:174.07 KB
- 文档页数:8
计算机操作系统实验报告一、实验目的本次实验的主要目的是深入了解计算机操作系统的工作原理和功能,通过实际操作和观察,掌握操作系统的基本概念和常用命令,提高对计算机系统的管理和控制能力。
二、实验环境1、操作系统:Windows 10 专业版2、硬件配置:Intel Core i5 处理器,8GB 内存,256GB 固态硬盘三、实验内容1、进程管理通过任务管理器观察系统中正在运行的进程,包括进程的名称、PID(进程标识符)、CPU 使用率、内存使用情况等。
尝试结束一些非关键进程,观察系统的反应。
2、内存管理使用系统自带的性能监视器查看内存的使用情况,包括物理内存、虚拟内存的总量、已使用量和可用量。
运行一些大型程序,观察内存的分配和释放过程。
3、文件管理创建、复制、移动、删除文件和文件夹,观察文件系统的操作效果。
查看文件和文件夹的属性,包括大小、创建时间、修改时间、访问权限等。
4、设备管理查看设备管理器中硬件设备的状态,包括是否正常工作、驱动程序的版本等。
尝试更新一些设备的驱动程序,观察设备性能的变化。
四、实验步骤及结果1、进程管理打开任务管理器,可以看到系统中正在运行的进程列表。
进程按照名称、PID、CPU 使用率、内存使用情况等进行排序。
例如,系统进程“System”和“svchostexe”通常占用一定的 CPU 和内存资源。
尝试结束一些非关键进程,如某些后台运行的软件进程。
在结束进程时,系统会提示可能会导致相关程序无法正常运行,确认后结束进程。
部分进程结束后,对应的程序会关闭,系统的资源占用也会相应减少。
2、内存管理打开性能监视器,在“内存”选项中可以直观地看到物理内存和虚拟内存的使用情况。
当运行大型程序时,如游戏或图形处理软件,内存的使用量会显著增加。
随着程序的关闭,已使用的内存会逐渐释放,可用内存量会回升。
3、文件管理在文件资源管理器中进行文件和文件夹的操作。
创建新文件和文件夹时,可以指定名称、类型和存储位置。
操作系统实验二实验报告一、实验目的本次操作系统实验二的主要目的是深入理解和掌握进程管理的相关概念和技术,包括进程的创建、执行、同步和通信。
通过实际编程和实验操作,提高对操作系统原理的认识,培养解决实际问题的能力。
二、实验环境本次实验使用的操作系统为 Windows 10,编程环境为 Visual Studio 2019。
三、实验内容及步骤(一)进程创建实验1、首先,创建一个新的 C++项目。
2、在项目中,使用 Windows API 函数`CreateProcess`来创建一个新的进程。
3、为新进程指定可执行文件的路径、命令行参数、进程属性等。
4、编写代码来等待新进程的结束,并获取其退出代码。
(二)进程同步实验1、设计一个生产者消费者问题的模型。
2、使用信号量来实现生产者和消费者进程之间的同步。
3、生产者进程不断生成数据并放入共享缓冲区,当缓冲区已满时等待。
4、消费者进程从共享缓冲区中取出数据进行处理,当缓冲区为空时等待。
(三)进程通信实验1、选择使用管道来实现进程之间的通信。
2、创建一个匿名管道,父进程和子进程分别读写管道的两端。
3、父进程向管道写入数据,子进程从管道读取数据并进行处理。
四、实验结果及分析(一)进程创建实验结果成功创建了新的进程,并能够获取到其退出代码。
通过观察进程的创建和执行过程,加深了对进程概念的理解。
(二)进程同步实验结果通过使用信号量,生产者和消费者进程能够正确地进行同步,避免了缓冲区的溢出和数据的丢失。
分析结果表明,信号量机制有效地解决了进程之间的资源竞争和协调问题。
(三)进程通信实验结果通过管道实现了父进程和子进程之间的数据通信。
数据能够准确地在进程之间传递,验证了管道通信的有效性。
五、遇到的问题及解决方法(一)在进程创建实验中,遇到了参数设置不正确导致进程创建失败的问题。
通过仔细查阅文档和调试,最终正确设置了参数,成功创建了进程。
(二)在进程同步实验中,出现了信号量使用不当导致死锁的情况。
计算机操作系统实验报告一、实验目的本次计算机操作系统实验的主要目的是深入了解操作系统的工作原理和功能,通过实际操作和观察,增强对操作系统概念的理解,提高解决实际问题的能力。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio 20193、编程语言:C++三、实验内容1、进程管理实验创建多个进程,并观察它们的执行顺序和资源占用情况。
使用进程控制块(PCB)来跟踪进程的状态变化,如就绪、运行、阻塞等。
2、内存管理实验模拟内存分配和回收算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察不同算法在内存利用率和分配效率方面的表现。
3、文件系统实验创建、读取、写入和删除文件,了解文件的操作流程。
研究文件的存储结构和目录管理方式。
4、线程同步与互斥实验使用互斥锁和信号量来实现线程之间的同步和互斥操作。
观察在多线程环境下资源竞争和同步的效果。
四、实验步骤1、进程管理实验步骤编写 C++程序,使用系统调用创建多个进程。
在每个进程中输出进程的标识符和当前执行时间。
通过观察控制台输出,分析进程的执行顺序和资源占用情况。
2、内存管理实验步骤实现不同的内存分配算法,并在程序中模拟内存请求和释放的过程。
记录每次内存分配和回收的结果,计算内存利用率和分配时间。
3、文件系统实验步骤使用文件操作函数创建文件,并写入一些数据。
读取文件中的数据,并将其输出到控制台。
删除文件,观察文件系统的变化。
4、线程同步与互斥实验步骤创建多个线程,共享一些公共资源。
在访问公共资源的代码段前使用互斥锁或信号量进行同步控制。
观察线程的执行结果,确保资源的正确访问和修改。
五、实验结果与分析1、进程管理实验结果与分析实验结果显示,进程的执行顺序是不确定的,取决于操作系统的调度策略和进程的优先级。
资源占用情况也因进程的不同而有所差异,一些进程可能占用较多的 CPU 时间和内存,而另一些则相对较少。
2、内存管理实验结果与分析首次适应算法在分配速度上较快,但容易产生内存碎片。
实验二进程调度1.目的和要求通过这次实验,理解进程调度的过程,进一步掌握进程状态的转变、进程调度的策略,进一步体会多道程序并发执行的特点,并分析具体的调度算法的特点,掌握对系统性能的评价方法。
2.实验内容阅读教材《计算机操作系统》第二章和第三章,掌握进程管理及调度相关概念和原理。
编写程序模拟实现进程的轮转法调度过程,模拟程序只对PCB进行相应的调度模拟操作,不需要实际程序。
假设初始状态为:有n个进程处于就绪状态,有m个进程处于阻塞状态。
采用轮转法进程调度算法进行调度(调度过程中,假设处于执行状态的进程不会阻塞),且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。
程序要求如下:1)输出系统中进程的调度次序;2)计算CPU利用率。
3.实验环境Windows操作系统、VC++6.0C语言4设计思想:(1)程序中进程可用PCB表示,其类型描述如下:struct PCB_type{int pid ; //进程名int state ; //进程状态2——表示“执行”状态1——表示“就绪”状态0——表示“阻塞”状态int cpu_time ; //运行需要的CPU时间(需运行的时间片个数)}用PCB来模拟进程;(2)设置两个队列,将处于“就绪”状态的进程PCB挂在队列ready中;将处于“阻塞”状态的进程PCB挂在队列blocked中。
队列类型描述如下:struct QueueNode{struct PCB_type PCB;Struct QueueNode *next;}并设全程量:struct QueueNode *ready_head=NULL,//ready队列队首指针*ready_tail=NULL , //ready队列队尾指针*blocked_head=NULL,//blocked队列队首指针*blocked_tail=NULL; //blocked队列队尾指针(3)设计子程序:start_state();读入假设的数据,设置系统初始状态,即初始化就绪队列和阻塞队列。
实验报告实验课程: 计算机操作系统学生姓名: XXX 学号: XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程错误!未定义书签。
实验二进程调度 ..... 错误!未定义书签。
实验三死锁避免—银行家算法的实现错误!未定义书签。
实验四存储管理 ..... 错误!未定义书签。
实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“”。
2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息序号进程名称进程ID线程数量占用内存优先级占CPU时间虚拟内存173********k标准0:00:009200k 2722834124k高0:00:043372k 35144308588k标准0:00:1543652k 446681120700k标准0:00:0123572k 5590831716k标准0:00:002128k 658161730340k标准0:00:1121720k3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:、、、,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。
4、在任务管理器中找到进程“”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论是管理桌面图标的文件(说出进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“”的各项信息,并填写下表:进程:中的各个线程序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关1000016B800000104 8100:00:064998336 2000016B8000003EC15150:00:008 3000016B8000009048100:00:0011 4000016B800000A0C8100:00:0013 5000016B800001280880:00:07817138 6000016B8000013D88100:00:002326 6、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。
实验报告实验课程: 计算机操作系统学生姓名: XXX 学号: XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程错误!未定义书签。
实验二进程调度 ..... 错误!未定义书签。
实验三死锁避免—银行家算法的实现错误!未定义书签。
实验四存储管理 ..... 错误!未定义书签。
实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“”。
2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:、、、,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。
4、在任务管理器中找到进程“”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论是管理桌面图标的文件(说出进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“”的各项信息,并填写下表:进程:中的各个线程序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关1000016B800000104 8100:00:064998336 2000016B8000003EC15150:00:0086、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。
《操作系统》课内实验报告一、实验目的操作系统是计算机系统的核心组成部分,本次《操作系统》课内实验旨在通过实际操作和观察,深入理解操作系统的基本原理、功能和运行机制。
具体目的包括:1、熟悉操作系统的常用命令和操作,如文件管理、进程管理、内存管理等。
2、掌握操作系统的资源分配和调度策略,观察其对系统性能的影响。
3、培养解决操作系统相关问题的能力,提高动手实践和分析问题的能力。
二、实验环境本次实验在以下环境中进行:1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code三、实验内容及步骤(一)文件管理实验1、创建、删除和重命名文件及文件夹打开文件资源管理器,在指定目录下创建新的文件夹和文本文件。
对创建的文件和文件夹进行重命名操作,观察文件名的变化。
选择部分文件和文件夹进行删除操作,验证是否成功删除。
2、文件复制、移动和属性设置选取一些文件,将其复制到其他目录,并观察复制过程和结果。
把特定文件移动到不同的位置,检查文件是否正确迁移。
设置文件的属性,如只读、隐藏等,查看属性设置后的效果。
(二)进程管理实验1、查看系统进程打开任务管理器,观察当前正在运行的进程列表。
了解进程的名称、PID(进程标识符)、CPU 使用率、内存占用等信息。
2、进程的终止和优先级设置选择一个非关键进程,尝试终止其运行,观察系统的反应。
调整某些进程的优先级,观察其对系统资源分配和运行效率的影响。
(三)内存管理实验1、查看内存使用情况通过系统性能监视器,查看物理内存和虚拟内存的使用情况。
观察内存使用量随时间的变化趋势。
2、内存优化操作关闭一些不必要的后台程序,释放占用的内存资源。
调整虚拟内存的大小,观察对系统性能的改善效果。
四、实验结果与分析(一)文件管理实验结果1、成功创建、删除和重命名文件及文件夹,系统能够准确响应操作,文件名和文件夹名的修改即时生效。
2、文件的复制和移动操作顺利完成,数据无丢失和损坏。
计算机操作系统实验报告计算机操作系统实验报告引言:计算机操作系统作为计算机系统的核心组成部分,承担着管理和控制计算机硬件资源的重要任务。
通过实验,我们可以更好地理解操作系统的工作原理和功能,掌握操作系统的基本操作和管理技巧。
本文将结合实验结果,对操作系统实验进行总结和分析。
实验一:操作系统安装与配置在这个实验中,我们学习了操作系统的安装和配置过程。
通过选择合适的操作系统版本、设置分区和文件系统等步骤,成功地安装了操作系统。
同时,我们还学习了如何进行系统配置,包括网络设置、用户管理和软件安装等。
通过这个实验,我们对操作系统的基本安装和配置有了更深入的了解。
实验二:进程管理进程是操作系统中最基本的执行单位,也是操作系统资源管理的核心。
在这个实验中,我们学习了进程的创建、调度和终止等操作。
通过编写简单的程序,我们可以观察到进程的创建和调度过程,了解进程的状态转换和资源分配。
同时,我们还学习了进程间通信的方式,如共享内存和消息传递等。
通过这个实验,我们对进程管理有了更深入的理解。
实验三:内存管理内存管理是操作系统中重要的一部分,它负责管理和分配计算机的内存资源。
在这个实验中,我们学习了内存的分配和回收算法,如连续分配和非连续分配等。
通过编写程序,我们可以观察到内存的分配和回收过程,了解内存的管理策略和算法。
同时,我们还学习了虚拟内存的概念和实现原理,通过页面置换算法实现了虚拟内存的管理。
通过这个实验,我们对内存管理有了更深入的认识。
实验四:文件系统文件系统是操作系统中用于管理和存储文件的一种机制。
在这个实验中,我们学习了文件系统的基本操作和管理技巧。
通过创建文件、目录和链接等操作,我们可以更好地理解文件系统的结构和组织方式。
同时,我们还学习了文件的读写和权限管理等操作,通过编写程序实现了对文件的操作。
通过这个实验,我们对文件系统有了更深入的了解。
实验五:设备管理设备管理是操作系统中负责管理和控制计算机设备的一种机制。
2012-2013学年第一学期计算机操作系统实验报告专业:软件工程班级:111033学号:11103325姓名:孟翔提交日期:2013年11月27日目录实验一 Windows多线程..................................................1实验二 Windows线程同步机制...........................................5 实验三 Windows线程通信................................................9 实验四银行家算法模拟.................................................15 实验五页面置换算法模拟...............................................22实验一 Windows多线程【开发语言及实现平台或实验环境】C++/C#Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET【实验目的】(1) 进一步理解操作系统的并发性;(2) 了解Windows线程创建方法,并通过查阅资料理解各参数的含义;(3) 了解多线程程序设计方法,并进行简单应用。
【实验要求】(1) 逐程序进行简要分析、运行各程序并仔细阅读注释;(2) 查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;(3) 完成实验报告。
【相关知识】一、核对象(一) 核对象的概念核对象是核分配的一个存块,这种存块是一个数据结构,表示核对象的各种特征。
并且只能由核来访问。
应用程序若需要访问核对象,需要通过操作系统提供的函数来进行,不能直接访问核对象(Windows 从安全性方面来考虑的)。
核对象通过Create* 来创建,返回一个用于标识核对象的句柄,这些句柄(而不是核对象)可在创建进程围使用,不能够被传递到其他进程中被使用。
计算机操作系统实验课实验报告一、实验目的本次计算机操作系统实验课的主要目的是通过实际操作和观察,深入理解计算机操作系统的基本原理和功能,提高对操作系统的实际运用能力和问题解决能力。
二、实验环境本次实验使用的计算机配置为:处理器_____,内存_____,操作系统为_____。
实验所使用的软件工具包括_____。
三、实验内容及步骤(一)进程管理实验1、编写程序创建多个进程,并观察进程的执行顺序和资源分配情况。
首先,使用编程语言(如 C 或 Java)编写代码,创建多个进程。
然后,通过操作系统提供的工具(如任务管理器)观察进程的创建、执行和结束过程。
记录不同进程的执行时间、CPU 使用率和内存占用情况。
2、实现进程间的通信机制,如管道、消息队列等。
分别编写使用管道和消息队列进行进程间通信的程序。
在程序中发送和接收数据,并观察通信的效果和数据的完整性。
(二)内存管理实验1、模拟内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
编写程序实现上述三种内存分配算法。
输入不同的内存请求序列,观察每种算法下内存的分配情况和碎片产生情况。
2、研究虚拟内存的工作原理,并进行相关实验。
通过操作系统的设置,调整虚拟内存的大小。
运行大型程序,观察虚拟内存的使用情况和系统性能的变化。
(三)文件系统实验1、实现文件的创建、读写和删除操作。
使用编程语言创建文件,并向文件中写入数据。
读取文件中的内容,并进行验证。
删除文件,观察文件系统的变化。
2、研究文件系统的目录结构和文件权限管理。
观察文件系统的目录层次结构,了解目录的组织方式。
设置文件的权限,如只读、读写、执行等,观察不同权限对文件操作的影响。
四、实验结果与分析(一)进程管理实验结果与分析1、在创建多个进程的实验中,发现进程的执行顺序并非完全按照创建的顺序,而是由操作系统的调度算法决定。
某些进程可能会因为等待资源而暂时被挂起,而其他进程则会得到执行机会。
2、通过进程间通信实验,发现管道通信方式简单直接,但只能用于具有亲缘关系的进程之间;消息队列则更加灵活,可以在不同的进程之间传递消息,但需要更多的编程和管理工作。
操作系统实验2 (一)实验目的完成一个监视指定的若干目录变动情况的(服务)程序。
(二)实验内容利用inotify机制进行文件或文件夹的监控。
(三)实验结果fileMonitor为程序名称,源码如下:#include <sys/inotify.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/types.h>#include <sys/stat.h>#include <signal.h>#include <syslog.h>#include <fcntl.h>#include <sys/resource.h>#include <errno.h>//#define _DEBUG#define _DAEMON#define EVENT_NUM 16#define BUF_SIZE 10240#ifdef _DAEMONchar * fileConf = "/etc/fileMonitor.conf";char * fileScan = "/etc/fileMonitor.scan";char * fileLog = "/etc/fileMonitor.log";#elsechar * fileConf = "fileMonitor.conf";char * fileScan = "fileMonitor.scan";char * fileLog = "fileMonitor.log";struct wd_name{int wd;char * name;};int wd_NUM = 0;struct wd_name * wd_array;//struct stat buf; // for detimine the type of file.const int filenameLen = 500;const int filelistLen = 10000;char files[10000][500];char buffer[BUF_SIZE];char logmsg[500];FILE * fplog;int fd, wd;char *offset = NULL;struct inotify_event *event;int len, tmp_len;char strbuf[16];int i = 0;int m_argc;char **m_argv;int sleeptime=1;char * event_array[]={"File was accessed","File was modified","File attributes were changed","writtable file closed","Unwrittable file closed","File was opened","File was moved from X","File was moved to Y","Subfile was created","Subfile was deleted","Self was deleted","Self was moved","Backing fs was unmounted","Event queued overflowed","File was ignored"};int init(int argc, char **argv);int readConfig(char * filename);int resetConfig(char * filename);int readScan(char * filename, int cur);int parseCmd(char * filename,int argc, char **argv);int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag);// no recursivelyint execCmdN(char** dirs,int dsize, char * filename,int cur);// recursivelyint execCmdR(char** dirs, int dsize, char * filename,int cur);// with file typeint execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur);// only filesint execCmdF(char** f_files,int fsize,int cur);char * getTime(){time_t now;struct tm *timenow;char strtemp[500];time(&now);timenow = (struct tm *)localtime(&now);return (char*)asctime(timenow);//printf("recent time is : %s \n", asctime(timenow));}//for selectint isready(int fd){int rc;fd_set fds;struct timeval tv;FD_ZERO(&fds);FD_SET(fd, &fds);_sec = _usec = 0;rc = select(fd+1, &fds, NULL, NULL, &tv);if( rc<0 ) //errorexit(-1);return FD_ISSET(fd, &fds) ? 1: 0;}//for daemon#define LOCKFILE "/var/run/fileMonitor.pid"#define LOCKMODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)int daemonize(const char *cmd){int i,fd0,fd1,fd2;pid_t pid;struct rlimit r1;struct sigaction sa;umask(0); //Clear file creation maskif(getrlimit(RLIMIT_NOFILE,&r1) < 0){printf("getrlimit error.\n");exit(1);}if((pid = fork()) < 0 ){printf("fork1 error.\n");exit(2);}else if(pid > 0)//Parent{exit(0);}setsid();sa.sa_handler = SIG_IGN;sigemptyset(&sa.sa_mask);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL)<0){printf("sigaction error.\n");exit(3);}if((pid=fork()) < 0){printf("fork2 error.\n");exit(2);}else if(pid > 0){exit(0);}if(chdir("/") < 0){printf("chdir error.\n");exit(4);}//close(0); /* close stdin */ // for file.scan and file.conf //close(1); /* close stdout */ // for file.scan and file.conf //close(2); /* close stderr */openlog(cmd,LOG_PID, LOG_USER);syslog(LOG_INFO,"fileMonitor Start\n");}int lockfile(int fd){struct flock f1;f1.l_type = F_WRLCK;f1.l_start = 0;f1.l_whence = SEEK_SET;f1.l_len = 0;return(fcntl(fd,F_SETLK,&f1));}int already_running(void){int fd;char buf[16];fd = open(LOCKFILE,O_RDWR|O_CREAT,LOCKMODE);if(fd < 0){printf("Can't Open %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't Open %s:%s",LOCKFILE,strerror(errno));exit(1);}if(lockfile(fd) < 0){if(errno == EACCES || errno == EAGAIN){close(fd);return 1;}printf("Can't lock %s:%s\n",LOCKFILE,strerror(errno));syslog(LOG_INFO,"Can't lock %s:%s",LOCKFILE,strerror(errno));exit(1);}ftruncate(fd,0);sprintf(buf,"%ld",(long)getpid());write(fd,buf,strlen(buf));return 0;}void sigterm(int signo){syslog(LOG_INFO,"got SIGTERM,EXIT");fclose(fplog);closelog();exit(0);}void reread(void){syslog(LOG_INFO,"Re-read configuration file ok");init(m_argc, m_argv);}void sighup(int signo){syslog(LOG_INFO,"Re-Reading configuration file");reread();}int main(int argc, char **argv){#ifdef _DAEMONstruct sigaction sa;daemonize(argv[0]);if(already_running()){printf("fileMonitor already running\n");syslog(LOG_INFO,"fileMonitor already running\n");exit(2);}sa.sa_handler = sigterm;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGTERM);sa.sa_flags = 0;if(sigaction(SIGTERM,&sa,NULL) < 0){syslog(LOG_INFO,"Can't Catch SIGTERM:%s",strerror(errno));exit(1);}sa.sa_handler = sighup;sigemptyset(&sa.sa_mask);sigaddset(&sa.sa_mask,SIGHUP);sa.sa_flags = 0;if(sigaction(SIGHUP,&sa,NULL) < 0){syslog(LOG_INFO,"Can't catch SIGHUP:%s",strerror(errno));exit(1);}#endifm_argc = argc;m_argv = argv;fd = inotify_init();if (fd < 0) {#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to initialize inotify.\n");syslog(LOG_INFO,logmsg);#elseprintf("Fail to initialize inotify.\n");#endifexit(-1);}fplog = fopen(fileLog,"wb");init(m_argc, m_argv);memset(logmsg,0,500);while(1){if (isready(fd)){if(len = read(fd, buffer, BUF_SIZE)) {offset = buffer;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"%s\tSome event happens, len = %d.\n",getTime(), len);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#endif#ifdef _DEBUGprintf("%s\tSome event happens, len = %d.\n",getTime(), len);#endifevent = (struct inotify_event *)buffer;while (((char *)event - buffer) < len){if (event->mask & IN_ISDIR){strcpy(strbuf, "Direcotory");}else{strcpy(strbuf, "File");}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject type: %s\n", strbuf);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tObject type: %s\n", strbuf);#endif#endiffor (i=0; i<wd_NUM; i++){if (event->wd != wd_array[i].wd) continue;#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tObject name: %s\n", wd_array[i].name);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tObject name: %s\n", wd_array[i].name);#endif#endifbreak;}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent mask: %08X\n", event->mask);fwrite(logmsg, 1 , sizeof(logmsg),fplog);printf("\tEvent mask: %08X\n", event->mask);#endif#endiffor (i=0; i<EVENT_NUM; i++){if (event_array[i][0] == '\0') continue;if (event->mask & (1<<i)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);syslog(LOG_INFO,logmsg);#elsememset(logmsg,0,500);sprintf(logmsg,"\tEvent: %s\n", event_array[i]);fwrite(logmsg, 1 , sizeof(logmsg),fplog);#ifdef _DEBUGprintf("\tEvent: %s\n", event_array[i]);#endif#endif}}tmp_len = sizeof(struct inotify_event) + event->len;event = (struct inotify_event *)(offset + tmp_len);offset += tmp_len;}fflush(fplog);}}#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"\tEsleep time %d\r",sleeptime);syslog(LOG_INFO,logmsg);#elseprintf("sleep time %d\r", sleeptime);fflush(stdout);#endiffflush(stdout);init(m_argc, m_argv);read(fd, buffer, BUF_SIZE);sleep(sleeptime);}return 0;}// read the configure from file.confint readConfig(char * filename){FILE * fp;fp = fopen(filename,"r");if(fp == NULL){memset(logmsg,0,500);sprintf(logmsg,"%s created.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("No %s exists.\n", filename);printf("%s created.\n", filename);#endifresetConfig(filename);fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s can not read.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s can not read.\n", filename);#endifexit(-1);}}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;int rflag = 0;int type = 0;int ret = 0;while(!feof(fp) && type < 4){fgets(buffer,filenameLen, fp);if(buffer[0] == '#'){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifcontinue;}if(0 == strcmp(buffer, "[DIRECTORY]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_dirs[cur_dir] = (char *) malloc(sizeof(char)*500);strcpy(f_dirs[cur_dir], buffer); // save typecur_dir++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[FILE_TYPE]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';f_files[cur_file] = (char *) malloc(sizeof(char)*500);strcpy(f_files[cur_file], buffer); // save typecur_file++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[FILE_TYPE]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#' && 0!= strcmp(buffer,"[Time]\n")){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);buffer[len-1]='\0';fileTypes[cur_type] = (char*)malloc(sizeof(char) * 500);strcpy(fileTypes[cur_type],buffer); // save itcur_type++;}fgets(buffer,filenameLen, fp);}}else if(0 == strcmp(buffer, "[Time]\n")){type++;fgets(buffer,filenameLen, fp);if(strlen(buffer) > 1)while(!feof(fp) && buffer[0] != '#'){#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d %s",strlen(buffer),buffer);syslog(LOG_INFO,logmsg);#elseprintf("%d %s",strlen(buffer),buffer);fflush(stdout);#endif#endifif(strlen(buffer) > 1){int len = strlen(buffer);//buffer[len-1]='\0';sleeptime = atoi(buffer);}fgets(buffer,filenameLen, fp);}}}if(type != 4){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is broken. Reset the configure....\n", filename);syslog(LOG_INFO,logmsg);resetConfig(filename);memset(logmsg,0,500);sprintf(logmsg,"%s is read again....\n", filename);syslog(LOG_INFO,logmsg);return readConfig(filename);#elseprintf("%s is broken. Reset the configure....\n", filename);resetConfig(filename);printf("%s is read again....\n", filename);return readConfig(filename);#endif}if(cur_dir + cur_file == 0 || (cur_dir ==0 && cur_type != 0)){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s is not configured correctly. Set the configure please.\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("%s is not configured correctly. Set the configure please.\n", filename);#endif//resetConfig(filename);exit(-1);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);syslog(LOG_INFO,logmsg);#elseprintf("%d lines read %d types.\n",cur_dir +cur_type + cur_file, cur_type);#endif#endiffclose(fp);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. \n");fflush(stdout);#endif#endif// default is with recursivelyret = execCmd(f_dirs, f_files, fileTypes, cur_dir, cur_file, cur_type, fileScan, 1);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is readConfig function. ret %d\n",ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is readConfig function. ret %d\n",ret);fflush(stdout);#endif#endiffor(i = 0; i < cur_dir; i++){free(f_dirs[i]);}for(i = 0; i < cur_type; i++){free(fileTypes[i]);}return ret;}// reset the file.conf if errorint resetConfig(char * filename){FILE * fp;fp = fopen(filename,"w");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Can not open %s\n", filename);syslog(LOG_INFO,logmsg);#elseprintf("Can not open %s\n", filename);#endifexit(-1);}fputs("#This is the configure file for fileMonitor.\n", fp);fputs("#DO NOT CHANGE the structure of this file.\n", fp);fputs("#In this place you can add the directories to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/dir\n", fp);fputs("[DIRECTORY]\n", fp);fputs("/home\n\n", fp);fputs("#In this place you can add the files to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|/home/tuxe/file\n", fp);fputs("[FILE]\n\n", fp);fputs("#In this place you can add file types to be monitored.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|*.txt\n", fp);fputs("[FILE_TYPE]\n", fp);fputs("*.txt\n\n", fp);fputs("#In this place you can add time option.\n", fp);fputs("#Be aware that there is no space in front of each line.\n", fp);fputs("#Remmember that PRESS Enter at the end of each line.\n", fp);fputs("#EXAMPLE|2\n", fp);fputs("[Time]\n", fp);fputs("1\n\n", fp);fclose(fp);}// parse the cmd and set files// return the wd_NUM;int parseCmd(char * filename, int argc, char **argv){int cmd_num = argc - 1;int offset = 1;// this test is no necessary.if(cmd_num <= 0){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Unknown error.\n");syslog(LOG_INFO,logmsg);#elseprintf("Unknown error.\n");#endifexit(-1);}int cur_file = 0;int cur_dir = 0;int cur_type = 0;char *f_dirs[500]; // for record the files//so the max dirs cmd list len is 500 char *fileTypes[500]; // for record the file type// so the max fileType cmd list len is 500 char *f_files[500]; // for record the files// so the max fileType cmd list len is 500 char * p;int i;char type = 'a';int rflag = 0;for(i = 0; i < cmd_num; i++){p = argv[i + offset];if(0 == strcmp(p, "--help")){printf("Usage:fileMonitor -d dirs -f files [-t fileTypes]\n\--help show help information\n\-f this is to set some files\n example -f /home/file1 /home/n.c\n\-d this is to set some directories\n example -d /home /tmp\n\-t this is optional to set some file_types\n example -t *.txt *.png\n\ -n set the time to monitor the directories\n example -n 2\n\-r to monitor with recursively\n\This program is used for monitor some files coded by Ren Gaojun, China.\n");fflush(stdout);exit(0);}if(0 == strcmp(p, "-f")){type = 'f';continue;}else if(0 == strcmp(p, "-d")){type = 'd';continue;}else if(0 == strcmp(p, "-t")){type = 't';continue;}else if(0 == strcmp(p,"-r")){type = 'a';rflag = 1;continue;}else if(0 == strcmp(p,"-n")){type = 'n';continue;}if( type == 'f'){f_files[cur_file++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type f %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type f %s \n",p);#endif#endif}else if( type == 'd'){f_dirs[cur_dir++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type d %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type d %s \n",p);#endif#endif}else if( type == 't'){fileTypes[cur_type++] = p;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type t %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type t %s \n",p);#endif#endif}else if( type == 'n'){sleeptime = atoi(p);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"type n %s \n",p);syslog(LOG_INFO,logmsg);#elseprintf("type n %s \n",p);#endif#endif}}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file, cur_type, rflag);syslog(LOG_INFO,logmsg);#elseprintf("%d cmd_num %d dirs %d files %d types %d rflag.\n",cmd_num,cur_dir, cur_file,cur_type, rflag);#endif#endifreturn execCmd(f_dirs,f_files, fileTypes, cur_dir,cur_file, cur_type, filename, rflag);}// execute the command to get the file list with recursively.int execCmd(char** dirs, char** f_files, char** filetypes, int dsize,int fsize, int tsize, char * filename, int flag){int i = 0;int ret = 0;memset(buffer,0,BUF_SIZE);//sprintf(buffer,"find %s -name '%s' > file.scan",argv[1] , argv[2]);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function.\n");fflush(stdout);#endif#endifif(tsize > 0) // with filetype{ret = execCmdT(dirs,filetypes,dsize, tsize, filename,0);}if(fsize > 0)ret = execCmdF(f_files,fsize, ret);if(dsize > 0){if(!flag) // not set the recursively flagret = execCmdN(dirs,dsize, filename,ret);elseret = execCmdR(dirs,dsize, filename,ret);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmd function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmd function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// with file type.int execCmdT(char** dirs, char** filetypes, int dsize, int tsize, char * filename,int cur){int i =0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. dsize %d, tsize %d\n", dsize, tsize);fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}strcat(buffer,"-name '");char tmp[BUF_SIZE];strcpy(tmp,buffer); // save the buffer.for(i = 0; i < tsize; i++) // each time search one type of file{strcat(buffer,filetypes[i]);strcat(buffer,"' > ");strcat(buffer,filename);system(buffer);#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"ret %d %s\n",ret, filename);syslog(LOG_INFO,logmsg);#elseprintf("ret %d %s\n",ret, filename);fflush(stdout);#endif#endifstrcpy(buffer,tmp);}#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdT function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdT function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with recursively.int execCmdR(char** dirs, int dsize, char * filename,int cur){int i = 0;int ret = cur;memset(buffer,0,BUF_SIZE);#ifdef _DEBUGmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. \n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. \n");fflush(stdout);#endif#endifstrcpy(buffer,"find ");for(i = 0; i < dsize; i++){strcat(buffer,dirs[i]);strcat(buffer," ");}// strcat(buffer,"-type d > ");strcat(buffer," > ");strcat(buffer,filename);system(buffer);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"%s\n",buffer);syslog(LOG_INFO,logmsg);#elseprintf("%s\n",buffer);fflush(stdout);#endif#endifret = readScan(filename,ret);#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdR function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdR function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the filesint execCmdF(char** f_files,int fsize,int cur){int i = 0;int ret = 0;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function.\n");fflush(stdout);#endif#endiffor(i = 0; i < fsize; i++){strcpy(files[cur + i], f_files[i]);}ret = fsize + cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdF function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdF function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}// execute the command to get the file list with no recursively.// just monitor the directory no filetypeint execCmdN(char** dirs,int dsize, char * filename,int cur){int i = 0;int ret = cur;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function.\n");syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function.\n");fflush(stdout);#endif#endiffor(i = cur; i < dsize + cur; i++){strcpy(files[i], dirs[i-cur]);}ret = i;#ifdef _DEBUG#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Here is execCmdN function. ret %d\n", ret);syslog(LOG_INFO,logmsg);#elseprintf("Here is execCmdN function. ret %d\n", ret);fflush(stdout);#endif#endifreturn ret;}int readScan(char * filename, int cur){int num = cur;FILE * fp;fp = fopen(filename,"r");if(fp == NULL){#ifdef _DAEMONmemset(logmsg,0,500);sprintf(logmsg,"Fail to open %s.\n", filename);syslog(LOG_INFO,logmsg);#endifprintf("Fail to open %s.\n", filename);exit(-1);}while(num < filelistLen && !feof(fp)) // read files and save them.{int L;fgets(files[num],filenameLen,fp);。
实验报告实验课程: 计算机操作系统学生姓名: XXX 学号: XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程 (2)实验二进程调度 (7)实验三死锁避免—银行家算法的实现 (14)实验四存储管理 (16)实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。
2、通过任务管理器识别操作系统中的进程和线程的相关信息。
3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。
三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“”。
2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息序号进程名称进程ID线程数量占用内存优先级占CPU时间虚拟内存173********k标准0:00:009200k 2722834124k高0:00:043372k 35144308588k标准0:00:1543652k 446681120700k标准0:00:0123572k 5590831716k标准0:00:002128k 658161730340k标准0:00:1121720k3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。
再从任务管理器中分别找到下列程序:、、、,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。
4、在任务管理器中找到进程“”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论是管理桌面图标的文件(说出进程的作用)。
5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“”的各项信息,并填写下表:进程:中的各个线程序号进程ID线程ID基本优先级当前优先级CPU时间上下文开关1000016B800000104 8100:00:064998336 2000016B8000003EC15150:00:008 3000016B8000009048100:00:0011 4000016B800000A0C8100:00:0013 5000016B800001280880:00:07817138 6000016B8000013D88100:00:002326 6、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。
操作系统课程设计报告专业:学号:姓名提交日期:【设计目的】1、本实验的目的是通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现。
2、结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
……………………………………..【设计内容】为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:①可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录②列目录时要列出文件名,物理地址,保护码和文件长度③源文件可以进行读写保护………………………………….【实验环境】Windows7操作平台Visual Studio2010【相关知识综述】理解二级目录的文件系统的组织;掌握常用的数据结构;系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件;使用文件来模拟外存,进行数据结构设计和操作算法的设计,实现一个文件系统并实现基本的文件操作(为了简便文件系统,不考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容)。
【设计思路】采用的数据结构、主要的函数说明、程序流程设计等本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记1.主要的数据结构#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename表示三种文件的长度都为25*/#define MAXCHILD 50 /*the largest child每个用户下可以有50个文件*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno定义一个常量2500个扇区*/typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address物理地址*/int flength; /*file length文件长度*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/ char fname[MAXNAME]; /*file name文件名*/} OSFILE;typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;/*osf文件的数据结构*/typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;2.主要函数void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CdF(); /*Change Dir*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem退出文件系统*/void help();3.总体功能程序结构图①打开命令的程序流程图②关闭命令的程序流程图③写命令程序流程图④删除命令的程序流程图:【源程序清单】#include "stdio.h"#include "string.h"#include "conio.h"#include "stdlib.h"#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename表示三种文件的长度都为25*/#define MAXCHILD 50 /*the largest child每个用户下可以有50个文件*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno定义一个常量2500个扇区*/typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address物理地址*/int flength; /*file length文件长度*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;文件标识可读可写可执行*/char fname[MAXNAME]; /*file name文件名*/} OSFILE;//osfile文件的数据结构,一级文件系统上创建的文件上例如W ANGFANG存储的就是这些内容typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD;/*osf文件的数据结构*/typedef struct /*the structure of OSUFD'LOGIN登录文件的数据结构*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/}OSUFD_OPENMODE;OSUFD *ufd[MAXCHILD]; /*ufd and ufd own files将osfile实例化ufd,有50个指向该结构的指针*/OSUFD_LOGIN ufd_lp;//声明了一个具体的变量int ucount=0; /*the count of mfd's ufds表示用户的个数*/int fcount[MAXCHILD]; /*the count of ufd's files*/int loginsuc=0; /*whether login successfully*/char username[MAXNAME]; /*record login user's name22定义了一个字符数组,存放用户名最大可放25个*/char dirname[MAXNAME];/*record current directory*/int fpaddrno[MAX]; /*record file physical address num*/OSUFD_OPENMODE ifopen[MAXCHILD][MAXCHILD]; /*record file open/close*/int wgetchar; /*whether getchar()*/FILE *fp_mfd,*fp_ufd,*fp_file_p,*fp_file;void LoginF(); /*LOGIN FileSystem*/void DirF(); /*Dir FileSystem*/void CdF(); /*Change Dir*/void CreateF(); /*Create File*/void DeleteF(); /*Delete File*/void ModifyFM(); /*Modify FileMode*/void OpenF(); /*Open File*/void CloseF(); /*Close File*/void ReadF(); /*Read File*/void WriteF(); /*Write File*/void QuitF(); /*Quit FileSystem退出文件系统*/void help();char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/void InputPW(char *password); /*input password,use '*' replace*/void SetPANo(int RorW); /*Set physical address num设置物理地址*/int ExistD(char *dirname); /*Whether DirName Exist,Exist-i,Not Exist-0该函数在退出的时候将内容写回磁盘*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int FindPANo(); /*find out physical address num找到物理地址*///清屏void clrscr(){system("cls");}int main(){int i,choice1;char choice[50]; /*choice operation:dir,create,delete,open,delete,modify,read,write*/int choiceend=1; /*whether choice end表示选择是否结束*/char *rtrim(char *str); /*remove the trailing blanks.去除后面的空格*/char *ltrim(char *str); /*remove the heading blanks.去除前面的空格*///该if语句的目的只是为了检测该文件是否存在,若不存在则创建if((fp_mfd=fopen("c:\\osfile\\mfd.txt","rb"))==NULL)//以只写的方式打开文件,返回一个指针,若不存在{fp_mfd=fopen("c:\\osfile\\mfd.txt","wb");//则创建该文件fclose(fp_mfd);//创建成功之后关闭该文件}//将模拟的磁盘区域全部初始化为零for(i=0;i<MAX;i++) fpaddrno[i]=0;//textattr(BLACK*16|WHITE);clrscr(); /*clear screen*/LoginF(); /*user login*/clrscr();if(loginsuc==1) /*Login Successfully*/{while (1){wgetchar=0;if (choiceend==1)printf("\n\nC:\\%s>",strupr(dirname));elseprintf("Bad command or file name.\nC:\\%s>",strupr(username));gets(choice);//输入所选择的strcpy(choice,ltrim(rtrim(strlwr(choice))));//将输入的值赋给choiceif (strcmp(choice,"dir")==0) choice1=1;//依次将输入的值与dir,create等等进行比较else if(strcmp(choice,"create")==0) choice1=2;//如果输入create 则将choice1置为2通过switch进行选择else if(strcmp(choice,"delete")==0) choice1=3;//依次内推else if(strcmp(choice,"attrib")==0) choice1=4;else if(strcmp(choice,"open")==0) choice1=5;else if(strcmp(choice,"close")==0) choice1=6;else if(strcmp(choice,"read")==0) choice1=7;else if(strcmp(choice,"write")==0) choice1=8;else if(strcmp(choice,"exit")==0) choice1=9;else if(strcmp(choice,"cls")==0) choice1=10;else if(strcmp(choice,"cd")==0) choice1=11;else if(strcmp(choice,"help")==0) choice1=20;else choice1=12;//choicel=12时跳转到default:choiceend=0;因为while(1)所以要不断循环switch(choice1){case 1:DirF();choiceend=1;break;case 2:CreateF();choiceend=1;if(!wgetchar) getchar();break;case 3:DeleteF();choiceend=1;if(!wgetchar)getchar();break;case 4:ModifyFM();choiceend=1;if(!wgetchar) getchar();break;case 5:OpenF();choiceend=1;if (!wgetchar) getchar();break;case 6:CloseF();choiceend=1;if (!wgetchar) getchar();break;case 7:ReadF();choiceend=1;if (!wgetchar) getchar();break;case 8:WriteF();choiceend=1;if (!wgetchar) getchar();break;case 9:printf("\nYou have exited this system.");QuitF();exit(0);break;case 10:clrscr();choiceend=1;break;case 11:CdF();choiceend=1;break;case 20:help();choiceend=1;break;default:choiceend=0;}}}else //如果没有登录成功printf("\nAccess denied.");}void help(void){printf("\nThe Command List\n");printf("\nCd Attrib Create write Read Open Cls Delete Exit Close\n");}char *rtrim(char *str) /*remove the trailing blanks.除去末尾端的空格符号指针指向字符串第一个*/{int n=strlen(str)-1;//n为字符串的长度减1while(n>=0)//{if(*(str+n)!=' ')//末尾不存在空格{*(str+n+1)='\0';//'\0'表示结束符break;}else n--;//如果存在空格,则将空格去掉}if (n<0) str[0]='\0';return str;}char *ltrim(char *str) /*remove the heading blanks去掉前端空格.*/{strrev(str);//把字符串str的所有字符的顺序颠倒过来(不包括空字符NULL)。
实验一 Windows XP 系统管理一、实验目的1) 了解和学习Windows系统管理工具及其使用;2) 熟悉Windows系统工具的内容和应用;3)熟悉Windows操作系统的应用环境。
二、实验环境需要准备一台运行Windows XP操作系统的计算机。
三、背景知识Windows XP的“管理工具”中集成了许多系统管理工具,利用这些工具,管理员可以方便地实现各种系统维护和管理功能。
这些工具都集中在“控制面板”的“管理工具”选项下,用户和管理员可以很容易地对它们操作和使用。
在默认情况下,只有一些常用工具——如服务、计算机管理、事件查看器、数据源 (ODBC) 、性能和组件服务等——随Windows XP 系统的安装而安装。
四、实验内容与步骤为了帮助用户管理和监视系统,Windows XP提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
步骤1:登录进入Windows XP。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。
在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:1) 本地安全策略:用于配置本地计算机的安全设置。
这些设置包括密码策略、帐户锁定策略、审核策略、IP 安全策略、用户权利指派、加密数据的恢复代理以及其他安全选项。
“本地安全策略”只有在非域控制器的计算机上才可用。
如果计算机是域的成员,这些设置将被从域接收到的策略覆盖。
2) 服务:用于管理计算机上的服务,设置要发生的恢复操作(如果服务失败)以及为服务创建自定义名字和描述从而能够方便地识别它们。
3)计算机管理:用于从单个的统一桌面实用程序管理本地或远程计算机。
“计算机管理”将几个 Windows XP 管理工具合并为一个单独的控制台树,从而更容易访问特定的计算机管理属性。
1. 计算机管理使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows XP管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解Windows 2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000中进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:Windows 2000 Professional、Visual C++ 企业版。
三、实验内容和步骤第一部分:程序1-1Windows 2000 的GUI 应用程序Windows 2000 Professional下的GUI应用程序,使用Visual C++编译器创建一个GUI 应用程序,代码中包括了WinMain()方法,该方法GUI类型的应用程序的标准入口点。
# include <># pragma comment(lib, “” )int APIENTRY WinMain(HINSTANCE /* hInstance */ ,HINSTANCE /* hPrevInstance */,LPSTR /* lpCmdLine */,int /* nCmdShow */ ){:: MessageBox(NULL,“hello, Windows 2000” ,“Greetings”,MB_OK) ;return(0) ; }在程序1-1的GUI应用程序中,首先需要头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到库文件并将其与产生的EXE文件连接起来。
这样就可以运行简单的命令行命令CL 来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。
这一指令是Visual Studio C++ 编译器特有的。
实验名称:操作系统进程管理实验实验目的:1. 理解操作系统进程管理的概念和原理。
2. 掌握进程的创建、调度、同步和通信机制。
3. 通过实验加深对进程管理算法的理解和应用。
实验环境:1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio实验内容:一、实验一:进程的创建与终止1. 实验目的了解进程的创建和终止机制,掌握进程控制块(PCB)的结构和功能。
2. 实验步骤(1)创建一个进程,使用系统调用创建子进程;(2)设置子进程的属性,如优先级、名字等;(3)终止子进程,释放资源;(4)查看进程信息,确认进程创建和终止过程。
3. 实验代码```c#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main() {pid_t pid;printf("Parent process: %d\n", getpid());pid = fork(); // 创建子进程if (pid == 0) {printf("Child process: %d\n", getpid());printf("Child process is running...\n");sleep(5); // 子进程延时5秒exit(0);} else {printf("Child process created: %d\n", pid);wait(NULL); // 等待子进程结束printf("Child process terminated.\n");}return 0;}```4. 实验结果在运行实验代码后,首先输出父进程的进程号,然后输出子进程的进程号,子进程运行5秒后结束,父进程输出子进程终止信息。
2016-2017学年第一学期
计算机操作系统实验报告
专业:计算机科学与技术
班级:141011班
学号:14101103
姓名:傅开煤
提交日期:2016年11月8日
实验二Windows线程同步机制
【开发语言及实现平台或实验环境】
C++/C#
Microsoft Visual Studio 6.0/ Microsoft Visual Studio .NET
【实验目的】
(1) 了解Windows线程同步机制;
(2) 了解互斥体,并通过查阅资料理解互斥体对象的使用方法;
(3) 了解事件,并通过查阅资料理解事件对象的使用方法;
(4) 了解关键区,并通过查阅资料理解关键区对象的使用方法;
(5) 了解信号量,并通过查阅资料理解信号量对象的使用方法;
(6) 利用Windows线程同步机制,模拟生产者消费者问题。
【实验要求】
(1) 逐程序进行简要分析、运行各程序并仔细阅读注释;
(2) 查阅MSDN或其他资料,掌握相关系统调用使用方法和参数含义;
(3) 完成实验报告。
【实验结果与分析】
1.(1)多次运行2-1(mutex).cpp后,其中之一的执行结果如下图:
(2)多次运行修改之后的2-1(mutex).cpp,其中之一的执行结果如下图:
分析:修改之前,在指定暂停的时间Sleep(1000)内,thread1和thread2随机售票,出
现多种情况;将两个子函数中注释掉的Sleep(1)语句让其可用后,thread1和thread2交替售票,即thread1在其暂停的时间Sleep(1)内,thread2获得了对共享对象hMutex的所有权,开始售票,同理当thread2在其暂停的时间Sleep(1)内,thread1获得了对共享对象hMutex 的所有权,开始售票,这样thread1和thread2就实现了交替售票。
2.(1)多次运行2-2(event).cpp后,其中之一的执行结果如下图:
(2)多次运行修改之后的2-2(event).cpp,其中之一的执行结果如下图:
3. (1)多次运行2-3(critical_section).cpp后,其中之一的执行结果如下图:
(2)多次运行修改之后的2-3(critical_section).cpp,其中之一的执行结果如下图:
分析:以上2-2(event).cpp 、2-3(critical_section).cpp的分析与2-1(mutex).cpp相同。
4.(1)运行2-4(Producer_Consumer).cpp后,执行结果如下图:
(2)多次运行修改之后的2-4(Producer_Consumer).cpp,其中之一的执行结果如下图:
分析:修改之前,在指定暂停的时间Sleep(20)内,Producer和Consumer只能执行一次;将两个子函数中注释掉的while语句让其可用后,Producer和Consumer在暂停的时间Sleep(20)内,随机循环获得共享对象的所有权,进行生产或者消费。
从而出现多种结果。
5. 运行2-4(Producer_Consumer)1.cpp后,执行结果如下图:
【实验思考及总结】
进程同步包括进程的互斥和进程的同步两个方面,是操作系统管理共享资源的一种手段。
一、用PV操作实现进程的互斥,只要用一个信号量与一组相关临界区联系起来,信号量的初值定义为“1”。
每个进程要进入临界区之前调用P操作,测试自己是否可以立即进入临界区;执行完临界区的程序段后,调用V操作表示自己退出临界区。
二、用PV操作实现进程的同步时应定义一组信号量,其中每个信号量与一个消息对应,根据各个消息量的物理含意确定初值。
进程通过调用P操作来测定自己需要的消息是否到达,通过调用V操作把其它进程需要的消息发送出去。
多线程设计优点:相对于单线程而言:可以响应多任务的并发操作。
多线程取消了主循环和轮流检测机制,一个线程可以暂停而不阻止系统其他的部分的执行,而且当程序中一个线程阻塞时,只有那个被阻塞的线程暂停,所有其他的线程继续执行。
相对于进程而言:它所要求的开销比较小,转换成本较小。
所有线程共享同一地址空间,相互协作。
彼此之间通信很容易。
缺点:等待共享资源的时候,运行速度会慢下来。
线程管理需要额外的CPU 开销。
如果设计得不合理,程序会变得异常负责。
会引发一些不正常的状态,像饥饿(starving),竞争(racing),死锁(deadlock),活锁(livelock)。
通过这次实验,我体会到线程同步机制的重要性,同时,在选用线程同步机制时也应该根据具体案例的要求选择合适的线程同步机制,对效率要求很高的程序就应该自己编写效率比较高的线程同步算法。