操作系统 实验一
14281020 吴毅辉
一、(系统调用实验)了解系统调用不同的封装形式。
要求:1、参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序(请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?)。
答:getpid的系统调用号是20;linux系统调用的中断向量号是0x80。
2、上机完成习题1.13。
系统调用的C函数形式输出“Hello World!”程序
3、阅读pintos操作系统源代码,画出系统调用实现的流程图。
二、(并发实验)根据以下代码完成实验。
要求:
1、编译运行该程序(cpu.c),观察输出结果,说明程序功能。
(编译命令: gcc -o cpu cpu.c –Wall)(执行命令:./cpu)
此程序的功能室收到输入的字符后不断打印该字符
2、再次按下面的运行并观察结果:执行命令:./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D &程序cpu运行了几次?他们运行的顺序有何特点和规律?请结合操作系统的特征进行解释。
每次输入字符,cpu便运行一次,连续输入四个字符ABCD,但是根据输出的结果可以看到不是按照顺序输出的,可见cpu的知行是并发的,使得该程序失去封闭性。
三、(内存分配实验)根据以下代码完成实验。
要求:
1、阅读并编译运行该程序(mem.c),观察输出结果,说明程序功能。(命令: gcc -o mem mem.c –Wall)
此程序功能为创建一个进程,并申请一个内存地址,用指针p指向并输出该进程的地址,然后顺序输出进程号和内存地址,将p循环+1。
2、再次按下面的命令运行并观察结果。两个分别运行的程序分配的内存地址是否相同?是否共享同一块物理内存区域?为什么?命令:./mem &; ./mem &
不相同,两个进程申请分配的内存地址不⼀样,对于每个进程而言,每个进程该分配的内存空间进行操作且互不影响。也不共享同一物理内存区域。每个进程的内存空间只是虚拟内存空间,不论两个进程申请的虚拟内存地址是否相同,真实的物理地址是不一样的,所以两个进程对地址上的数值操作都是独立的。
四、(共享的问题)根据以下代码完成实验。
要求:
- 阅读并编译运行该程序,观察输出结果,说明程序功能。(编译命令:gcc -o thread thread.c -Wall –pthread)(执行命令1:./thread 1000)
该程序功能为创建两个线程,遍历次数做累加操作,输出初始值和最终值。
- 尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?(例如执行命令2:./thread 100000)(或者其他参数。)
最明显的特征是,最终值的数字是给定参数值的两倍。
3、提示:哪些变量是各个线程共享的,线程并发执行时访问共享变量会不会导致意想不到的问题。
参数loops和counter是两个线程共享的。并发执行互不影响,所以counter累积了两倍的数字。