【Linux】进程概念(上)(2)

简介: 【Linux】进程概念(上)(2)

👉进程👈


什么是进程


在课本上,我们经常会看到一个运行起来(加载到内存)的程序就是进程、进程和程序相比具有动态性等等的说法。其实,这些说法都是不全面的。那么接下来,我们一起探讨什么是进程?


我们写代码经过编译和链接后,形成了可执行程序。而程序的本质是在磁盘上放着的文件。程序想要运行起来,首先需要加载到内存。那么,内存了肯定会有很多被加载进来的程序,那么操作系统如何管理这些程序呢?是不是先描述,在组织啊?


为了描述这些程序,就引入了进程控制块(Processing Control Block)的概念。而进程等于内核数据结构(struct task_struct)+ 进程对应的磁盘代码。

19da6178591e470799582650468476eb.pngb6975ee7c84148de8783381e8d606283.png


task_ struct 内容分类


  • 标示符: 描述本进程的唯一标示符,用来区别其他进程。
  • 状态: 任务状态,退出代码,退出信号等。
  • 优先级: 相对于其他进程的优先级。
  • 程序计数器: 程序中即将被执行的下一条指令的地址。

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

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

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

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

其他信息。


查看和杀死进程


28df22d15d394a268c86ff1760929574.png


ps ajx | head -1 && ps ajx | grep '进程名' #查看指定进程
kill -9 进程的PID #杀死指定进程

482ff9abcbab4436b73d89fe30846ad7.png

e07da91da6774c75bf95a2308867d2ab.png



注:PID (Process ID)是进程的标识符。grep 指令也是一个进程。进程在调度运行的时候,进程具有动态属性


604c5b8ddd6d4943879ec8b5eaabc793.png



64318041eb6c4b8e93468d5a16bf9556.png


d53513bde698417096cd273d3d3ed9e8.png

注:getpid 函数是获得当前进程的 PID,而 getppid 函数是获得当前进程的父进程的 PID。

查看进程目录 ls /proc

dd9e4b03dad74a5b98ffbd6d8b144ffe.png

fc7a347be21043d39a7a907003f804c8.png


4e2ed3ce7a58462397d53832a7b08eac.png


注:删掉进程对应的可执行程序,进程还可以跑。因为进程跑起来就和可执行程序没有什么太大的关系了。Ctrl + C 可以退出前台程序。


如果我们把我们的进程退出再运行起来,如此重复。我们会发现一个现象:子进程的 ID 一直在变,而父进程的 ID 一直不变。这是为什么呢?

cf799eefbeaf491f9b2f76866f618fc4.png


那么,我们就来看看这个父进程是什么。

2daa7d12509144c78ab4230af3ffc72f.png


其实该父进程就是 bash,该进程是云服务器开启时系统帮我们创建好的。一般情况下,命令行上启动的进程的父进程都是 bash。shell 以创建子进程的方式来跑我们的程序,子进程出问题了,父进程不会受到任何的影响。那 shell 是如何创建子进程将我们的程序跑起来的呢?这部分内容将在进程控制里讲解。接下来,我们来学习一下如何创建子进程。


创建子进程


fork 是一个创建子进程的函数。


619f001d014946de879e6d58cc5a8e35.png


注:vim 的批量化注释:先摁下 Ctrl + V 键,再连续摁下方向键(j - 向下,k - 向上)至你想要注释的内容,再摁下 Shift + i 键,最后输入 // 就可以实现批量化注释了。


9d54670ad84447f9998c7fca39fbdd60.png



8fe0a781a06f47ccae29fdb42d77c34b.png


上面只是一个小小的例子,我们通常不这么来写代码。


对于 fork 函数,我们重点研究它的返回值。如果子进程创建成功,将会给父进程返回子进程的 ID,给子进程返回 0。如果子进程创建失败,将会给父进程返回 -1。

72bdfca107504a11ad4cdc731151fd8c.png


知道了 fork 函数的返回值后,我们对上面的代码再进行修改并让程序跑起来。


3f5d1571f46345219be8d7b0bda3adee.png

45fd7adfefe14f34810331269afc7537.png

上图的结果,很好地说明了子进程创建成功,将会给父进程返回子进程的 ID,给子进程返回 0。但我有一个问题,为什么同一个变量 id在后续不会被修改的情况下有不同的内容呢?现在这个知识点,无法给大家讲解,这里涉及了进程地址空间的内容。


fork 函数真正的用法是利用分支结构来让父子进程执行不同的代码,那我们再把上面的代码修改一下。

2161b493b2104a1baaabf102686938f3.png


7bc31c48e1dd4041bcaea7a0077c15c3.png


现在父子进程在一起运行,那么这就是多进程了。那现在问题来了,如果是 C语言的话,if - else if - else 结构能够同时成立吗?很明显不能!但是现在似乎可以了。其实真正的原因是 fork 函数执行之后,会有父子进程两个进程在执行后续的代码,也就是说 fork 函数之后的代码,被父子进程共享。那么,我们就可以通过返回值的不同,让父子进程执行后续共享代码的一部分。


👉总结👈


本篇博客主要讲解了冯诺依曼体系结构,什么是操作系统、库和函数调用的区别、什么是进程、如何查看和杀死进程以及如何创建子进程等等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️


























相关文章
|
2月前
|
资源调度 Linux 调度
Linux c/c++之进程基础
这篇文章主要介绍了Linux下C/C++进程的基本概念、组成、模式、运行和状态,以及如何使用系统调用创建和管理进程。
40 0
|
1天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
26天前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
98 4
linux进程管理万字详解!!!
|
17天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
58 8
|
14天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
25天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
66 4
|
26天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
28天前
|
消息中间件 存储 Linux
|
2月前
|
运维 Linux
Linux查找占用的端口,并杀死进程的简单方法
通过上述步骤和命令,您能够迅速识别并根据实际情况管理Linux系统中占用特定端口的进程。为了获得更全面的服务器管理技巧和解决方案,提供了丰富的资源和专业服务,是您提升运维技能的理想选择。
49 1
|
2月前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
【10月更文挑战第9天】本文将深入浅出地介绍Linux系统中的进程管理机制,包括进程的概念、状态、调度以及如何在Linux环境下进行进程控制。我们将通过直观的语言和生动的比喻,让读者轻松掌握这一核心概念。文章不仅适合初学者构建基础,也能帮助有经验的用户加深对进程管理的理解。
27 1