操作系统实验一

16281004-洪华兴-操作系统实验一

一、 (系统调用实验)了解系统调用不同的封装形式。

1、参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序(请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?)。
2、上机完成习题1.13。
3、阅读pintos操作系统源代码,画出系统调用实现的流程图。

1、 从所给第二个代码可以看到getpid的系统调用号为0x14,Linux系统调用的中断向量号为0x80,两种调用方法如下图:
在这里插入图片描述
在这里插入图片描述
2、两种调用方法如下图。第一个是使用Linux的系统调用使用write函数;第二个用的是C语言内嵌汇编的方法。
在这里插入图片描述
在这里插入图片描述
3、pintos操作系统的系统调用的实现如下:
在这里插入图片描述

二、 (并发实验)根据以下代码完成下面的实验。

1、编译运行该程序(cpu.c),观察输出结果,说明程序功能。
(编译命令: gcc -o cpu cpu.c –Wall)(执行命令:./cpu)
2、再次按下面的运行并观察结果:执行命令:./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D &程序cpu运行了几次?他们运行的顺序有何特点和规律?请结合操作系统的特征进行解释。

1、 编译和执行如下图,根据代码和输出可以得出该程序是输出命令行参数中的内容,如果输入的个数为0,则输出提示信息。
在这里插入图片描述
2、再根据题目所给的指令操作,可以看到ABCD输出的顺序与输入顺序不一样。可以得出结论四个程序在宏观上是同时运行的,但在微观上CPU是交叉运行的。
在这里插入图片描述

三、 (内存分配实验)根据以下代码完成实验。

1、阅读并编译运行该程序(mem.c),观察输出结果,说明程序功能。(命令: gcc -o mem mem.c –Wall)
2、再次按下面的命令运行并观察结果。两个分别运行的程序分配的内存地址是否相同?是否共享同一块物理内存区域?为什么?命令:./mem &; ./mem &
3、尝试关闭ALSR 地址空间随机化后再次运行程序。

1、编译执行如下图,可以看到程序分配了内存并打印内存地址,然后将0放入内存的第一个位置,后一直循环把地址的值村在p中。
在这里插入图片描述
2、在进行如下图的操作命令,从图中结果可以看出两个独立运行的程序不共享一个物理地址。这是因为操作系统虚拟化了内存,每个进程访问的私有虚拟地址空间。
在这里插入图片描述
3、在关闭ALSR 地址空间随机化后,可以发现两个程序所分配的地址是相通的。
在这里插入图片描述

四、(共享的问题)根据以下代码完成实验。

1、阅读并编译运行该程序,观察输出结果,说明程序功能。(编译命令:gcc -o thread thread.c -Wall)(执行命令1:./thread 1000)
2、尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?(例如执行命令2:./thread 100000)(或者其他参数。)
3、提示:哪些变量是各个线程共享的,线程并发执行时访问共享变量会不会导致意想不到的问题。

1、 编译执行如下图,当输入的参数为1000时,程序使用pthread .create()创建两个线程,每个线程在worker()的例程中运行,该函数的作用是循环递增的计数器,计数区间为1。当两个线程完成时,计数器的最终值为2000,因为每个线程将计数器累加1000次。
2、 当循环的输入值为N时,程序的输出值为2N。
3、 当输入更大的数值时,会发现输出的值不再是它输入的值的两倍。这是因为当参数变得很大时,就会因为指令调用顺序和参数共享的缘故导致错误。
在这里插入图片描述
GitHub源码:https://github.com/hhxhongchen/lab/tree/master/lab1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值