OS-2019第一次实验

一 系统调用实验

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值