OS第2次实验报告:创建进程

  • 姓名:巫艳珍
  • 学号:201821121034
  • 班级:计算1812

1. 编写程序

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

 #include<sys/types.h>
 #include<stdio.h>
 #include<unistd.h>
 int main()
 {
      pid_t fpid;
      for(int i=0;i<2;i++){
           fpid=fork();
           if(fpid<0||fpid==0){
              break;
          }
      }
      sleep(40);
      if(fpid<0)
          printf("error in fork!");
      else if(fpid==0){
          printf("Child process,my process id is %d\n",getpid());
      }
      else{
          printf("Parent process,my process id is %d\n",getpid());
       }
      return 0;
 }

使用gcc Hello.c -o Hello进行编译,并用命令./Hello让其在后台运行:

 运行结果:

 

2. 打印进程树

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

  • 在程序中使用sleep(40)来挂起进程,以便打印进程树
  • 打印进程树命令:pstree -p 27609

3. 解读进程相关信息

(1) ps -ef:

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

wuyanzhen@jmu-cs-ubuntu:~$ ps -ef|grep "Hello"
UID         PID    PPID     C   STIME    TTY       TIME           CMD
wuyanzh+   30559   26522    0   23:21    pts/5    00:00:00       ./Hello
wuyanzh+   30560   30559    0   23:21    pts/5    00:00:00       ./Hello
wuyanzh+ 30561 30559 0 23:21 pts/5 00:00:00 ./Hello
  •  每个字段的含义:

    UID:表示该进程的使用者id,当前进程使用者为:wuyanzhen

    PID:表示进程的ID,给出的例子中,ID分别为:30559,30560,30561

    PPID:表示该进程的父进程,在给出的例子中,进程30559的父进程为26522,进程30560和30561的父进程ID均为30559

    C:表示进程占用CPU的百分比,例子取值为0说明该进程未占用CPU

    STIME:表示程序的启动时间,给出的例子程序启动时间为23:21

    TTY:表示该进程的登录终端,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。 pts/5表示第五个虚拟终端

    TIME:表示该程序的执行时间

    CMD:表示命令的名称和参数,用./Hello执行Hello文件

  • 小结:
  1. PID和PPID分别代表子进程和父进程,并能够相互匹配
  2. 将打印出的进程信息与进程树对应起来,程序成功实现了由一个进程创建两个子进程

(2) ps -aux

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

  • 每个字段的含义:

    USER:指用户名,即当前进程的拥有者

    PID:表示进程ID,给出的例子中有三个进程,分别为30559,30560,30561

    %CPU:指该进程占用CPU的百分比

    %MEM:表示该进程占用内存的百分比,给出的例子为0,表示三个进程均未占用内存

    VSZ:表示该进程使用的虚拟內存量(KB),由上图可知,三个进程使用的虚拟内存量都是4376KB

    RSS:表示该进程占用的固定內存量(KB),进程30559占用固定内存为752KB,进程30560和30561占用固定内存都为72KB

    TTY:表示该进程的登录终端,若与终端无关,则显示? 若为pts/0等,则表示由网络连接主机进程。 pts/5表示第五个虚拟终端(同(1))

    STAT:表示进程的状态,常见的有:

      D(TASK_UNINTERRUPTIBLE):表示不可中断的睡眠状态(通常IO的进程),指的是进程不响应异步信号

      S (TASK_INTERRUPTIBLE):表示可中断的睡眠状态,即上图三个进程的状态,由于等待某事件的发生而被挂起

      R (TASK_RUNNING):表示可执行状态,只有在该状态的进程才可能在CPU上运行

      T (TASK_STOPPED or TASK_TRACED):表示暂停或跟踪状态

      Z (TASK_DEAD – EXIT_ZOMBIE):表示退出状态,进程占有的所有资源将被回收,该进程成为僵尸进程

      X (TASK_DEAD – EXIT_DEAD):表示退出状态,该进程被彻底释放,即将被销毁

    START:表示该进程被触发启动的时间,上图表示启动时间为23:21

    TIME:表示该进程实际使用CPU运行的时间,给出的例子中,时间为0

     COMMAND:表示命令的名称和参数,用./Hello执行Hello文件

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

Q1:打开两个终端,在一个终端执行完程序后,在另一个终端通过得到的进程ID却无法打印出进程树

解答:将程序放入后台运行,用得出的父进程ID打印出进程树

Q2:为何执行上述程序时,执行的时间是0 

解答:因为运行时速度较快,还不够1ms,所以是时间为0 

posted @ 2020-04-03 13:13  王尔  阅读(283)  评论(0编辑  收藏  举报