什么是 Linux 进程、线程、轻量级进程和进程状态

举报
Tiamo_T 发表于 2022/08/16 16:16:32 2022/08/16
【摘要】 在本文中,我们将讨论 Linux 进程、线程和轻量级进程,并了解它们之间的区别。最后,我们还将讨论 Linux 进程的各种状态。

Linux 自诞生以来已经发展了很多。在服务器和关键任务工作方面,它已成为使用最广泛的操作系统。尽管从整体上理解 Linux 并不容易,但有一些方面是 Linux 的基础,值得理解。

在本文中,我们将讨论 Linux 进程、线程和轻量级进程,并了解它们之间的区别。最后,我们还将讨论 Linux 进程的各种状态。

Linux 进程

在一个非常基本的形式中,Linux 进程可以被可视化为程序的运行实例。例如,只要在你的 Linux 机器上打开一个文本编辑器,一个文本编辑器进程就会诞生。

这是我在机器上打开 gedit 时的示例:

$ gedit & 
[1] 5560

$ ps -aef | grep gedit 
1000       5560   2684 9 17:34 pts/0 00:00:00 gedit

第一个命令 (gedit &) 打开 gedit 窗口,而第二个ps 命令(ps -aef | grep gedit) 检查是否有关联的进程。在结果中您可以看到有一个与 gedit 关联的进程。

进程是 Linux 的基础,因为操作系统完成的每一项工作都是根据进程完成的。只要想一想,你就会发现它是一个过程。这是因为任何打算完成的工作都需要系统资源(由内核提供),并且它是一个被内核视为可以提供系统资源的实体的进程。

进程的优先级取决于哪个内核上下文切换它们。如果具有更高优先级的进程已准备好执行,则可以抢占该进程。


例如,如果一个进程正在等待系统资源,例如保存在磁盘上的文本文件中的一些文本,那么内核可以调度更高优先级的进程并在数据可用时返回等待进程。这可以让整个操作系统保持滚动,并让用户感觉任务正在并行运行。

进程可以使用进程间通信方法与其他进程通信,并且可以使用共享内存等技术共享数据。

在 Linux 中,fork() 用于创建新进程。这些新进程称为子进程,每个子进程最初共享所有段,如文本、堆栈、堆等,直到子进程尝试对堆栈或堆进行任何更改。如果发生任何更改,将为子级准备堆栈和堆段的单独副本,以便更改保持特定于子级。文本段是只读的,因此父项和子项共享相同的文本段。C fork 函数文章解释了更多关于 fork() 的信息。

Linux 线程与轻量级进程

Linux 中的线程只不过是进程的执行流程。包含多个执行流的进程称为多线程进程。

对于非多线程进程,只有执行流是主执行流,因此也称为单线程进程。对于 Linux 内核,没有线程的概念。每个线程都被内核视为一个单独的进程,但这些进程与其他正常进程有些不同。我将在以下段落中解释差异。

线程通常与术语轻量级进程或 LWP 混合使用。原因可以追溯到 Linux 仅在用户级别支持线程的时代。这意味着即使是多线程应用程序也仅被内核视为单个进程。这给管理这些用户级线程的库带来了巨大挑战,因为它必须处理线程执行不会阻碍任何其他线程发出阻塞调用的情况。

后来实现发生了变化,进程被附加到每个线程,以便内核可以处理它们。但是,如前所述,Linux 内核并不将它们视为线程,每个线程都被视为内核内部的一个进程。这些过程被称为轻量级过程。

轻量级进程 (LWP) 和普通进程之间的主要区别在于 LWP 共享相同的地址空间和其他资源,如打开文件等。由于某些资源是共享的,因此与其他普通进程相比,这些进程被认为是轻量级的因此命名为轻量级过程。

因此,实际上我们可以说线程和轻量级进程是相同的。只是线程是在用户级别使用的术语,而轻量级进程是在内核级别使用的术语。

从实现的角度来看,线程是使用 Linux 中符合 POSIX 的 pthread 库公开的函数创建的。在内部,clone() 函数用于创建正常和轻量级的进程。这意味着要创建一个普通的进程 fork(),它会使用适当的参数进一步调用 clone(),而要创建一个线程或 LWP,pthread 库中的一个函数会使用相关标志调用 clone()。因此,主要区别是通过使用可以传递给 clone() 函数的不同标志生成的。

在各自的手册页上阅读有关 fork() 和 clone() 的更多信息。

如何在 Linux 中创建线程解释了有关线程的更多信息。

Linux 进程状态

正常 Linux 进程的生命周期看起来很像现实生活。进程诞生,与父母共享一段时间的资源,当它们准备好进行更改时获取自己的资源副本,根据它们的优先级经历各种状态,然后最终死亡。本节将讨论 Linux 进程的各种状态:

  • RUNNING – 此状态指定进程正在执行或等待执行。
  • INTERRUPTIBLE - 此状态指定进程正在等待被中断,因为它处于睡眠模式并等待发生可以唤醒此进程的某些操作。动作可以是硬件中断、信号等。
  • UN-INTERRUPTIBLE – 就像 INTERRUPTIBLE 状态一样,唯一的区别是处于这种状态的进程不能通过传递信号来唤醒。
  • STOPPED – 此状态指定进程已停止。如果将 SIGSTOP、SIGTTIN 等信号传递给进程,则可能会发生这种情况。
  • TRACED – 此状态指定正在调试进程。每当调试器停止进程(以帮助用户调试代码)时,进程就会进入此状态。
  • ZOMBIE - 此状态指定进程已终止但仍停留在内核进程表中,因为此进程的父进程仍未获取此进程的终止状态。Parent 使用 wait() 系列函数来获取终止状态。
  • DEAD - 此状态指定进程终止并且从进程表中删除条目。当父节点成功获取终止状态时达到此状态,如 ZOMBIE 状态中所述。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。