操作系统实验指导书修订版

合集下载

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书实验⼀操作系统⽤户接⼝实验⼀、实验⽬的熟悉操作系统的命令接⼝、图形⽤户接⼝和程序接⼝。

⼆、实验内容:1、使⽤操作系统的命令接⼝。

使⽤Windows常⽤命令:dir 、md、copy、date、help,显⽰这些命令的结果,并解释这些命令的作⽤。

图1-1 命令控制台图1-2 windows常⽤命令图1-3 windows常⽤命令图1-4 windows常⽤命令使⽤图1-5 windows常⽤命令使⽤2、使⽤操作系统的程序接⼝。

VB环境下:编制⼀⼩程序,使其可通过某个系统调⽤来获得os 提供的某种服务,如打开控制⾯板:Shell "rundll32.exe Shell32.dll,Control_RunDLL", 1VC环境下:⽤C语⾔编制⼀个⼩程序,使其可通过Localtime( )系统调⽤来获得OS提供的时间和⽇期。

3、使⽤操作系统的图形⽤户接⼝(略)。

三、思考:OS向⽤户提供的命令接⼝、图形⽤户接⼝和程序接⼝分别适⽤于哪些场合?实验⼆进程创建与撤消⼀、实验⽬的1、加深对进程概念的理解和进程创建与撤消算法;2、进⼀步认识并发执⾏的实质。

⼆、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通⽤户⾝份认识windows的进程管理。

通过windows的“任务管理器”观察进程的状态,进⾏进程的创建、切换和撤销。

(2)语⾔级—以普通程序员⾝份认识⾼级语⾔VC++/Java/VB的进程创建与撤销⼯具。

(3)模拟级—以OS设计师⾝份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。

三、实验步骤1、windows的进程管理当前状态图2-1 windows任务管理器切换前图2-2 windows任务管理器切换后图2-3 windows任务管理器撤销图2-4 windows任务管理器2、VC++进程创建与撤销⼯具Windows所创建的每个进程都从调⽤CreateProcess() API函数开始,该函数的任务是在对象管理器⼦系统内初始化进程对象。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书实验概述本次操作系统实验是为了让学生通过实践了解操作系统的基本概念,原理和使用。

通过完成实验,学生将了解操作系统内核,进程调度,文件系统和输入输出等关键组成部分。

实验环境实验要求使用 Linux 操作系统,可以选择任意一种 Linux 发行版。

可以在物理机上安装 Linux,也可以使用虚拟机软件(如 VirtualBox)来运行 Linux 虚拟机。

实验准备在进行实验之前,需要完成以下准备工作:1.安装 Linux 操作系统(如 Ubuntu、Fedora 等)或虚拟机软件(如VirtualBox)。

2.熟悉 Linux 基本命令和操作,包括文件操作、进程管理等。

实验内容本次操作系统实验分为以下几个部分:1. 实验一:进程管理本部分实验要求学生了解进程管理的基本概念和原理,掌握进程创建、终止和状态转换等操作。

学生需要完成以下任务:•编写一个简单的 C 程序,实现进程的创建、终止和状态转换功能。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析进程的状态转换过程。

2. 实验二:进程调度本部分实验要求学生了解进程调度算法的原理和实现方法,掌握优先级调度、轮转调度和最短作业优先调度等算法。

学生需要完成以下任务:•编写一个简单的 C 程序,模拟进程调度算法的执行过程。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析不同调度算法对进程执行顺序的影响。

3. 实验三:文件系统本部分实验要求学生了解文件系统的基本概念和实现原理,掌握文件的创建、读写和删除等操作。

学生需要完成以下任务:•编写一个简单的 C 程序,实现文件的创建、读写和删除功能。

•使用 Linux 命令行工具编译、运行和调试 C 程序。

•观察和分析文件系统的存储结构和操作过程。

4. 实验四:输入输出本部分实验要求学生了解操作系统的输入输出机制和设备驱动程序的原理和实现方法,掌握文件读写、设备驱动和错误处理等操作。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书实验1 安装Linux操作系统一、实验目的在虚拟机Vmware或者Virtual Box上安装Unbuntu 9.1操作系统,后续实验都将在此环境上进行。

通过实验,要求:1、掌握在虚拟机上安装操作系统的方法;2、学会安装Linux系统;3、学会启动Linux系统;4、学会在宿主机Windows XP操作系统下,与虚拟机上安排的Ubuntu共享文件的方法。

二、实验内容1、把ubuntu安装至虚拟机上。

●加载安装ubuntu操作系统的ISO IMG文件●启动ubuntu虚拟机●按提示分阶段装入系统2、在Windows下通过网络磁盘来访问ubuntu共享文件夹●在虚拟系统Ubuntu下新建一个文件夹,右击该文件夹,选择属性,共享,启用“共享此目录”,并允许他人在此共享里写数据。

注:共享时需要Samba的支持,系统会提示安装。

●安装完成Samba后,需要重启ubuntu才能生效。

此时回到XP时可在网上邻居里看到一个*** - desktop server(Samba,Ubuntu)的共享目录。

●返回Windows XP系统,右击“网上邻居”,选择“映射网络驱动器”,●在“浏览”里找到刚才在Ubuntu下共享的文件夹,选择后完成映射,这时打开“我的电脑”会发现多了一个“网络驱动器”,如同我们的硬盘一样。

这时你可以在XP系统里复制几个文件到相应的网络驱动器,然后进入Ubuntu 系统,就能看到我们刚才复制的文件了;当然,我们也可以往ubuntu共享文件夹里放文件,在XP系统使用。

注:在创建文件共享的时候,注意主机的网卡一定要打开,否则创建共享是不能成功的实验2 Linux系统中程序编辑、编译与调试工具一、实验目的1、熟悉使用Linux字符界面、窗口系统的常用命令。

2、熟悉运用Linux常用的编程工具。

3、掌握在Linux操作系统环境上编辑、编译、调试、运行一个C语言程序的全过程。

二、实验内容1、熟悉开机后登录Linux系统和退出系统的过程;2、掌握一种Linux的编辑器,特别是字符界面的vi工具的使用(详见VI简易使用手栅);3、掌握GCC编译器的基本用法(详见GCC使用手册及常用命令行);4、掌握GDB调试程序的方法(详见GDB调试程序手册)。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

操作系统实验指导书及代码

操作系统实验指导书及代码

操作系统实验指导书及代码《操作系统》实验指导书目录实验环境 ................................................. 1 实验报告要求 ............................................. 1 实验一进程控制与处理机调度综合实验 ..................... 2 实验二存储管理与页面置换算法 (7)实验环境本课程实验硬件环境为PⅢ以上的处理器,带有显示器。

操作系统使用windows98以上操作系统,基本编程环境为Turbo C。

实验报告要求实验报告应包含以下内容:(1)实验题目(2)实验目的(3)实验环境(4)算法描述(5)程序源代码(6)出现的问题(7)对问题的解决方案(8)实验结果与结果分析(9)实验思考(学生对本次实验的收获的总结)实验一进程控制与处理机调度综合实验一、实验目的通过模拟进程控制方法及单处理机系统的进程调度,了解进程的结构,进程的创建与撤消,进程的组织及进程的状态及其转换,掌握进程调度策略。

二、实验学时4学时三、实验内容本实验为单机模拟进程调度算法,在程序设计时不需真正地建立线程或者进程。

实验模拟创建若干进程(人为输入或随机数产生),选择一种或几种单处理机的进程调度算法,如FCFS(先来先服务),SPF(短进程优先),RR(时间片轮转法),优先级算法等,模拟进行进程调度。

每进行一次调度,都打印一次运行进程、就绪队列、以及各个进程的PCB,并能在进程完成后及时撤消该进程。

四、算法描述1 进程及进程的运行状态进程是现代计算机中的基本要素,是系统分配资源和调度的基本单位。

进程与程序不同,进程是系统中动态的实体,有它的创建、运行和撤销的过程。

PCB块是系统感知进程存在的唯一实体。

进程的创建必须首先创建进程的PCB块,而进程的运行也伴随着PCB块的变化,进城撤销也要同时撤销它的PCB块。

所以本实验的任务就是通过模拟调度进程的PCB块来调度进程。

计算机操作系统实验指导书_windows

计算机操作系统实验指导书_windows

《操作系统原理》实验指导书计算机科学与技术系2010年9月目录《操作系统原理》实验教学大纲(修订) (1)实验考核方式与基本要求 (3)实验一进程控制描述与控制 (12)实验二并发与调度 (24)实验三存储管理 (31)实验四设备管理 (40)实验五文件管理与系统安全 (44)附录实验报告参考规范 (64)《操作系统原理》实验教学大纲(修订)课程编号:0433314课程名称:操作系统原理实验学时:14一、本实验课的性质、任务与目的操作系统作为计算机专业的一门专业基础课,是计算机专业的核心课程之一,学好与否直接关系到学生是否能更好地学习后续课程。

