操作系统第二次实验:创建进程

0.个人信息

姓名:王璐璐

学号:201821121037

班级:计算1812

1.编写程序

用vim编写程序——使用fork()创建两个子进程。代码如下:

 #include <stdio.h>
 #include <sys/types.h>
 #include <unistd.h>
 int main(){
     pid_t fpid;
     fpid=fork();
     if(fpid<0){
         printf("error");
     }
     else if (fpid==0){
         printf("child process 1,process id: %d\n",getpid());
     }
     else{
         pid_t fpid2=fork();
         if(fpid2<0){
             printf("error2");
         }
         else if(fpid2==0){
             printf("child process 2,process id: %d\n",getpid());
         }
         else{
             printf("parent process,process id: %d\n",getpid());
         }
         sleep(500);         //延迟100秒,进程挂起
     }
 }

编译过程:

得到的程序运行结果图如下:

2.打印进程树

(1)在代码中创建完进程后,使用sleep(500)函数,将进程挂起了500秒。

(2)方法一:打开两个控制台,一个开启程序,一个打印进程树;

(3)使用命令打印出上述进程的进程树,结果如下:

其中15250为父进程的pid号,15251和15252分别为两个子进程的pid号

(4)方法二:用“&”将进程放置后台运行,再打印进程树

3.解读进程相关信息

3.1解读

(1)下图中红色框表示的是查找到的与创建的父子进程相关的进程信息:

(2)执行后,会有以下几个字段

UID        PID  PPID  C STIME TTY          TIME CMD

(3)根据执行fork.c程序,解释上述的几个字段含义:

①UID:表示用户的ID。在该实验中,用户ID是wanglulu,这是我登录服务器时的用户名;

②PID:表示某一个进程的ID号。在该实验中,fork.c创建了三个进程,其进程ID号分别为15250,15251,15252;

③PPID:表示某一个进程的父进程ID号。在该实验中,fork.c创建了一个父进程和两个子进程,从结果图中可以看出进程ID15251和15252的父进程ID均为15250;

④C:表示CPU使用的资源百分比。在该实验中,三个进程的资源百分比均为0;

⑤STIME:表示程序启动时间。从该实验的结果图中,可以发现创建父进程的同时会将两个子进程创建好,这三个进程的创建时间是一致的;

⑥TTY:表示进程与控制终端的关联值。由于fork.c中创建的三个进程是父子关系,这三个进程最后得到TTY值是一样的,值pts/1表示在桌面Linux中是标准输出;

⑦TIME:表示进程使用的总CPU时间。由结果图可知,创建进程无需使用CPU

⑧CMD:所下达的指令名称

3.2解读

(1)下图是执行命令后得到的字段结果:

(2)执行后,会有以下几个字段:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

(3)根据执行fork.c程序,解释上述的几个字段含义:

①USER:表示的含义与使用“ps -ef”中的字段“UID”相类似;

②PID:同“ps -ef”中的“PID”;

③%CPU:同“ps -ef”中的“C”;

④%MEM:表示该进程所占用的物理内存百分比。在该实验中显示这三个进程所占的物理内存百分比均为0;

⑤VSZ:表示的是该进程使用掉的虚拟内存量 (Kbytes)。由结果图可以看出父进程和第二个子进程均开辟了4508Kbytes大小的空间,由于第一个子进程处于僵死状态,第一个子进程并未占空间,即每次使用fork()创建一个进程时,都会开辟一个大小相同的虚拟内存空间;

⑥RSS:表示的是该进程占用的固定的内存量 (Kbytes)。从结果图中可以看出父进程所占用的固定内存量比子进程的大很多,子进程所占有的固定内存量是一致的;

⑦TTY:同“ps -ef”中的“TTY”;

⑧STAT:表示的是该程序目前的状态。由结果图中可以得出,父进程和第二个子进程正处于睡眠状态中,而第一个子进程处于终止状态,但父进程未将该子进程进行回收;

⑨START:表示的是该进程被触发启动的时间;

⑩TIME:表示的是该进程实际使用 CPU 运作的时间;COMMAND:同“ps -ef”中的“CMD”

4.问题

(1)创建的子进程中,第一个子进程的状态处于僵死状态,还未找到错误处;

5.相关链接

TTY值的取值含义解释:https://blog.csdn.net/u013115811/article/details/78849165

原文地址:https://www.cnblogs.com/jmuaia-wll/p/12636620.html

时间: 2024-11-14 06:25:46

操作系统第二次实验:创建进程的相关文章

操作系统第2次实验报告:创建进程

