山东信息Linux实验报告,山东大学大二下学期操作系统实验报告

这篇博客详细介绍了山东大学大二下学期关于操作系统的四个实验:进程控制、进程调度算法、进程同步及内存页面置换算法。实验涉及创建和控制进程、模拟调度策略、解决并发问题以及页面替换策略的实践,通过C语言编程实现。实验旨在加深对操作系统核心概念的理解,如并发执行、进程状态转换、同步与互斥、内存管理和调度策略等。
摘要由CSDN通过智能技术生成

《山东大学大二下学期操作系统实验报告》由会员分享,可在线阅读,更多相关《山东大学大二下学期操作系统实验报告(68页珍藏版)》请在人人文库网上搜索。

1、操作系统实验报告计算机科学与技术学院 计算机科学与技术专业2012级1班 目录一、进程控制实验31.1 实验目的31.2示例实验31.2.1实验内容31.3独立实验41.3.1实验内容41.3.2实验步骤41.3.3实验演示结果71.3.4实验代码7二、进程调度算法实验92.1 实验目的92.2示例实验102.2.1实验内容102.2.2实验演示结果102.3独立实验112.3.1实验内容112.3.2实验步骤122.3.3实验演示结果142.3.4实验代码14二、进程同步实验163.1 实验目的163.2示例实验163.2.1实验内容163.2.2实验演示结果173.3独立实验173.3.1。

2、实验内容173.3.2实验步骤183.3.3实验演示结果213.3.4实验代码21三、内存页面置换算法实验314.1 实验目的314.2示例实验314.2.1实验内容314.2.2实验演示结果324.3独立实验324.3.1实验内容324.3.2实验步骤334.3.3实验演示结果354.3.4实验代码37四、磁盘移臂调度算法实验485.1 实验目的485.2示例实验495.2.1实验内容495.2.2实验演示结果505.3独立实验505.3.1实验内容505.3.2实验步骤515.3.3实验演示结果545.3.4实验代码54一、 进程控制实验1.1 实验目的加深对于进程并发执行概念的理解。实践。

3、并发进程的创建和控制方法。观察和体验进程的动态特性。进一步理解进程生命期期间创建、变换、撤销状态变换的过程。掌握进程控制的方法,了解父子进程间的控制和协作关系。练习 Linux 系统中进程创建与控制有关的系统调用的编程和调试技术。1.2示例实验1.2.1实验内容以下实验示例程序应实现一个类似shell 子命令的功能,它可以从执行程序中启动另一个新的子进程并执行一个新的命令和其并发执行。1.2.2实验演示结果1.3独立实验1.3.1实验内容参考以上示例程序中建立并发进程的方法,编写一个父子协作进程,父进程创建一个子进程并控制它每隔 3 秒显示一次当前目录中的文件名列表。1.3.2实验步骤1.3.。

4、2.1算法设计通过进程间的通讯,先创建一个父进程一个子进程,父进程沉睡3秒,子进程作为当前父进程再次创建一个他的子进程,当前子进程执行显示当前目录文件列表功能,执行execve()方法后死亡。While(1)在死循环里无限进行当前操作。即达到父进程创建一个子进程并控制它每隔3秒显示一次当前目录中的文件名列表的要求。1.3.2.2开发调试过程打开一终端命令行窗体,新建一个文件夹,在该文件夹中建立名为pctrl.c的C语言程序;再建立以下名为 pctrl.h 的 C 语言头文件;建立项目管理文件 Makefile;输入 make 命令编译连接生成可执行的 pctl 程序;执行 pctl 程序;再次。

5、执行带有子进程指定执行命令的 pctl 程序。1.3.2.3思考与分析1反映的进程的特征和功能,在真实的操作系统中是怎样实现和反映出教材中讲解的进程的生命期、进程的实体和进程状态控制的。对于进程概念和并发概念有哪些新的理解和认识?子进程是如何创建和执行新程序的?答:进程是一个可并发执行的程序在某数据集上的一次运行,是程序的一次运行过程。而程序只是进程的一个组成部分,进程是程序的执行过程。程序是静态的指令集合,而进程是动态的过程实体,是动态的产生、发展和消失。此外所谓的进程并发执行是在宏观上并发,而在微观上交替执行。每个进程都用一个唯一的整数形式的进程标识符来标识,通过fork()系统调用,可创。

