操作系统实验二

16281004-洪华兴-操作系统实验二

一、打开一个vi进程。通过ps命令以及选择合适的参数,只显示名字为vi的进程。寻找vi进程的父进程,直到init进程为止。记录过程中所有进程的ID和父进程ID。将得到的进程树和由pstree命令的得到的进程树进行比较。

解答:先进入终端然后输入vi进入vi界面
在这里插入图片描述
然后再打开另一个终端输入ps-A找到vi界面的进程PID为2742,然后输入ps -l2742找到PPID,后通过ps-l指令逐步查找PPID。
在这里插入图片描述
最后得到父进程顺序2742->2732->2727->1061->1010->909->1
在这里插入图片描述
通过pstree指令得到进程树
在这里插入图片描述

二、编写程序,首先使用fork系统调用,创建子进程。在父进程中继续执行空循环操作;在子进程中调用exec打开vi编辑器。然后在另外一个终端中,通过ps –Al命令、ps aux命令,查看vi进程及其父进程的运行状态,理解每个参数所表达的意义。选择合适的命令参数,对所有进程按照cpu占用率排序。

解答:代码如下:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
	pid_t pid;
	pid=fork();
	if(pid>0)
	 while(1);
	else if(!pid)
	{
		int ret;
		ret=execlp("vi","",NULL);
		if(ret==-1)
		 perror("execl");
	}
	else if(pid==-1)
	 perror("fork");
	return 0;
}

使用ps -Al查看信息,结果如下:
在这里插入图片描述
参数如下:
在这里插入图片描述
意义:

参数名意义
Fflag
Sstat,状态
UID执行者身份
PID进程ID
PPID父进程ID
CCPU使用资源的百分比
PRIpriority,优先级
NINice值
ADDR核心功能,指出该进程在内存的哪一部分
SZ用掉的内存的大小
WCHAN当前进程是否正在运行,若为“-”表示正在进行
TTY登陆者的终端位置
TIME用掉的CPU的时间
CMD所执行的指令

使用ps -aux查看信息,结果如下:
在这里插入图片描述
参数如下:
在这里插入图片描述
意义:

参数名意义
USER进程的属主
PID进程ID
%CPU进程占用的CPU百分比
%MEM占用内存的百分比
VSZ发进程使用的虚拟内存量(KB)
RSS占用的记忆体大小
TTY终端的次要装置号码
STAT该行程的状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
START该进程的启动时间
TIME占用CPU的时间
COMMAND命令的名称和参数

使用top指令对CPU占有量进行降序排序
在这里插入图片描述

三、使用fork系统调用,创建如下进程树,并使每个进程输出自己的ID和父进程的ID。观察进程的执行顺序

在这里插入图片描述
解答:代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main(void) {
 int p1,p2,p3,p4,p5;
 while ((p1=fork())==-1);
 if (!p1) {
    printf("p1 pid %d, ppid %d.\n",getpid(),getppid());
    while ((p2=fork())==-1);
    if (!p2) {
      printf("p2 pid %d, ppid %d.\n",getpid(),getppid());
      while((p4=fork())==-1);
      if(!p4){
	printf("p4 pid %d, ppid %d.\n",getpid(),getppid());
      	exit(0);
      }
      else 
	wait(0);
      while((p5=fork())==-1);
      if(!p5){
	printf("p5 pid %d, ppid %d.\n",getpid(),getppid());
      	exit(0);
      }
      else 
	wait(0); 
      exit(0);
    }
    else
      wait(0);
    while ((p3=fork())==-1);
    if (!p3) {
      printf("p3 pid %d, ppid %d.\n",getpid(),getppid());
      exit(0);
    }
    else
      wait(0);
    exit(0);
 }
  else
    wait(0);
  return 0;
}

输出结果如下:
在这里插入图片描述

四、修改上述进程树中的进程,使得所有进程都循环输出自己的ID和父进程的ID。然后终止p2进程(kill或者自动退出),观察p1、p3、p4、p5进程的运行状态和其他相关参数有何改变。

