zoukankan      html  css  js  c++  java
  • 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
    ",getpid());
          }
          else{
              printf("Parent process,my process id is %d
    ",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 

  • 相关阅读:
    LeetCode
    LeetCode
    控制反转(Ioc)
    KMP算法
    *&m与m的区别
    函数指针与函数指针数组的使用方法
    C++四种类型转换
    内存分配:堆内存,栈内存
    汇编 基础
    i++,++i 作为参数
  • 原文地址:https://www.cnblogs.com/will-h/p/12623894.html
Copyright © 2011-2022 走看看