Java工程师面试突击(第3季)重磅升级,从70讲增至160讲,带你探究Linux进程秘密

2025-04-09
来源:网络整理

“ Java工程师采访攻击(第3季)”已大幅升级,从最初的70次讲座到160次讲座,内容倍增了一倍以上。请参阅文章末尾的文章,以升级一些内容。

操作系统的“过程”是一个基本概念,每个人都需要在学习计算机时触摸。抛开那些纯粹的理论基础操作系统实现,经过多年的软件开发,每次运行程序都有问题时,我们都必须逐步分析流程的各个状态,以找出问题所在的位置。这次,我们将带您在环境中练习,探索和揭示“过程”的秘密。

什么是一个过程

首先,让我们谈谈“程序”的概念。程序是存储在磁盘上的指令的有序集合,并且是静态的。一个过程是程序执行的过程,包括动态创建,调度和灭绝的整个过程。它是计划资源管理的最小单位。

线程是可用于在操作系统上执行计算计划的最小单元。在大多数情况下,它包含在此过程中,是该过程中的实际操作单元。一个过程可以包含多个线程,并且是资源调度的最小单元。 [的引用]

多线程程序模型

探索过程的第一步,您在那里吗?你还好吗?

PS

一个。列出当前系统过程的快照。

找到唯一标识过程的过程pid()。每个人都应该使用PS命令知道此命令。对于新手用户,他不是。

让我简要介绍您。一般用法是PS -EF列出了系统中的频繁信息。通常,它将需要管道来求助于您感兴趣的过程。与此一样,PS -EF | GREP第一列PID代表过程编号,PPID(ID)代表父进程编号。

探索过程的第二步,让我看看您结交了哪些朋友(系统通话和信号)

以及在此过程中的跟踪系统调用和信号

什么是“系统调用”?系统调用是指在“用户状态”中运行的程序,该程序要求提供更高特权才能从操作系统的“内核状态”运行。系统调用提供了用户程序和操作系统之间的接口。

然后启动一个过程,该过程可以跟踪启动后的系统调用和流程信号。此命令可以查看过程执行期间调用哪些系统调用。通过指定不同的选项,可以输出系统调用的时间。准确性可以准确地对微秒来进行,甚至可以统计地分析系统的“耗时呼叫”

当解决过程假死亡问题并可以帮助您找出该过程陷入哪个系统时,这是非常有用的。已经运行的过程还可以指定-P参数加上PID,以将其像GDB一样附加和跟踪。

统计数据

探索过程的第三步,让我看看您带来的小兄弟(线程)。

a打印运行程序的堆栈信息。

执行PID命令,您可以在当前线程中看到堆栈信息。 PID可以通过上一个PS命令获得。您可以看到该过程中启动的线程号,还可以在过程中看到每个线程的“堆栈”内容。

您是否看过上面印刷的LWP?这是一个知识点,LPW指的是 - 轻质线程。扩展知识:

没有真正的线程

程序崩溃会怎么样_应用程序崩溃事件代码_小程序崩溃分析开发

其中不在其中的线程是通过流程模拟和实现的,因此称为轻量级过程。

该过程是“资源管理”的最小单元,线程是“资源调度”的最小单元(此处不考虑)

探索过程的第四步,让小兄弟(线程)出来并排队。

一棵印刷运行过程结构的树结构根据树结构

您可以直观地查看该过程和启动的线程之间的关系,并显示过程身份。

探索该过程的第五步是死亡(过程崩溃)或实时(过程运行)。我需要知道您的秘密(堆栈框架和上下文)。

GDB

GDB是GNU开发的GCC套件的程序调试工具。您可以查看程序堆栈,设置断点,打印程序运行时信息,甚至是调试多线程程序。它具有非常强大的功能。

将GDB视为这里的命令,这有点浪费金钱。如果您想详细谈论GDB,则可以完全支持文章的长度。让我们在这里谈论它。如果您有机会发表另一篇文章,则可以详细介绍它。

使用

要使用GDB进行调试C/C ++程序,请首先在编译时添加-G选项。 G ++ -G test.cpp -o测试,以便可以使用GDB调试生成的程序。

您可以通过GDB直接启动程序调试,命令:GDB PROG

还可以将GDB的启动过程附加到调试中。命令:GDB PROG PID

程序崩溃后,您还可以使用GDB来调试参数,以查看程序死亡之前留下的最后一个单词(堆栈信息)。命令:GDB Prog,这里有一件事要注意。某些系统具有违约程序崩溃且不会生成。目前,您需要-c才能生成。

探索过程的步骤6,我想了解有关您的一切。

更近了一步

通过 /proc /pid文件了解过程的运行时信息和统计信息。 /proc系统是一个仅存在内存中并且不占据外部内存空间的伪文件系统。它以文件系统的形式为内核和过程提供了通信接口。输入系统/Proc目录:

Proc目录

/proc目录中有许多以数字命名的目录,每个数字代表过程编号PID,它们是过程目录。当前在系统中运行的每个过程都对应于一个目录 /proc /pid,其中该过程编号为 /proc下的目录名称。它们是阅读过程信息的接口。我们可以输入此文件以了解过程运行时信息和统计信息。

高频使用

/proc /pid目录中有一些重要的文件。我将选择一些经常使用的并会讨论它们。 /proc/pid/包含该过程可用环境变量的列表。如果该程序存在问题,则不确定环境变量是否设置为生效,则可以猫查看和确认。

/proc/pid/fd/此目录包含指向该过程打开的每个文件的链接。从这里,您可以查看该过程打开的文件描述符信息,包括标准输入,输出和错误流。您还可以看到该过程打开的连接文件描述符,LSOF命令具有相似的效果。

小程序崩溃分析开发_程序崩溃会怎么样_应用程序崩溃事件代码

/proc/pid/stat包含该过程的所有状态信息,包括过程编号,父进程编号,线程组编号,任务在用户状态下运行的时间,任务在内核状态运行的时间,虚拟地址空间的代码段,封锁信号的位图的代码段以及其他信息。

其他统计数据

/proc/pid/此文件保存该过程的完整命令行

/proc/pid/cwd指向该过程当前工作目录的符号连接

/proc/pid/exe包含在进程中运行程序的链接

/proc/pid/mem在内存中包含该过程的内容

/proc/pid/包含该过程的内存使用信息

让我们总结一下

好的,过了一会儿,您对过程及其背后的秘密有很好的了解。如果我们的好朋友“流程”会遇到任何问题(崩溃,假死亡,阻止,系统呼叫超时,文件描述符异常),您应该知道如何帮助它!让我们总结一下:

PS检查过程ID,以查看该过程是否仍在那里并且过程状态

如果您在那里,请查看当前的流程信息,它是否卡在哪个位置?比较每个帧的最后一个呼叫信息以找到异常

如果该过程不再是文件,请转到GDB直接查看信息

当您怀疑过程状态信息时,请查看 /proc /pid下的过程状态信息,这可能会激发您的灵感。

最后,如果以上都没有作用,请闭上眼睛祈祷!

最后写

我希望今天的分享对您有所帮助。祝您您写的服务永远不会崩溃。切勿让上面教授的操作被破坏。

最后,谢谢您的阅读。本文的目的是分享您对知识的理解。我将反复验证技术文章以确保最高准确性。如果文章中有明显的错误,请指出它们,因此让我们一起讨论。

结尾

“ Java工程师采访第3季”的大纲:(注意:请在文章结尾处扫描QR码1-66,并在课程详细信息页面上获取)

有关详细的课程内容,您可以扫描下面的QR码以了解:

分享