操作系统第2章作业题答案

题目一:请指出执行系统调用时向操作系统传递参数的三种常用方式分别是什么,并分别说明在哪些情况下适合采用哪种方式。
三种方式分别为
1,寄存器传递,在传递的参数占用空间较小,传递参较少时使用,比如在中断返回时传递一个参数时 使用eax寄存器传递中断类型
2,内存的块和表传递,当需要传递的参数总大小大于寄存器数量时,可以通过将块的首地址和大小通 过寄存器传递,如使用I/O输出字符串时,通常使用两个寄存器一个存入起始地址,一个存入字符串长 度来作为参数传递。
3,使用栈传递,通过将参数压入栈中然后通过操作系统弹出使用,这种方法所允许传入的参数大小是 最大的,常见的为我们一般使用的函数的参数就是通过栈传递的。

题目二:操作系统中为什么要将机制和策略区分开来? 请查找文献并以实际操作系统中的案例来举例说明其好处。
机制可以理解为“提供基本的功能”而策略为“使用这些功能的方案”,机制与相关的硬件设备和算 法有关,机制与设计人员的设计方案有关,而机制和策略区分可以保证操作系统能够很容易的被修改, 因为当我们需要修改操作系统一些相关功能的时候,我们可以直接更改我们的策略而不用修改我们的 机制,这样能够为操作系统的设计节省很大时间开销,同时如果后面硬件升级,我们可以直接在策略 不变 的情况下升级机制,这样也能增加操作系统的可维护性。

最典型的案例就是手机中的耳机问题:当没有区分机制和策略的时候,操作系统一般设计为当插头检 测到有耳机插入的时候,就关闭扬声器,声音转向耳机;当检测到耳机拔出的时候,就关闭耳机通道, 声音转向扬声器。虽然这个适用于大多数情况,但如果在插上耳机的情况下,有闹钟发生,我们希望 的仍是扬声器发出声音,在这种情况下如果机制和策略不分离,就很难以完成,而在机制与策略分离 的情况下,只要修改策略就能够实现在这类特殊情况的需求
所以作为底层的机制就不能擅自去实现策略。只需要提供相关的功能即可,而上层根据需要来调用这些接口。所以机制和策略需要区分开来。

题目三:操作系统采用微内核设计的主要优点是什么? 用户程序和系统服务在微内核结构内如何相互影响? 采用微内核设计的缺点又是什么?

微内核是内核的一种精简形式。将通常与内核集成在一起的系统服务层被分离出来,变成可以根据需求加入的选件,这样就可提供更好的可扩展性和更加有效的应用环境。使用微内核设计,对系统进行升级,只要用新模块替换旧模块,不需要改变整个操作系统。其优点在于
1,因为系统服务层被分离出来所以能够使得不同的API,文件系统,甚至不同的操作系统的特性在一个系统中共存。
2,系统非常灵活。当运行一个应用程序时,只需把选定的系统服务加载到系统中即可。而修改了服务以后可以通过联机进行测试;并不需要重新构建或者启动一个新的内核,他们并不影响系统的运行。
3,系统服务或者设备驱动故障和与它们有关的运行任务是隔绝的。
4,依存关系的服务器系统可以加以限制,使为安全重要至关信赖的计算基数的应用可被削减。
5,这种由微内核所决定的结构(IPC,多线程)能够应用在所有的应用程序和服务上。一个精炼的微内核接口能够有演绎成更多模块的系统结构。
用户程序和系统服务是通过进程间的通信机制在微内核内相互作用互相传递消息。
由于微内核只是内核的一种精简模式,所以系统的核心只实现了最基本的系统操作,这样内核以外的外部程序之间由于独立运行使得系统难以进行良好的整体优化。且进程间相互通信的开销也较单一内核系统大得多。

题目四:在第二章中介绍了一个从一个源文件向一个目标文件复制内容的程序。请用 Win32 或 POSIX 的 API 写出这个 C 程序,并确保你的 C 程序中包括了所有必要的错误检测(如文件是否存在等)。
在win32 API代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <Windows.h>
int main(int argc,char** argv)
{
    
    
    if(argc!=3)//main函数中第一个参数,int型的argc,为整型,用来统计程序运行时发送给main函数的命令行参数的个数,在VS中默认值为1。 
    //第二个参数,char*型的argv[],为字符串数组,用来存放指向的字符串参数的指针数组,每一个元素指向一个参数。
    //argv[0]为本文件的目录地址,argv[1],argv[2]应为源文件名和目的文件名,所以argc应该为3,其他数量都不对
    {
    
    
        printf("file arguments number wrong\ntrue format: copyfile.exe source_file,object_file");
        return 0;
    }
    HANDLE handlein,handleout;//文件输入输出句柄
    DWORD in,out;//文件实际读出和写入的字节数
    DWORD filesize;//要复制文件的大小
    char* buffer;//缓冲区,先将数据读到缓冲区中,然后再重缓冲区写入到文件
    handlein=CreateFile(argv[1],GENERIC_READ,FILE_SHARE_DELETE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    handleout=CreateFile(argv[2],GENERIC_WRITE,FILE_SHARE_DELETE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
    //CreateFile这个函数的功能是创建或者打开一个文件或者I/O设备,如执行成功,则返回文件句柄。 INVALID_HANDLE_VALUE 表示出错.
    if(handlein==INVALID_HANDLE_VALUE)//
    {
    
    
        perror("open source_file failure");
        exit(1);
    }
    if(handleout==INVALID_HANDLE_VALUE)
    {
    
    
        perror("open object_file failure");
        exit(2);
    }
    filesize=GetFileSize(handlein,NULL);//获取文件大小
    buffer=(char*)malloc(filesize);
    while(ReadFile(handlein,buffer,filesize,&in,NULL)&&in>0)//每次读入时成功且读入的字节数不为0则表示文件还没有完全读取
    {
    
    
        WriteFile(handleout,buffer,filesize,&out,NULL);
        if(in!=out)//如果读入的字节数和写入的字节数不相同则表示复制时出现异常
        {
    
    
            printf("file copy abnormally\n");
            exit(3);
        }
    }
    printf("file copy successfully\n");
    CloseHandle(handlein);
    CloseHandle(handleout);
}

掌握系统级跟踪工具,观察并记录。一旦你正确地设计并实现了题目 4 中的程序,采用跟踪系统调用的工具来运行它,观察并记录相应的过程。(Linux 系统提供了 ptrace 工具,而Solaris 系统则采用 truss 或 dtrace 命令。在 MacOSX 中,dtrace 工具提供了类似的功能。)
因为题目中没有直接给Windows下的系统级跟踪工具,这里我在网络上搜索使用的是在Windows环境下 的Process Monitor软件(可以显示实时文件系统,注册表,进程和线程活动)来进行跟踪系统调用。
先进行程序的运行:
在这里插入图片描述

打开软件后如图该软件会监控电脑所有的进程运行情况,这里我们可以搜索copyfile.exe(问题4中运 行的程序来找到相应的进程)
在这里插入图片描述

找到之后可以查看相关的线程事件如下
其中有时间发生的时间(精确到微秒)负责运行的线程号,运行结果,文件路径,运行时间,文 件信息
在这里插入图片描述

进程信息如下:其中开始时间是电脑的开机时间

在这里插入图片描述

运行该程序所使用的相关文件操作栈的信息如下:
在这里插入图片描述

还有相关文件创建的线程信息:

在这里插入图片描述

请自选一操作系统,按文件管理、状态信息、文件修改、程序语言支持、程序加载与执行、通信、后台服务等类别分别给出该操作系统相应的系统程序并简要介绍该系统程序(各类别至少一个)。
系统选择是windows(以下资料来自网络)
文件管理:
CreateFile:打开文件
要对文件进行读写等操作,首先必须获得文件句柄,
ReadFile:从文件中读取字节信息。
在打开文件获得了文件句柄之后,则可以通过该函数读取数据。
WriteFile:向文件写入字节信息。
同样可以将文件句柄传给该函数,从而实现对文件数据的写入。
CloseHandle:关闭文件句柄。
打开门之后,自然要记得关上。
状态信息:
GetFileTime:获取文件时间。
有三个文件时间可供获取:创建时间、最后访问时间、最后写时间。
该函数同样需要文件句柄作为入口参数。
GetFileSize:获取文件大小。
由于文件大小可以高达上数G(1G需要30位),因此一个32位的双字节类型无法对其精确表达,因此返回码表示低32位,还有一个出口参数可以传出高32位。
该函数同样需要文件句柄作为入口参数。
GetFileAttributes:获取文件属性。
可以获取文件的存档、只读、系统、隐藏等属性。
该函数只需一个文件路径作为参数。
GetFileInformationByHand le:获取所有文件信息
该函数能够获取上面所有函数所能够获取的信息,如大小、属性等,同时还包括一些其他地方无法获取的信息,比如:文件卷标、索引和链接信息。该函数需要文件句柄作为入口参数。
文件修改:
SetFilePoint:移动文件指针。
该函数用于对文件进行高级读写操作时。
CopyFile:复制文件
注意:只能复制文件,而不能复制目录
程序语言支持:
Windows Management Instrumentation(WMI)
Winmgmt (Windows管理规范服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,依赖于Event Log、Remote Procedure Call服务。WMI是Windows中的基础管理结构,它通过一组常用接口来控制和监视系统(如对系统属性的查看与更改、设置用户权限等)。WMI为访 问大量的Windows管理数据提供了一个统一的机制。WMI通过脚本、C++程序接口、.NET类(系统管理)和命令行工具(WMIC)提供了对信息的 访问。WMI的功能还包括事件、远程、查询、查看、计划和实施用户扩展及更多内容。总而言之,虽然在服务管理工具中可以关闭,但最好别动它,否则会出现许多莫名的问题。
程序加载与执行:
Print Spooler:
将文件加载到内存中,Spooler(打印后台处理服务)的进程名是 spoolsv.exe,WinXP Home/PRO默认安装的启动类型是自动,依赖于Remote Procedure Call。Spooler是为了提高文件打印效率,将多个请求打印的文档统一进行保存和管理,先将要打印的文件拷贝到内存,待打印机空闲后,再将数据送往 打印机处理。这样处理速度更快些。建议将其设置为手动,有打印任务时再打开。如果没有打印机自然是禁用了。
通信:
Background Intelligent Transfer Service:
使用闲置的网络带宽来传输数据。
Messenger:
在客户端及服务器之间通过网络传输传送信息。这个服务与 Windows Messenger 无关。如果停止这个服务,Alerter信息将不会被传输。如果停用这个服务,所有依存于它的服务将无法启动。
NetMeeting Remote Desktop Sharing:
让使用者可以通过NetMeeting服务,由远程访问本机。如果这项服务停止的话,远程桌面共享功能将无法使用。如果服务停用的话,任何依赖它的服务将无法启动。
Network DDE DSDM:
通过网络共享信息动态数据交换 (DDE)。如果这个服务被停止,DDE网络共享将无法使用。如果这个服务被停用,任何依存于它的服务将无法启动。
NTLM Security Support Provider:
为没有使用命名管道传输的远程过程调用(RPC)程序提供安全性。
后台服务:
Windows time
W32Time(Windows时间服务)的进程名是svchost.exe,在WinXP Home/PRO下默认安装的启动类型是自动,它没有服务依存关系。这一服务对应WinXP的Internet对时服务,如不需要关闭即可。
BACKGROUND TASKS INFRASTRUCTURE SREVICE:
控制哪些后台服务可以在系统上运行的windows基础结构服务。
Background Intelligent Transfer Service
BITS (后台智能传输服务)的进程名是Svchost.exe,WinXP Home/Pro默认安装的启动类型是手动,依赖于Remote Procedure Call、Workstation服务。微软宣称BITS能够利用剩余的带宽传输文件,当网络切断或计算机需重启时,后台智能传输服务会自动对文件传输加 以维护,当网络重新连接时,后台智能传输服务将继续从停止的地方继续开始传输文件。其实这个服务原是用来实现HTTP 1.1服务器之间的信息传输,基本上它的应用也就是支持Windows自动更新时的断点续传。如果你禁用了Automatic Updates,留着它基本上也没有什么意义。
Alerter (警示器)服务的进程名是Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到)。Alerter服务的功能是, WinXP将系统上发生的与管理有关的事件以警示(Alert)信息传送至网络上指定的电脑或用户,例如当发生打印错误或硬盘即将写满等事件,这类警示信 息由XP的警示器服务(Alerter Service)收集、送出。
尽管Alerter依存的服务并没有Messenger(信使)服务,但Alerter服务必须依赖后者才能送出信息,故在启动Alerter服务后还必须确定Messenger服务也是在工作中,而接收的电脑也必须启 动Messenger服务。由于Alerter服务运行后,服务使用户可以发送弹出(Pop-up)信息给其他用户,这些信息有可能被攻击者用来实施攻 击,如诱骗用户修改口令等,从而造成安全隐患。同时该服务使得用户帐号名泄漏,也有可能被攻击者利用来进行口令猜测攻击。所以对于家庭单机用户,甚至对于 绝大多数小型的局域网来说,这个功能是完全可禁用的,不仅节省了系统资源和加快启动速度,也提高了机器的安全性。

猜你喜欢

转载自blog.csdn.net/qq_49327751/article/details/120964843