Linux——进程|描述进程-PCBtask_struct-PCB的一种组织进程 |查看进程父进程和子进程|PID获取|父子关系|fork初识

简介: 笔记

课本概念:程序的一个执行实例,正在执行的程序等

内核观点:担当分配系统资源(CPU时间,内存)的实体。

进程:对应的代码和数据+PCB结构体

描述进程-PCB


进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。

课本上称之为PCB(process control block), Linux操作系统下的PCB是: task_struct


cpu不能直接去访问文件中的程序和数据,而是通过访问PCB,才能访问数据和程序


cpu对进程的管理,变成了对进程PCB结构体链表的增删查改


task_struct-PCB的一种

在Linux中描述进程的结构体叫做task_struct。

task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息


task_ struct内容分类

标示符: 描述本进程的唯一标示符,用来区别其他进程。

状态: 任务状态,退出代码,退出信号等。

优先级: 相对于其他进程的优先级。

程序计数器: 程序中即将被执行的下一条指令的地址。

内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。

I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用的文件列表。

记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

其他信息


组织进程

管理理念:先描述,再组织


可以在内核源代码里找到它。所有运行在系统里的进程都以task_struct链表的形式存在内核里。


查看进程


我们执行一个程序就是开始一个进程,程序结束,进程结束



我们改成死循环代码



查看进程输入ps,ps只能查看自己的终端下的进程,若想查看所有进程输入ps axj



输入ps axj,此时查看的是系统中所有进程的信息


1.png


还可利用ps axj查看自己的


ps axj | grep 'mypro'


2.png


带上头部 ps axj | head -1 && ps axj |grep 'mypro'

3.png



输入top命令,也可显示系统中的所有进程,相当于任务管理器,退出q



4.png5.png

系统中还有一个proc的目录


6.png


我们可以看到当前进程的PID是21682

7.png



我们在proc 里面可以找到这个数字ls /proc -l


8.png


我们可以利用它的pid查看进程,我们所看到的是它进程的所有属性数据9.png




我们可以看到当前工作目录和可执行程序


cwd是当前进程的工作目录,exe可执行程序


C语言代码->可执行程序->运行可执行程序->每个进程都会有一个属性,来保存自己所在的工作路径(进程运行时所在的工作路径)


进程的当前路径在跟可执行程序在一个路径

10.png



也可这样查看属性

11.png

当我们退出程序时,再去查看这个路径,发现已经没有这个路径了

12.png


因此/proc里面的文件是动态变化的


父进程和子进程


PID获取

输入man getpid可查看pid


这里面看到的头文件和C语言没有任何关系,这是操作系统提供的头文件


pid_t是操作系统提供的一个pid类型,其实是unsigned int


所有函数在变成进程之后才能被调用


13.png14.png



运行

15.png16.png


输入kill -9 30254可以终止程序进行,终止进程


17.png

父子关系

man getppid获得父进程ID,get pid获得进程ID


18.png



这里的父进程ppid是谁?



我们可以看到ppid就是bash,bash是一种shell的一种


无论是系统的命令还是自己编写的程序,都是bash(shell)的子进程


我们关掉bash





输什么命令都不起作用


我们重新登陆即可,但是每次登陆的时候,PPID都不同,每次登陆都是打开bash




fork初识


fork:用来创建一个子进程


返回值:1.失败的时候返回-1


               2.成功的时候子进程pid返回给父进程,0返回给子进程



一个程序没有fork时



我们加上fork



再次修改


20.png21.png22.png



从fork之后变成了俩个进程,一个是父进程,一个是子进程


23.png


 i am parent ....打印的是子进程

24.png



fork之后产生了俩个进程,一个是上面的ret,一个是下面的ret,因为给子进程返回0,给父进程返回子进程的pid,所以上面是父进程,下面是子进程,


子进程的ppid是14672,14672就是父进程的pid


fork子进程探讨

25.png

运行之后程序打印了俩次

26.png



执行俩遍是因为创建了子进程,在fork之后代码是父子共享的

27.png



再次修改程序

28.png



运行之后,由于fork成功子进程返回的是0,子进程进入else if,父进程返回的是子进程的PID,父进程进入else,这里的if和else if同时执行,这是因为fork之后有俩个不同的进程流

