您的位置:首页 > 其它

OS实验一:操作系统初步 16281021

2019-03-17 22:36 288 查看

OS实验一:操作系统初步 16281021

OS实验一:操作系统初步

GitHub地址:https://github.com/RebekahYuuu/Experiments-of-Operating-System

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

要求:
1、参考下列网址中的程序。阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序(请问getpid的系统调用号是多少?linux系统调用的中断向量号是多少?)。

Linux系统中断向量号是0x80
getpid的系统调用号是20


总结:系统调用共分三类:(1)API接口函数(2)用syscall(系统调用号)(3)C语言中嵌入汇编语言
这三种方法封装性由高到低不属于同一层次,但都可以实现系统调用

2、上机完成习题1.13。

命令printf(“Hello World!\n”)可归入 C标准函数、GNU C 函数库。

理由:
C标准函数库(ANSI C)是任何C编译器都应该遵循的C语言协议。它是基本的C语言函数库,包含了C语言最基本的库函数。这个库可以根据头文件划分为 15 个部分。
GNU C是在ANSI C的基础上增添了一些基于Linux操作系统的扩展,例如对ASM语法的支持、编译器支持内联函数、支持__attribute__机制。
Linux API是程序员与系统调用之间的接口,系统调用并不直接与程序员进行交互,它仅仅是一个通过软中断机制向内核提交请求以获取内核服务的接口。实际使用中,程序员调用的通常都是用户编程接口(API)。
汇编实现代码:

section .data                           ;section declaration
msg     db      "Hello, world!",0xA     ;our dear string
len     equ     $ - msg                 ;length of our dear string
section .text                           ;section declaration
;we must export the entry point to the ELF linker or
global _start       ;loader. They conventionally recognize _start as their
;entry point. Use ld -e foo to override the default.
_start:
;write our string to stdout
mov     eax,4   ;system call number (sys_write)
mov     ebx,1   ;first argument: file handle (stdout)
mov     ecx,msg ;second argument: pointer to message to write
mov     edx,len ;third argument: message length
int     0x80    ;call kernel
;and exit
mov     eax,1   ;system call number (sys_exit)
xor     ebx,ebx ;first syscall argument: exit code
int     0x80    ;call kernel`

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

应用程序->程序请求系统调用->查中断向量表->进入相应中断服务程序->返回应用程序

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

要求:
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 &

该程序的功能是创建一个进程,并用指针指向并输出该进程的内存地址空间,然后顺序输出进程号、内存地址

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

要求:
1、阅读并编译运行该程序,观察输出结果,说明程序功能。(编译命令:gcc -o thread thread.c -Wall –pthread)(执行命令1:./thread 1000)
该程序的功能是创建两个线程,每个线程中,遍历给定参数的次数,输出次数counter值的初始值和最终值。

2、尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?(例如执行命令2:./thread 100000)(或者其他参数。)
Final value的值为thread命令参数值的两倍,参数loops和counter是两个线程共享的。
3、提示:哪些变量是各个线程共享的,线程并发执行时访问共享变量会不会导致意想不到的问题。

不同线程并发执行对同一全局变量操作时,可能会导致错误的结果,是由于在执行一个线程的某一个功能时可能会跳跃到另一个线程。
此外,当参数大至一定程度时,输出值不再是参数的2倍,这里可能是因为CPU处理的过程时间太长,两个线程的运行时间片发生了重合,其中一个线程在进行累加操作时,另一个线程读入了脏数据,造成了结果错误的情况。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: