• Linux基础教程:8、linux的进程管理(1)


    通window系统一样,linux也拥有这一个强大的和window的任务管理器一样的进程管理程序,我们只需要将doc窗口打开然后输入ps -u,就可以看到当前正在运行的进程:

    ps -u

     不管加不加-,反正u配合起来的意思就是静态的打印当前运行的进程,为什么是静态有什么是静态,因为它不会动,我们也是可以用肉眼看出来的,这个就是一串不会动的数字,然而我们可以很容易的从这个数据中发现他们是一个表格,表头上是各种各样的进程的参数;

    那么,什么是进程呢?我们都知道如果我们想要玩一款游戏或者是使用一些程序的话要从网络上将他们下下来然后在计算机上再执行,这个存在我们计算机硬盘上的东西我们就叫做程序,当我们将他们启动跑起来的时候他们需要开启一个进程,而进程是在内存中的;

    1、我们可以输入top来动态的查看进程

    top

     

    这里top的话是直接打印了所有的进程信息,而且还是在不断变化的,可以看到很多的列,有进程号(也就是PID,相当于文件的描述符),还有user(用户,一般用来筛选),cup的使用,时间和名称等的信息,我们通过看数据也是很容易分析出来的,我们要注意一个地方就是S(进程的状态):

    D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

    这里可以看到狠毒都是s和T, 一般做服务器维护的话就要注意清理这个僵尸进程;

    在我们输入top命令的时候其实还有很多可选项:

    top M(按照内存排序)/P(CPU使用排序)/T(时间排序)/K(可以根据pid杀死线程)

    意思就是要我们输入要杀死的线程的pid;不过除了这种杀死线程的方式,我们还可以使用kill指令来杀死线程;

    kill -9 线程PID

    这里我就不做演示了;先要退出的话直接ctrl+c,记住线程号,然后输入上面的指令就可以杀死对应的线程;

    2、进程控制

    进程一共有四个状态:就绪态、运行态、睡眠态、终止态;这里的就绪态就是程序的资源分配到位之后等待CPU执行的状态,运行态就是cup在执行的状态,睡眠态又有阻塞态和挂起,就是一种进程因为一些原因导致无法执行的情况就阻塞,只是暂时退出但是还没有终止的进程能够随时被唤醒的状态就是挂起;

    在linux,我们可以看到任务切换好像都是无缝的,但是从微观上来说,切换进程其实都是需要事件的,只是事件比较少,也就是说linux中的进程其实是并发的,而不是并行的;只是每个进程之间不断地切换运行我们感觉不出来而已;

    3、fork函数

    这个函数可以创建出一个新线程,而且这个线程的内容是和父进程一样的,我们来了解一下什么事子进程,什么父进程,在window端,如果我们用微信打开一个小程序,是不是小程序依赖着微信这个环境,我们就可以称他们为父子线程;

    1. #include<stdio.h>
    2. #include<stdlib.h>
    3. #include<unistd.h>
    4. int main()
    5. {
    6.        pid_t pid;
    7.        pid=fork();
    8.        if(pid==-1)
    9.       {
    10.                perror("fork error");
    11.                exit(1);
    12.       }
    13.        else if(pid>0)
    14.       {
    15.                printf("parent process , pid=%d,ppid=%d\n",getpid(),getppid());
    16.       }
    17.        else if(pid==0)
    18.       {
    19.                
    20.                printf("parent process , pid=%d,ppid=%d\n",getpid(),getppid());
    21.       }
    22.        printf("finish!\n");
    23.        return 0;
    24. }

     

    其实这里就是父子线程打印的几句话了,这里的第二句话的ppid(也就是父进程id)就是第一句话的pin(本线程Id),所以第一个线程就是父进程,第二个就是子进程,我们可以通过getpid、getppid来分别获取到本线程id和父线程id,不过我们通过ps现在是看不到的,因为程序执行完之后就进入了终止态;

    这里的pid_t应该是头文件里面的宏定义,相当于int;当我们执行fork这个函数之后,就会创建一个和本线程一模一样的子线程,而且是直接执行的,所以我们要注意这个函数的使用,fork也是有返回值,这个反回值可以使0、1 、-1,分别表示的子线程、父线程、创建线程失败;如果还有不懂的话,可以使用man指令;

  • 相关阅读:
    自动化项目实战:用requests库自动保存王者荣耀英雄皮肤到本地,文末附源码下载!
    统计学习方法第二章习题
    解决Mapper接口错误: 使用MyBatis Plus时未正确继承BaseMapper接口或添加@Mapper注解导致无法使用相关方法的探索与编程实践
    你确定不了解下 Java 中反射黑魔法吗?
    自动驾驶——构建仿真系统
    Mybatis的一对一和一对多的标签介绍
    基于Java毕业设计在线选课系统设计源码+系统+mysql+lw文档+部署软件
    AAAI2018-Spatial As Deep: Spatial CNN for Traffic Scene Understanding
    机器学习——Machine Learning
    Gson转换错误导致Int变为Double类型
  • 原文地址:https://blog.csdn.net/aiwanchengxu/article/details/127807092