29.png

一个子进程只能有一个父进程,一个父进程可以有多个子进程,所以是父子关系


输入这个语句可动态观察: while :; do ps axj | head -1 && ps ajx | grep mypro | grep -v grep;sleep 1;done

30.png



fork俩个返回值问题

fork会创建一个子进程,会把0或-1返回给子进程,把子进程PID返回给父进程,为什么会有俩个返回值呢?


创建子进程的时候,要新建一个task_struct结构体,子进程的内部属性要以父进程为模板,就像父子DNA关系一样


31.png


当准备return时,我们的核心代码已经完成了吗?


32.png


通过task_struct将代码加载到寄存器当中


操作系统和cpu运行某一个进程,本质从task_struct形成的队列中挑选一个task_struct,来执行它的代码,进程调度,变成了在task_struct的队列中选择一个进程的过程


只要想到进程,优先想到对应的task_struct


当我们准备return的时候,核心代码已经完成了,当子进程准备return的时候,子进程已经被创建出来了,甚至放在了运行队列当中


当父进程被cpu调度的时候,会return 一个值给父进程,子进程被调度的时候,会return一个值给子进程,所以会出现return俩次的情况


总结:


1.因为fork内部,父子各自会执行自己的return语句


2.返回俩次,并不意味着会保存俩次


父子进程被创建出来,哪一个先运行?


这个没有固定答案,有可能是父进程,也有可能是子进程,因此谁先运行不一定,这个由操作系统的调度器决定


相关文章
|
5月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
138 16
|
7月前
|
Linux 数据库 Perl
【YashanDB 知识库】如何避免 yasdb 进程被 Linux OOM Killer 杀掉
本文来自YashanDB官网,探讨Linux系统中OOM Killer对数据库服务器的影响及解决方法。当内存接近耗尽时,OOM Killer会杀死占用最多内存的进程,这可能导致数据库主进程被误杀。为避免此问题,可采取两种方法:一是在OS层面关闭OOM Killer,通过修改`/etc/sysctl.conf`文件并重启生效;二是豁免数据库进程,由数据库实例用户借助`sudo`权限调整`oom_score_adj`值。这些措施有助于保护数据库进程免受系统内存管理机制的影响。
|
7月前
|
Linux Shell
Linux 进程前台后台切换与作业控制
进程前台/后台切换及作业控制简介: 在 Shell 中,启动的程序默认为前台进程,会占用终端直到执行完毕。例如,执行 `./shella.sh` 时,终端会被占用。为避免不便,可将命令放到后台运行,如 `./shella.sh &`,此时终端命令行立即返回,可继续输入其他命令。 常用作业控制命令: - `fg %1`:将后台作业切换到前台。 - `Ctrl + Z`:暂停前台作业并放到后台。 - `bg %1`:让暂停的后台作业继续执行。 - `kill %1`:终止后台作业。 优先级调整:
350 5
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
428 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
Linux C语言
C语言 多进程编程(四)定时器信号和子进程退出信号
本文详细介绍了Linux系统中的定时器信号及其相关函数。首先,文章解释了`SIGALRM`信号的作用及应用场景,包括计时器、超时重试和定时任务等。接着介绍了`alarm()`函数,展示了如何设置定时器以及其局限性。随后探讨了`setitimer()`函数,比较了它与`alarm()`的不同之处,包括定时器类型、精度和支持的定时器数量等方面。最后,文章讲解了子进程退出时如何利用`SIGCHLD`信号,提供了示例代码展示如何处理子进程退出信号,避免僵尸进程问题。
|
12月前
|
消息中间件 存储 Linux
Linux手账—exec和fork
本文介绍了Linux系统中进程控制的核心功能——`fork`和`exec`系列函数。`fork`用于创建新进程(子进程),继承父进程的资源但拥有独立的地址空间;`exec`系列函数则在当前进程中执行新程序,替换原有地址空间。文章详细解析了这些函数的基本概念、用法及工作原理,强调了它们在多进程编程中的重要性。
184 0
|
存储 Linux 文件存储
在Linux中,文件系统是如何组织的?
在Linux中,文件系统是如何组织的?
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
linux内核执行fork时对写时复制的设置
linux内核执行fork时对写时复制的设置