实验一:操作系统初步

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

1.参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

  • 新建两个C文件,分别输入两种方式调用linux操作系统的代码,并对两个文件进行编译第一个程序中pid是用来保存使用API 函数getpid()返回的进程号,而第二个程序pid则保存嵌入式汇编代码使用系统调用号得到的进程号。其中:“mov$0x14,%%eax\n\t”表示将20(getpid系统调用号为20)传进eax寄存器,“int $0x80\n\t”发出系统调用(软中断)指令。“mov %%eax,%0\n\t”则是将eax寄存器的值存入变量pid。
  • 从而我们可以看出API接口函数getpid()直接调用和系统调用getpid()是不同的。

2.上机完成习题1.13

在这里插入图片描述
在这里插入图片描述

  • C标准函数库是所有符合标准的头文件的集合,以及常用的函数库实现程序,例如I/O输入输出和字符串控制。glibc是Linux下面C标准库的实现,即GNU C Library。Glibc本身是GNU旗下的C标准库,后来逐渐成为了Linux的标准C库。而Linux API用于保证应用程序可以在源程序一级上在多种操作系统上移植运行,这些系统调用编程接口主要是通过C库(LIBC)来实现的。我认为Linux API通过调用glibc函数库来实现所需的功能,而其本身并不包括这些函数,因此printf(“Hello World!\n”)可归入C标准函数和GNU C函数库。

3.阅读pintos操作系统源代码,画出系统调用实现的流程图。

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

在这里插入图片描述

1、编译运行该程序(cpu.c),观察输出结果,说明程序功能。

(编译命令: gcc -o cpu cpu.c –Wall)(执行命令:./cpu)
在这里插入图片描述

2、编译运行该程序(cpu.c),观察输出结果,说明程序功能。

(编译命令: gcc -o cpu cpu.c –Wall)(执行命令:./cpu)
在这里插入图片描述

  • 当同时输入四条指令时,系统每隔一秒会输出ABCD四个值,代表系统一秒内同时执行四条指令。即使只有一个处理器,但四个程序在同时进行,并且ABCD四个值会以不同的顺序输出,这就是操作系统的并发运行,在操作系统中,并发是指一个时间段中有几个程序都处于已启动运行到运行完毕间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。所以一秒内执行四次实质上是每一时刻都只有一个程序在执行,但四个程序交替执行。

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

在这里插入图片描述

1、阅读并编译运行该程序(mem.c),观察输出结果,说明程序功能。

(命令: gcc -o mem mem.c –Wall)
在这里插入图片描述

2、再次按下面的命令运行并观察结果。两个分别运行的程序分配的内存地址是否相同?是否共享同一块物理内存区域?为什么?

在这里插入图片描述

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

1、阅读并编译运行该程序,观察输出结果,说明程序功能。

1、(编译命令:gcc -o thread thread.c -Wall –pthread)(执行命令1:./thread 1000)
在这里插入图片描述

2、尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?

2、(例如执行命令2:./thread 100000)(或者其他参数。)
在这里插入图片描述

  • 主程序使用pthread .create()创建两个线程。在这个例子中,每个线程开始在一个名为worker()的例程中运行,在该例程中,它只是循环递增一个统计循环次数的计数器。当两个线程完成时,计数器的最终值为2000,因为每个线程将计数器递增1000次。实际上,当循环的输入值设置为N时,我们期望程序的最终输出为2N。
  • 在这次运行中,当我们给出10000000的输入值,而不是最终值为20000000时,我们首先获得12135518。 而且第二次运行程序时,会再次获得错误的值,并获得与上次不同的值。通过查询得知,与指令的执行方式有关。上面程序的一个关键部分共享计数器递增,这部分需要三个指令:一个用于将计数器的值从存储器加载到寄存器中,一个用于递增它,一个用于将其存储回内存。 因为这三个指令不是一次全部执行完毕,所以才会发生这样的现象。

代码链接:https://github.com/zymmoa/OS-Labs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值