6、建新进程。新进程通过复制原来进程的地址空间而成。这种机制允许父子进程方便的进行通信。系统调用fork(),得到的子进程实际上是父进程的克隆体,要执行不同的新程序要使用系统调用exec(),以用新程序来取代进程的内存空间。其功能是根据参数指定的文件名找到程序文件,把它装入内存,覆盖原来进程的映像,形成一个不同于父进程的子进程。除了进程映像被更换之外,新进程的PID及其他PCB属性均保持不变,实际上是一个新进程“借壳”原来子进程开始运行。父进程可通过系统调用waitpid()来把自己移出就绪队列来等待子进程的终止。2信号的机理是什么?怎样利用信号实现进程控制?每个信号对应一个正整数常量(为sign。

7、alnumber。定义在系统头文件中),代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进程发生了某异常事件。每个进程运行时,要通过信号机制来检查是否有信号到达。若有,中断正在执行的程序,转向该信号相对应的处理程序,已完成对事件的处理;处理结束后再返回到原来的断点继续执行。1.3.3实验演示结果1.3.4实验代码pctl.c文件:#include pctl.hint main()int pid_1,pid_2; /存放子进程号int status_1,status_2; /存放子进程返回状态while(1)pid_1=fork() ; if(pid_1#include #inclu。

8、de #include #include #include /进程自定义的键盘中断信号处理函数typedef void (*sighandler_t) (int);void sigcat()printf(%d Process continuen,getpid();二、进程调度算法实验2.1 实验目的加深对进程调度概念的理解,体验进程调度机制的功能,了解 Linux 系统中进程调度策略的使用方法。 练习进程调度算法的编程和调试技术。2.2示例实验2.2.1实验内容以下示例实验程序要测试在 linux 系统中不同调度策略和不同优先数的调度效果。2.2.2实验演示结果2.3独立实验2.3.1实验内容。

9、设有两个并发执行的父子进程,不断循环输出各自进程号、优先数和调度策略。进程初始调度策略均为系统默认策略和默认优先级。当某个进程收到 SIGINT信号时会自动将其优先数加 1,收到 SIGCSTP 信号时会自动将其优先数减 1。请编程实现以上功能。2.3.2实验步骤2.3.2.1算法设计建立一个父进程和一个子进程。通过第一章学习的进程控制相互发送信号。当按下 Ctrl+C 时,父进程实现优先级加 1。当按下Ctrl+Z 时,子进程实现优先级减1。用 signal 系统调用将父进程注册一个本进程处理 SIGINT 的实现优先级加 1 的函数。子进程注册一个本进程处理SIGTSTP 的实现优先级减 。

10、1 的函数。当按下 Ctrl+Z 时,子进程做出响应,其优先级减 1;当按下Ctrl+C 时,父进程做出响应,父进程优先级加 1.然后再输出各自进程号、优先数和调度策略。以上行为通过 for()语句循环。2.3.2.2开发调试过程新建一个文件夹,在该文件夹中建立以下名为 pctl.c 的 C 语言程序。再建立以下名为pctl.h的 C 语言头文件。建立项目管理文件 Makefile 。输入 make 命令编译连接生成可执行的pctl程序 。执行并调试 pctl程序2.3.2.3思考与分析进程调度调度策略和功能如下所示:SCHED_OTHER 默认的分时调度策略(值等于 0)SCHED_FIFO。

11、 先进先先出调度策略(值等于 1)SCHED_RR 时间片轮转调度策略(值等于 2)进程调度本质就是让谁先执行,让谁后执行。在真实的操作系统中,由调度策略和优先级决定谁先执行。Linux 的调度策略有三种,SCHED_OTHER 分时调度,SCHED_FIFO 先进先出,SCHED_RR 时间片轮转。后两种专用于对响应时间有特殊要求的进程,并且会抢先于 SCHED_OTHER 调度策略的进程而执行。通过这个系统调用设置进程调度策略,intsched_setscheduler(pid_t pid,int policy,const struct sched_param *sp); 其中 pid 是。

12、进程号,policy 是以上说明的 3 种调度策略之一,sp 调度参数结构指针,调度参数结构主要存有调度优先数。进程优先数(prio)由静态优先级和动态优先级两部分组成。静态优先级与调度策略有关。动态优先级由以下系统调用设置,int setpriority(int which,int who,int prio);which 设置的对象。可以是:进程 PRIO_PROCESS进程组 PRIO_PGRP用户 PRIO_USERwho 对应设置对象的进程号或组号或用户号prio 要设置的进程优先数2.3.3实验演示结果2.3.4实验代码psched.c文件:#include#include#incl。

