《操控》是韩国SBS电视台于2017年7月24日起在月火档播出的现实律政剧,由李政勋执导,金贤政编剧,南宫珉、刘俊相、严智苑、文成根等主演。该剧主要讲述了想要揭发社会不正之风真相的记者之间发生的故事, 以下是为大家整理的关于操作系统文件管理实验报告4篇 , 供大家参考选择。
操作系统文件管理实验报告4篇

【篇一】操作系统文件管理实验报告
实验项目二 进程管理
一、 实验目的
1. 理解进程的概念,掌握父、子进程创建的方法。
2. 认识和了解并发执行的实质,掌握进程的并发及同步操作。
二、 实验内容
1. 编写一C语言程序,实现在程序运行时通过系统调用fork( )创建两个子进程,使父、子三进程并发执行,父亲进程执行时屏幕显示“I am father”,儿子进程执行时屏幕显示“I am son”,女儿进程执行时屏幕显示“I am daughter”。
2. 多次连续反复运行这个程序,观察屏幕显示结果的顺序,直至出现不一样的情况为止。记下这种情况,试简单分析其原因。
3. 修改程序,在父、子进程中分别使用wait()、exit()等系统调用“实现”其同步推进,并获取子进程的ID号及结束状态值。多次反复运行改进后的程序,观察并记录运行结果。
三、 源程序及运行结果
源程序1:
#include
#include
#include
int main(int argc, char ** argv )
{
int pid=fork();
if(pid < 0)
printf("error!");
else if( pid == 0 )
{
printf("I am son!\n");
}
else
{
int pid=fork();
if (pid < 0)
printf("error!");
else if( pid == 0 )
{
printf(“I am daughter! \n");
}
else
printf("I am father!\n");
}
sleep(1);
return 0;
}
运行结果:
源程序2:
#include
#include
#include
int main(int argc, char ** argv )
{
char *message;
int n;
int pid=fork();
if(pid < 0)
printf("error!");
else if( pid == 0 )
{
message="I am daughter!";
pid=getpid();
n=3;
}
else
{
int pid=fork();
if (pid < 0)
printf("error!");
else if( pid == 0 )
{
message="I am son!";
pid=getpid();
n=3;
}
else
message="I am father!";
n=3;
}
for(;n>0;n--)
{
puts(message);
sleep(1);
}
return 0;
}
运行结果:
四、 实验分析与总结
1. 实验内容1运行结果为什么无固定顺序,fork()函数创建进程是如何并发执行的。
答:因为进程是并发执行的,fork()函数创建的三个进程抢占cpu不同,从而导致三个程序被cpu 调度顺序不同,所以实验一结果无固定顺序。Fork()函数调用成功后,子进程与父进程并发执行的代码相同,但由于子进程也继承父进程的程序指针,所以子进程是从fork()后执行的,另外fork在子进程和父进程中返回值是不同的。在父进程中返回子进程的pid,而在子进程中返回0,使父进程和子进程执行不同的分支。
2. 实验内容3是如何实现父子进程的同步执行的。
答:wait()会暂时停止目前进程的执行,直到有信号来到或子进程结束。程序段主要使用了函数wait()和,exit()这是因为父进程必须等待两个子进程终止后才终。在父进程中调用wait()函数,则父进程被阻塞,进入等待队列,等待子进程结束。子进程终止时执行exit()向父进程发终止信号,当接到信号后,父进提取子进程的结束状态值,从wait()返回继续执行原程序,从而实现了父、子进程的同步推进。
总结:通过进程管理实验,了解fork()函数创建进程是并发执行的,wait()进程表示会暂时停止目前进程的执行,可以灵活运用fork()和wait()进程解决有关问题。在实验中遇到许多问题,如:实验中调用fork()进程失败,可能的原因有系统中有太多的进程或者实际用户ID的进程总数超过了系统的限制。刚接触VMware这个系统,操作不熟悉,多次操作后,了解这个系统有关操作,实验做起来就比较简单了。对实验代码也不熟悉,最后通过请教老师和同学,终于实验理解透彻,并成功运行了。不仅上课要认真听课,要想真正学会,课下也要付出努力。
【篇二】操作系统文件管理实验报告
题目:实验五组号:第五组 同组同学姓名:纪天啸 宋雅迪 印佳明 于洋 湛健 日期: 2017年4月7日
实验环境:
内核版本:替换前4.8.0 替换后4.10.8
编译器:gcc 5.4.0
1. 问题描述学习linux系统调用的过程,通过向系统内核中增加一个自己编写的新函数,实现对内核空间的读写。函数功能主要为向用户返回目前时间(书中要求返回xtime的值,在新版本中时间以由timekeeper结构体替代)。
由于编译一次内核时间较长,修改不易。所以主要实现方式为先通过编写内核模块,修改系统内存中的系统调用表,插入自己编写的内核函数,对功能进行验证。无误后,修改linux内核源代码,加入自己编写的系统调用函数,重新编译内核,对现有内核进行替换。并在用户空间对函数进行调用验证。
2. 流程图插入内核模块方式:
重新编译内核方式:
系统调用函数功能的实现:
3. 设计实现3.1程序源码
附上程序源码
要求每个函数都有文件头
/*******************************************************
函数名:
参数表说明:
返回值:
函数功能描述:
********************************************************/
每个关键步骤都有注释,最好英文
插入内核模块方式:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define my_syscall_num 134//占用的原表中的系统调用号
//模块信息说明
MODULE_LICENSE("GPL");
MODULE_AUTHOR("JTX");
MODULE_DESCRIPTION("my_syscall");
MODULE_VERSION("1.0");
void disable_write_protection(void);//清除写保护
void enable_write_protection(void);//恢复写保护
asmlinkage long sys_my_syscall(int flag, struct timeval __user *thetime);//自己实现的系统调用函数
unsigned long *sys_call_table = 0;//存储系统调用表的地址
static int (*anything_saved)(void);//存储原表项的值
/*******************************************************
函数名:unsigned long **get_sys_call_table(void)
参数表说明:无
返回值:系统调用表地址
函数功能描述:获得内存中系统调用表的首地址。赋予entry内核空间首地址,对每块地址进行遍历,当entry[__NR_close]==sys_close,时即可认为找到系统调用表的地址,__NR_close为close的系统调用号。
********************************************************/
unsigned long **get_sys_call_table(void)
{
unsigned long **entry = (unsigned long **)PAGE_OFFSET;//赋予entry内核空间首地址
//对内核空间中每块地址进行遍历查找
for (;(unsigned long)entry < ULONG_MAX; entry += 1)
{
if (entry[__NR_close] == (unsigned long *)sys_close)
{
return entry;
}
}
return NULL;
}
/*******************************************************
函数名:void disable_write_protection(void)
参数表说明:无
返回值:无
函数功能描述:修改控制寄存器cr0,从而关闭写保护
********************************************************/
void disable_write_protection(void)
{
unsigned long cr0 = read_cr0();//读取cr0
clear_bit(16, &cr0);//清除第16位
write_cr0(cr0);//写回控制寄存器
}
/*******************************************************
函数名:void enable_write_protection(void)
参数表说明:无
返回值:无
函数功能描述:修改控制寄存器cr0,恢复写保护
********************************************************/
void enable_write_protection(void)
{
unsigned long cr0 = read_cr0();
set_bit(16, &cr0);
write_cr0(cr0);
}
/*******************************************************
函数名:static int __init init_addsyscall(void)
参数表说明:无
返回值:整型,状态
函数功能描述:初始化内核模块。获取系统调用表地址,并修改插入自己编写的系统调用函数
********************************************************/
static int __init init_addsyscall(void)
{
printk(KERN_EMERG"insmod!\n");
sys_call_table = (unsigned long *)get_sys_call_table();//获取系统调用表首地址
anything_saved = (int(*)(void)) (sys_call_table[my_syscall_num]);//保存原始系统调用的地址
disable_write_protection();//关闭写保护
sys_call_table[my_syscall_num] = (unsigned long)&sys_my_syscall;//更改原始的系统调用地址
enable_write_protection();//恢复写保护
return 0;
}
/*******************************************************
函数名:asmlinkage long sys_my_syscall(int flag, struct timeval __user *thetime)
参数表说明:flag为标志位,thetime返回当前时间
返回值:长整型
函数功能描述:从内核变量中读取当前时间并返回给用户,当标志位为真是,打印时间
********************************************************/
asmlinkage long sys_my_syscall(int flag, struct timeval __user *thetime)
{
if (likely(thetime != NULL))
{
struct timeval ktv;
struct timespec64 now;
getnstimeofday64(&now);
ktv.tv_sec = now.tv_sec;
ktv.tv_usec = now.tv_nsec/1000;
if (copy_to_user(thetime, &ktv, sizeof(ktv)))
return -EFAULT;
if (flag)
printk(KERN_EMERG"flag is true!\ntv.tv_sec: %ld\ntv.tv_usec: %ld\n", ktv.tv_sec, ktv.tv_usec);
}
printk(KERN_EMERG"This is my_syscall!\n");
return 0;
}
/*******************************************************
函数名:static void __exit exit_addsyscall(void)
参数表说明:无
返回值:无
函数功能描述:恢复系统调用表,退出模块
********************************************************/
static void __exit exit_addsyscall(void)
{
disable_write_protection();//关闭写保护
//恢复原有的sys_call_table的函数指针的值。
sys_call_table[my_syscall_num] = (unsigned long)anything_saved;
//恢复写保护
enable_write_protection();
printk(KERN_EMERG"rmmod!\n");
}
module_init(init_addsyscall);
module_exit(exit_addsyscall);
重新编译内核方式:
1.在include/linux/syscalls.h中加入函数声明:
asmlinkage long sys_my_syscall(int flag, struct timeval __user *thetime);
2.在kernel/sys_ni.c加入系统调用,处理失败的情况:
cond_syscall(sys_my_syscall);
3.在arch/x86/entry/syscalls/syscall_64.tbl(针对x86架构)中添加系统调用表项:
332 common my_syscall sys_my_syscall
4.在time.c中添加函数定义
3.2测试结果
插入内核模块进行测试:
编译内核前内核版本:
编译替换后:
在用户空间对调用进行测试:
4. 总结4.1 遇到的问题及解决办法
问题1:编译一次内核所需时间太长,修改调试不方便
问题1解决方法:采取先在内核模块中完成测试功能后,再写入内核代码。
问题2:在编译内核时提示无配置文件,无法编译
问题2解决办法:把系统中原有的内核配置文件.config拷贝到新内核的目录下即可
问题3:查找系统调用表时,网上的例子是使用命令查看/proc文件来获取,再硬编码到程序中,这种方法不可靠,当重新开机后地址会改变
问题3解决方法:遍历内核空间每个地址即可,具体说明可见代码中函数get_sys_call_table的说明
问题4:网上例子中采取内联汇编的方式修改寄存器,在32位中有效,在64位系统中报错
问题4解决方法:查阅资料可知,内核中提供了修改寄存器的接口
问题5:在内核代码kernel文件夹下系统调用表无效
问题5解决方法:查阅文档可知,x86架构有其指定的系统调用表,在arch/x86下,kernel文件夹中为其他架构通用的系统调用表
4.2 心得体会
本次实验涉及的是linux的系统调用。所谓系统调用,即操作系统为应用程序提供的与内核进行交互的一组接口。通过此接口,用户态下的应用程序可以转化为内核态,同时调用相应的内核函数运行,从而实现应用程序与内核的交互。
通过本次实验我们学会了如何向linux系统内核中添加自己编写的函数进行调用,明白了linux系统调用的过程,体会到了系统内核的重要性,计算机本身不具备文件写入和读出功能,这些功能由操作系统提供。操作系统是功能扩展机(虚拟机),它提供了许多系统调用,供程序员使用。要做好实验,需要按照实验教程上面的内容一步步落实,要边做边领悟相关原理及运行结果的出现的原因,这样我们才能在试验中学到更多、掌握更多。其次,也遇到问题我们自然是要先自己思考,通过不同的尝试来解决,之后不能解决的我们要多向老师同学请教,通过互相交流得来的知识也是会让我们难忘的。
【篇三】操作系统文件管理实验报告
许昌学院
《操作系统》实验报告书
学号:
姓名:闫金科
班级:14物联网工程
成绩:
2016年02月
实验一Linux的安装与配置
一、实验目的
1. 熟悉Linux系统的基本概念,比如Linux发行版、宏内核、微内核等。
2. 掌握Linux系统的安装和配置过程,初步掌握Linux系统的启动和退出方法。
3. 熟悉Linux系统的文件系统结构,了解Linux常用文件夹的作用。
二、实验内容
1. 从网络上下载VMware软件和两个不同Linux发行版镜像文件。
2. 安装VMware虚拟机软件。
3. 在VMware中利用第一个镜像文件完成第一个Linux的安装,期间完成网络信息、用户信息、文件系统和硬盘分区等配置。
4. 在VMware中利用第二个镜像文件完成第二个Linux的安装,并通过LILO或者GRUB解决两个操作系统选择启动的问题。
5. 启动Linux系统,打开文件浏览器查看Linux系统的文件结构,并列举出Linux常用目录的作用。
三、 实验过程及结果
1、启动VMware,点击新建Linux虚拟机,如图所示:
2、点击下一步,选择经典型,点击下一步在选择客户机页面选择Linux,版本选择RedHatEnterpriseLinux5,如图所示:
3、点击下一步创建虚拟机名称以及所要安装的位置,如图所示:
4、点击下一步,磁盘容量填一个合适大小,此处选择默认值大小10GB,如图所示:
5、点击完成,点击编辑虚拟机设置,选择硬件选项中的CD-ROM(IDE...)选项,在右侧连接中选择“使用ISO镜像(I)”选项,点击“浏览”,找到Linux的镜像文件,如图所示:
6点击确定按钮后,点击启动虚拟机按钮,来到Linux的安装界面,如图所示:
7、到此页面之后,等待自动检测安装,如图所示:
8、等到出现如图所示页面后点击“skip”按钮,跳过检测,直接进入安装设置界面,如图所示:
9、安装设计界面如图所示:
10、点击Next按钮进入设置语言界面,设置语言为“简体中文”,如图所示:
11、点击Nest按钮进入系统键盘设置按钮,设置系统键盘为“美国英语式”,如图所示:
12、点击下一步按钮,弹出“安装号码”对话框,选择跳过输入安装号码,如图所示:
13、按照提示,一直点击下一步按钮,如图所示:
14、到设置最后一步,点击下一步按钮进入开始安装RedHatEnterpriseLinuxSever界面,如图所示:
15、安装完成后,进入欢迎界面,按照提示点击前进按钮知道进入Linux桌面,如图所示:
16、安装成功的Linux系统桌面如图所示,桌面包含五个图标,分别为:计算机、jk’sHome、回收站、RHEL/5.3i386DVD。
四、实验总结
通过安装虚拟机等操作让我认识到Linux这系统一些基本特点,本次试验学会了安装虚拟机并且使用虚拟机安装操作系统,掌握了红帽Linux系统的安装和配置过程,以及对镜像ISO文件的使用,有别于我们机器上使用的系统,通过虚拟机这个软件还可以在已有系统的基础上使用其他操作系统。安装过程中一定要注意选择版本的时候要选择RedHatEnterpriseLinux5版本,否则安装不能成功。自己动手成功的安装了Linux系统,自己对Linux的学习产生更大的兴趣。
实验二Linux操作系统的运行模式
一、实验目的
1. 熟悉Linux系统终端工作环境的使用,了解Linux命令的格式,使用学会利用常用的Linux命令来完成系统的管理和维护。
2. 了解X-Windows的特点,熟悉Linux图形用户接口的使用,掌握GNOME桌面环境的基本操作。
3. 了解和掌握在Linux环境下安装软件包的方法,如QQforLinux等用软件的安装方法。
二、实验内容
1. 启动Linux系统打开虚拟终端界面,使用Linux的在线帮助指令man或help获得ls、uname、date、cal、mkdir、cp等Linux命令的帮助手册,了解这些命令的具体使用方法。同时,也可以通过执行“命令名–help”来显示该命令的帮助信息,如“ls–help”,试用这些命令。
2. 通过uname命令的执行,查看并给出相关系统信息:操作系统的名称、系统域名、系统CPU名称等。
3. 在主目录下创建一个名为myetc的子目录,将/etc目录下与网络相关的文件和子目录拷贝到该目录,并将这些文件的执行权限设置为可执行。
4. 在主目录/home下创建目录program、music和temp,然后在program下建立目录java和C,列出完成该过程的所有命令。
5. 在图形界面环境中,查看GNOME桌面的面板和桌面,设置GNOME,包括屏幕保护程序、更改背景和指定关联程序等。
6. 实现对光盘的加载和访问,然后卸载。
三、实验过程及结果
1、打开终端,输入【ls–help】来查看【ls】指令的使用方法,同理查看uname、date
、cal、mkdir、cp的使用方法。
2、在终端中输入【uname–a】显示操作系统名系统cpu名和系统域名
3、重启系统,用【root】用户名进入系统,以获得权限。在终端中输入【mkdirmyetc】,在主目录下创建【myrtc】的目录,【ls】查看是否创建。输入【cd..】返回至【/】文件,输入【cp–retcroot/myetc】讲etc中内容复制到myetc中,进入myetc文件【ls】查看。输入
【chmodu+xetc】赋予文件可执行的权限,输入【ll】查看。
4、在home下,输入【mkdir{program,music,temp}】,可在home下创立这三个目录,输入【ls】查看。在program下输入【mkdir{java,C}】,可创立java和C两个目录,【ls】查看。
5、在桌面上方选择【系统】-【首选项】,即可设置屏幕保护程序和更改背景和指定关联程序
5、在桌面上可见看到有CD光盘,双击浏览,右键【弹出】即卸载。
四、实验总结和体会
Linux的指令系统是学习Linux操作系统很重要的一部分,指令系统相当于在Windows操作系统下的doc,可以省去图形化界面。通过这次的实验让我了解了Linux的强大功能,了解到Linux有许多方便快捷的设置基本配置的方法,这使我更喜欢上Linux的使用。在使用指令的过程中,有时候对文件的操作需要一定的权限,这时需要在登陆时用户名使用【root】,而不是我们在安装时使用的用户名,这样就获得了管理员权限,可以对一些系统文件进行操作。
实验三Linux应用软件与系统管理
一、实验目的
1. 了解OpenOffice.Org集成办公软件,掌握利用OpenOffice.Org的套件来完成文档和图片的处理。
2. 了解Linux网络管理的知识,熟悉Linux网络配置的方法,掌握在Linux环境下配置Web服务器和ftp服务的方法。
二、实验内容
1. 配置Linux系统的网络环境,安装FTP和Web服务器,并配置相关的属性,利用FTP实现WINDOWS和Linux之间的数据交换。
2. 利用FTP程序上传自己的照片到FTP服务器,利用OpenOffice的文字处理工具OpenOfficeWriter制作一份表格形式的个人简历。个人简历中至少包含学号、姓名、性别、专业、照片和学习经历等内容,并保存为网页格式(html格式)。
3. 将个人简历网页设置为WEB服务器的首页,然后在客户端利用浏览器访问WEB服务器,查看效果。
4. 通过读取proc文件系统,获取系统各种信息(如主机名、系统启动时间、运行时间、版本号、所有进程信息、CPU使用率等),并以比较容易的方式显示。
三、实验过程及结果
1.配置网络环境:在(服务.cmd).里面进行以下操作:在服务里选择3按回车
完成后,可在本地连接看到VMware已连接上网络
在虚拟机设置中设置以太网网络连接方式为
网关地址填虚拟机的网管,IP地址设为虚拟机的一个子网:
四、总结:
在linux系统下,make是我们经常用到的编译命令,所以关于make代码和他的操作指令一定要记清楚。所以,熟练掌握了make和makefile工具之后,源码安装软件就变的像windows下安装软件一样简单。
实验四进程控制与管理
一、实验目的
1. 掌握GCC编译器的用法,学会利用GCC编辑器来编辑C语言程序,学会利用GDB调试器来调试C语言程序。
2. 理解进程和程序的区别和联系,
3. 掌握在Linux环境下观察进程运行情况和CPU工作情况的命令。
4. 了解fork()系统调用,掌握利用fork()创建进程的方法。
5. 了解Linux系统其他与进程相关的系统调用,如exec、wait和exit等。
6. 了解Linux常用的进程通信机制。
二、实验内容
1. 利用Linux的进程管理命令ps、top来监视和跟踪进程,体会进程和程序的关系。
2. 利用Linux的文字编辑器编写文件复制的C语言程序,并用gcc编译该程序,然后运行该程序。
3. 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示"a",子进程分别显示字符"b"和字符"c"。试观察记录屏幕上的显示结果,并分析原因。
4. 修改上述程序,每一个进程循环显示一句话。子进程显示"daughter…"及"son……",父进程显示"parent……",观察结果,分析原因。
5. 用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容。
三、实验过程及结果
1、利用Linux的进程管理命令ps、top来监视和跟踪进程,体会进程和程序的关系。
从用户身份切换到ROOT身份
输入命令ps查看进程
输入命令top跟踪进程
2、利用Linux的文字编辑器编写一个计算机100个自然数和的C语言程序,并用gcc编译该程序,然后运行该程序。
创建一个.C文件并进入进行编辑
用GCC进行编译,再查看文件,发现产生执行文件a.out
执行这个可执行文件得到结果5050
1、 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示"a",子进程分别显示字符"b"和字符"c"。试观察记录屏幕上的显示结果,并分析原因。
穿件一个.C文件并进行编写程序代码
反复执行2次该程序
可以看出两次执行的结果abc出现的顺序不同,原因是,3个进程的输出次序是随机的,并不会按规定的顺序出现,所以会出现上述结果。
4、修改上述程序,每一个进程循环显示一句话。子进程显示"daughter…"及"son……",父进程显示"parent……",观察结果,分析原因。
重新修改代码
执行这段程序
原分析:
因和之前一样,可以看出执行的结果3个单词出现的顺序不同,原因是,
3个进程的输出次序是随机的,并不会按规定的顺序出现,所以会出现上述结果。
5、用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容。
编写代码
执行的结果
结果表明execl替代了son的内容
四、实验总结和体会
这个实验考察的是进程之间存在很多可能性以及对编辑器的使用。本次实验学习了在linux环境下用gcc编译器运行c语言程序,在linux环境下编写程序用到了vi编辑器,知道了该编辑器也需要各种命令来操作。编写C语言程序时用到了fork()函数,再调用execl()用新的程序替换该子进程的内容。
实验五进程调度模拟程序的设计与实现
一、实验目的
1. 了解进程调度的概念,掌握常用进程调度算法的原理。
2. 掌握Linux程序设计编辑、编译和调试的技巧。
二、实验内容
1. 编写程序实现进程调度调度算法先来先服务、优先级高优先和时间片轮转调度算法。(编程语言不限)
2. 输入数据,输出运行结果。
三、实验过程及结果
四、 实验总结和体会
通过做本实验,让我对进程或作业先来先服务、高优先权、按时间片轮转调度算法以及进程调度的概念和算法,有了更深入的认识!理解进程的状态及变化,动态显示每个进程的当前状态及进程的调度情况。进程调度是处理机管理的核心内容。优先级高优先是根据作业的优先级,总是选择优先级最高者进入队列。轮转调度算法是调度程序每次把CPU分配给就绪队列首进程/线程使用规定的时间间隔,就绪队列中都路保留巡行一个时间片。
【篇四】操作系统文件管理实验报告
操作系统教程
实验指导书
实验一 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++源程序的文件名。
步骤4:将清单1-1所示的程序清单复制到新创建的C/C++源程序中。编译成可执行文件。
步骤5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,然后进入工程目录中的debug子目录,执行编译好的可执行程序:
E:\课程\os课\os实验\程序\os11\debug>hello.exe
运行结果 (如果运行不成功,则可能的原因是什么?) :
答:运行成功,结果:
(2)计算进程在核心态运行和用户态运行的时间
步骤1:按照(1)中的步骤创建一个新的“Win32 Consol Application”工程,然后将清单1-2中的程序拷贝过来,编译成可执行文件。
步骤2: 在创建一个新的“Win32 Consol Application”工程,程序的参考程序如清单1-3所示,编译成可执行文件并执行。
步骤3:在“命令提示符”窗口中运行步骤1中生成的可执行文件,测试步骤2中可执行文件在核心态运行和用户态运行的时间。
E:\课程\os课\os实验\程序\os12\debug>time TEST.exe
步骤4:运行结果 (如果运行不成功,则可能的原因是什么?)
因为此程序是个死循环,所以运行时间为无穷大。______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
步骤5:分别屏蔽While循环中的两个for循环,或调整两个for循环的次数,写出运行结果。
屏蔽i循环:
_______________________________________________________________________________屏蔽j循环:
_______________________________________________________________________________调整循环变量i的循环次数:
_______________________________________________________________________________调整循环变量j的循环次数:
_______________________________________________________________________________
3、 实验结论
通过实验可以得知运行一个程序CPU的使用情况是不同的,同时与循环的次数无关,和当前计算的复杂情况有关。实验得出的数据可以可以说明这一点。
实验二 进程管理
1、实验目的
1) 通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解Windows进程的“一生”。
2) 通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。
2、实验内容和步骤
(1). 创建进程
本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:\课程\os课\os实验\程序\os11\debug>os21
(假设编译生成的可执行文件是os21.exe)
_____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
PID:3676 ,
句柄数:11
内存使用:1080K
页面错误:263
页面缓存:15K
步骤3:在“命令提示符”窗口加入参数重新运行生成的可执行文件。运行结果:
范例:E:\课程\os课\os实验\程序\os11\debug>os21 3
(假设编译生成的可执行文件是os21.exe)
按下ctrl+alt+del,调用windows的任务管理器,记录进程相关的行为属性:
PID:2821
句柄数:7
内存使用:832K
页面错误:263
页面缓存:15K
步骤4:修改清单2-1中的程序,将nClone的定义和初始化方法按程序注释中的修改方法进行修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤2中的方式运行,看看结果会有什么不一样。运行结果:
第一次修改:结果不变。
第二次修改:是一个死循环,不断的弹出此窗口:
从中你可以得出什么结论:
nClone的作用:_控制程序的执行,当nClone大于等于5时可跳出程序。
________________________________________________________________
_____________________________________________________________________
变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?________________
____有,nClone被修改后会对程序的结束控制产生影响
_______________________________________________________________________________
(2). 父子进程的简单通信及终止进程
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单2-2中的程序,编译成可执行文件。
步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:\课程\os课\os实验\程序\os11\debug>os22
(假设编译生成的可执行文件是os22.exe)
步骤3:按源程序中注释中的提示,修改源程序2-2,编译执行(执行前请先保存已经完成的工作)。运行结果:
不断的弹出:
在程序中加入跟踪语句,或调试运行程序,同时参考MSDN中的帮助文件CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述:
通过main(int argc, char* argv[])传递参数,每次运行时先检测argc的值,若小于1,程序运行结束,否则继续往下执行。
步骤4:填空
CreateProcess() 函数有_5_______个核心参数?本实验程序中设置的各个参数的值是:
a. ______szFilename___________________________________________;
b. ______szCmdLine___________________________________________;
c. ______NULL___________________________________________;
d. ______NULL___________________________________________;
e. ______FALSE___________________________________________;
f. _______CREATE_NEW_CONSOLE__________________________________________;
g. _______NULL__________________________________________;
h. _______NULL__________________________________________;
i. _______si__________________________________________;
j. _______pi__________________________________________。
步骤5:按源程序中注释中的提示,修改源程序2-2,编译执行。运行结果:
步骤6:参考MSDN中的帮助文件CreateMutex()、OpenMutex()、ReleaseMutex()和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述:
CreateMutex()创建互斥体,OpenMutex()打开互斥体,ReleaseMutex()释放互斥体,WaitForSingleObject()检测hHandle事件的信号状态,通过这些方法可实现当前只有一个进程被创建或使用,实现进程的同步。
3、 实验结论
通过对进程的操作,如创建进程,实现对进程的简单控制。创建互斥体,解决了进程的同步问题,两者相互使用,使进程的运行情况得到了很好的管理。
实验三 进程同步的经典算法
1、实验目的
1) 回顾系统进程、线程的有关概念,加深对Windows 2000线程的理解。
2) 了解互斥体对象,通过对生产者消费者等进程间同步与互斥经典算法的实现,加深对P、V原语以及利用P、V原语进行进程间同步与互斥操作的理解。
2、实验内容和步骤
(1). 生产者消费者问题
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单3-1中的程序,编译成可执行文件。
步骤2:在“命令提示符”窗口运行步骤1中生成的可执行文件。运行结果:
范例:E:\课程\os课\os实验\程序\os11\debug>os31
(假设编译生成的可执行文件是os31.exe)
步骤3:仔细阅读源程序,找出创建线程的WINDOWS API函数,回答下列问题:线程的第一个执行函数是什么(从哪里开始执行)?它位于创建线程的API函数的第几个参数中?
答:第一个执行函数是Producer;位于第三个参数中。
步骤4:修改清单3-1中的程序,调整生产者线程和消费者线程的个数,使得消费者数目大与生产者,看看结果有何不同。运行结果:
从中你可以得出什么结论:
生产速度快,生产者经常等待消费者;反之,消费者经常等待。
步骤5:修改清单3-1中的程序,按程序注释中的说明修改信号量EmptySemaphore的初始化方法,看看结果有何不同。运行结果:
步骤6:根据步骤4的结果,并查看MSDN,回答下列问题
1)CreateMutex中有几个参数,各代表什么含义。
答:有三个参数.
1. LPSECURITY_ATTRIBUTES lpMutexAttributes 代表安全属性的指针
2. BOOL bInitialOwner代表布尔bInitialOwner
3. LPCTSTR lpName 代表LPCTSTR类型lpName
2)CreateSemaphore中有几个参数,各代表什么含义,信号量的初值在第几个参数中。
四个参数:1、表示采用不允许继承的默认描述符2、设置信号机的初始计数3、设置信号机的最大计数 4、指定信号机对象的名称。
3)程序中P、V原语所对应的实际Windows API函数是什么,写出这几条语句。
P:Take() V:Append()
4)CreateMutex能用CreateSemaphore替代吗?尝试修改程序3-1,将信号量Mutex完全用CreateSemaphore及相关函数实现。写出要修改的语句:
可以
Mutex=CreateSemaphore(NULL,false,false,NULL);
(2). 读者写者问题
根据实验(1)中所熟悉的P、V原语对应的实际Windows API函数,并参考教材中读者、写者问题的算法原理,尝试利用Windows API函数实现第一类读者写者问题(读者优先)。
3、 实验结论
将信号量看作生产或消费的一个对象,对信号量的生成和销毁操作如同P操作和V操作一样,生成者消费者问题模拟的就是对信号量的生成和销毁,其中牵涉了信号量的同步,这也是该问题为何称为同步的经典问题的原因。
实验四 存储管理
1、 实验目的
(1) 通过对Windows 2000“任务管理器”、“计算机管理”、“我的电脑”属性、“系统信息”、“系统监视器”等程序的应用,学习如何察看和调整Windows的内存性能,加深对操作系统存储管理、虚拟存储管理等理论知识的理解。
(2) 了解Windows 2000的内存结构和虚拟内存的管理,理解进程的虚拟内存空间和物理内存的映射关系。
2、 实验内容和步骤
(1)观察和调整Windows 2000/XP的内存性能。
步骤1:阅读“背景知识”,请回答:
1) 什么是“分页过程”?
分页过程就是将信息从主内存移动到磁盘进行临时存储的过程。
2) 什么是“内存共享”?
允许访问某些内存空间而不危及它和其他应用程序的安全性和完整性
3) 什么是“未分页合并内存”和“分页合并内存”?
Windows 2000中,未分页合并内存的最大限制是多少?
未分页合并内存:分页合并内存是存储迟早需要的可分页代码或数据的内存部分。
分业合并内存: 未分页合并内存包含必须驻留在内存中的占用代码或数据。
在Windows2000中为分业合并内存的最大限制是256MB。
4) Windows 2000分页文件默认设置的最小容量和最大容量是多少?
内存数量的1.5倍作为分页文件的最小容量,这个最小容量的两倍作为最大容量。
步骤2:登录进入Windows 2000 Professional。
步骤3:查看包含多个实例的应用程序的内存需求。
1) 启动想要监视的应用程序,例如Word。
2) 右键单击任务栏以启动“任务管理器”。
3) 在“Windows任务管理器”对话框中选定“进程”选项卡。
4) 向下滚动在系统上运行的进程列表,查找想要监视的应用程序。
请在表4-3中记录:
表4-3 实验记录
“内存使用”列显示了该应用程序的一个实例正在使用的内存数量。
5) 启动应用程序的另一个实例并观察它的内存需求。
请描述使用第二个实例占用的内存与使用第一个实例时的内存对比情况:
第二个实例占用内存22612K,比第一个实例占用的内存大很多。
步骤4:未分页合并内存。
估算未分页合并内存大小的最简单方法是使用“任务管理器”。未分页合并内存的估计值显示在“任务管理器”的“性能”选项卡的“核心内存”部分。
总数 (K) :__96340K___________________________
分页数:_____50328___________________________
未分页 (K) :__46052K_________________________
还可以使用“任务管理器”查看一个独立进程正在使用的未分页合并内存数量和分页合并内存数量。操作步骤如下:
1) 单击“Windows任务管理器”的“进程”选项卡,然后从“查看”菜单中选择“选择列”命令,显示“进程”选项卡的可查看选项。
2) 在“选择列”对话框中,选定“页面缓冲池”选项和“非页面缓冲池”选项旁边的复选框,然后单击“确定”按钮。
返回Windows 2000“任务管理器”的“进程”选项卡时,将看到其中增加显示了各个进程占用的分页合并内存数量和未分页合并内存数量。
仍以刚才打开观察的应用程序 (例如Word) 为例,请在表4-4中记录:
表4-4 实验记录
从性能的角度来看,未分页合并内存越多,可以加载到这个空间的数据就越多。拥有的物理内存越多,未分页合并内存就越多。但未分页合并内存被限制为256MB,因此添加超出这个限制的内存对未分页合并内存没有影响。
步骤5:提高分页性能。
在Windows 2000的安装过程中,将使用连续的磁盘空间自动创建分页文件(pagefile.sys) 。用户可以事先监视变化的内存需求并正确配置分页文件,使得当系统必须借助于分页时的性能达到最高。
虽然分页文件一般都放在系统分区的根目录下面,但这并不总是该文件的最佳位置。要想从分页获得最佳性能,应该首先检查系统的磁盘子系统的配置,以了解它是否有多个物理硬盘驱动器。
1) 在“开始”菜单中单击“设置” – “控制面板”命令,双击“管理工具”图标,再双击“计算机管理”图标。
2) 在“计算机管理”窗口的左格选择“磁盘管理”管理单元来查看系统的磁盘配置。
如果系统只有一个硬盘,那么建议应该尽可能为系统配置额外的驱动器。这是因为:Windows 2000最多可以支持在多个驱动器上分布的16个独立的分页文件。为系统配置多个分页文件可以实现对不同磁盘I/O请求的并行处理,这将大大提高I/O请求的分页文件性能。
请在表4-5中记录:
表4-5 实验记录
步骤6:计算分页文件的大小。
要想更改分页文件的位置或大小配置参数,可按以下步骤进行:
1) 右键单击桌面上的“我的电脑”图标并选定“属性”。
2) 在“高级”选项卡上单击“性能选项”按钮。
3) 单击对话框中的“虚拟内存”区域中的“更改”按钮。
请记录:
所选驱动器 (C: ) 的页面文件大小:
驱动器:_C:__________________________________
可用空间:________31637________________________ MB
初始大小 (MB) :___________________________
最大值 (MB) :_____________________________
所选驱动器 (D: ) 的页面文件大小:(如果有的话)
驱动器:______D:_____________________________
可用空间:____20682____________________________ MB
初始大小 (MB) :____756MB_______________________
最大值 (MB) :____1512MB_________________________
所有驱动器页面文件大小的总数:
允许的最小值:___2_________________________ MB
推荐:___________1522_________________________ MB
当前已分配:________756______________________ MB
4) 要想将另一个分页文件添加到现有配置,在“虚拟内存”对话框中选定一个还没有分页文件的驱动器,然后指定分页文件的初始值和最大值 (以兆字节表示) ,单击“设置”,然后单击“确定”。
5) 要想更改现有分页文件的最大值和最小值,可选定分页文件所在的驱动器。然后指定分页文件的初始值和最大值,单击“设置”按钮,然后单击“确定”按钮。
6) 在“性能选项”对话框中单击“确定”按钮。
7) 单击“确定”按钮以关闭“系统特性”对话框。
步骤7:使用任务管理器。
可以使用“任务管理器”来简单地检查分页文件是否配置了正确容量。这样可以实时提供系统正在使用分页文件的方式以及其他重要系统信息的准确描述。
通过右键单击任务栏运行“任务管理器”,选定“性能”选项卡查看实时的系统统计数据。与分页文件大小最有关的信息位于“认可用量”区域。这一区域显示了认可“峰值”是否达到或超过了认可“限制”,以及它是否超过了系统上的物理内存数量。认可“峰值”是指系统迄今为止向进程分配的最大物理内存和虚拟内存数量。
请记录:
物理内存 (K)
总数:___1039660K_____________________________
可用数:_502544K_____________________________
系统缓存:504332K____________________________
认可用量 (K)
总数:____400156K____________________________
限制:____1714520K____________________________
峰值:____427648K____________________________
当系统遇到分页活动增加的情况时,提交的内存数量 (“认可总数”) 就会增加。一旦它达到了“认可限制”值,系统就需要扩展分页文件。“认可限制”值指出在不必扩展分页文件的情况下可以向内存提交的虚拟内存数量。因为目标是避免扩展分页文件,所以必须保持“认可总数”和“认可限制”值相差较大。如果这两个值接近了,那么系统必须动态增加分页文件的大小。
“任务管理器”的“认可用量”区域显示的信息还说明了系统的主内存是否足以满足系统执行的任务。如果认可“总数”值经常超过系统中的内存数量,那么系统的物理内存可能不足。
(2)了解和检测进程的虚拟内存空间。
步骤1:创建一个“Win32 Consol Application”工程,然后拷贝清单4-1中的程序,编译成可执行文件。
步骤2:在VC的工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者在“命令提示符”窗口运行步骤1中生成的可执行文件。
范例:E:\课程\os课\os实验\程序\os11\debug>os41
(假设编译生成的可执行文件是os41.exe)
步骤3:根据运行结果,回答下列问题
虚拟内存每页容量为:________4.00KB______________________________________
最小应用地址:______________0x00010000_____________________________________
最大应用地址:_____________0x7ffeffff_______________________________________
当前可供应用程序使用的内存空间为:_____1.99GB___________________________
当前计算机的实际内存大小为:_____0.99GB_________________________________
理论上每个Windows应用程序可以独占的最大存储空间是:_____________
按committed、reserved、free等三种虚拟地址空间分别记录实验数据。其中“描述”是指对该组数据的简单描述,例如,对下列一组数据:
00010000 – 00012000 Committed, READWRITE, Private
可描述为:具有READWRITE权限的已调配私有内存区。
将系统当前的自由区 (free) 虚拟地址空间填入表4-6中。
表4-6 实验记录
将系统当前的已调配区 (committed) 虚拟地址空间填入表4-7中。
表4-7 实验记录
将系统当前的保留区 (reserved) 虚拟地址空间填入表4-8中。
表4-8 实验记录
3、 实验结论
简单描述windows进程的虚拟内存管理方案:通过对文件的操作权限,有只读,读写,不允许访问等等和不同的调度方式实现对虚拟内存的管理。
实验五 文件和设备管理
1、实验目的
通过对Windows 2000提供的文件与文件夹加密、磁盘配额管理、进行磁盘清理、执行备份操作、使用CHKDSK维护文件完整性和整理磁盘碎片等功能进行操作:
1) 熟悉Windows 2000的文件系统。
2) 明确应用NTFS文件系统的积极意义。
3) 掌握优化Windows 2000磁盘子系统的基本方法。
4) 进一步理解现代操作系统文件管理知识。
2、实验内容与步骤
步骤1:阅读“背景知识”,请回答:
1) Windows 2000支持哪三种主要的文件系统:
a. ______FAT16____________________________________________________________
b. _______FAT32___________________________________________________________
c. _____ NTFS _____________________________________________________________
2) NTFS文件系统只能用于哪些操作系统环境:
Windows NT、2000和XP
步骤2:登录进入Windows 2000 Professional。
步骤3:加密文件或文件夹。
为加密文件或文件夹,可按照以下步骤进行:
1) 在“Windows资源管理器”中,右键单击想要加密的文件或文件夹,然后单击“属性”命令。
2) 在“常规”选项卡上,单击“高级”按钮。在“高级属性”对话框中,可以设置的文件属性有:
3) 选定“加密内容以便保护数据”复选框。
4) 单击“确定”按钮完成操作。
步骤4:访问RSM服务。
Windows 2000还通过一些辅助组件提供了用于额外存储的选项。可移动存储管理 (Removable Storage Management,RSM) 就是一项用于管理可移动媒体 (例如磁带和光盘) 以及存储设备 (库) 的服务。RSM允许应用程序访问和共享相同的媒体资源。RSM使用户可以很容易地追踪可移动存储媒体 (例如磁带和光盘) ,并管理包含它们的库 (例如转换器和光盘机) 。
为访问RSM服务,可按以下步骤操作:
1) 在“控制面板”中双击“管理工具”图标,再双击其中的“计算机管理”图标,打开本地“计算机管理”窗口。
2) 在左窗格右键单击控制树中的“可移动存储”。
“可移动存储”可以管理和设置的项目有:
a. ________媒体____________________________________________
b. _________库___________________________________________
磁盘配额可追踪和控制卷的磁盘空间使用情况。为分配磁盘配额,可按照以下步骤进行:
1) 打开“我的电脑”。
2) 右键单击想要指定默认配额位的卷 (例如某个硬盘) ,然后单击“属性”命令。
3) 在“属性“对话框中,选定”配额“选项卡。
4) 在“属性“对话框的”配额“选项卡上,选定“启用配额管理”。
5) 选定“将磁盘空间限制为”选项,这将激活磁盘空间限制和警告级别区域。
6) 在文本框中键入数值,从下拉列表中选定一个磁盘空间限制单位,然后单击“确定”。可以使用小数值 (例如20.5MB) 。
步骤6:添加新的磁盘配额项
在启用卷的磁盘配额时,将从这一时刻开始自动追踪新用户的卷使用情况。为了对现有的卷用户应用磁盘配额,可以在“配额项”对话框中添加新的配额项。操作步骤如下:
1) 在“我的电脑”窗口中,右键单击想要添加新的磁盘配额项的卷,然后单击“属性”命令。
2) 在“属性”对话框中,选定“配额”选项卡。
3) 在“配额”选项卡上,单击“配额项”按钮。
4) 在“配额项目”窗口的“配额”菜单中单击“新建配额项”命令。
5) 在“选择用户”对话框中,单击“查找范围”列表框,选定想要从中选择用户名的域名或工作组名称。单击“添加”,然后单击“确定”按钮。
6) 在“添加新配额项”对话框中,可以对所选用户设置的配额限制项目有:
7) 单击“确定”按钮完成操作。
只能在Windows 2000中使用 NTFS格式化的磁盘卷上分配磁盘配额。如果想要管理配额,则必须是驱动器所在计算机上的Administrators组的成员。
步骤7:磁盘清理。
“磁盘清理”有助于释放硬盘驱动器空间。“磁盘清理”程序将搜索驱动器,然后显示可以安全删除的临时文件、Internet缓存文件以及不需要的程序文件。可以指示删除其中一些或所有的文件。
为打开“磁盘清理”功能,可单击“开始”按钮,单击“程序”菜单中的“附件”-“系统工具”-“磁盘清理”命令。
“磁盘清理”搜索指定的驱动器。在打开和关闭文件或者使用Interne连接时,系统会创建临时文件,这些临时性质的文件有时会继续保存在硬盘上。“磁盘清理”程序可以了解这些文件采用的形式及其在磁盘上的位置,以便安全地删除这些文件,释放宝贵的磁盘空间。
步骤8:备份。
为应对故障事件,Windows 2000包括了一个功能齐全的“备份”程序,该程序使用了一些标准的备份设备。
单击“开始”菜单中“系统工具”的“备份”命令,可运行“备份”实用程序。
在“备份”程序中包括了“备份向导”和“还原向导”,这些向导简化了备份和恢复Windows 2000服务器上存储的重要数据的任务。用户也可以在“备份”选项卡和“还原”选项卡中使用“备份”和“还原”程序的手工版本。
· 备份数据
要想选定要备份的数据,只需要在“备份”窗口的左窗格中单击要备份的文件或目录旁边的复选框即可。然后在窗口下方选择备份目的地,命名备份媒体,最后单击“开始备份”按钮。
· 恢复数据
为“还原”恢复数据,先选定想要恢复的文件和文件夹,选定恢复备份文件和文件夹的位置,设置恢复选项,然后单击“开始还原”进行恢复操作。
· 计划作业
除备份和恢复数据之外,Windows 2000“备份”程序还允许计划备份作业,以便在无人干预的情况下运行。
计划备份操作可按照以下步骤进行:
1) 打开“备份”实用程序。
2) 单击“备份”选项卡,从“作业”菜单中
选择“新建”命令。
3) 单击以选定想要备份的任何驱动器、文件夹或文件的复选框。
4) 选定将作为备份目的地的文件或磁带设备,然后单击“作业”菜单中的“保存选项”命令,以保存文件和文件夹选择。
5) 在“备份媒体或文件名”文本框中,键入备份文件的路径和文件名或者选定磁带。
6) 单击“工具”菜单中的“选项”命令,选定想要使用的任何备份选项,例如备份类型和日志文件类型,然后单击“确定”按钮。
7) 单击“开始备份”,在“备份作业信息”对话框中进行所需要的任何更改。
8) 如果想要设置高级备份选项,例如数据验证或硬件压缩,则单击“高级”。选择完高级备份选项后,单击“确定”按钮。
9) 单击“备份作业信息”对话框中的“计划”。
10) 在“设置账号信息”对话框中,输入一个用户名和密码 (指定在这个账号下运行计划的备份操作) 。
11) 在“计划的作业选项”对话框中,在“作业名”文本框中键入计划的备份作业的名称。然后单击“属性”,以设置计划备份的日期、时间和频率参数。在完成后单击“确定”按钮退出操作。
步骤9:使用 CHKDSK维护文件完整性
Windows 2000的CHKDSK可以扫描FAT、FAT32和NTFS分区上的文件系统完整性,它检查丢失的簇、交叉链接文件等,还可以尝试更正它找到的任何错误。它还提供了其他许多文件系统信息。
如果Windows 2000感觉到文件系统损坏,它将在启动时自动运行CHKDSK。用户也可以手工启动这个实用程序。CHKDSK可以在5种模式中运行。第一种模式没有任何参数,这是一种只读模式,仅用于检查文件系统中的任何错误。在这种模式中,CHKDSK会报告任何错误,但是不会尝试修复错误,因此这个过程完成得非常快。其他4个选项使用以下参数:
· /FILENAME 检查指定文件的碎片化情况。
· /F 尝试修复文件系统中的任何错误。
· /V 提供分区上的每一个文件的名称和完整路径。
· /R 查找分区上的坏扇区并尝试恢复可读信息。
要运行CHKDSK,可执行以下操作:
1) 在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,打开“命令提示符”窗口。
2) 在命令提示符上进入要检查的分区。例如,键入C:\ 。
3) 键入不带任何参数的CHKDSK,以便只检查文件系统错误。如果找到了任何错误,则继续进行第4) 步。
请记录系统执行CHKDSK命令过程中显示的提示信息:
CHKDSK系统检查之后,报告的磁盘信息是:
4) 运行带 /F参数的CHKDSK,以尝试修复在文件系统中找到的错误。
一般情况下,用户只有在担心系统存在着Windows 2000没有意识到的磁盘问题时才会使用这个实用程序。
步骤10:整理磁盘碎片。
Microsoft声称使用像NTFS这样有效的文件系统可以减少整理碎片的需要,但是NTFS文件系统也仍然会受碎片化的影响。Windows 2000中包括了一个“磁盘碎片整理程序”实用程序。通过整理使用FAT、FAT32或NTFS文件系统的卷的碎片,Windows 2000包括了一些用来维护磁盘性能的能力。
这个版本具有以下限制:
· 只能整理本地卷的碎片。
· 一次只能整理一个卷的碎片。
· 在扫描一个卷时不能整理另一个卷的碎片。
· 不能使用脚本。
· 不能计划碎片的整理工作。
· 一次只能运行一个Microsoft管理控制台 (MMC) 管理单元。
所有测试过的系统配置都表明,NTFS碎片整理可以改进性能,并且较快的系统配置从磁盘碎片整理上获得的收益比功能较弱的系统更多
为打开“碎片整理”功能,可单击“开始”按钮,单击“程序”菜单中的“附件”-“系统工具”-“碎片整理”命令。
3、实验结论
谈谈WINDOWS支持的几种文件系统的优缺点:
解答:FAT文件系统是早期文件系统之一,也是MS-DOS使用的原始文件系统。它将文件信息储存在位于卷标开头处的文件分配表中,并保存两份文件分配表,以防其中的一个遭到破坏,
FAT文件系统最大的优点是MS-DOS、Windows 9x甚至OS/2都能访问FAT卷标;而其最大的弱点是随着FAT卷标尺寸的增长,最小的簇尺寸也随之增长。对于大于512MB的硬盘而言,最小的簇尺寸为16KB;对于大于2GB的硬盘,最小的簇尺寸为64KB。这就导致磁盘空间的极大浪费,因为一个文件必须占用整数个簇。因此,1KB的文件在2GB的硬盘上将占用64KB的磁盘空间。FAT文件系统不支持尺寸大于4GB的卷标。
FAT32文件系统通过提供长文件名的支持来扩展FAT文件系统,并与FAT16兼容。FAT (16和32) 文件系统是支持可移动媒体 (例如软盘) 上的惟一的文件系统。
Windows NT文件系统 (NTFS) 包括了FAT文件系统的所有功能,同时又提供了对高级文件系统特征 (例如安全模式、压缩和加密) 的支持。它是为在大磁盘上有效地完成文件操作而设计的。与FAT和保护模式FAT文件系统不同,它的最小簇尺寸不超过4KB。但是,NTFS卷标只能为Windows NT、2000和XP操作系统所访问。