操作系统实验一
一 系统调用实验
1 运用不同的方式调用getpid程序
getpid的系统调用号39,中断向量号int 80h
2 习题1.13
2.1 C语言方式实现
#include<stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
2.2 汇编方式实现
section .data
hello: db 'Hello world ! ',10
helloLen: equ $-hello
section .text
global _start
_start:
mov eax,4
mov ebx,1
mov ecx,hello
mov,edx,helloLen
int 80h
mov eax,1
mov ebx,0
int 80h
3 系统调用实现流程图
二 并发实验
1 编译运行该程序
因为该命令的argc=1,所以输出如图所示结果。
从代码中我们可以看出,程序执行后将会输出argv[1]里的内容,而argv数组存储的就是我们在shell中输入的内容,即argv[0]是程序名,argv[1]是参数名,也就是说,这段代码执行后将会输出我们输入的参数。由于后续我们是同时运行了4个参数不同的程序,所以我们可以通过输出的内容判断程序并发执行时,进行的先后顺序。
2 按下面命令运行并观察结果
CPU运行了4次,程序运行的顺序是随机无序的。这是因为这四个程序ABCD是并发执行的,即在这一时间段内四个程序同时执行,但在某一时刻,却只有一个程序在实际执行,在这期间,程序之间就需要竞争资源,从而导致了程序是走走停停进行的,执行完成的顺序因此也是杂乱无序的。
三 内存分配实验
1 观察输出结果,说明程序功能
从这段代码中我们可以看出,该程序首先会输出p在内存中分配的地址,之后会持续输出p的进程号以及执行的次数。
2 再次按下面的命令运行并观察结果
首先,我们需要关闭ALSR地址空间随机化
现在我们开始运行程序
可以看到,两个程序分配到的内存地址时相同的。这是因为Linux把虚拟内存划分成区域area的集合,每个存在的虚拟页面都属于一个area。一个area包含了连续的多个页。Linux通过area相关的数据结构来灵活地管理虚拟内存
四 共享的问题
1 观察输出结果,说明程序功能
这段代码创建了两个线程,每个线程均进行了函数worker的运算,即进行了一个loops大小的递加运算,最后输出运算的初始值以及最终结果。
2 总结规律并解释
规律:Final value的值一开始为输入参数的2倍,但随着loop值的增大,Final value不再为loop的2倍
解释:在程序中,我们输入的参数即为loop的值,因为在程序中我们创建了两个线程p1,p2,每个线程都进行了一个loop的递增循环,因为进行了两次,所以Final Value为输入参数的2倍。但是,虽然参数的增大,CPU处理时间过长,两个线程在运行时发生了重合,即一个线程在进行累加操作时,另一个线程读取了过时的counter变量,有些类似于数据库中的读脏数据,因此产生了final value不足参数两倍的情况。
3 分析是否会出现问题
可以看到,当输入的参数较小时,不会出现问题,但当参数足够大时,CPU就处理不过来,会出现读脏数据的情况,从而出现问题。
本文章涉及到的其他代码,由于在题目中已经出现,故在本文中未再次涉及。本次实验涉及到的所有代码,均已存储在本人github中,如有需求请查看:https://github.com/16281307/OS/tree/master/lab1