操作系统实验一
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