操作系统os第一次作业 16281027

@操作系统os第一次作业

操作系统os第一次作业 16281027

实验一: 操作系统初步

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

要求:
1、参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序(请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?)。
2、上机完成习题1.13。
3、阅读pintos操作系统源代码,画出系统调用实现的流程图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上述汇编代码中,ebx用于存储参数0,eax首先用于存储系统调用号0x14即getpid的系统调用号,之后进入软中断调用0x80H,将eax赋值为getpid得到的系统进程号的值。操作系统为用户态进程与硬件设备进行交互提供了一组接口,即系统调用。程序通过软中断或系统调用指令向内核发出一个明确的请求,内核将调用相关函数来实现(如sys_read(),sys_write()),它们运行在os的内核态,这点不同于普通的函数调用,而且用户程序不能直接调用这些函数。
系统调用可以通过syscall()或调用linux底层c语言库中每个对应的系统调用函数,如exit,fork,read发起,这些函数定义在<syscall.h><unistd.h>中,linux系统中通过软中断int 0x80调用实现控制权的转移,控制权转移至内核后执行函数内容并返回结果。
习题1.13:流程如下:
应用程序→程序请求系统调用→根据参数对照中断向量表→进入相应的中断服务程序→返回应用程序

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

要求:
1、编译运行该程序(cpu.c),观察输出结果,说明程序功能。
(编译命令: gcc -o cpu cpu.c –Wall)(执行命令:./cpu)
2、再次按下面的运行并观察结果:执行命令:./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D &程序cpu运行了几次?他们运行的顺序有何特点和规律?请结合操作系统的特征进行解释。
在这里插入图片描述
在这里插入图片描述
程序功能是显示当前执行的程序的命令行参数argv[1]。执行结果如下:
在这里插入图片描述
由程序执行结果可知,因为程序的并发执行使程序失去了封闭性,并发执行程序的次序是不定、随机的。

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

要求:
1、阅读并编译运行该程序(mem.c),观察输出结果,说明程序功能。(命令: gcc -o mem mem.c –Wall)
2、再次按下面的命令运行并观察结果。两个分别运行的程序分配的内存地址是否相同?是否共享同一块物理内存区域?为什么?命令:./mem &; ./mem &
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
程序功能是创建一个进程,并用指针p指向并输出该进程的内存空间地址,然后顺序输出进程号和内存地址。
可以看到,两个程序运行分配的内存地址是不同的,且分配的物理内存区域也不相同。

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

要求:
1、阅读并编译运行该程序,观察输出结果,说明程序功能。(编译命令:gcc -o thread thread.c -Wall –pthread)(执行命令1:./thread 1000)
2、尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?(例如执行命令2:./thread 100000)(或者其他参数。)
3、提示:哪些变量是各个线程共享的,线程并发执行时访问共享变量会不会导致意想不到的问题。
在这里插入图片描述
在这里插入图片描述
程序的功能是创建两个线程,每个线程中,遍历给定参数的次数,输出次数counter值的初始值和最终值。
可以看到,Final value的值为thread命令参数值的两倍。
参数loops和counter是两个线程共享的。不同线程并发执行对同一全局变量操作时,可能会导致错误的结果,是由于在执行一个线程的某一个功能时可能会跳跃到另一个线程。
此外,当参数大至一定程度时,输出值不再是参数的2倍,这里可能是因为CPU处理的过程时间太长,两个线程的运行时间片发生了重合,其中一个线程在进行累加操作时,另一个线程读入了脏数据,造成了结果错误的情况。

猜你喜欢

转载自blog.csdn.net/Bismarck0116/article/details/88608120