初识Linux下进程1

简介: 初识Linux下进程1

🌎初识进程




前言

  我们在电脑上点开的一个个应用,其实就是一个个进程,进程仅仅如此吗?今天我们就来认识一下进程,那么话不多说,开启我们今天的话题!


🚀简单认识一下进程

  打开任务管理器,管理器上显示的所有应用都是进程,例如:

  这些打开的应用程序,都是进程,这也说明了操作系统可以同时运行多个进程,我们上次学习了操作系统的管理工作,那么os是如何对加载到内存的程序做管理的呢?

  还是那六个字: 先描述再组织

  那么在我们Linux系统下,是如何描述进程的?众所周知,Linux大部分是用C语言写的,而描述进程就会用到struct结构体:

struct XXX{
  //状态
  //优先级
  //内存指针字段
  //标识符
  //..包含进程几乎所有的属性字段
  
  struct XXX *next; 
};

  先描述,就是将进程的属性信息放在结构体当中。


🚀如何管理进程

  可执行程序被加载到内存的时候,仅仅是 将可执行程序的代码和数据加载进来 了,但是os并不认识你:

  这就好比,你跟你的好朋友小明是室友,今天你们去蹭陌生人的席,但是不巧的是被主人发现了,主人一脸奇怪的看着你俩。这个时候,因为主人没有对应的信息,所以主人并不认识你。

  但是你急中生智,你告诉主人家:我们是你七大姑的八大姨家的孩子,他是我弟弟。然后你就拿出了500块钱,说:刚才忘记上账了。这个时候主人家也不管你是不是亲戚了:“来了就是客人,钱我就收着了,你去登记吧~,一人250。”

  对于操作系统也是如此,既然你已经加载进来了,os为了 更好的管理这些程序,就需要把你的信息交给操作系统。

  所以就需要将可执行程序的结构体变量实例化,也就是创建 结构体对象 !所以 每一个 可执行程序都有对应的描述其结构体的对象。

  进程全称为:Process Control Block进程控制块),简称:PCB

struct PCB{
  //状态
  //优先级
  //内存指针字段
  //标识符
  //..包含进程几乎所有的属性字段
  
  struct PCB *next; //链式结构,指向下一个PCB对象
};

  我们已经描述完了一个结构体对象,那么如何组织呢?其实在进程结构体对象当中,有着一个 next 指针,用来指向下一个PCB对象形成链式结构,这样,所有的进程就都可以关联起来了。

  那么这个PCB对象就是进程吗?也不是,进程是:进程 = 内核数据结构 + 可执行程序。这里的 内核数据结构 暂时 可以理解为 进程的PCB对象


🚀进程属性信息

  PCB是进程比较官方的叫法,在Linux下我们的进程实际上叫做:task_struct。其中 task_struct 是 PCB 的一种

  • 标识符:描述本进程的唯一标识符,用来区别其它进程。
  • 状态:任务状态,退出码,退出信号等…
  • 优先级:相对于其他进程的优先级。
  • 程序计数器:程序中即将被执行的下一条指令的地址。
  • 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块指针。
  • 上下文数据:进程执行时处理器的寄存器中的数据。
  • I/O状态信息:包括显示的IO请求,分配给进程的IO设备和被进程使用的文件列表。
  • 记账信息:可能包括处理器时间总和,使用时钟数量总和,时间限制,记账号等。
  • 其他信息

  这里需要提及的一点就是 程序计数器,我们CPU是如何知道我们当前行代码的下一行代码在哪个位置呢?比如 当我们正在执行一个从1累加到100的程序

  很多人会误以为CPU很快,所以很聪明,其实 CPU非常 “笨”, 因为CPU的工作内容就是:取指令 ——> 分析指令 ——> 执行指令,执行完成后,一直循环这几个步骤

  就像一个百米运动员,跑的很快,但是给他拿一套高数卷子,可能就让他头大了。

  那么我们CPU是如何执行指令的呢?其实在CPU内部有一个名为 eip/pc 寄存器,这个寄存器被称为 pc指针(point code),这个pc指针会指向 当前正在执行指令的下一条指令的地址!

  那么也就是说,pc指针指向哪个代码块,哪个进程就会被执行

  进程里的这些其他属性我们往后会慢慢地接触,目前了解即可,我们可以先看一下在Linux源码当中,task_struct到底是什么样的:

  展示的仅仅是task_struct 的 一小段代码,而完整的task_struct 大约有几百行代码,篇幅有限,这里就不多展示了,有兴趣可以自己查阅Linux源码。

  这里我想要说明的是,进程中的属性是非常多的,当然这些属性有着自己的用途,以后我们就会慢慢接触。


