操作系统第一次作业

第一题

了解系统调用不同的封装形式。

要求:阅读分别运行用API接口函数getpid()直接调用和汇编中断调用两种方式调用Linux操作系统的同一个系统调用getpid的程序

  1. 请问getpid的系统调用号是多少? 答:4848
    linux系统调用的中断向量号是多少?答:4934

    操作系统第一次作业
    操作系统第一次作业

习题1.13

命令:printf(“Hello World!\n”)可归入一个{C标准函数、GNU C 函数库、Linux API}中哪一个或者哪几个?请分别用相应的linux系统调用的C函数形式和汇编代码两种形式来实现上述命令。
答:可归入C标准函数和GNU C 函数库
操作系统第一次作业操作系统第一次作业

系统调用流程图

阅读pintos操作系统源代码,画出系统调用实现的流程图
操作系统第一次作业

第二题

并发实验

操作系统第一次作业
编译运行该程序,观察输出结果,说明程序功能。
输入指令后有字符串的话循环执行字符串,如果命令行后之执行程序名后没有字符串则输出“usage :cpu ”操作系统第一次作业
再次按下面的运行并观察结果:执行命令:./cpu A & ; ./cpu B & ; ./cpu C & ; ./cpu D &程序cpu运行了几次?他们运行的顺序有何特点和规律?请结合操作系统的特征进行解释。
答:四次,当在程序运行时,输入其他字符串时,先输出其他的字符串之后再接着运行之前的进程。这个体现了操作系统的并发特点。在一个时间段的代码3运行时,其他线程处于挂起的状态。
预想是输出ABCD 与与预想不同且每次输出不同的结果操作系统第一次作业
Stderr标准输出(设备)文件,对应终端的屏幕。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。
argv[1] 指向在DOS命令行中执行程序名后的第一个字符串
argv[2] 指向执行程序名后的第二个字符串

第三题

(内存分配实验)阅读并编译运行该程序,观察输出结果,说明程序功能
操作系统第一次作业
首先,分配一些内存(a1)。 然后,打印内存地址(a2)将数字0放入新分配的内存的第一个位置(a3)。 最后,循环:延迟一秒并递增存储在p中保存的地址的值。 对于每个print语句,它还会打印出正在运行的程序的进程标识符(PID)操作系统第一次作业
再次按下面的命令运行并观察结果。两个分别运行的程序分配的内存地址是否相同?是否共享同一块物理内存区域?为什么?命令:./mem &; ./mem &操作系统第一次作业
答:内存地址不同,共享同一块物理内存区域,因为操作系统虚拟化了内存,每个进程访问自己的私有虚拟地址空间,操作系统以某种方式映射到机器的物理内存。一个正在运行的程序中的内存引用不会影响其他进程(或OS本身)的地址空间。

第四题

(共享的问题)根据以下代码完成实验操作系统第一次作业
1、阅读并编译运行该程序,观察输出结果,说明程序功能。
主程序使用Pthread .create()创建两个线程。 将线程视为在与其他函数相同的内存空间中运行的函数,其中一次**多个函数。每个线程开始在一个名为worker()的例程中运行,在该例程中,是循环递增一个统计循环次数的计数器。操作系统第一次作业
2、尝试其他输入参数并执行,并总结执行结果的有何规律?你能尝试解释它吗?
当循环的输入值设置为N时,我们期望程序的最终输出为2N。输入更大的数的时候如5000、10000时则不满足。这种现象和指令的执行方式有关。操作系统第一次作业
3、提示:哪些变量是各个线程共享的,线程并发执行时访问共享变量会不会导致意想不到的问题。
计数器和loops是各个线程共享的,会导致问题

遇到的问题

1、首先是Linux的使用问题,第一次接触使用Linux甚至不知道怎么运行程序,后来了解gcc 命令之后发现了一个编译器geany ,在学习终端运行程序和使用命令安装软件的时候大概体验了Linux与我熟悉的Windows的不同。
2、读代码的时候遇到了问题。第一次接触C语言内嵌汇编,在上机的时候老师带着我学习了第一题汇编的含义和系统调用的一些内容,系统调用号,中断向量号等。
3、在读程序的时候遇到了不懂的函数已补充至实验报告中。
4、了解了系统的并发,虚拟化,内存分配等知识。
5、在终端输入指令时,作业中给出的指令无法正常运行,已自行作出修改。

github连接

https://github.com/notdz56/16281023-/tree/master/操作系统第一次实验代码