操作系统概念第二章作业

第一题

请指出执行系统调用时向操作系统传递参数的三种常用方式分别是什么,并分别说明在哪些情况下适合采用哪种方式。
答:

  1. 通过寄存器来传递参数
  2. 将参数存在内存的块和表中,并将块的地址通过寄存器来传递(Linux和Solaris就采用这种方法)
  3. 参数也可以通过程序放在或压入堆栈中,并通过操作系统弹出。
    在x86_32中,通过中断(INT 0x80)实现系统调用,寄存器eax存放系统调用号,同时系统调用返回值也存放在eax中;当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器ebx、ecx、edx、esi、edi、ebp中;当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器ebx中保存指向该内存区域的指针
    在x86_64中,通过中断(syscall)指令来实现,寄存器eax存放系统调用号,同时系统调用返回值也存放在eax中;当系统调用参数小于等于6个时,参数则必须按顺序放到寄存器rdi、rsi、rdx、r10、r8、r9中;当系统调用参数大于6个时,全部参数应该依次放在一块连续的内存区域里,同时在寄存器ebx中保存指向该内存区域的指针

第二题

操作系统中为什么要将机制和策略区分开来?请查找文献并以实际操作系统中的案例来举例说明其好处。
答:
策略可能会随时间或位置而有所改变;在最坏情况下,每次策略改变都可能需要底层机制的改变。机制和策略区分能更好地实现资源分配。系统更需要通用机制,这样策略的改变只需要重定义一些系统参数。 当机制和策略分开时,策略可以随意地改变但机制还是不能改变。这种安排提供了系统地灵活性。在最新的Solaris版本,调度由可加载的表控制。根据当前加载的表,系统可以是分时的、批处理的、实时的或公平分配的。制定调试机制的目的在于通过单个load-new-table命令得到巨大的策略改变。另一种极端的情况是Windows系统,其中机制和策略在系统中被编码以形成统一的系统风格。

第三题

操作系统采用微内核设计的主要优点是什么?用户系统和系统服务在微内核结构内如何相互影响?采用微内核设计的缺点又是什么?
答:
微内核设计将所有非基本部分从内核中移走,并将他们实现为系统程序或用户程序。因此便于内核得到有效的管理;同时微内核设计便于扩充操作系统;提供了更好的安全性和可靠性。用户程序和系统服务通过进程的通信机制在微内核中相互作用,如消息传递等。微内核的缺点是,由于将很多模块移除到了内核之外,所以缺点是与进程间通信的过度联系和为了保证用户程序和系统服务相互作用而频繁使用操作系统的消息传递功能

第四题

在第二章中介绍了一个从一个源文件向目标文件复制内容的程序。请用Win32或POSIX的API写出这个C程序,并确保你的C程序中包含了所有必要的错误检测(如文件是否存在等)。
答:
首先获取源文件和目标文件的路径以及文件名,其次检查源文件是否存在,如果存在即打开,否则打印复制失败;再创建目标文件,如果不存在则创建,否则打印复制失败;在while循环中,将源文件中的内容读取到缓冲区中,再从缓冲区中将内容写入到目标文件中,直到文件读取失败或全部内容读取完成。关闭源文件和目标文件,打印复制成功。程序结束。

#include <stdio.h>		//定义输入\输出函数
#include <stdlib.h>		//定义杂项函数及内存分配函数
#include <string.h>		//定义字符串处理函数
#include <sys/types.h>	//提供类型pid_t 和 size_t的定义
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>		//声明了整型的极限常量
#include <unistd.h>
int main(int argc, char *argv[], char *env[])
{
	char srcFile[1024],dstFile[1024];	//定义源文件名和目标文件名
	char buf[65535];//缓冲内容
	printf("请输入源文件的路径以及文件名\n");
	scanf("%s",srcFile);
	printf("请输入目标文件的路径以及文件名\n");
	scanf("%s",dstFile);
	int src, dst;	// 定义源文件以及目标文件打开的返回值
	src = open(srcFile,O_RDONLY);	
	//调用open函数打开源文件,O_RDONLY表示只读模式
	if(src == -1)	
	{
		printf("源文件不存在,放弃\n");
		return 0;
	}
	dst = open(dstFile,O_CREAT|O_RDWR,0644)	
	//调用open函数打开目标文件,O_RDWR是可读可写模式
	//O_CREAT表示如果指定文件不存在,则创建这个文件
	//0644是mode参数(设置文件访问权限的初始值,和用户掩码umask有关),
	//0644表示-rw-r-r-,这个参数在第二个参数中又O_CREAT时才有用
	if(dst == -1)
	{
		printf("目标文件存在,放弃\n");
		return 0;
	}
	int flag;
	if((flag = read(src,dst,65535))>0)	//将数据读入到缓冲区
		write(dst,buf,flag);	//将数据从缓冲区中写入到目标文件
	close(src);
	close(dst);
	printf("复制成功\n");
	return 0;
}

第五题

掌握系统级跟踪工具,观察并记录。一旦你正确地设计并实现了题目4中的程序,采用跟踪系统调用的工具来运行它,观察并记录相应的过程。(Linux系统提供了ptrace工具,而Solaris系统则采用truss或dtrace命令。在Mac OSX中,dtrace工具提供了类似的功能)。
答:
在虚拟机上面进行编译运行
编译运行
使用Linux下的strace跟踪程序来跟踪从源文件向目标文件拷贝内容过程中发生的系统调用。输入 strace -c -tt ./POSIX_API 统计每一次系统调用所执行的时间、次数和出错的次数等
在这里插入图片描述
其中 -tt参数表示在输出中的每一行前加上时间信息,微秒级
输入strace -T -tt -e trace=file ./POSIX_API来跟踪从一个源文件向目标文件复制内容中与文件有关的系统调用;其中-T参数表示显示每一次调用所消耗的时间;-e trace=file表示只跟踪有关文件操作的系统调用

参考网址

Linux Strace跟踪进程信息
利用POSIX文件函数部分实现Linux中的CP功能

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值