通过本实验课程的学习,使学生理解与掌握操作系统设计所遵循的基本原理,基本方法,建立多道程序设计环境下的并行程序设计的思维方式。

此外,操作系统用到的各种算法也是学生加强算法锻炼的好机会,对日后从事系统开发方面的工作有直接的借鉴作用。

本实验课程在操作系统原理课程教学中占有重要地位,目的是让学生及时掌握和巩固所学的基本原理和基础理论,加深理解。

提高学生自适应能力,为将来使用和设计各类新的操作系统打下良好的基础。

二、本实验课所依据的课程基本理论计算机操作系统,操作系统中所介绍的重要算法。

三、实验类型与要求序号实验内容内容提要实验要求实验时数实验类型每组人数所在实验室名称备注一进程控制描述与控制操作系统界面、进程管理必修 2 验证 2 系机房二并发与调度进程并发、进程状态转换必修 2 验证 2 系机房三存储管理内存空间分配及虚拟存储器必修 2 验证 2 系机房四设备管理设备分配与回收必修 2 验证 2 系机房五文件管理与系统安全文件系统目录结构,文件操作及操作系统安全任选 2 验证 2 系机房六操作系统功能模拟设计实验操作系统功能模拟设计并实现必修 4 设计3-4 系机房四、每组人数与实验学时数序号实验内容实验时数每组人数一进程控制描述与控制 2 2二并发与调度 2 2三存储管理 2 2四设备管理 2 2五文件管理与系统安全 2 2六操作系统功能模拟设计实验 4 3-4五、考核方式与评分办法考核方式:在规定时间内,按要求设计相应的模拟系统并上机调试运行,写出详细的实验报告,在机上向教师演示自己设计的模拟系统。

操作系统实验指导书

操作系统实验指导书

操作系统实验指导书《操作系统原理》实验指导书适用专业:课程代码: 8400220 学时: 10 学分:编写单位:编写人:审核人:审批人:年月《操作系统原理》实验指导书适用于计算科学与技术专业、信息科学专业前言操作系统原理是一门理论性与实践性较强的学科,开设本实验课程的目的在于培养学生的实践能力,促使理论与实践的结合。

实现操作系统功能和高级程序设计语言编程的应用,已成为我校计算机学科教学的主要内容。

本实验指导书介绍了实验环境、上机实验步骤、各实验项目的目的要求及内容,最后附有实验报告的格式,作为我校操作系统课程上机实验指导的主要依据。

根据实验大纲要求,包含两个实验及其相关实验作业。

要完成上述内容,单纯依靠课内上机是不够的,希望同学们课外多多花时间练习,熟能生巧。

对不同年级或专业的学生可根据学生具体情况调整实验内容。

目录前言 (1)一、实验环境 (3)二、上机实验步骤 (3)1.启动V ISUAL C++6.0开发环境 (3)2.创建一个项目 (3)3.关闭工作空间 (7)三、实验项目 (8)实验一进程的调度(5学时) (8)实验二存储管理(5学时) (10)四. 参考文献 (11)西华大学计算机系上机实践报告 (12)一、实验环境操作系统原理课程的实验环境如下:1. 硬件环境微型计算机(Intel x86系列CPU)一台2. 软件环境Windows98/2000/XP操作系统VC++6.0或其它的开发工具。

二、上机实验步骤下面以Visual C++ 6.0为例简单介绍开发Windows应用程序的步骤。

Visual C++ 6.0中的MFC AppWizard(应用程序向导)可以使用户自动生成一些常用的标准程序结构和编程风格。

例如一般的Windows 应用程序结构、DLL应用程序结构、单文档(SDI)应用程序结构、多文档(MDI)应用程序结构等。

下面详细介绍利用MFC AppWizard创建一个Windows应用程序的步骤:1.启动Visual C++ 6.0开发环境从“开始”菜单中选择“程序”| Microsoft Visual Studio 6.0 | Microsoft Visual C++6.0,显示Visual C++ 6.0开发环境主窗口。

《操作系统》实验指导书

《操作系统》实验指导书

操作系统实验指导书专业:计算机科学与技术;软件工程课程名称:操作系统课程类别:专业必修课计算机与通信工程学院2009目录第1篇Linux操作系统使用 (1)实验1Linux系统的安装及基本操作 (1)实验2Linux 的常用命令与基本管理 (38)第2篇操作系统算法模拟 (53)实验1 银行家算法 (53)实验2 进程调度 (55)实验3 动态分区分配 (56)实验4 页式存储管理 (57)实验5 虚拟存储管理器的页面调度 (59)实验6 文件管理 (62)实验7 磁盘存储空间的分配与回收 (64)实验8 磁盘调度 (66)附录 (67)实验1报告写法 (67)实验2报告的写法 (67)算法模拟部分 (68)第1篇Linux操作系统使用实验1Linux系统的安装及基本操作一、实验目的1.掌握Red Hat Enterprise Linux 5的安装方法。

2.了解Linux操作系统的启动与登录方法。

3.掌握Red Hat Linux图形用户界面下的基本操作。

二、实验工具与设备1.实验工具:Red Hat Enterprise Linux 5光盘或镜像文件。

2.实验设备:计算机(带CD-ROM)一台。

三、实验预备知识虚拟机简介虚拟机,顾名思义就是虚拟出来的电脑,这个虚拟出来的电脑和真实的电脑几乎完全一样,所不同的是他的硬盘是在一个文件中虚拟出来的,所以你可以随意修改虚拟机的设置,而不用担心对自己的电脑造成损失。

虚拟机中有自己的CPU、主板、内存、BIOS、显卡、硬盘、光驱、软驱、网卡、声卡、串口、并口和US B等设备。

Vmware介绍Vmware是一个“虚拟PC”软件。

它使你可以在一台机器上同时运行二个或更多Windows、DOS、LINUX系统。

与“多启动”系统相比,VMWare采用了完全不同的概念。

多启动系统在一个时刻只能运行一个系统,在系统切换时需要重新启动机器。

VMWare是真正“同时”运行,多个操作系统在主系统的平台上,就象标准Wi ndows应用程序那样切换。

《操作系统》实验指导手册

《操作系统》实验指导手册

《操作系统》实验指导书计算机科学教研室2009.9目录实验一熟悉Windows2000/XP中的进程和线程实验二编程实现进程的控制实验三Windows中的线程与线程同步现象实验四操作系统中的经典线程同步问题实验五死锁避免—银行家算法的实现实验六Windows内存管理实验七分页内存管理算法模拟实验八页面置换算法的模拟实现实验九磁盘调度中的电梯调度算法实现实验十Windows中的消息机制实验一熟悉Windows2000/XP中的进程和线程一、实验目的1、熟悉Windows2000/XP中任务管理器的使用。

2、通过任务管理器识别操作系统中的进程和线程的相关信息。

3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。

二、实验理论基础及教材对应关系1、实验理论基础:(1)操作系统中的进程和线程的概念;(2)进程PCB的各项指标含意;2、本实验内容主要对应于教材第2章。

三、实验内容与步骤1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

如下图所示:2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表(填满即可):表一:统计进程的各项主要信息3、从桌面启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是,原因是。

