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

 

  • 姓名  邹文兵 
  • 学号  201821121028
  • 班级  计算1811

1. 编写程序

在服务器上用VIM编辑器编写一个程序:一个进程创建(fork)两个子进程。给出源代码:

 #include <stdio.h>
 #include <sys/types.h>
 #include<unistd.h>
 int main(){
     pid_t pid1=fork(),pid2;
     if(pid1==0)
         printf("子进程1的ID号为:%d\n",getpid());
     else if(pid1<0)
         printf("创建子进程1出错!\n");
     else {
         printf("父进程1的ID号为:%d\n",getpid());
         pid2=fork();
         if(pid2==0)
             printf("子进程2的ID号为:%d\n",getpid());
         else if(pid2<0)
             printf("创建子进程2出错!\n");
         else
             printf("父进程2的ID号为:%d\n",getpid());
     }
     sleep(2000);
     return 0;
 }

源代码运行结果截图:

2. 打印进程树

打印1所创建的进程树结构,给出带有自己名字的截图。

提示:

  • 使用unsigned sleep(unsigned seconds)挂起进程,以便打印进程树
  • 打印进程树命令pstree -p pid

3. 解读进程相关信息

(1) ps -ef 

zouwenbing@jmu-cs-ubuntu:~$ ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
zouwenb+  7721  7011  0 14:33 pts/2    00:00:00 ./two_child
zouwenb+  7722  7721  0 14:33 pts/2    00:00:00 ./two_child
zouwenb+  7723  7721  0 14:33 pts/2    00:00:00 ./two_child

使用ps -ef给出所创建进程的信息,并分析每个字段的含义:

UID : 用户的ID号为:zouwenbing

PID : 该进程的ID号:如上程序由一个进程号为7721,创建了两个子进程号分别为:7722,7723

PPID :父进程的ID号: 如上程序两个子进程的父进程ID号(PPID)都为7721,可知是由同一个父进程所创建。

C :CPU占用的百分比,该进程CPU占比为0%

STIME :进程开始的时间 :该进程开始时间为14:33


TTY :控制tty的终端设备号  :pts/2

TIME :使用掉的CPU时间,该进程未占CPU,故使用掉的时间为00:00:00

CMD :可执行文件的简单名称,two_child

 

(2) ps -aux

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
zouwenb+ 19453  0.0  0.2  20580  3848 pts/1    S+   15:49   0:00 man ps all
zouwenb+ 19463  0.0  0.1   9192  2500 pts/1    S+   15:49   0:00 pager
zouwenb+ 20802  0.0  0.1  39008  3616 pts/3    R+   15:55   0:00 ps -aux

USER:用户的名字

PID:进程的ID号:19453(以下都以第一条作为参考)

%CPU:进程的cpu利用率,它是CPU使用时间除以进程运行的时间:0%

%MEM:进程的常驻集大小与机器上的物理内存,表示为百分比:0.2%

VSZ:  该进程使用的虚拟內存量(KB) 

RSS :该进程占用的固定內存量(KB)(驻留中页的数量) 

STAT :进程的状态 :S+ 处于休眠状态

其中STAT状态位常见的状态字符有:

D      无法中断的休眠状态(通常 IO 的进程); 

R      正在运行可中在队列中可过行的; 

S      处于休眠状态;

T      停止或被追踪; 

W      进入内存交换 (从内核2.6开始无效); 

X      死掉的进程 (基本很少见); 

Z      僵尸进程; 

<      优先级高的进程 

N        优先级较低的进程 

L         有些页被锁进内存; 

s         进程的领导者(在它之下有子进程); 

l         多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads); 

+        位于后台的进程组;

START: 该进程被触发启动时间该进程实际使用CPU运行的时间

COMMAND:指令的具体内容:man ps all

 

使用ps -aux给出所创建进程的信息,并分析每个字段的含义。

4. 通过该实验产生新的疑问及解答

通过该实验如果有产生新的疑问,可以写出来,并尝试自己解决问题。

产生的问题:在编写程序产生两个子程序的过程中总是会产生多个子程序,

解决方法:深刻的了解fork()函数产生子程序的过程,它在产生子程序时该子程序是接着在fork()函数后的所有代码都在次执行一遍,但是此时的返回值为:0,而在父程序时的返回值为:子程序的程序号。根据这些性质写出相应的代码实现。

posted @ 2020-04-04 16:27  zouwenbin  阅读(301)  评论(0编辑  收藏  举报