Linux 进程讲解 一

41 篇文章 1 订阅
35 篇文章 5 订阅

  最近刚刚接触了进程的概念,之前看了很多文章来讲解什么是进程什么是线程,简单的来说进程就是现在正在执行的一个程序,

我们在windows下打开任务管理器里边就有进程这一项,简单来看我们运行着哪些程序进程里边就有哪些,但是又不止这些还有很多我们看不懂不知道的后台机进程。复杂点来说就是百度对进程的解释,进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。专业来说进程就是PCB,那PCB到底是什么我们之后也会做详细的介绍,更具体的来说我们主要学习的Linux下进程是task_struct。

  这里我用一个我看过的一个故事来给大家具体的讲一下到底什么是进程,这里我们需要两个程序分别是小红和小蓝,在最早的时候我们的cpu是很菜的,他不能同时处理多个程序,因为他只有一个内核,所以我们总是在执行完一个程序之后再去执行另一个程序,但是后来人们发现,虽然这个cpu很菜,并且随着cpu 的不断发展cpu的速度越来越快了,他比硬盘和内存的读取速度要快的多,所以就出现了我读数据两小时,处理数据五分钟的情况,在读取数据的时候cpu闲的不行,他就想给自己找点活干,这时候有人就帮他找到了工作,我们在处理完小蓝这段数据再去读取数据的时候我们为什么不让我们的cpu去解决一下小红的问题,当小蓝读取完我再把cpu让给你。但是这就出现了一个问题,你小蓝用我的cpu当我读取好的时候,cpu怎么知道我刚刚执行到哪了,我下边该执行哪了,我该怎么去执行。这时候就需要我们人为的来告诉cpu再次接过小红程序的时候他应该去怎么做,那我们怎么告诉他?大家就想到了一个办法, 我们把这些数据全都存起来,无论是你执行到那一句了,还是函数调用到哪了,还是说需要什么参数了,我全都给你保存下来,当你从硬盘里边读取完之后我们就通过存的这些数据来继续执行你的程序。那用来保存你这些数据的结构体和你本身的代码就是正在执行的一个程序,那就是我们的进程。如果这么说我们的程序岂不是运行一会停一会运行一会停一会,那为什么我在用电脑的时候并没有这种情况呢?实际上是有的,只不过cpu的处理速度和切换程序的速度实在是太快了,我们肉眼根本感觉不出来这种变化,在我们看来他们就是同时执行的。这就是我们通常说的并发,但是这两个程序并不是并行,因为他们本质上并不是同时进行的,但是这些年来,程序已经实现了并行,因为我们的cpu已经出现了多核心,想Intel现在都是四核心了,我们手机上的高通甚至都是八核心了。

  那我们的这个执行现场到底保存到了哪呢?保存这个执行现场有个通用的名字叫做PCB(process control block)也就是我们的程序控制块,这是对保存执行现场数据结构的一个统称,因为我们这里针对的是Linux,Linux下我们的PCB他有个具体的名称叫task_struct

那这个task_struct里边到底保存了些什么,我们是可以在Linux下通过指令来看的。

 

在ls /proc指令下可以看到我们当前系统的一些进程,这里的数字是我们进程中的标识符。我们还可以通过指令来看PCB中的到底有些什么

我们使用ps aux指令,一旦说起来就要补充很多内容,ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。因为ps指令的选项有很多,我们这里aux是一个组合指令我们简单说一下这三个选项都有什么用处?

a:显示现行终端下的所有程序包括其他用户的程序。

u:以用户为主的格式来显示程序的状况。

x:显示所有程序,不以终端机来区分

之后我们会专门介绍ps的一些指令,ps的选项很多我们之后会更详细的介绍。

 

图里可以到我们各个进程的详细情况,我们可以通过grep指令加上管道符来获取第一行的数据来查看ps指令到底给我们显示出来了哪些信息。

我们可以在这里看到进程的一些信息,PID就是我们的进程标识符,%CPU、%MEM是这个进程占的CPU和内存。

但是指令查看的并不是很全面,这里我们介绍一下task_struct里边到底有些什么,首先是标识符,这就好像我们在学校里边都有一个唯一的学号一样,这算是进程的一个学号,唯一的标识符用来区别和其他进程的一个区别。第二个是进程的状态,进程是有很多种状态的就和我们在学校中一样,我们是正在学习还是在睡觉还是说什么都没干,或者是已经休学了。通过状态标志来获取我们当前进程的状态。第三个是进程的优先级,这个更容易理解,虽然我们都是每个程序来执行一会,但是我们也是要区分优先级的谁先来执行谁后来因为有些程序是需要我们立马来做出反应的,就比如我现在在码字,并且我后台在下载一个程序,在我码字的一瞬间我是想让程序立马对我做出反应的,即使很短也不希望存在延迟。这时候我们码字这个进程就希望要比后台下载的优先级高一些。程序计数器更不用说了即使来存储我们当前中断的时候程序应该要执行的下一条指令,这样我们再回来的时候就可以继续执行了。内存指针、I\O状态都不需要有过多的理解明白简单的意思就可以了。上下文数据我们简单的说一下,他和程序计数器可以理解成类似的功能,不过程序计数器来计的是下一条指令,而这里记得是我们的数据,就好比休学,我们在大二那一年出去义务兵做了两年,我们再回来的时候我们的学籍还是要存在的并且是继续从大二那年之后开始继续上课。

并且我们是可以通过代码来查看我们的进程id的。

1 #include<stdio.h>

  2 #include<unistd.h>

  3

  4 int main()

  5 {

  6    pid_t pid= getpid();

  7    printf("id=%d\n",pid);

  8    while(1)

  9    {

 10        sleep(1);                                                                                                                 

 11    }

 12

 13     return 0;

 14 }

 15

Getpid()就是获得我们当前进程id的函数使用这个函数是需要包含我们的unistd.h头文件的。我们在执行程序后边写了一个while循环不断的让程序在睡眠,这里我们是为了不让程序退出,如果程序执行结束并且退出的话我们就没办法查看他的进程。

我们在程序运行后能看到输出的一个id,因为这个终端下程序是在执行的状态下,不能输入命令了,所以我们需要再打开一个终端。

我们查看我们的进程并且通过管道符筛选出进程id是2541的进程。

之后我们在之前的终端ctrl+c结束我们的进程,然后再去第二个终端查看。

这时候我们2541的进程就不存在了,但是为什么还会有个进程出来,这个进程是你执行查找这个命令的进程。

什么是进程我们就简单的介绍到这里,我们对进程的了解不能是简单的执行程序或者是PCB,我们要更深入的了解PCB也就是Linux下的task_struct具体是什么。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值