4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化、得到的结论是(说出explorer.exe进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:表二:统计线程的各项信息进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异是。

操作系统实验指导书(完整版)

操作系统实验指导书(完整版)

《计算机操作系统实验》指导书(第二版)实验一LINUX的安装与使用 (2)实验二进程管理与通信 (27)实验三存储管理——页面置换算法模拟 (51)实验四文件管理 (56)实验五LINUX服务器配置(选做) (62)实验报告撰写指导 (72)韶关学院信息工程学院计算机系教师:陈正铭2007-9-10实验一LINUX的安装与使用【实验目的】1、了解与掌握RED HAT LINUX 9.0的安装过程。

2、熟悉LINUX的命令及使用格式与常用基本命令。

【实验内容】1、使用图形化安装模式安装RED HAT LINUX 9.0。

2、使用WINDOWS操作系统中的远程登录程序telnet.exe 登录LINUX。

3、练习使用LINUX的常用基本命令如ls、cd、who、pwd、ps、pstree、top等。

4、掌握WINDOWS和LINUX之间的文件共享方法。

【实验指导】一、Red Hat Linux 9光盘启动安装过程1、准备工作(1)购买或下载Redhat9的安装光盘(3张盘)或镜像文件,下载地址:校园网FTP站点。

或从红帽子主站下载∶/(2)在硬盘中至少留2个分区给安装系统用,挂载点所用分区推荐4G以上,交换分区在256M 左右比较适合,文件系统格式不论,反正安装过程会重新格式化。

(假如使用虚拟机vm安装建议最少留6G存储空间)(3)记录下你电脑中下列设备型号∶鼠标、键盘、显卡、网卡、显示器。

及网络设置用到的IP地址、子网掩码、默认网关和DNS名称服务器地址等信息。

2、安装红帽子Red Hat Linux 9将光驱设为第一启动盘,放入第一张安装光盘后重新启动电脑,如果你的光驱支持自启动, 如无意外将出现如下图:直接按回车键后将出现如下图1 ,如果你不处理30秒后也会自动进入。

在图1中提示:是否测试安装CD的内容的完整性,选―OK‖开始测试安装CD;选―Skip‖不测试安装CD开始安装出现图6所示,如果是第一次安装当然要测试安装CD,选―OK‖后回车,出现如下图2选―Test‖测试安装光盘的文件,选―Eject CD‖测试光盘以外的安装文件,这里我选择―Test‖后回车,出现如下图3正在测试第一张安装CD,测试完后显示如下图4所示看到上图最后一行英文―It is OK to install from this med ia‖说明这张安装CD是OK的,按―Enter‖键回车后,显示如下图5所示选择―Continue‖并回车开始安装。

操作系统实验指导书教案

操作系统实验指导书教案

操作系统实验指导书教案第一章:操作系统概述1.1 实验目的了解操作系统的概念、功能和作用。

熟悉操作系统的发展历程和主要特点。

1.2 实验内容介绍操作系统的定义和基本功能。

分析操作系统的核心组件和架构。

探讨操作系统的主要特点和应用场景。

1.3 实验步骤讲解操作系统的定义和基本功能。

分析操作系统的核心组件和架构。

讨论操作系统的主要特点和应用场景。

1.4 实验总结总结操作系统的核心概念和主要特点。

强调操作系统在计算机系统中的重要性。

第二章:处理器管理2.1 实验目的了解处理器管理的基本原理和作用。

熟悉进程调度和上下文切换。

2.2 实验内容介绍处理器管理的基本原理和关键技术。

分析进程调度算法和上下文切换的过程。

2.3 实验步骤讲解处理器管理的基本原理和关键技术。

分析进程调度算法和上下文切换的过程。

2.4 实验总结总结处理器管理的核心概念和关键技术。

强调处理器管理在操作系统中的重要性。

第三章:内存管理3.1 实验目的了解内存管理的基本原理和作用。

熟悉虚拟内存和分页/分段机制。

3.2 实验内容介绍内存管理的基本原理和关键技术。

分析虚拟内存的实现和分页/分段机制。

3.3 实验步骤讲解内存管理的基本原理和关键技术。

分析虚拟内存的实现和分页/分段机制。

3.4 实验总结总结内存管理的核心概念和关键技术。

强调内存管理在操作系统中的重要性。

第四章:文件系统4.1 实验目的了解文件系统的基本原理和作用。

熟悉文件存储和访问控制。

4.2 实验内容介绍文件系统的基本原理和关键技术。

分析文件存储结构和访问控制机制。

4.3 实验步骤讲解文件系统的基本原理和关键技术。

分析文件存储结构和访问控制机制。

4.4 实验总结总结文件系统的核心概念和关键技术。

强调文件系统在操作系统中的重要性。

第五章:设备管理5.1 实验目的了解设备管理的基本原理和作用。

熟悉输入/输出设备和驱动程序。

5.2 实验内容介绍设备管理的基本原理和关键技术。

分析输入/输出设备和驱动程序的交互过程。

(完整版)操作系统实验指导书(新)

(完整版)操作系统实验指导书(新)

目录实验一WINDOWS进程初识 (3)1、实验目的 (3)2、实验内容和步骤 (3)3、实验结论 (5)4、程序清单 (5)实验二进程管理 (6)背景知识 (6)1、实验目的 (12)2、实验内容和步骤 (12)3、实验结论 (17)4、程序清单 ........................................... 错误!未定义书签。

实验三进程同步的经典算法.. (17)背景知识 (18)1、实验目的 (20)2、实验内容和步骤 (20)3、实验结论 (23)4、程序清单 ........................................... 错误!未定义书签。

实验四存储管理.. (24)背景知识 (24)1、实验目的 (32)2、实验内容和步骤 (32)3、实验结论 (49)4、程序清单 ........................................... 错误!未定义书签。

实验五文件和设备管理 . (50)背景知识 (50)1、实验目的 (54)2、实验内容与步骤............................... 错误!未定义书签。

3、实验结论 ........................................... 错误!未定义书签。

实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application (控制台应用程序)。

(2)掌握WINDOWS API的使用方法。

(3)编写测试程序,理解用户态运行和核心态运行。

2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC++ 6.0。

步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。

操作系统实验指导书

操作系统实验指导书

《操作系统》课程实验指导书信电工程学院2011年9月目录前言 (1)实验要求 (2)实验准备 (3)实验一处理机管理 (4)实验二存储管理 (7)实验三设备管理 (10)实验四文件管理 (14)前言“操作系统”是计算机及相关专业的必修课程,在学习计算机操作系统理论的同时,通过实验可以加强对操作系统基本原理的理解。

让学生通过上机实验验证计算机操作系统的难点,增加学生对计算机操作系统的领悟和掌握。

使学生对计算机操作系统的工作原理和工作过程有深刻的体会和理解,同时又锻炼了程序编制能力和学生创造能力。

本课程共设8个学时,实验主要由进程管理、存储管理、设备管理、文件管理等4个主要几个部分所组成。

其中验证类实验占25%、设计类实验占75%,每个实验2学时。

考虑由于学生C语言基础较并且不平衡,本课程实验安排了实验准备(由学生课下完成),主要了解掌握TurboC2.0编程环境、掌握C语言编程的基本编制方法和技巧,为后继的实验做准备。

这些实验能很好地解决配合操作系统课程教学来指导学生进行实践的问题。

实验要求1.学生按照实验要求,上机前写好上机实验预习报告,内容包括:实验的目的、内容、实验步骤(程序)。

2.上机实验时按实验要求完成每一个实验的内容。

3.课后认真书写实验报告。

实验报告采用统一的实验报告纸,实验封面包括:课程名称、实验名称、实验序号、班级、姓名、学号、实验时间。

实验报告书写规范,应包括:实验目的和要求、实验内容、实验步骤、实验记录(程序)。

4.遵守机房纪律,服从辅导员教师指挥,爱护实验设备。

5.实验课程不迟到。

如有事不能出席,所缺实验一般不补。

实验准备一.实验目的熟悉TurboC2.0基本编程环境掌握C语言的基本编程方法二.实验内容与要求(一)TurboC2.0的基本操作1、TurboC2.0的基本操作2、运行一个C语言程序的一般过程3、编辑并保存存一个C语言程序4、编译、链接源程序文件5、运行与查看程序结果(二)C语言程序的基本编程方法1、数据类型、运算符、表达式2、数据的输入、输出3、C语言程序的基本控制结构4、数组5、函数与程序结构6、指针7、结构与联合8、文件操作(可通过网络查找TurboC2.0用户说明书,并在其指导进行操作,并要求人手一本C语言程序设计教材并上机练习)实验一处理机管理一、掌握进程及进程调度的概念、三种基本状态及转换二、实验内容1、复习进程的概念、进程调度的含义、进程的三种基本状态及转换2、编制一个模拟进程调度的程序三、参考程序#include"stdio.h"#define running 1/*用running表示进程处于运行状态*/#define aready 2/*用aready表示进程处于就绪状态*/#define blocking 3/*用blocking表示进程处于等待状态*/#define sometimes 5/*用sometime表示时间片大小*/#define n 10/*假定系统允许进程个数为10*/struct{int name;/*进程标识符*/int status;/*进程状态*/int ax,bx,cx,dx;/*进程现场信息,通用寄存器内容*/int pc;/*进程现场信息,程序计数器内容*/int psw;/*进程现场信息,程序状态寄存器内容*/int next;/*下一个进程控制块的位置*/}pcbarea[n];/*定义模拟进程控制块区域的数组*/int PSW,AX,BX,CX,DX,PC,TIME;/*模拟寄存器*/int run;/*定义指向正在运行进程的进程控制块的指针*/struct{int head;int tail;}ready;/*定义指向正在运行进程的进程控制块的指针*/int block;/*定义指向等待队列的指针*/int pfree;/*定义指向空闲进程控制块队列的指针*/sheduling()/*进程调度函数*/{int i;if(ready.head==-1)/*空闲进程控制块队列的指针*/{printf("无就绪进程\n");return 0;}i=ready.head;/*就绪队列头指针赋给i*/ready.head=pcbarea[ready.head].next;/*就绪队列头指针后移*/if(ready.head==-1) ready.tail=-1;/*就绪队列为空,修正尾指针 ready.tail*/pcbarea[i].status=running;/**/TIME=sometimes;/*设置相对时钟寄存器*//*恢复该进程现场信息*/AX=pcbarea[run].ax;BX=pcbarea[run].bx;CX=pcbarea[run].cx;DX=pcbarea[run].dx;PC=pcbarea[run].pc;PSW=pcbarea[run].psw;/*修改指向运行进程的指针*/run=i;return 0;}/*进程调度函数结束*/create(int x)/*创建进程*/{int i;if(pfree==-1)/*空闲进程控制块队列为空*/{printf("无空闲进程控制块,进程创建失败\n");return 0;}i=pfree;/*取空闲进程控制块队列的第一个*/pfree=pcbarea[pfree].next;/*pfree后移*//*填写该进程控制内容:*/pcbarea[i].name=x;pcbarea[i].status=aready;pcbarea[i].ax=x;pcbarea[i].bx=x;pcbarea[i].cx=x;pcbarea[i].dx=x;pcbarea[i].pc=x;pcbarea[i].psw=x;if(ready.head!=-1){/*就绪队列不空时,挂入就绪队列方式*/pcbarea[ready.tail].next=i;ready.tail=i;pcbarea[ready.tail].next=-1;}else{/*就绪队列为空时,挂入就绪队列方式*/ready.head=i;ready.tail=i;pcbarea[ready.tail].next=-1;}return 0;}/*进程创建函数结束*/main(){/*系统初始化*/int num,j;run=ready.head=ready.tail=block=-1;pfree=0;for(j=0;j<n-1;j++)pcbarea[j].next=j+1;pcbarea[n-1].next=-1;printf("输入进程编号(避免编号的冲突,以负数输入结束,最多可以创建10个进程):\n");scanf("%d",&num);while(num>0){create(num);scanf("%d",&num);}sheduling();if(num!=-1){printf("进程名进程状态寄存器内容:ax bx cx dx pc psw:\n");printf("%4d%10d%3d%3d%3d%3d%3d%3d\n",pcbarea[run].name,pcbarea[run].status,pcbarea[ run].ax,pcbarea[run].bx,pcbarea[run].cx,pcbarea[run].dx,pcbarea[run].pc,pcbarea[run ].psw);}}/*main结束*/实验二存储管理一、实验目的掌握分页存储管理的基本原理及分页存储管理中的地址变换过程二、实验内容1、复习分页想念管理的基本概念、基本原理、及地址变换过程2、编制一个模拟地址变换过程的程序三、参考程序/*页式虚拟存储管理中地址转换和缺页中断的模拟*/#include"stdio.h"#define n 64/*模拟实验中假定的页表长度*/#define length 10struct{int lnumber;/*页号*/int flag;/*表示该页是否在主存,"1"表示在主存,"0"表示不在*/int pnumber;/*该页所在主存块的块号*/int write;/*该页号是否被修改,"1"表示修改过,"0"表示末修改过*/ int dnumber;/*该页存放在磁盘上的位置,即磁盘块号*/}page[n];/*页表定义*/int m;/*m为该作业在主存中的主存块块数*/int page_length;/*页表实际长度*/int p[length];/*存放在主存中页的页号*/int head;/*主存中页号队列*/page_interrupt(lnumber)int lnumber;{int j;printf("发生缺页中断*%d\n",lnumber);/*淘汰页*/j=p[head];p[head]=lnumber;head=(head+1)%m;if(page[j].write==1)printf("将页%d写回磁盘第%d块\n",j,page[j].dnumber);page[j].flag=0;/*第j页存在标志改为"0"*/page[lnumber].pnumber=page[j].pnumber;page[lnumber].flag=1;/*第lnumber页存在标志改为"0"*/page[lnumber].write=0;/*第lnumber页修改标志改为"1"*/printf("淘汰主存块%2d中的页%2d从磁盘第%d块中调入页%2d\n",page[j].pnumber,j,page[lnumber].dnumber,lnumber);}/*缺页中断处理函数结束*/void command(laddress,write)unsigned laddress;int write;{int paddress,ad,pnumber,lnumber;kk:/*取出逻辑地址laddress的页号lnumber(高6位)和页内地址ad*/ lnumber=laddress>>10;ad=laddress&0x3ff;if(lnumber>=page_length){printf("不存在该页\n");}if(page[lnumber].flag==1)/*页在主存*/{pnumber=page[lnumber].pnumber;/*从页表中取得块号*/paddress=pnumber<<10|ad;/*合并块号和块内地址形成物理地址padress*/printf("逻辑地址是:%x 对应的物理地址是%x\n:",laddress,paddress);}if(write==1)/*如果需要写,修改页的修改标志位*/page[lnumber].write=1;else{page_interrupt(lnumber);/*缺页中断*/goto kk;}}/*命令处理函数结束*/void main(){int lnumber,pnumber,write,dnumber;unsigned laddress;int i;/*输入页表信息,页号从0开始,依次编号,创建页表page*/printf("输入页表信息,创建页表(若页号为-1,则结束输入\n");printf("输入页号和辅存地址");scanf("%d%d",&lnumber,&dnumber);i=0;while(lnumber!=-1){page[i].lnumber=lnumber;page[i].flag=0;page[i].write=0;page[i].dnumber=dnumber;i++;printf("输入页号和辅存地址");scanf("%d%d",&lnumber,&dnumber);}page_length=i;printf("输入主存号,主存块数要小于%d,(以-1结束):",i);scanf("%d",&pnumber);m=0;head=0;while(pnumber!=-1){if(m<=i){page[m].pnumber=pnumber;page[m].flag=1;p[m]=m;m++;}scanf("%d",&pnumber);}printf("输入指令性质(1-修改,0-不需要,其他--结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);while(write==0||write==1){command(laddress,write);/**/printf("输入指令性质(1-修改,0-不需要,其他--结束程序运行)和逻辑地址:");scanf("%d%x",&write,&laddress);}}/*函数结束*/实验三设备管理一、实验目的了解设备管理的基本原理、设备的分配与回收过程二、实验内容1、复习设备管理的基本概念、基本原理、常用的数据结构、分配策略及算法2、编制一个独占设备的分配和回收模拟程序三、参考程序/*独占设备的分配和回收模拟*/#include"stdio.h"#include"string.h"#define false 0#define true 1#define n 4#define m 10struct{char type[10];/*设备类名*/int count ;/*拥有设备台数*/int remain;/*现存的可用设备台数*/int address;/*该类设备在设备表中的起始地址*/}equiptype[n];/*设备类表定义,假定系统有N个设备类型*/struct{int number;/*设备绝对号*/int status;/*设备好坏状态*/int remain;/*设备是否已分配*/char jobname[4];/*占有设备的作业名*/int lnumber;/*设备相对号*/}equipment[m];/*设备表定义,假定系统有M个设备*/allocate(char J[],char type[],int mm){int i,t;/*查询该类设备*/i=0;while(i<n&&strcmp(equiptype[i].type,type)!=0)i++;if(i>=n)/*没有找到该类设备*/{printf("无该类设备,设备分配失败");return(false);}if(equiptype[i].remain<1)/*所需设备现存可用台数不足*/{printf("该类设备不足,分配失败");return(false);}t=equiptype[i].address;/*取出该类设备在设备表中的起始地址*/while(!(equipment[t].status==1&&equipment[t].remain==0))t++;/*填写作业名、相对号,状态改为已分配*/equiptype[i].remain--;equipment[t].remain=1;strcpy(equipment[t].jobname,J);equipment[t].lnumber=mm;}/*设备分配函数结束*/reclain(char J[],char type[]){int i,t,j,k,nn;i=0;while(i<n&&strcmp(equiptype[i].type,type)!=0)i++;if(i>=n)/*没有找天该类设备*/{printf("无该类设备,设备回收失败");return(false);}t=equiptype[i].address;/*取出该类设备在设备表中的起始地址*/ j=equiptype[i].count;/*取出该类设备的数量*/k=0;nn=t+j;for(;t<nn;t++)if(strcmp(equipment[t].jobname,J)==0&&equipment[t].remain==1) {equipment[t].remain=0;k++;}equiptype[i].remain=equiptype[i].remain+k;if(k==0)printf("该作业没有使用该类设备\n");}/*设备收回函数结束*/main(){char J[4];int i,mm,a;char type[10];/*设备类表初始化:*/strcpy(equiptype[0].type,"input");/*输入机*/equiptype[0].count=2;equiptype[0].remain=2;equiptype[0].address=0;strcpy(equiptype[1].type,"printer");/*打印机*/equiptype[1].count=3;equiptype[1].remain=3;equiptype[1].address=2;strcpy(equiptype[2].type,"disk");/*磁盘机*/equiptype[2].count=4;equiptype[2].remain=4;equiptype[2].address=5;strcpy(equiptype[3].type,"tape");/*磁带机*/equiptype[3].count=1;equiptype[3].remain=1;equiptype[3].address=9;/*设备表初始化:*/for(i=0;i<10;i++){equipment[i].number=i;equipment[i].status=1; //343434equipment[i].remain=0;}while(1){printf("\n0-退出,1-分配,2-回收,3-显示");printf("\n选择功能项(0-3):");scanf("%d",&a);switch(a){case 0:/*程序结束*/return(false) ;case 1:/*a=1分配设备*/printf("输入作业名、作业所需设备类和设备相对号");scanf("%s%s%d",J,type,&mm);allocate(J,type,mm);/*分配设备*/break;case 2:/*a=2回收设备*/printf("输入作业名和作业归还的设备类");scanf("%s%s",J,type);reclain(J,type);/*回收设备*/break;case 3:/*a=3输出设备类表和设备表的内容*/printf("\n输出设备类表\n");printf(" 设备类型设备总量空闲好设备\n");for(i=0;i<n;i++)printf("%9s%8d%9d\n",equiptype[i].type,equiptype[i].count,equiptype[i].remain); printf("输出设备表:\n");printf("绝对号好/坏已/未分配占用作业名相对号\n");for(i=9;i<m;i++)printf("%3d%8d%9d%12s%8d\n",equipment[i].number,equipment[i].status,equipment[i].remain,equipment[i].jobname,equipment[i].lnumber);}}}。

操作系统实验指导

操作系统实验指导
计算机操作系统 实 验 指 导 书
目 录
实验一 windows命令使用 2 实验二 进程模拟程序 9 实验三 进程调度 17 实验四 银行家算法模拟实现 23 实验五 作业调度模拟 28 实验六 请求页式存储管理中常用页面置换算法模拟 实用
ntbackup 系统备份和还原 nbtstat.exe 使用 NBT(TCP/IP 上的 NetBIOS)显示协议统计和当前 TCP/IP 连接。 nddeapir.exe NDDE API服务器端 netsh.exe 用于配置和监控 Windows 2000 命令行脚本接口(XP不可用) netstat.exe 显示协议统计和当前的 TCP/IP 网络连接。 nlsfunc.exe 加载特定国家的信息。Windows 2000 和 MS-DOS 子系统不使用该命令接受该命令 只是为了与 MS-DOS 文件兼容。 notepad.exe 打开记事本 nslookup.exe 该诊断工具显示来自域名系统 (DNS) 名称服务器的信息。 ntbackup.exe 备份和故障修复工具 ntfrs.exe NT文件复制服务 (XP不可用) ntvdm.exe 模拟16位Windows环境 nw16.exe NetWare转向器 nwscript.exe 运行Netware脚本 odbcad32.exe 32位ODBC数据源管理 (驱动程序管理) odbcconf.exe 命令行配置ODBC驱动和数据源 packager.exe 对象包装程序 pathping.exe 包含Ping和Tracert的程序 pentnt.exe 检查Pentium的浮点错误 perfmon.exe 系统性能监视器 ping.exe 验证与远程计算机的连接 posix.exe 用于兼容Unix print.exe 打印文本文件或显示打印队列的内容。 progman.exe 程序管理器 psxss.exe Posix子系统应用程序 qappsrv.exe 在网络上显示终端服务器可用的程序 qprocess.exe 在本地或远程显示进程的信息(需终端服务) query.exe 查询进程和对话 (XP不可用) quser.exe 显示用户登陆的信息(需终端服务) qwinsta.exe 显示终端服务的信息 rononce -p 15秒关机 rasAdmin 远程访问服务. regedit.exe 注册表编辑器 rasadmin.exe 启动远程访问服务 (XP不可用) rasautou.exe 建立一个RAS连接 rasdial.exe 宽带,拨号连接 ras.exe 运行RAS连接 (XP不可用) rcp.exe 计算机和运行远程外壳端口监控程序 rshd 的系统之间复制文件 rdpclip.exe 终端和本地复制和粘贴文件 recover.exe 从坏的或有缺陷的磁盘中恢复可读取的信息。 redir.exe 运行重定向服务 regedt32.exe 32位注册服务 regini.exe 用脚本修改注册许可 regwiz.exe 注册向导 replace.exe 用源目录中的同名文件替换目标目录中的文件。 rexec.exe rexec 命令在执行指定命令前,验证远程计算机上的用户名,只有安装了 TCP/IP 协 议后才可以使用该命令。 risetup.exe 运行远程安装向导服务 (XP不可用) route.exe 控制网络路由表

操作系统实验指导书(新)

操作系统实验指导书(新)

目录实验一 WINDOWS进程初识 (3)1、实验目的 (3)2、实验内容和步骤 (3)3、实验结论 (5)4、程序清单 (5)实验二进程管理 (6)背景知识 (6)1、实验目的 (12)2、实验内容和步骤 (12)3、实验结论 (16)4、程序清单................... 错误!未定义书签。

实验三进程同步的经典算法 .. (17)背景知识 (17)1、实验目的 (19)2、实验内容和步骤 (19)3、实验结论 (22)4、程序清单................... 错误!未定义书签。

实验四存储管理 (23)背景知识 (23)1、实验目的 (31)2、实验内容和步骤 (31)3、实验结论 (48)4、程序清单................... 错误!未定义书签。

实验五文件和设备管理 (49)背景知识 (49)1、实验目的 (53)2、实验内容与步骤............. 错误!未定义书签。

3、实验结论................... 错误!未定义书签。

实验一WINDOWS进程初识1、实验目的(1)学会使用VC编写基本的Win32 Consol Application (控制台应用程序)。

(2)掌握WINDOWS API的使用方法。

(3)编写测试程序,理解用户态运行和核心态运行。

2、实验内容和步骤(1)编写基本的Win32 Consol Application步骤1:登录进入Windows,启动VC++ 6.0。

步骤2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 Consol Application”,然后在“Project name”处输入工程名,在“Location”处输入工程目录。

创建一个新的控制台应用程序工程。

步骤3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”, 然后在“File”处输入C/C++源程序的文件名。

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

目录实验一Windows任务管理器的使用 (2)实验二进程创建与撤消 (11)实验三进程间通信 (14)实验四创建线程 (16)实验五线程同步 (25)实验六作业调度试验 (29)实验七虚拟内存存储管理 (35)实验八页式存储管理实验报告 (39)实验九存储管理 (51)实验十设备管理 (68)实验十一文件管理 (73)实验一 Windows任务管理器的使用一、实验目的通过在Windows 任务管理器中对程序进程进行响应的管理操作,熟悉操作系统进程管理的概念,学习观察操作系统运行的动态性能.二、实验内容启动并进入Windows环境,单击Ctrl + Alt + Del键,或者右键单击任务栏,在快捷菜单中单击“任务管理器”命令,打开“任务管理器”窗口.1.分别查看每个选项卡的内容,了解相关参数的含义及其当前内容.2.在“进程”选项卡上单击“查看”菜单,然后单击“选择列”命令.单击要增加显示为列标题的项目,然后单击“确定”.分别了解“进程”选项卡各列的含义及其当前内容.3.为更改正在运行的程序的优先级,可在“进程”选项卡上右键单击您要更改的程序,指向“设置优先级”,然后单击所需的选项.更改进程的优先级可以使其运行更快或更慢(取决于是提升还是降低了优先级) ,但也可能对其他进程的性能有相反的影响.(查看进程管理器,说明按照名字序号前5个进程的主要用途和功能.)4、修改windows服务选项,将windows的远程用户修改注册表的服务设置成禁止. :打开控制面板→管理工具→服务→找到"Remote Registry",双击,启动类型设置为禁用.5、修改windows的磁盘管理并设定配额选项. :磁盘格式必须是NTFS,右键点击盘符,就有配额. FAT32转NTFS的命令:convert 盘符:/fs:ntfs6、修改windows启动选项,将其中的前三个自动启动的选项去掉. :开始→运行→输入msconfig,到启动页.7、修改windows的虚拟内存交换空间.8、修改windows使得windows启动时,显示操作系统列表时间为5秒,并写出启动文件的具体内容. :右键我的电脑→属性→高级→启动和故障恢复的设置→显示列表时间设为5,→点击编辑→列出具体内容,一般是:[boot loader]timeout=0default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect9、查看windows本地安全策略,并修改为定期强制修改密码.写出本地安全策略的审核的内容. :开始→运行→输入gpedit.msc →计算机设置→Windows设置→安全设置→账户策略→密码策略→密码最长存留期设置为需要的天数即可.10、获得此计算机网卡的网络配置及mac地址. :开始→运行→输入cmd回车→输入ipconfig /all回车即是.11、在D盘新建一个文件夹,以自己的拼音缩写命名,并利用命令将其映射为I盘. :例如为aaa,命令:subst I: d:\aaa.即将c:\aaa映射为I盘. (注:I盘是虚拟盘,不是实际的硬盘)语法subst [drive1:[drive2:}Path}subst drive1:/d参数drive1:指定要为其指派路径的虚拟驱动器.drive2:指定包含指定路径的物理驱动器(如果不是当前的驱动器).Path指定要指派给虚拟驱动器的路径./d删除虚拟驱动器./?在命令提示符显示帮助.注释以下命令在subst 命令中使用的驱动器上无法工作(或不应使用):chkdskDiskcompDiskcopyformatlabelrecoverdrive1 参数必须在lastdrive 命令指定的范围之内.如果没有,subst 将显示下列错误消息:Invalid parameter - drive1:范例若要为路径B:\User\Betty\Forms 创建虚拟驱动器Z,请键入:subst z:b:\user\betty\forms现在,不用键入完整路径,而是通过键入虚拟驱动器号,后跟冒号,即可到达该目录,如下所示:z:winxp中的映射盘符命令:subst另附上软件extrasubst.zip(创建虚拟驱动器)12、通过设备管理器查看系统所有组件配置.包括驱动程序,装载的所有程序,windows组件,硬件组件的IRQ等.13、查看windows的版本及注册信息. :开始→运行→输入winver回车14、利用windows自带的聊天工具,进行局域网内的聊天,并写出详细步骤. 首先启动服务中的Messager服务,Sp2以后版本默认为禁止的,将其设为自动,然后要发消息就开始→运行→输入net send 对方IP地址信息内容.回车即可15、利用命令查看windows进程中每个进程所提供的服务.命令:tasklist /SVC (注:查看svchost进程情况)清除伪装成Svchost.exe的病毒、木马√了解Svchost.exe的功能√判断真假Svchost.exe进程√清除伪装成Svchost.exe的病毒、木马一、紧急状况:系统发现严重病毒图1 数量众多的SVCHOST进程系统中的Svchost.exe进程是正常系统进程,不是病毒.二、松了口气:Svchost.exe是台“CD机”1.服务装在“CD机”里Svchost.exe是NT内核操作系统(Windows 2000/XP/2003都属于NT内核操作系统)独有的进程,“Svchost”其实就是“Service Host”(服务宿主)的缩写.微软官方对它的定义是:Svchost.exe是从动态链接库(DLL)中运行的服务的通用主机进程名称,通俗讲,它就是一个服务装载器.大家可以把每个服务想象成一张音乐CD,而Svchost.exe就是用来播放这种CD的CD机.2.为什么用“CD机”装服务由于Windows 2000/XP系统服务越来越多,以EXE单独进程的形式启动所有服务会大大增加系统负担,为节省系统资源,微软将一些系统服务以动态链接库(DLL)形式实现,而Svchost.exe就是用来装载这些DLL文件以启动系统服务的程序.没有人会为了发行一张CD而制作一台专用播放此CD的CD机,微软也一样.3.系统里有几台这样的“CD机”那为什么系统进程列表中的Svchost.exe会有多个呢?微软为了让系统能更好地进行服务控制,就允许多个Svchost.exe进程同时运行,每个Svchost.exe进程可以包含一组服务,想像一下可以同时容纳3张甚至更多CD的多碟CD机.打开注册表[HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Svchost]主键,在窗口右侧可以看到许多键值,这里的每个键值都代表一组服务,键值数据则包含了该组服务下面运行的服务名称列表,每组服务启动时都会通过单独的Svchost.exe进程来装载.Windows XP中默认共有六组服务(见图2),其中imgsvc、NetworkService、rpcss、termsvcs四个组,它们都只有一个服务运行,这些服务启动后的Svchost.exe进程用户名为“SYSTEM”.而LocalService和netsvcs组都启动了多个服务,它们的Svchost.exe进程用户名分别为“LOCAL SERVICE”和“NETWORDSERVICE”,从图1中可以看到这种区别.图2 众多svchost进程的区别当然了,这六组服务通常并不都是启动状态的,根据系统启动的服务不同,反映在系统进程列表中的Svchost.exe进程数量也是不同的,Windows XP会有四个到六个Svchost.exe进程,而Windows 2000通常则会有两个Svchost.exe进程.小提示:点击“开始→运行”,在运行框中输入“CMD”回车,然后在打开的命令行窗口中输入“Tasklist /svc”(不含引号)命令,可以更直观地看到每个Svchost.exe进程装载的服务名称列表(见图3).图3 查看svchost进程装载的服务名称4.获取每张“CD”的详细信息如果想更进一步了解Svchost.exe装载的这些服务都是什么功能,可以记下键值数据中的服务名称,例如“RpcSs”,接着打开注册表的[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Servi ces],再打开下面的“RpcSs”子键,在右边的“Description”键值中就可以看到该服务的描述,而在“ImagePath”键值数据中则可以看到这个服务的运行命令正是“%SystemRoot%\system32\svchost -k rpcss”(见图4).而在“RpcSs”子键下还有一个“Parameters”(参数)子键,其右边的“ServiceDll”键值数据“%SystemRoot%\system32\rpcss.dll”则表明了RpcSs服务启动时调用的是系统目录下的“Rpcss.dll”文件,这就好像你原来只知道CD中歌曲的歌名,现在又让你能够查到这首歌的演唱者.图4 查看svchost的具体功能如果觉得通过注册表查询服务名称了解其属性不太方便,也可以使用“全能助手用Windows服务管理专家”(以下简称“服务管理专家”)来查询,运行软件后单击“All Win32 Services”分支,在右侧服务列表中根据服务名称索引即可快速找到要查询的服务,单击服务名称,即可看到该服务的启动命令以及调用的DLL 文件等相关信息(见图5).同时软件还专门设计了Svchost Group分支,可以快速查询LocalService和netsvcs组中的服务详细信息.图5 用工具查看svchost的情况全能助手用Windows服务管理专家小档案软件名称:全能助手用Windows服务管理专家软件版本:1.02软件大小:164KB软件授权:免费适用平台:Windows 2000/XP下载地址:点击这里下载三、危机仍在:小心病毒的骗局由于Svchost.exe进程的特殊性,它隐藏了真正运行的程序的名称,在表面看到的只是Svchost.exe 进程,这个特性同时也让许多病毒、木马有空可钻,企图以此迷惑用户.那么如何判断系统中的多个Svchost.exe进程是否正常呢?下面针对这类病毒常用的几种欺骗手法来进行分析.骗局1:利用假冒Svchost.exe名称的病毒程序火眼金睛:这种方式运行的病毒并没有直接利用真正的Svchost.exe进程,而是启动了另外一个名称同样是Svchost.exe的病毒进程,由于这个假冒的病毒进程并没有加载系统服务,它和真正的Svchost.exe 进程是不同的,只需在命令行窗口中运行一下“Tasklist /svc”,如果看到哪个Svchost.exe进程后面提示的服务信息是“暂缺”(见图6),而不是一个具体的服务名,那么它就是病毒进程了,记下这个病毒进程对应的PID数值(进程标识符),即可在任务管理器的进程列表中找到它,结束进程后,在C盘搜索Svchost.exe 文件,也可以用第三方进程工具直接查看该进程的路径,正常的Svchost.exe文件是位于%systemroot%\System32目录中的,而假冒的Svchost.exe病毒或木马文件则会在其他目录,例如“w32.welchina.worm”病毒假冒的Svchost.exe就隐藏在Windows\System32\Wins目录中,将其删除,并彻底清除病毒的其他数据即可.图6 查看可疑svchost进程骗局2:一些高级病毒则采用类似系统服务启动的方式,通过真正的Svchost.exe进程加载病毒程序,而Svchost.exe是通过注册表数据来决定要装载的服务列表的,所以病毒通常会在注册表中采用以下方法进行加载:添加一个新的服务组,在组里添加病毒服务名在现有的服务组里直接添加病毒服务名修改现有服务组里的现有服务属性,修改其“ServiceDll”键值指向病毒程序判断方法:病毒程序要通过真正的Svchost.exe进程加载,就必须要修改相关的注册表数据,可以打开[HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Svchost],观察有没有增加新的服务组,同时要留意服务组中的服务列表,观察有没有可疑的服务名称,通常来说,病毒不会在只有一个服务名称的组中添加,往往会选择LocalService和netsvcs这两个加载服务较多的组,以干扰分析,还有通过修改服务属性指向病毒程序的,通过注册表判断起来都比较困难,这时可以利用前面介绍的服务管理专家,分别打开LocalService和netsvcs分支,逐个检查右边服务列表中的服务属性,尤其要注意服务描述信息全部为英文的,很可能是第三方安装的服务,同时要结合它的文件描述、版本、公司等相关信息,进行综合判断.例如这个名为PortLess BackDoor的木马程序,在服务列表中可以看到它的服务描述为“Intranet Services”,而它的文件版本、公司、描述信息更全部为空,如果是微软的系统服务程序是绝对不可能出现这种现象的.从启动信息“C:\WINDOWS\System32\svchost.exe -k netsvcs”中可以看出这是一款典型的利用Svchost.exe进程加载运行的木马,知道了其原理,清除方法也很简单了:先用服务管理专家停止该服务的运行,然后运行regedit.exe打开“注册表编辑器”,删除[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\IPRIP]主键,重新启动计算机,再删除%systemroot%\System32目录中的木马源程序“svchostdll.dll”,通过按时间排序,又发现了时间完全相同的木马安装程序“PortlessInst.exe”,一并删除即可实验二进程创建与撤消一、实验目的1.通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows 2000进程生存过程.2.通过阅读和分析实验程序,学习创建进程、观察进程和终止进程的程序设计方法.二、背景知识1. 创建进程:CreateProcess() 调用的核心参数是可执行文件运行时的文件名及其命令行.下表详细地列出了每个参数的类型和名称.可以指定第一个参数,即应用程序的名称,其中包括相对于当前进程的当前目录的全路径或者利用搜索方法找到的路径;lpCommandLine参数允许调用者向新应用程序发送数据;接下来的三个参数与进程和它的主线程以及返回的指向该对象的句柄的安全性有关.然后是标志参数,用以在dwCreationFlags参数中指明系统应该给予新进程什么行为.经常使用的标志是CREATE_SUSPNDED,告诉主线程立刻暂停.当准备好时,应该使用ResumeThread() API来启动进程.另一个常用的标志是CREATE_NEW_CONSOLE,告诉新进程启动自己的控制台窗口,而不是利用父窗口.这一参数还允许设置进程的优先级,用以向系统指明,相对于系统中所有其他的活动进程来说,给此进程多少CPU时间.接着是CreateProcess() 函数调用所需要的三个通常使用缺省值的参数.第一个参数是lpEnvironment参数,指明为新进程提供的环境;第二个参数是lpCurrentDirectory,可用于向主创进程发送与缺省目录不同的新进程使用的特殊的当前目录;第三个参数是STARTUPINFO数据结构所必需的,用于在必要时指明新应用程序的主窗口的外观.CreateProcess() 的最后一个参数是用于新进程对象及其主线程的句柄和ID的返回值缓冲区.以PROCESS_INFORMATION结构中返回的句柄调用CloseHandle() API函数是重要的,因为如果不将这些句柄关闭的话,有可能危及主创进程终止之前的任何未释放的资源.2. 终止进程:所有进程都是以调用ExitProcess() 或者TerminateProcess()函数结束的.但最好使用前者而不要使用后者,因为进程是在完成了它的所有的关闭“职责”之后以正常的终止方式来调用前者的.而外部进程通常调用后者即突然终止进程的进行,由于关闭时的途径不太正常,有可能引起错误的行为.TerminateProcess() API函数只要打开带有PROCESS_TERMINATE访问权的进程对象,就可以终止进程,并向系统返回指定的代码.这是一种“野蛮”的终止进程的方式,但是有时却是需要的.如果开发人员确实有机会来设计“谋杀”(终止别的进程的进程) 和“受害”进程(被终止的进程) 时,应该创建一个进程间通讯的内核对象——如一个互斥程序——这样一来,“受害”进程只在等待或周期性地测试它是否应该终止.三、实验内容1.编译运行项目Lab2.1\CntrlOtherPrcss.dsw,观察运行结果,并阅读和分析实验程序.*主要分析A 、void CCntrlOtherPrcssDlg::OnStart();B、void CCntrlOtherPrcssDlg::OnStop();2.编译运行项目Lab2.2\proclist.dsw,观察运行结果,并阅读和分析实验程序.*主要分析A 、void CCntrlOtherPrcssDlg::OnStart();B、void CCntrlOtherPrcssDlg::OnStop();3.编写程序将系统中所有的Notepad进程全部终止.TerminateProcess就可以:BOOL TerminateProcess(HANDLE hProcess, // handle to the processUINT uExitCode // exit code for the process );实验三进程间通信一、实验目的在本实验中,通过对文件映射对象的了解,来加深对Windows 2000线程同步的理解.回顾系统进程、线程的有关概念,加深对Windows 2000线程间通讯的理解;了解文件映射对象;通过分析实验程序,了解线程如何通过文件映射对象发送数据;了解在进程中如何使用文件映射对象.二、背景知识1.共享内存:Windows 2000提供了一种在文件中处理数据的方法,名为内存映射文件,也称为文件映射.文件映射对象是在虚拟内存中分配的永久或临时文件对象区域(如果可能的话,可大到整个文件) ,可将其看作是二进制的数据块.使用这类对象,可获得直接在内存中访问文件内容的能力.文件映射对象提供了强大的扫描文件中数据的能力,而不必移动文件指针.对于多线程的读写操作来说,这一点特别有用,因为每个线程都可能想要把读取指针移动到不同的位置去——为了防止这种情况,就需要使用某种线程同步机制保护文件.在CreateFileMapping() API中,一个新的文件映射对象需要有一个永久的文件对象(由CreateFile() 所创建) .该函数使用标准的安全性和命名参数,还有用于允许操作(如只读) 的保护标志以及映射的最大容量.随后可根据来自OpenFileMapping() API的其他线程或进程使用该映射——这与事件和互斥体的打开进程是非常类似的.内存映射文件对象的另一个强大的应用是可请求系统创建一个运行映射的临时文件.该临时文件提供一个临时的区域,用于线程或进程互相发送大量数据,而不必创建或保护磁盘上的文件.利用向创建函数中发送INV ALID_HANDLE_V ALUE来代替真正的文件句柄,就可创建这一临时的内存映射文件;指令内核使用系统页式文件来建立支持映射的最大容量的临时数据区.为了利用文件映射对象,进程必须将对文件的查看映射到它的内存空间中.也就是说,应该将文件映射对象想象为进程的第一步,在这一步中,当查看实际上允许访问的数据时,附加有共享数据的安全性和命名方式.为了获得指向内存区域的指针需要调用MapViewOfFile() API,此调用使用文件映射对象的句柄作为其主要参数.此外还有所需的访问等级(如读-写) 和开始查看时文件内的偏移和要查看的容量.该函数返回一个指向进程内的内存的指针,此指针可有多种编程方面的应用(但不能超过访问权限) .当结束文件映射查看时,必须用接受到的指针调用UnmapViewOfFlie() API,然后再根据映射对象调用CloseHandle() API,从而将其清除三、实验内容1.编译运行项目Lab5.1\SHAREMEM.DSW,观察运行结果,并阅读和分析实验程序.2. Lab5.2目录下的示例程序:ProcessA.exe,ProcessB.exe用三种方法实现了进程通信.(1)进程A中输入一些字符,点“利用SendMessage发送消息”按钮可将消息发到进程B.(2)在进程A中输入一些字符,点“写数据到内存映像文件”按钮,然后在进程B中点“从内存映像文件读数据”按钮可收到消息.(3)先在进程B中点“创建管道并接收数据”按钮,然后在进程A中输入一些字符,点“写数据到管道文件”按钮可将消息发到进程B(重复第3步每次可发一条消息).消息传递数据通信可参考SendMessage.txt,共享内存通信可参考MemFile.txt,管道通信可参考Pipe.txt.3.编写程序利用WM_COPYDATA消息机制,实现线程间的通信.实验四创建线程一、实验目的1. 通过创建线程、观察正在运行的线程和终止线程的程序设计和调试操作,进一步熟悉操作系统的线程概念,理解进程与线程之间的关系.2.通过阅读和分析实验程序,学习创建线程、观察线程和终止线程的程序设计方法.二、背景知识1.创建线程:创建线程并因而成就一个多线程程序,是以CreateThread()作为一切行动的开始.次函数的原型如下:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);如果CreateThread()成功,传回一个handle,代表新线程.否则传回一个FALSE.如果失败,可以调用GetLastError()获知原因.2.终止线程:线程结束代码可以依靠调用GetExitCodeThread()完成.BOOL GetExitCodeThread(HANDLE hThread,/*由CreateThread()传回的线程handle*/ LPDWORD lpExitCode /*指向一个DWORD,用于接受结束代码*/);如果成功,GetExitCodeThread()传回TRUE,否则传回FALSE.如果线程已结束,那么线程的结束代码会被放在lpExitCode参数中带回来.如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE.如果需要用更强制性的手法结束一个线程,可以使用ExitThread().以下摘自MSDNuintptr_t _beginthread(void( __cdecl *start_address)( void * ),unsigned stack_size,void *arglist);Parametersstart_addressStart address of routine that begins execution of new thread.stack_sizeStack size for new thread or 0.arglistArgument list to be passed to new thread or NULL.securityPointer to a SECURITY_A TTRIBUTES structure that determines whether the returned handle can be inherited by child processes. If NULL, the handle cannot be inherited. Must be NULL for Windows 95 applications.initflagInitial state of new thread (0 for running or CREA TE_SUSPENDED for suspended); use ResumeThread to execute the thread.thrdaddrPoints to a 32-bit variable that receives the thread identifier.Return ValueIf successful, each of these functions returns a handle to the newly created thread. _beginthread returns –1L on an error, in which case errno is set to EAGAIN if there are too many threads, or to EINV AL if the argument is invalid or the stack size is incorrect. _beginthreadex returns 0 on an error, in which case errno and _doserrno are set.See Standard Types for more information on uintptr_t.See _doserrno, errno, _sys_errlist, and _sys_nerr for more information on these and other return codes.RemarksThe _beginthread function creates a thread that begins execution of a routine at start_address. The routine at start_address must use the __cdecl calling convention and should have no return value. When the thread returns from that routine, it is terminated automatically. For more information on threads, see Multithreading._beginthreadex resembles the Win32 CreateThread API more closely than _beginthread does. _beginthreadex differs from _beginthread in the following ways:_beginthreadex has three additional parameters: initflag, security, threadaddr. The new thread can be created in a suspended state, with a specified security (Windows NT only), and can be accessed using thrdaddr, which is the thread identifier.The routine at start_address passed to _beginthreadex must use the __stdcall calling convention and must return a thread exit code._beginthreadex returns 0 on failure, rather than –1L.A thread created with _beginthreadex is terminated by a call to _endthreadex.The _beginthreadex function gives you more control over how the thread is created than _beginthread does. The _endthreadex function is also more flexible. For example, with _beginthreadex, you can use security information, set the initial state of the thread (running or suspended), and get the thread identifier of the newly created thread. You are also able to use the thread handle returned by _beginthreadex with the synchronization APIs, which you cannot do with _beginthread.It is safer to use _beginthreadex than _beginthread. If the thread spawned by _beginthread exits quickly, the handle returned to the caller of _beginthread may be invalid or, worse, point to another thread. However, the handle returned by _beginthreadex has to be closed by the caller of _beginthreadex, so it is guaranteed to be a valid handle if _beginthreadex did not return an error. You can call _endthread or _endthreadex explicitly to terminate a thread; however, _endthread or _endthreadex is called automatically when the thread returns from the routine passed as a parameter. Terminating a thread with a call to endthread or _endthreadex helps to ensure proper recovery of resources allocated for the thread._endthread automatically closes the thread handle (whereas _endthreadex does not). Therefore, when using _beginthread and _endthread, do not explicitly close the thread handle by calling the Win32 CloseHandle API. This behavior differs from the Win32 ExitThread API.Note For an executable file linked with LIBCMT.LIB, do not call the Win32 ExitThread API; this prevents the run-time system from reclaiming allocated resources. _endthread and _endthreadex reclaim allocated thread resources and then call ExitThread.The operating system handles the allocation of the stack when either _beginthread or _beginthreadex is called; you do not need to pass the address of the thread stack to either of these functions. In addition, the stack_size argument can be 0, in which case the operating system uses the same value as the stack specified for the main thread.arglist is a parameter to be passed to the newly created thread. Typically it is the address of a data item, such as a character string. arglist may be NULL if it is not needed, but _beginthread and_beginthreadex must be provided with some value to pass to the new thread. All threads are terminated if any thread calls abort, exit, _exit, or ExitProcess.RequirementsRoutineRequired headerCompatibility_beginthread<process.h>Win 98, Win Me, Win NT, Win 2000, Win XP_beginthreadex<process.h>Win 98, Win Me, Win NT, Win 2000, Win XPFor additional compatibility information, see Compatibility in the Introduction.LibrariesMultithreaded versions of the C run-time libraries only.To use _beginthread or _beginthreadex, the application must link with one of the multithreaded C run-time libraries.ExampleThe following example uses _beginthread and _endthread.// crt_BEGTHRD.C// compile with: /MT /D "_X86_" /c#include <windows.h>#include <process.h> /* _beginthread, _endthread */#include <stddef.h>#include <stdlib.h>#include <conio.h>void Bounce( void *ch );void CheckKey( void *dummy );/* GetRandom returns a random integer between min and max. */#define GetRandom( min, max ) ((rand() % (int)(((max) + 1) - (min))) + (min))BOOL repeat = TRUE; /* Global repeat flag and video variable */HANDLE hStdOut; /* Handle for console window */CONSOLE_SCREEN_BUFFER_INFO csbi; /* Console information structure */int main(){CHAR ch = 'A';hStdOut = GetStdHandle( STD_OUTPUT_HANDLE );/* Get display screen's text row and column information. */GetConsoleScreenBufferInfo( hStdOut, &csbi );/* Launch CheckKey thread to check for terminating keystroke. */ _beginthread( CheckKey, 0, NULL );/* Loop until CheckKey terminates program. */while( repeat ){/* On first loops, launch character threads. */_beginthread( Bounce, 0, (void *) (ch++) );/* Wait one second between loops. */Sleep( 1000L );}}/* CheckKey - Thread to wait for a keystroke, then clear repeat flag. */ void CheckKey( void *dummy ){_getch();repeat = 0; /* _endthread implied */}/* Bounce - Thread to create and and control a colored letter that moves * around on the screen.** Params: ch - the letter to be moved*/void Bounce( void *ch ){/* Generate letter and color attribute from thread argument. */char blankcell = 0x20;char blockcell = (char) ch;BOOL first = TRUE;COORD oldcoord, newcoord;DWORD result;/* Seed random number generator and get initial location. */srand( _threadid );newcoord.X = GetRandom( 0, csbi.dwSize.X - 1 );newcoord.Y = GetRandom( 0, csbi.dwSize.Y - 1 );while( repeat ){/* Pause between loops. */Sleep( 100L );/* Blank out our old position on the screen, and draw new letter. */if( first )first = FALSE;elseWriteConsoleOutputCharacter( hStdOut, &blankcell, 1, oldcoord, &result );WriteConsoleOutputCharacter( hStdOut, &blockcell, 1, newcoord, &result );/* Increment the coordinate for next placement of the block. */oldcoord.X = newcoord.X;oldcoord.Y = newcoord.Y;newcoord.X += GetRandom( -1, 1 );newcoord.Y += GetRandom( -1, 1 );/* Correct placement (and beep) if about to go off the screen. */if( newcoord.X < 0 )newcoord.X = 1;else if( newcoord.X == csbi.dwSize.X )newcoord.X = csbi.dwSize.X - 2;else if( newcoord.Y < 0 )newcoord.Y = 1;else if( newcoord.Y == csbi.dwSize.Y )newcoord.Y = csbi.dwSize.Y - 2;/* If not at a screen border, continue, otherwise beep. */elsecontinue;Beep( ((char) ch - 'A') * 100, 175 );}/* _endthread given to terminate */_endthread();}Inputpress any key to endThe following sample code demonstrates how you can use the thread handle returned by _beginthreadex with the synchronization API WaitForSingleObject. The main thread waits for the second thread to terminate before it continues. When the second thread calls _endthreadex, it causes its thread object to go to the signaled state. This allows the primary thread to continue running. This cannot be done with _beginthread and _endthread, because _endthread calls CloseHandle, destroying the thread object before it can be set to the signaled state.// crt_begthrdex.cpp// compile with: /MT#include <windows.h>#include <stdio.h>#include <process.h>unsigned Counter;unsigned __stdcall SecondThreadFunc( void* pArguments ){printf( "In second thread...\n" );while ( Counter < 1000000 )Counter++;_endthreadex( 0 );return 0;}int main(){HANDLE hThread;unsigned threadID;printf( "Creating second thread...\n" );// Create the second thread.hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );// Wait until second thread terminates. If you comment out the line// below, Counter will not be correct because the thread has not// terminated, and Counter most likely has not been incremented to// 1000000 yet.WaitForSingleObject( hThread, INFINITE );printf( "Counter should be 1000000; it is-> %d\n", Counter );// Destroy the thread object.CloseHandle( hThread );}OutputCreating second thread...In second thread...Counter should be 1000000; it is-> 1000000如果是VC 6下,是由于没有使用多线程的C run-time library解决方法是:debug状态:settings->C/C++->Project Options中加入/MDdrelease状态:settings->C/C++->Project Options中加入/MD三、实验内容1.打开项目Lab3.1\Numbers.dsw,首先阅读程序代码并预测运行结果.然后编译运行该程序,检查实际结果是否与预测结果相同;连续多次运行该程序,检查每一次运行结果是否相同,为什么?2.编译运行项目Lab3.2\ExitCode.dsw,观察运行结果,并阅读和分析实验程序.3.打开项目Lab3.3\ShareDataSection.dsw,首先阅读程序代码并预测运行结果.然后编译运行该程序,检查实际结果是否与预测结果相同,为什么?4. 编写一组小程序测试Windows操作系统创建进程和线程的能力,创建尽可能多的进程和线程,得到这个数目的极限,进程和线程启动后可以进入睡眠状态或者死循环,考虑这两种情况对结果的影响.。

相关文档
最新文档