13、ude#include #define SIGINT 2#define SIGTSTP 20void handler_sigint(int signo) /用于提升优先数printf(n%d 进程优先数增加 1n,getpid();setpriority(PRIO_PROCESS, getpid(),getpriority(PRIO_PROCESS,getpid() + 1);void handler_sigtstp(int signo) /用于降低优先数printf(n%d 进程优先数减小 1n,getpid();setpriority(PRIO_PROCESS, getpid(),getp。

14、riority(PRIO_PROCESS,getpid() - 1);int main() pid_t pid;if(pid = fork() 0) signal(SIGINT, handler_sigint); /父进程处理 Ctrl+Csignal(SIGTSTP, SIG_IGN); /忽略 Ctrl+Zelsesetpriority(PRIO_PROCESS, getpid(), 10); /设定子进程初始动态优先级为 10,否则看不出效果signal(SIGTSTP, handler_sigtstp); /子进程处理Ctrl+Zsignal(SIGINT, SIG_IGN); /忽略。

15、 Ctrl+Cint i=1;while(i 0) printf(Im parent process, );elseprintf(Im child process, );printf(pid = %d, priority = %d, scheduler = %dn,getpid(), getpriority(PRIO_PROCESS,getpid(),sched_getscheduler(getpid();sleep(3);i+;其他文件同示例实验。二、 进程同步实验3.1 实验目的加深对并发协作进程同步与互斥概念的理解,观察和体验并发进程同步与互斥操作的效果,分析与研究经典进程同步与互斥问题。

16、的实际解决方案。了解 Linux 系统中 IPC 进程同步工具的用法,练习并发协作进程的同步与互斥操作的编程与调试技术。3.2示例实验3.2.1实验内容以下示例实验程序应能模拟多个生产/消费者在有界缓冲上正确的操作。它利用 N 个字节的共享内存作为有界循环缓冲区,利用写一字符模拟放一个产品,利用读一字符模拟消费一个产品。当缓冲区空时消费者应阻塞睡眠,而当缓冲区满时生产者应当阻塞睡眠。一旦缓冲区中有空单元,生产者进程就向空单元中入写字符,并报告写的内容和位置。一旦缓冲区中有未读过的字符,消费者进程就从该单元中读出字符,并报告读取位置。生产者不能向同一单元中连续写两次以上相同的字符,消费者也不能从。

17、同一单元中连续读两次以上相同的字符。3.2.2实验演示结果3.3独立实验3.3.1实验内容抽烟者问题。假设一个系统中有三个抽烟者进程,每个抽烟者不断地卷烟并抽烟。抽烟者卷起并抽掉一颗烟需要有三种材料:烟草、纸和胶水。一个抽烟者有烟草,一个有纸,另一个有胶水。系统中还有两个供应者进程,它们无限地供应所有三种材料,但每次仅轮流提供三种材料中的两种。得到缺失的两种材料的抽烟者在卷起并抽掉一颗烟后会发信号通知供应者,让它继续提供另外的两种材料。这一过程重复进行。 请用以上介绍的 IPC 同步机制编程,实现该问题要求的功能。3.3.2实验步骤3.3.2.1问题分析有两个供应者,有三个消费者。用于存放烟草。

18、,纸和胶水的公共缓冲区的大小是 3.存放顺序要指定。分别是烟草,纸和胶水。每一个供应者供应的物品有三种,(烟草+纸)(烟草+胶水)(纸+胶水) 。三个消费者分别需要三个里面的一种。约束:(1)某一时刻,只能有一个供应者,放入一对物品。(2) 某一时刻, 只能有一个消费者, 且要保证这个消费者恰好需要的就是刚刚生产的物品。(3)所有供应者提供这种物品之后,不论它要生产什么物品,只有等到消费者拿走了物品之后,才能继续生产。3.3.2.2算法设计(1)供应者的上下文完全一样,在程序中 fork()子进程之后,让父进程和子进程并发执行供应者代码即可。(2)消费者有三个,且每个消费者需要的物品不同,所以。

19、不能使用同一个代码段。这样,就需要建立两个子进程和一个父进程同时并发执行。 然后在各自区域执行相似的但不同的代码段。(3)用信号灯实现同步和互斥约束。(4)创建公共缓冲区和指向首地址的指针/获取缓冲区使用的共享内存,buff_ptr 指向缓冲区首地址buff_ptr = (char *)set_shm(buff_key,buff_num,shm_flg);/获取供应者放产品首位置指针 pput_ptrpput_ptr = (int *)set_shm(pput_key,pput_num,shm_flg);3.3.2.3开发调试过程新建一个文件夹,在该文件夹中建立以下名为 ipc.h 的 C 语。

20、言头文件。再建立以下名为 ipc.c 的 C 语言头文件,实现头文件中申明的函数。再建立以下名为 producer.c 的 C 语言头文件,实现供应者的功能。再建立以下名为 consumer.c 的 C 语言头文件,实现消费者的功能。建立项目管理文件 Makefile 。输入 make 命令编译连接生成可执行的 producer 和 consumer 程序 。执行并调试 producer 和 consumer 程序。3.3.2.4思考与分析进程之间的同步在该实验中是通过信号灯实现的。 进程之间为了同步而使用的信号灯,必须完全相同的在各自进程中创建。这样,这些信号灯就会被这些进程共享。然后通过执。

21、行信号灯的 up()和 down()操作.使得进程并发执行时保持同步。因为如果信号灯的值小于 0,那么这个进程会阻塞,这就是为什么能够同步。操作系统中,进程同步可以通过信号量机制实现。在本实验中,信号灯就是信号量 ,down()操作就是信号量的 wait 操作,up()操作就是信号量的 signal 操作。3.3.3实验演示结果3.3.4实验代码ipc.h文件:#include #include #include #include #include #include #include #define BUFSZ 256/建立或获取 ipc 的一组函数的原型说明int get_ipc_id(ch。

22、ar *proc_file,key_t key);char *set_shm(key_t shm_key,int shm_num,int shm_flag);int set_msq(key_t msq_key,int msq_flag);int set_sem(key_t sem_key,int sem_val,int sem_flag);int down(int sem_id);int up(int sem_id);typedef union semuns int val; Sem_uns;typedef struct msgbuf long mtype;char mtext1; Msg_b。

23、uf;/生产消费者共享缓冲区即其有关的变量key_t buff_key;int buff_num;char *buff_ptr;/生产者放产品位置的共享指针key_t pput_key;int pput_num;int *pput_ptr;/消费者取产品位置的共享指针key_t cget_key;int cget_num;int *cget_ptr;/生产者有关的信号量key_t prod_key;key_t pmtx_key;int prod_sem;int pmtx_sem;/消费者有关的信号量key_t c_PG_key;key_t c_TP_key;key_t c_TG_key;key。

24、_t cmtx_key;int c_PG_sem;int c_TP_sem;int c_TG_sem;int cmtx_sem;int sem_val;int sem_flg;int shm_flg;ipc.c文件:#include ipc.hint get_ipc_id(char *proc_file,key_t key)FILE *pf;int i,j;char lineBUFSZ,columBUFSZ;if(pf = fopen(proc_file,r) = NULL)perror(Proc file not open);exit(EXIT_FAILURE);fgets(line, BU。

25、FSZ,pf);while(!feof(pf)i = j = 0;fgets(line, BUFSZ,pf);while(linei = ) i+;while(linei != ) columj+ = linei+;columj = 0;if(atoi(colum) != key) continue;j=0;while(linei = ) i+;while(linei != ) columj+ = linei+;columj = 0;i = atoi(colum);fclose(pf);return i;fclose(pf);return -1;int down(int sem_id)stru。

26、ct sembuf buf;buf.sem_op = -1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) #include using namespace std;Replace:Replace()int i;/设定总得访问页数,并分配相应的引用页号和淘汰页号记录数组空间cout PageNumber;ReferencePage = new intsizeof(int) * PageNumber;EliminatePage = new intsizeof(int) * PageNumber;/输入引用页号序列(页面。

27、走向),初始化引用页数组cout ReferencePagei;/引用页暂存引用数组/设定内存实页数(帧数),并分配相应的实页号记录数组空间(页号栈)cout FrameNumber;PageFrames = new intsizeof(int) * FrameNumber;Replace:Replace()void Replace:InitSpace(char * MethodName)int i;cout endl MethodName endl;FaultNumber=0;/引用还未开始,-1 表示无引用页for (i = 0; i PageNumber; i+)EliminatePag。

28、ei = -1;for(i = 0; i FrameNumber; i+)PageFramesi = -1;/分析统计选择的算法对于当前输入的页面走向的性能void Replace:Report(void)/报告淘汰页顺序cout endl Eliminate page:;for(int i=0; EliminatePagei!=-1; i+) cout EliminatePagei ;/报告缺页数和缺页率cout endl Number of page faults = FaultNumber endl;cout setw(6) setprecision(3) ;cout Rate of page faults = 100*(float)FaultNumber/(float)Pag。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值