解答:代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void) {
 pid_t p1,p2,p3,p4,p5;
 int i=0;
 while ((p1=fork())==-1);
 if (!p1) 
 {
	while ((p2=fork())==-1);
	if (!p2) 
	{
	  while((p4=fork())==-1);
          if(!p4) 
	  {
	    while(1)
	    {
      	      printf("p4 pid %d, parent pid %d.\n",getpid(),getppid());
	      sleep(2);
	    }
	  }
      	  else 
	  {
      	    while((p5=fork())==-1);
      	    if(!p5) 
	    {
	      while(1)
	      {
      	        printf("p5 pid %d, parent pid %d.\n",getpid(),getppid());
		sleep(2);
	      }
	    }
      	  }
	  while(1)
	  {
	    printf("p2 pid %d, parent pid %d.\n",getpid(),getppid());
            
	    /*i++;
	    if(i==2)
	    {
		int *p=NULL;
                *p=0;
	    }*/ //段地址错误
            /*i++;
            if(i==2)
	        exit(0);*/ //exit()函数
	    sleep(2);
	  }
    	}
    	else 
	{
    	  while ((p3=fork())==-1);
    	  if (!p3) 
   	  {
	    while(1)
	    {
      	      printf("p3 pid %d, parent pid %d.\n",getpid(),getppid());
	      sleep(2);
	    }
	  }
 	}
	while(1)
	{
      	   printf("p1 pid %d, parent pid %d.\n",getpid(),getppid());
           sleep(2);
	}

  }
  return 0;
}

输出结果如下:
在这里插入图片描述
使用kill -9手动中断进程
在这里插入图片描述
使用exit()函数中断进程
在这里插入图片描述
段错误,即访问了非法内存或未申请的内存产生的错误
在这里插入图片描述
通过这些方式杀死进程2后,可以发现进程2已经不存在,但它的子程序进程4和进程5仍然存在,并且完成输出信息的任务,但其PPID已经变成了进程1的PPID。

GitHub源码:https://github.com/hhxhongchen/lab/tree/master/lab2