🚀内核运行队列

  我们已经初步了解了进程,可是,当CPU想要去运行进程,该如何去运行这么多进程呢?其实在CPU内部,会给这些进程排个队,依次来执行这些进程,也就是所谓的 运行队列

  内核的运行队列也是通过 先描述再组织 的方式来实现的,先描述,将需要的进程数据与信息放在运行队列的结构体当中,再组织,创建结构体对象,对进程信息进行排队管理。

struct runqueue//内核运行队列
{
  int count;//进程计数
  PCB *head;//指向进程的头指针,以便于能够执行
  //...其他属性信息
}

  所以教材上所谓的 CPU让进程排队,就是让进程的PCB排队,而不是让进程的可执行程序去排队!


🚀查看进程

  我们知道了进程的概念,那么我们想看看进程到底长什么样子,如何操作呢?我们可以使用:

ls /etc #在etc目录下查看进程

  使用 ls 命令在 etc 目录下查看进程即可,当然也可以使用 ps 命令:

ps#查看当前正在运行的进程有哪些

  可以看到当前运行的进程就是 bashps 命令,我们也可以查看更多进程,使用ps命令时,带上 ajx 或者 aux 选项:

ps ajx#或者ps aux都可

  当然还有其他的查看进程的方法,这里就不再赘述了,有兴趣可以自己查资料。


🚀通过系统调用获取进程标识符

✈️父子进程

  在开始上手实操之前,我们需要了解一下什么是父子进程:

  在我们用ps命令查看系统的进程的时候,上面的属性信息就写着一个进程的父子进程的id:

  其中的 PID就是该进程自己的idPPID指的是该进程的父进程id,这也就是该进程的进程标识符,每个进程都有自己的 唯一标识符

✈️查看运行中的进程

  首先我们要先创建一个C的源文件,编译生成可执行程序:

再配置makefile文件:

再形成可执行程序:

我们运行程序,当程序在执行的时候,这个可执行程序就变为了一个 进程

  我们可以使用如下指令 显示出进程的状态

ps ajx | head -1 && ps ajx | grep 可执行程序 #使用命令行管道,将前面得到的信息向后传递

  我们可以看到,当程序在运行时,我们可以看到,./mybin 出现在了进程状态栏里面,此时我们进程的 pid为13133ppid为12693。当进程结束时,这个进程也就消失了。

  不对啊,我不记得我们在写程序的时候有写父进程啊?这个父进程id是怎么来的?我们不妨对该父进程 ppid 进行 ps 一下:

ps 进程id#显示id进程的信息

  其实 这个程序的 默认父进程是bash,这是因为:

  bash是大多数 Linux 系统的登录 shell。当您登录到系统时,bash shell 会启动并等待输入命令。输入命令时,bash shell 会将其解析为一个可执行文件和一组参数,然后在bash上执行该可执行程序

  注意./mybin下面的那个进程是grep的进程,因为在运行的时候,grep命令也变成了一个可执行程序,也是一个进程


📒✏️ 总结

  •  电脑上启动的一个个程序就是进程,更详细点:进程=内核数据结构+可执行程序
  •  我们大部分人的电脑CPU只有一个,所以操作系统需要将很多进程进行管理,用到了运行队列
  •  一个原始进程的父进程是bash

  如果这篇文章对你有帮助的话,还望三连支持呀~~

相关文章
|
8月前
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
10月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
321 32
|
6月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
259 67
|
5月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
150 16
|
5月前
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
114 20
|
4月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
102 0
|
4月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
127 0
|
4月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
91 0
|
4月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
90 0
|
8月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
331 34

热门文章

最新文章