操作系统的首次实验
操作系统初
大学:计算机与信息技术
专家:信息安全(保密技术) )。
类:安全1601
名字:深情的前辈
学号: 16281194
2019年3月5日
一、(系统调用实验)了解系统调用的不同封装形式。
1、请参照以下URL步骤。 请参阅使用API接口函数getpid ()直接调用和程序集中断调用两种方法运行分别调用Linux上相同系统调用getpid的程序。 (请告诉我getpid的系统呼叫号码。 linux系统调用的中断矢量号码是多少? 请参阅。
通过查询syscall_32.tbl表,可以看到getpid系统调用的中断号为20。 系统调用是内核空间内函数的执行,但出于提高系统安全性、提高用户程序可移植性等目的,用户程序不能直接调用或修改内核空间内的函数。 此时,使用系统调用,它是连接用户空间和内核空间的纽带,内核内函数的具体实现与系统调用函数的对应关系通过syscall_32.tbl表记录。
2、机上完成习题1.13。
Linux调用c函数格式
汇编格式
此代码无法在64位系统上直接编译。 必须添加“-m32”才能编译32位程序。 但是,直接输入时会显示错误,需要安装匹配库“sudo apt-getinstallgcc-multilibgmultilib module-assistant”。
3、阅读pintos源代码,绘制系统调用实现的流程图。
()同时实验)根据以下代码进行以下实验。
要求:
1、编译并运行该程序(cpu.c ),观察输出结果,说明程序的功能。
(编译命令: gcc -o cpu cpu.c -Wall ) ) )执行命令:/cpu () ) ) ) ) ) )。
2、再次按以下运行,观察结果。 执行命令。/cpu A;/cpu B;/cpu C;/cpu D程序cpu运行了多少次? 他们运行的顺序有什么特征和规律? 请结合操作系统的特点进行说明。
1 #包含stdio.h
2 #include stdlib.h
3 #include sys/time.h
4 #include assert.h
5 # include (公共. h )
6
7 int
(8主(int argc,char *argv[] ) ) ) ) ) ) ) ) ) ) ) )。
9 {
10if(argc!=2) {
11fprintf(stderr,“usage: cpu n”
12退出(1;
13 }
14 char *str=argv[1];
15while(1) {
16spin(1;
17printf(%s(n ),str );
18 }
19 eturn 0;
20
以上实验表明,cpu在一个周期内运行4次,由于不可测原理,无法准确确认时间开销,但可以粗略计算吞吐量。
输出顺序与系统调度有关,如果是单一的道路或轮换,其输出一定是顺序,但由于当前的系统调度很复杂,如果是随机调度,则输出顺序不一定。
三、(内存分配实验)根据以下代码完成实验。
要求:
1、阅读并编译运行该程序(mem.c ),观察输出结果,说明程序的功能。 (命令: gcc -o mem mem.c -Wall )
2、再次执行以下命令,观察结果。 分配给两个分别运行的程序的内存地址是否相同? 是否共享相同的物理内存空间? 为什么? 命令:/mem;/mem
1 #包含unistd.h
2 #include stdio.h
3 #include stdlib.h
4 # include (公共. h )
5
6 int
7main(intargc,char *argv[] ) ) ) ) ) ) ) ) ) 652
8 {
9int*p=malloc(sizeof(int ); //a1
10资产(p!=NULL;
11printf () (%d )地址为pointed to by p : % pn ),
12 getpid (,p ); //a2
13 *p=0; //a3
14while(1) {
15spin(1;
16 *p=*p 1;
17printf () (%d ) p:%d(n ),getpid ),*p ); //a4
18 }
19返回0;
经过上述实验,两个程序所分配的存储器地址不同,但如果关闭地址随机化,则所分配的地址相同。 但具体物理地址不能完全确定,其中有对应关系。 随机的,可能不是物理连续的。
四、(共享问题)根据以下代码完成实验。
要求:
1、阅读并编译运行该程序,观察输出结果,说明程序的功能。 (编译指令: gcc-o thread thread.c-wall-pthread ) (执行指令1:/thread 1000 ) )
2、试运行其他输入参数,总结运行结果的哪些规律? 我可以试着说明一下那个吗? 例如,执行命令2:/thread 100000 ) (或其他参数。 )
3、提示:哪些变量由各个线程共享,线程同时运行时访问共享变量会不会出现意想不到的问题?
1 #包含stdio.h
2 #include stdlib.h
3 #包含“common.h”
4
5电压输入计数器=0;
6 int loops;
7
8 Void *工作器(Void * Arg ) {
9 int i;
10for(I=0; i loops; I ) {
11柜台;
12 }
13返回空值;
14 }
15
16英寸
17主(int argc,char *argv[] ) ) ) ) ) ) ) ) ) ) )。
18 {
19if(argc!=2) {
20fprintf(stderr," usage: threads n "
21退出(1;
22 }
23loops=atoi(argv[1];
24 pthread_t p1,p2;
25 printf (“initial value : % dn”,counter );
26
27pthread_create(P1,NULL,worker,NULL );
28pthread_create(P2,NULL,worker,NULL );
29pthread_join(P1,NULL );
30pthread_join(P2,NULL );
31printf(「finalvalue:%dn”,counter );
32返回0;
33
修改每个参数后,得到的数值与两倍不同,理论值应该是输入值的两倍,但由于碰撞,数值将小于两倍。
实验代码地址