个人信息 姓名:郑楚杭 学号:201821121009 班级:计算1811 一.实验目的 熟练Linux创建进程fork操作. 二.实验内容 在服务器上用VIM编写一个程序:一个进程创建两个子进程. 查看进程树 查看进程相关信息 三.实验报告 1. 编写程序 2. 打印进程树 编译1的程序并运行: 打印进程树: 3. 解读进程相关信息 (1) ps -ef UID PID PPID C STIME TTY TIME CMD zhengch+ 31795 31794 0 23:29 pts/4 0

操作系统ucore lab5实验报告

操作系统lab5实验报告 到实验四为止,ucore还一直在核心态"打转",没有到用户态执行.创建用户进程,让用户进程在用户态执行,且在需要ucore支持时,可通过系统调用来让ucore提供服务.而本实验将进程的执行空间扩展到了用户态空间,出现了创建子进程执行应用程序等.即实验五主要是分析用户进程的整个生命周期来阐述用户进程管理的设计与实现. 练习0 填写已有实验 这里和前几个实验一样,照样运用meld软件进行对比,大致的截图如下: 这里简单将我们需要修改的地方罗列如下: proc.c

实验三 进程模拟调度程序

1.    目的和要求 1.1.           实验目的 用高级语言完成一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 1.2.           实验要求 1.2.1例题:设计一个有 N个进程并发执行的进程调度模拟程序. 进程调度算法:采用最高优先级优先的调度算法(即把处理机分配给优先级最高的进程)和先来先服务(若优先级相同)算法. (1).  每个进程有一个进程控制块(PCB)表示.进程控制块包含如下信息:进程名.优先级.到达时间.需要运行时间.已用CPU时间.进程状态等

Java 多线程详解(二)------如何创建进程和线程

Java 多线程详解(一)------概念的引入:http://www.cnblogs.com/ysocean/p/6882988.html 在上一篇博客中,我们已经介绍了并发和并行的区别,以及进程和线程的理解,那么在Java 中如何创建进程和线程呢? 1.在 Windows 操作系统中创建进程 在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程.更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例): 第一步:windows+R,

实验八 进程的切换和系统的一般执行过程

实验八 进程的切换和系统的一般执行过程 20135114王朝宪 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关键代码switch_to分析 1.1 进程调度与进程调度的时机分析 操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已. 对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制

二、创建进程和线程

1.在 Windows 操作系统中创建进程 在 windows 操作系统中,我们创建一个进程通常就是打开某个应用软件,这便在电脑中创建了一个进程.更原始一点的,我们在命令提示符中来做(我们以打开记事本这个进程为例): 第一步:windows+R,输入cmd,打开 cmd 命令提示符 第二步:在命令提示符中输入 notepad,按 Enter 键便会弹出记事本应用软件 PS:常用的windows 应用软件命令 1.regedit:打开注册表编辑器 2.control:打开控制面板 3.msconf

Java中如何创建进程(转)

在Java中,可以通过两种方式来创建进程,总共涉及到5个主要的类. 第一种方式是通过Runtime.exec()方法来创建一个进程,第二种方法是通过ProcessBuilder的start方法来创建进程.下面就来讲一讲这2种方式的区别和联系. 首先要讲的是Process类,Process类是一个抽象类,在它里面主要有几个抽象的方法,这个可以通过查看Process类的源代码得知: 位于java.lang.Process路径下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Delphi 使用CreateProcess创建进程并弹出进程PID值

var  ExeName:PChar;  StartupInfo:TStartupInfo;  ProcessInfo:TProcessInformation;begin  FillChar(ProcessInfo,sizeof(TProcessInformation),0);  FillChar(StartupInfo,Sizeof(TStartupInfo),0);  StartupInfo.cb:=Sizeof(TStartupInfo);  StartupInfo.dwFlags:=ST

《现代操作系统》2.1、进程

进程:一个正在执行程序的实例(程序计数器.寄存器.变量当前值) 2.1.1.进程模型 一台多道程序计算机的内存中有4道程序 4道程序被抽象为4个各自拥有自己的控制流程 实际上只有一个物理计数器,所以每个程序运行时,它的逻辑程序计数器被装入实际的程序计数器中 在观察足够长的一段时间后,所有程序都运行了,但是在任意给定的瞬间仅有一个进程真正在运行 (一个CPU只能真正一次运行一个进程) 2.1.2.创建进程 4种主要事件导致进程的创建 1)系统初始化 2)执行了正在运行的进程所调用的进程创建系统调用