专业方向:软件工程-软件工程(ID:07701) 修订人:金虎 ________________________________________ 《操作系统大作业》教学大纲 第一部分 课程目的与任务 一、课程基础: 在学这门课之前,学生必须预修过高级语言、数据结构、离散数学方面的基本知识,先修操作系统课程,延时完成操作系统大作业。 、适应对象: 计算机科学与技术-计算机应用; 软件工程-软件工程; 电子信息科学类-电子信息科学与技术;管理类-信息管理专业 三、教学目的: 为配合《操作系统》课程的教学,通过模拟操作系统原理的实现,使学生能更深刻地领会操作系统工作原理和操作系统实现方法,并提高程序设计能力, 特开设此课程设计。 四、内容提要: 本课要求模拟采用多道程序设计方法的单用户操作系统,该操作系统包括进程管理、存储管理、设备管理和文件管理四部分。 第部分 内容及基本要求 第1章、进程控制管理实现 ●基本要求:利用简单的结构和控制方法模拟进程结构、进程状态和进程控制。 ●参考学时:8学时 ●参考资料: 用PCB表示整个进程实体,利用随机数方法或键盘控制方法模拟进程执行中产生的事件。或者利用鼠标或者键盘中断的基于图形接口方式的进程控制管理。 1、 定义PCB(可以采用静态结构或动态结构):包括理论PCB中的基本内容,如内部ID、外部ID、进程状态、队列指针。由于无法实现真正的进程创建功能,在实验中只需建立PCB,用它代表完整的进程。 2、 定义进程状态转换方式:进程的状态转换是由进程内部操作或操作系统的控制引起,由于无法实现这些功能,学生可以采用随机数方法或键盘控制方法模拟,并实现对应的控制程序。随机方法指产生1-6的随机数,分别代表创建进程(c)、结束进程(e)、进程阻塞(b)、激活进程(w)、调度进程(p)、时间片到(t)等事件;键盘模拟方法指定义6种按键代表以上6种事件。 3、 根据四种事件处理就绪队列、阻塞队列和当前执行中的进程。 每次事件处理后应形象地显示出当前系统中的执行进程是哪一个,就绪队列和阻塞队列分别包含哪些进程。 第2章、请求分页式存储管理的地址转换过程实现: ●基本要求:实现分页式存储地址转换过程,在此基础上实现请求分页的地址转换。实现请求页式地址转换中出现的缺页现象时,用到的先进先出FIFO、最近最久未使用LRU、最佳OPT置换算法。 ●参考学时:8学时 ●参考资料: 利用键盘输入本模拟系统的物理块的大小,作业的页表中的块号;完成逻辑地址转换成相应的物理地址的过程。 1、建立一张位示图,用来模拟内存的分配情况,利用随机数产生一组0和1的数对应内存的使用情况。 2、输入块(页)的大小,通过模拟位示图为本作业分配内存空间建立相应的页表(长度不定); 3、录入逻辑地址转换成相应的物理地址 4、扩充页表,变成请求式的维页表(增加存在位等)完成地址转换。 5、输入分配给本作业的块数,模拟作业执行的逻辑地址转换成页面调度次序; 6、分别采用OPT、FIFO、LRU置换算法,利用堆栈结构完成页面置换;记录被换出的页面和新换入的页面。 第3章、设备管理实现: ●基本要求:设备管理主要包括设备的添加和删除、设备的分配和回收、同时实现设备独立性。 ●参考学时:6学时 ●参考资料: 假定模拟系统中有键盘、鼠标、打印机和显示器四个设备,三个控制器和两个通道,采用安全分配方式。 1、设备管理子系统涉及到系统设备表(SDT)、通道控制表(CHCT)、控制器控制表(COCT)和设备控制表(DCT)来体现输入输出系统的四级结构和三级控制。我们模拟这样的数据结构来完成对外围设备的管理。 (1)添加设备:增加对应的设备控制表和系统设备表中的表项,如果需要新建对应的控制器控制表。 (2)删除设备:删除对应的设备控制表和系统设备表中的表项,如果需要删除对应的控制器控制表。 2、设备的分配和回收,进程申请设备的时候,建立起通路,即获成功;否则阻塞到通道、控制器或设备上面。进程回收设备的时候,把阻塞进程唤醒。 3、设备分配必须满足设备的独立性要求。为了实现设备独立性,要求在驱动程序之上设计一层设备无关软件,其主要功能可分为: (1)执行所有设备的公有操作,主要包括:(a)独占设备的分配与回收;(b)将逻辑设备名映射为物理设备(LUT),进一步可以找到相应物理设备的驱动程序。 (2)向用户层(或文件层)软件提供统一的接口。例如,对各种设备的读操作,在应用程序中都用read; 而对各种设备的写操作,则都使用write。 第4章、文件管理系统实现: ●基本要求:利用交互式命令实现树型目录结构和文件管理,同时利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表记录文件在外存上的存储方式。 ●参考学时:8学时 ●参考资料: 在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文件)、DEL(删除文件)和DIR。目录项包括文件或目录名称、类型(文件、目录或空目录项)、创建日期以及下一个目录项指针、下一级目录项指针。 1、创建初始文件,建立根目录的“.”和“..”目录项。 2、显示命令提示符“$”。 3、输入命令后根据命令含义完成相应文件操作: MD:在目录文件中创建子目录,同时搜索当前目录最后一个目录项,并保存指针信息; CD:根据当前目录切换到指定目录; RD:搜索所要删除的目录是否为空目录,若是则删除; MK:在当前目录中创建文件名称;(申请空间利用位示图修改FAT) DEL:搜索所要删除的文件是否存在,若是则删除;(恢复位示图修改FAT) DIR:列出当前目录的所有目录项。 4、在创建文件的时候分配空闲的磁盘空间,采用显示链接的方式,利用文件分配表(FAT)记录文件在外存上的存储情况。 5、当删除文件时,回收外存上的空间,修改位示图和文件分配表。 第5章、进程调度算法的实现: ●基本要求:实现先来先服务FCFS、短作业优先SJF以及时间片轮转调度算法。 ●参考学时:6学时 ●参考资料: 根据创建进程的系统时钟,取相对时钟作为进程的到达时间,利用随机数产生每个进程的估计运行时间。利用模拟系统中提供的算法分别计算其相应的周转时间和带权周转时间。 1、利用绝对时间和相对时钟产生一组进程的到达时刻和运行时间。 2、实现FCFS算法:根据进程的到达时间的先后次序来完成对若干进程的调度。 3、实现SJF算法:根据当前时间已经到达进程的需要运行时间选取其中时间最小的进程最先运行。 4、实现时间片轮转算法:首先要求确定时间片的大小,依据进程的到达时间依次加入队列,每次分配一个时间片大小的时间,如果没有完成参与下一次的竞争,当最后需要一个小于等于时间片的时间时本进程完成,同时退出队列。 5、计算每种算法调度后,系统的平均周转时间和平均带权周转时间。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值