【Linux系统编程】进程概念与基本创建 文章目录1. 进程的概念2. 进程描述—PCB3. task_struct—PCB的一种4. task_ struct的内容5. 查看进程这篇文章我们来学习下一个概念——进程1. 进程的概念那什么是进程呢我们该如何理解它呢如果我们打开电脑的任务管理我们看到这里面就展示了当前正在运行的进程那大家看这其实就是我们当前打开的程序嘛所以我们给出一个结论我们以前任何启动并运行程序的行为都是由操作系统帮助我们将程序转化为进程来完成特定的任务。那说到底进程到底是什么呢我们继续来探讨探讨大家看这张图那我们平时自己写好的可执行程序我们知道它本质其实就是一个二进制文件嘛那我们运行这个可执行程序首先它被载入内存其实就是把可执行程序里面的指令和数据加载到内存。那此时它就变成一个进程了吗大家想一个问题一个社会人进入到你的学校他就是你们学校的一名学生了吗不是的。那同样的一个可执行程序或应用程序被加载到内存里面他就变成了被操作系统管理的进程了吗好像也有点不合理。那一个人如何才算你们学校的学生呢是不是它的学籍要在你们学校里它的信息要在你们学校的教务管理系统上这才是最关键的。然后第二个问题我们可能同时运行多个程序那他们都要加载到内存里就好比学校里面有好多学生那学校肯定要对这么多学生进行一个良好的管理。那同样的操作系统也要对加载到内存的多个进程进行管理。那如何进行管理呢很简单还是我们之前说的——先描述再组织2. 进程描述—PCB那如何描述进程呢进程信息被放在一个叫做进程控制块PCB的数据结构中可以理解为进程属性的集合。PCB是进程存在的唯一标识。课本上称之为PCBprocess control blockLinux操作系统下的PCB是: task_struct所以我们每运行一个程序除了要把它对应的指令和数据加载到内存操作系统还会为它创建一个PCB来记录和管理进程信息那操作系统要管理这么多的进程就可以把所有进程的PCB用一个数据结构比如链表管理起来再组织那此后操作系统对于进程的管理就变成了对组织PCB的数据结构的管理所以回到我们上面说的一个程序被加载到内存他就是进程了吗不是的进程包括了程序加载到内存中的指令和数据以及内核中与之关联的进程控制块PCB所以我们这里给出一个进程的概念进程程序加载到内存中的指令和数据内核中与之关联的进程控制块PCB此外课本概念程序的一个执行实例正在执行的程序等内核观点担当分配系统资源CPU时间内存的实体。3. task_struct—PCB的一种在Linux中描述进程的结构体叫做task_structtask_struct是Linux内核的一种数据结构它会被装载到RAM(内存)里并且包含着进程的信息4. task_ struct的内容task_ struct里面包含了以下内容标示符: 描述本进程的唯一标示符用来区别其他进程。状态: 进程任务状态退出代码退出信号等。优先级: 相对于其他进程的优先级。程序计数器: 程序中即将被执行的下一条指令的地址。内存指针: 包括程序代码和进程相关数据的指针还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据I/O状态信息: 包括I/O请求分配给进程的I/O设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和使用的时钟数总和时间限制记账号等。其他信息可以在内核源代码里找到它所有运行在系统里的进程都以task_struct双向链表的形式存在内核里。然后呢我们上面提到可执行程序其实就是一个文件嘛而文件的话我们说过文件内容属性那程序运行载入到内存里面的指令和数据这毫无疑问肯定是文件的内容。然后呢我们有提到每个进程操作系统都会创建一个PCB来描述进程可以理解为PCB就是进程的属性集合。那请问这里的PCB即进程属性的集合跟可执行文件的属性有没有关系呢其实呢有关系但是关系不大。磁盘上文件的属性一般就是文件名、文件类型位置占用空间这些东西。而PCB呢它是由操作系统动态创建和维护的一种内核数据结构它里面包含的进程的属性都是操作系统自己获取和记录的跟文件的属性不是一回事没什么关系。其实也稍微有点关系后面会带大家看。5. 查看进程那如何查看进程呢psaux /psaxj选项解释a显示⼀个终端所有的进程包括其他用户的进程。x显示没有控制终端的进程例如后台运⾏的守护进程。j显示进程归属的进程组ID、会话ID、父进程ID以及与作业控制相关的信息u以用户为中心的格式显示进程信息提供进程的详细信息如用户、CPU和内存使用情况等首先我们先来写一个代码和makefile编辑一下myprocess.c保存退出然后我们把makefile写一下然后我们make一下就生成了一个可执行程序myprocess那我们./执行这个可执行程序操作系统就会把它加载到内存同时为他建立PCB在Linux上是task_struct,然后它就变成了进程那我们如何查看这个进程呢让这个进程继续跑着我们再打开一个渠道然后我们输入一条命令就可以看到我们刚才运行起来的进程简单解释一下这条命令ps axj | head -1 ps axj | grep myprocess这是是逻辑与连接了两条命令首先ps axj可以显示当前系统中所有进程的详细信息但是我们不想看所有的所以管道连接head -1就是去只显示ps axj展示出来的所有信息的第一行即那个表头信息然后后面又连接一条指令其实就是过滤取出关键字myprocess对应的进程信息然后下面那个大家可以不用管它是因为grep这个也是一个进程也被过滤出来了当然可以把它屏蔽掉就只剩我们的这一个了那然后我们再打开一个渠道也把这个程序运行起来然后我们就可以观察到两个了然后我们来观察一下显示的信息我们看到有个PID就是我们上面提到的进程的唯一标识符。它们两个是不一样的所以它们两个是不同的两个进程虽然是同一个可执行程序运行生成的。那除了上面查看进程的方式还有其它方法我们还可以通过 /proc 系统文件夹查看进程信息proc其实就是process的缩写嘛/proc 目录是 Linux 系统中的一个特殊目录是一个 虚拟文件系统procfs由内核在内存中动态生成不占用实际磁盘空间提供了有关当前运行进程和内核状态的信息。需要注意的是它跟普通的文件不一样它不是一个真正的文件系统而是通过内核在内存中维护的一个虚拟文件系统。只有当操作系统启动的时候它才会存在并不存在于磁盘上。但是这里我们好像没有看到myprocess。这里有很多数字代表什么呢这些数字其实是特定进程的PID我们是能找到上面我们两个myprocess进程的PID的这些数字是蓝色的我们知道蓝色表示它是一个目录/文件夹。所以一个进程被创建好操作系统会自动在proc目录下创建一个以新增进程的PID命名的文件夹我们可以进去看看这里面有很多内容这些内容其实就是当前进程的相关属性信息这些东西大多我们还看不懂但是大家看这两个不就是对应程序的路径吗。那这就是我们前面说的进程的属性跟文件的属性也稍微有一点关系这里的exe对应的路径其实就是当前进程对应的可执行程序的所在路径那cwd又是什么呢cwd——Current Working Directory它记录了进程的当前路径之前我们学习C语言文件操作以写方式打开一个文件如果该文件不存在则会在当前路径下创建一个新文件这里说的当前路径即cwd记录的路径。那然后我们当前是在proc里面这个进程PID对应的这个目录里面的上面说了PID对应的目录是进程创建的时候才会在proc目录下新增的。那如果我们把对应的进程终止CTRLc掉在想查看这个目录的内容就不行了上一级我们也回不去了。因为进程终止操作系统就会在proc目录下把这个进程PID对应的目录及其里面的内容删除掉。所以proc目录里面的内容是动态变化的。这篇文章就先到这里下一篇文章我们继续讲解进程相关的内容…