厦门理工学院操作系统实验3
- 格式:docx
- 大小:1.73 MB
- 文档页数:11
2022年厦门理工学院数据科学与大数据技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、设计实时操作系统时,首先应该考虑系统的()。
A.可靠性和灵活性B.实时性和可靠性C.分配性和可靠性D.灵活性和实时性2、下列观点中,不是描述操作系统的典型观点的是()。
A.操作系统是众多软件的集合B.操作系统是用户和计算机之间的接口C.操作系统是资源的管理者D.操作系统是虚拟机3、死锁与安全状态的关系是()。
A.死锁状态有可能是安全状态B.安全状态有可能成为死锁状态C.不安全状态就是死锁状态D.死锁状态一定是不安全状态4、关于临界问题的一个算法(假设只有进程P0和P1,能会进入临界区)如下(i为0或1代表进程P0或者P1):Repeatretry:if(turn!=-1)turn=i;if(turn!=i)go to retry;turn=-1;临界区:turn=0;其他区域;until false;该算法()。
A.不能保持进程互斥进入临界区,且会出现“饥饿”B.不能保持进程互斥进入临界区,但不会出现“饥饿”C.保证进程互斥进入临界区,但会出现“饥饿”D.保证进程互斥进入临界区,不会出现“饥饿”5、在个交通繁忙的十字路口,每个方向只有一个车道,如果车辆只能向前直行,而不允许转弯和后退,并未采用任何方式进行交通管理。
下列叙述正确的是()。
A.该十字路口不会发生死锁,B.该十字路口定会发生死锁C.该上字路口可能会发生死锁,规定同时最多3个方向的车使用该十字路是最有效的方法D.该十字路口可能会发生死锁,规定南北方向的两个车队和东西方向的两个车队互斥使用十字路口是最有效的方法6、为了使多个进程能有效地同时处理输入和输出,最好使用()结构的缓冲技术。
A.缓冲池B.循环缓冲C.单缓冲D.双缓冲7、虚拟设备是通过()技术实现的。
A.并行B.通道C.SPOOLingD.虚拟存储8、若文件f1的硬链接为f2,两个进程分别打开fl和f2,获得对应的文件描述符为fd1和fd2,则下列叙述中,止确的是()I.fl和f2的读写指针位置保持相同II.fl和f2共享同个内存索引节点III.fdl 和fd2分别指向各自的用户打开文件表中的一项,A.仅IIB. 仅II、IIIC.仪I、IID. I、II和II9、下列算法中,用于磁盘调度的是(),A.时间片轮转法B.LRU算法C.最短寻道时间优先算法D.高优先级算法10、有一个矩阵为100行x200列,即a[100][200]。
《操作系统》实验报告a.程序运行结果ret= 是一个不确定的值,试说明原因b.将程序中int a=20语句调换到红颜色位置,结果如何c. 将程序中int a=20 int*p=&a;语句置换成蓝颜色语句,结果又如何?(2)阅读下面接收创建子线程返回一个复杂的数据结构变量程序代码并输入、调试、输出结果;针对下列问题进行说明或修改:将temp定义和赋值变为create()函数内定义的局部变量,应如何修改程序对结果又什么影响并说明原因?四、实验结果与数据处理1.线程的创建(1)实验结果:图1:进程的创建一代码图2:程序运行结果(2)结果分析:运行结果:我们可以看到主线程会先打印出相应的ID,然后再是子线程打印自己的ID原因:当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。
每个进程至少都有一个主线程,所以没有干预的情况下,主线程都是优先于子线程运行的。
所以在输出ID的时候,主线程会比子线程早输出自己的ID。
(3)思考:a.通过以上实验线程执行与函数调用的不同,线程与进程的不同答:线程是程序执行部分,是操作系统的划分。
函数是编程中的概念,是功能模块的划分。
b.如何控制主线程与子线程的执行顺序答:我们可以使用sleep函数来对线程进行挂起的操作,从而来控制主线程与子线程的执行顺序。
图3:修改后的代码图4:修改后的代码运行结果总结:①线程被创建后,并不能保证那个线程先执行,新创建的线程和调用线程的执行顺序不确定,由操作系统进行调度,注意:编译时要连接库libpthread;就是编译的时候要加-lpthread②在C程序中, main(int argc, char **argv) 就是一个主线程。
我们可以在主线程中做任何普通线程可以做的事情,但它和一般的线程有有一个很大的区别:主线程返回或者运行结束时会导致进程的结束,而进程的结束会导致进程中所有线程的结束。
厦门理⼯学院操作系统实验1
《操作系统》实验报告
实验序号:1 实验项⽬名称:Linux操作系统及开发环境搭建
四、实验结果与数据处理
1.搭建虚拟机VMware Workstation下的Ubuntu操作系统环境(1)实验结果:图1:⽤户登录界⾯
图2:Ubuntu系统桌⾯
根据群⽂件中的Ubuntu安装与配置,我成功地在虚拟机VMware Workstation下搭建了Ubuntu操作系统环境,并注册了⾃⼰的⽤户账号,进⼊了Ubuntu桌⾯,并且可以正常进⾏操作。
2.搭建Ubuntu操作系统下的C语⾔编程环境,并⽤C语⾔实现N!程序,编译好并运⾏,采⽤函数调⽤的形式,模块化编程思想:
(1)实验结果:
图3:N!程序代码
图4:在终端运⾏程序
图5:打印学号姓名程序代码
图6:在终端运⾏相应程序。
操作系统课程设计报告时间:2015-12-28 〜2013-1-8地点:信息技术实验中心计算机科学与技术专业2013 级2 班07 号2015-12-28目录一.课程设计的目的和意义 (3)二进程调度算法模拟 (4)1 设计目的 (4)2 设计要求 (4)3 使用动态优先权的进程调度算法的模拟 (6)4. ............................................................................................................................................ 程序流程图 (10)5. ............................................................................................................................................ 实验结果 .. (11)6. ............................................................................................................................................ 实验代码 .. (14)7. ............................................................................................................................................ 实验总结 .. (20)三动态分区分配方式模拟 (21)1 设计目的 (21)2 设计要求 (21)3 模拟算法的实现 (21)4 程序流程图 (24)5 实验结果 (24)6 实验代码 (25)7.实验总结 (30)四请求调页存储管理方式模拟 (31)1 设计目的 (31)2 设计要求 (31)3 模拟算法的实现 (32)4 程序流程图 (37)5. ............................................................................................................................................ 实验结果 .. (38)6. ............................................................................................................................................ 实验代码 .. (39)7. ............................................................................................................................................ 实验总结 .. (42)五简单文件系统的实现 (43)1 设计目的 (43)2 设计要求 (43)3 算法的实现 (44)4.程序流程图 (46)5.实验结果 (46)6 实验代码 (47)7.实验总结 (61)操作系统课程设计总结 (62)课程设计的目的和意义目的:1. 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的内容。
厦门理工学院操作系统实验5(共14页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--《操作系统》实验报告实验序号:5 实验项目名称:线线程的同步和互有一个仓库生产者负责生产产品,并放入仓库,消费者从仓库拿走产品,要求仓库每次只能入一人,仓库中最多存放10个产品,仓库满时不能再放入产品,仓库空时不能再从中取出产品,生产消费速度不同思路:生产和消费各一个线程,仓库为互斥,假设容量为10,库存为3假设生产速度比消费速度快,信号量的值等于剩余产品。
在以下程序中,已经给出主函数要求实现void *produce(void *arg)()和void *cost(void *arg)()两个函数并对整个程序进行调试运行。
在每一个函数中,如果工作条件满足情况下,先等待某个信号量,在进行线程各自的操作(产品数的变化,显示当前工作的产品数),再释放另一个信号量四、实验结果与数据处理1.利用互斥锁实现线程互斥(1)实验结果:图1:互斥锁实现进程互斥代码图2:程序运行结果(2)结果分析:运行结果:我们可以看到会先打印出2,后打印出3。
原因:我们通过互斥锁,让第一个进程先对共享变量进行加1操作,然后轮到第二个进程来对共享变量进行加1操作,因为共享变量初始值为1,所以才能得到最后2、3的结果,这个实验体现了在线程实际运行过程中,我们经常需要多个线程保持同步,这时可以用互斥锁来完成任务。
互斥锁的使用过程中,主要有pthread_mutex_init、pthread_mutex_destory、pthread_mutex_lock、pthread_mutex_unlock这几个函数以完成锁的初始化,锁的销毁,上锁和释放锁操作。
对共享资源的访问, 要对互斥量进行加锁, 如果互斥量已经上了锁, 调用线程会阻塞, 直到互斥量被解锁. 在完成了对共享资源的访问后,要对互斥量进行解锁。
(3)程序修改:如果去掉子线程中的互斥控制,这时候程序的结果是并发,试通过sleep()控制子线程的不同并发过程,实现程序的不同结果(有三种)图3:第一种修改后的代码图4:第一种修改后的代码运行结果图5:第二种修改后的代码图6:第二种修改后的代码运行结果图7:第三种修改后的代码图8:第三种修改后的代码运行结果总结:①当我们在共享变量修改前加上sleep函数时,这样打印出来的数值都是原来的共享变量加1,原因是在共享变量修改之前,第一个进程试图修改共享变量的操作被阻塞了,这样导致马上进行的第二个进程修改值的操作和第一个进程基本一样,所以这样最后就让共享变量实际上只加了一次1,打印出来的结果就是两个2。
《—嵌入式系统原理与应用—》实验指导书黄鹏程、谢勇编写适用专业:计算机科学与技术物联网工程厦门理工学院计算机与信息工程院(系)2016 年 3 月实验3:外部中断实验实验学时:2实验类型:(演示、验证√、综合、设计研究)实验要求:(必修√、选修)一、实验目的1. 理解中断的概念及其在嵌入式系统中的应用;2. 熟悉LPC1700系列 CortexM3 微控制器的NVIC的配置;3. 熟悉 LPC1700系列 CortexM3 微控制器外部中断的控制。
二、实验内容在EasyARM1768开发板的硬件平台上,基于流水灯显示实验,结合向量中断控制器NVIC和外部中断,设计并实现外部中断实验。
要求实现三种方式的流水灯实现,并且通过三个按键利用通过外部中断实现三种不同方式的切换。
三、实验原理、方法和手段中断对嵌入式系统来说是很重要的一个概念,利用中断,可以开发出很接近产品的嵌入式系统。
市场上大部分的不带嵌入式操作系统的嵌入式系统都采用了“前后台系统”来实现产品功能,这其中的前台就是中断机制。
故我们要理解中断的概念,并且能够应用中断到实际的嵌入式系统中来。
图1 前后台系统图2 中断处理流程示意图1、中断向量控制器(NVIC)嵌套向量中断控制器(NVIC)是 Cortex-M3 处理器的一个内部器件,它与 CPU 内核紧密耦合,共同完成对中断的响应,降低了中断延时,使得最新发生的中断可以得到高效处理。
它能够管理中断的各种事务,比如使能或禁止外设中断源的中断,设置外设中断源的优先级,挂起中断,查看外设中断源的中断触发状态等。
然后把中断信号给ARM内核。
NVIC的应用示意图如下所示:图3 NVIC 的作用CPU内核图4 NVIC寄存器描述中断建立的过程可大大简化,只需三步:①系统启动后进行优先级分组。
②设定中断优先级。
③使能中断。
图5 中断建立过程2、外部中断外部中断一般用于外设模块通过微控制器的引脚给一个中断信号给ARM核,来触发外部中断,以便执行相应的中断处理操作。
操作系统实验报告三一、实验目的本次操作系统实验的目的在于深入了解操作系统的进程管理、内存管理和文件系统等核心功能,通过实际操作和观察,增强对操作系统原理的理解和掌握,提高解决实际问题的能力。
二、实验环境本次实验在 Windows 10 操作系统环境下进行,使用了 Visual Studio 2019 作为编程工具,并借助了相关的操作系统模拟软件和调试工具。
三、实验内容与步骤(一)进程管理实验1、创建多个进程使用 C++语言编写程序,通过调用系统函数创建多个进程。
观察每个进程的运行状态和资源占用情况。
2、进程同步与互斥设计一个生产者消费者问题的程序,使用信号量来实现进程之间的同步与互斥。
分析在不同并发情况下程序的执行结果,理解进程同步的重要性。
(二)内存管理实验1、内存分配与回收实现一个简单的内存分配算法,如首次适应算法、最佳适应算法或最坏适应算法。
模拟内存的分配和回收过程,观察内存的使用情况和碎片产生的情况。
2、虚拟内存管理了解 Windows 操作系统的虚拟内存机制,通过查看系统性能监视器观察虚拟内存的使用情况。
编写程序来模拟虚拟内存的页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等。
(三)文件系统实验1、文件操作使用 C++语言对文件进行创建、读写、删除等操作。
观察文件在磁盘上的存储方式和文件目录的结构。
2、文件系统性能测试对不同大小和类型的文件进行读写操作,测量文件系统的读写性能。
分析影响文件系统性能的因素,如磁盘碎片、缓存机制等。
四、实验结果与分析(一)进程管理实验结果1、创建多个进程在创建多个进程的实验中,通过任务管理器可以观察到每个进程都有独立的进程 ID、CPU 使用率、内存占用等信息。
多个进程可以并发执行,提高了系统的资源利用率。
2、进程同步与互斥在生产者消费者问题的实验中,当使用正确的信号量机制时,生产者和消费者能够协调工作,不会出现数据不一致或死锁的情况。
《高级语言程序设计》实验报告实验序号:3 实验项目名称:顺序、选择结构09机制2班学号0908012232 姓名叶志伟专业、班级实验地点1-511 指导教师胡亮实验时间3月15日一、实验目的及要求1.掌握正确使用逻辑运算符和逻辑表达式表示逻辑判断;2.熟练掌握用if语句编写选择结构的程序;3.掌握switch语句的正确使用;4.初步了解调试程序的一般方法。
二、实验设备(环境)及要求使用Visual C++ 6.0;windows系列操作系统的环境。
三、实验内容与步骤1.输入一个华氏温度f,要求输出摄氏温度c。
公式为c=5/9(f-32)。
输出要求有文字说明,取2位小数。
【算法提示】1)定义实变量c,f2)提示输入"Please enter f:"3)读入f4)根据公式计算c5)打印两位精度的结果。
测试结果:华氏温度f 摄氏温度c100.250.523.782.有一函数x (x<1)y= 2x-1 (1<=x<10)3x-11 (x>=10)用scanf函输入x的值,求y值。
【算法提示】1)定义实变量x,y2)提示输入"Please enter x:"3)读入x4)判断x所在的区间,对应出y的计算公式并求值(进一步细化)5)打印结果。
运行结构截图:3.从键盘上输入一个正整数,判断这个数能否同时被3和5整除;运行结构截图:4.假设手机有两种收费方式,第一种是每分钟0.6元,无月租费;另一种是每分钟0.4元再收50元月租费,输入一个月打电话的时间(分钟),判断那一种更省钱。
运行结构截图:5.税收问题。
假设某国家收税是分段计费,标准如下:在1万元以上部分收税20%;5000-10000元部分收税10%;1000-5000元部分收税5%;1000元以下部分免税。
根据输入的金额计算应缴纳的税金。
如:某人收入是12000元,则应缴纳的税金为4000*5%+5000*10%+2000*20%=1100元【实验提示】①给你的变量起个好名字,不要什么变量都用a,b,c…等,变量最好用英文单词或单词的缩写命名,变量名字要体现变量在程序的含义和作用。
《操作系统》实验报告
实验序号:3 实验项目名称:进程管理
四、实验结果与数据处理
1.进程的创建一
(1)实验结果:
图1:进程的创建一代码
图2:程序运行结果
(2)结果分析:
运行结果:我们由图可以得知输出结果为bca或者abc的任意排列。
结果分析:我们从进程执行并发的角度来思考,不管输出abc的任意排列都是有可能的。
原因:fork函数的原理是:一个现有进程可以调用fork函数创建一个新进程。
由fork创建的新进程被称为子进程(child process)。
fork函数被调用一次但返回两次。
两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。
在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。
在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。
我们可以通过fork返回的值来判断当前进程是子进程还是父进程。
而fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。
(3)程序修改:
1.如果想让子进程先执行,父进程后执行,利用wait()/waitpid()函数怎样修改程序实现。
2.如果让多个进程不并发执行,而是按规定的顺序执行,请利用sleep()函数怎样修改程序实现。
图3:修改后的代码
图4:修改后的代码运行结果
从代码修改后的运行结果和网上查阅的资料我们可以知道wait()/waitpid()和sleep()函数都可以控制进程执行的先后顺序,而我们也可以深入了解一下wait()和waitpid()的区别:
a. wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或者该进程接收到了一个指定的信号为止。
如果该父进程没有子进程或者它的子进程已经结束,则wait()函数就会立即返回。
b. waitpid()的作用和wait()一样,但它并不一定要等待第一个终止的子进程(它可以指定需要等待终止的子进程),它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作业控制。
实际上,wait()函数只是waitpid()函数的一个特例,在Linux 内部实现wait()函数时直接调用的就是waitpid()函数。
2.进程的创建二
(1)实验结果:
输入gcc -Wall ex_forc.c -o ex_forc
图5:fork()函数程序运行结果
输入gcc -Wall ex_forc.c -o ex_forc
./ex_forc
图6:vfork()函数程序运行结果
(2)结果分析:
使用fork()函数由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行,而使用vfork()函数则一定是子进程先于父进程运行。
他们的区别是:a.fork()用于创建一个新进程。
由fork()创建的子进程是父进程的副本。
即子进程获取父进程数据空间,堆和栈的副本。
父子进程之间不共享这些存储空间的部分。
而vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,因为子进程会立即调用exec (或exit)于是也就不会存放该地址空间。
相反,在子进程调用exec或exit之前,它在父进程的空间进行。
b.vfork()与fork()另一个区别就是:vfork保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行。
图7:fork()函数程序
图8:vfork()函数程序图8:vfork()函数程序
图9:程序流程图
3.进程的控制
(1)实验结果:
输入gcc -Wall jckz.c -o jckz
图10:无lockf()程序运行结果
结果分析:由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。
但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
这与打印单字符的结果相同。
图11:有lockf()程序运行结果
图12:无lockf()程序代码
图13:有lockf()程序代码
(2)结果分析:
运行结果:我们可以从图中得知,上锁的输出结果大致与未上锁的输出结果相同,也是随着执行时间不同,输出结果的顺序会有所不同。
结果分析:因为上述程序执行时,不同进程之间不存在共享临界资源(其中打印机的互斥性
已有由操作系统保证)问题,所以,加锁与不加锁效果相同。
(3)总结:
因为第一次使用lockf(),刚开始还不明白lockf()中的参数到底应该怎样用,后来在网上查询了资料,才明白了lockf(int fd, int cmd, off_t len)中的参数分别为:fd 是打开文件的文件描述符,cmd 是指定要采取的操作的控制值,len是要锁定或解锁的连续字节数。
lockf()函数允许将文件区域用作信号量(监视锁),或用于控制对锁定进程的访问(强制模式记录锁定)。
试图访问已锁定资源的其他进程将返回错误或进入休眠状态,直到资源解除锁定为止。
当关闭文件时,将释放进程的所有锁定,即使进程仍然有打开的文件。
当进程终止时,将释放进程保留的所有锁定。
此函数调用成功后,将返回值 0,否则返回−1,并且设置 errno 以表示该错误。
4.进程创建替换控制
(1)实验结果:
图14:程序运行结果1
图15:程序运行结果2
图16:程序代码
执行命令ls -l ,列出当前目录下所有文件和子目录;
ls completed!
(2)结果分析:
程序在调用fork()建立一个子进程后,马上调用wait(),使父进程在子进程结束之前,一
直处于睡眠状态。
子进程用exec()装入命令ls,exec()后,子进程的代码被ls的代码取代,这时子进程的PC指向ls的第1条语句,开始执行ls的命令代码。
(3)思考:
a.可执行文件加载时进行了哪些处理?
可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。
b.什么是进程同步?wait()是如何实现进程同步的?
进程同步是指对多个相关进程在执行次序上进行协调,以使并发执行的主进程之间有效地共享资源和相互合作,从而使程序的执行具有可在现行。
首先程序在调用fork()机那里了一个子进程后,马上调用wait(),使父进程在子进程调用之前一直处于睡眠状态,这样就使子进程先运行,子进程运行exec()装入命令后,然后调用wait(0),使子进程和父进程并发执行,实现进程同步。
五、分析与讨论
通过这一次的实验,我对进程的控制和管理有了更多的了解,也学会了如何对子进程和父进程进行相应的操作,明白了fork()、vfork()、exec()、wait()、waitpid()、sleep()、lockf()等等函数,对于进程的整个运行过程和运行方式有了更加深入地体会,让我对linux 操作系统的学习更加得心应手了。