百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

一文搞懂Linux进程、线程、协程的区别,进程管理很简单

liebian365 2024-10-17 14:05 44 浏览 0 评论

希望可以通过本小结 彻底地搞清楚进程生命周期,进程生命周期创建、退出、停止,以及僵尸进程的本质;

进程是处于执行期的程序以及相关的资源的总称,是操作系统资源分配的单位:

进程的资源到底包括什么?
1.打开的文件
2.挂起的信号
3.内核的内部数据
4.处理器的状态
5.内存映射的内存地址空间 等等

Linux系统 对线程和进程并不特别区分。线程仅仅被视为一个与其他线程共享某些资源的进程。每个线程都拥有唯一自己的task_struct。

内核调度的对象是根据task_struct结构体。可以说是线程,而不是进程。

不仅仅要有资源,还需要有进程的描述,例如:pid

进程描述符及task_struct

linux通过task_struct结构体描述一个进程:

mm成员:描述内存资源
fs成员:描述文件系统资源
files成员:进程运行时打开了多少文件,fd的数组
signal成员:进程接收的信号资源

Linux通过slab分配器分配task_struct结构,只需在栈底创建新的结构,struct thread_info。
每个任务的thread_info结构在它的内核栈的尾端分配。

pid的数量是有限的

$ cat /proc/sys/kernel/pid_max
32768

task_struct被管理形成链表 --> 形成树 -->形成哈希: pid --> task_struct 根据哈希来进行pid检索

Linux进程生命周期(就绪、运行、睡眠、停止、僵死)

进程、线程、协程

在linux系统里,进程和线程都是通过task_struct结构体来描述。 进程之间不共享地址空间,而线程与创建它的进程是共享地址空间的。

线程又分为:内核线程、用户级线程和 协程。

对于I/O密集型场景,就算开多个线程来处理,也未必能提升CPU的利用率,反而会增加线程切换的开销。

此外,多线程之间如果存在临界区或者共享数据,那么同步的开销也不容忽视。

而协程就是用来解决这个问题的,一个用户线程上可以跑多个协程,以此提升单核的利用率。

tips: Linux中对进程和线程创建的几个系统调用发现, 创建时最终都会调用do_fork()函数,不同之处是传入的参数不同(clone_flags),最终结果就是进程有独立的地址空间和栈 ,而用户线程可以自己制定用户栈,地址空间和内核进程共享,内核线程则只有和内核共享的一个栈,同一个地址空间。 不管是进程还是线程,do_fork最终会创建一个task_struct结构。

什么是僵尸进程?

僵尸是子进程死了,资源已经释放。所以不可能有内存泄漏等。但是父进程还没有来得及去wait回收它。task_struct 还在,父进程可以查到子进程的死因。

kill -9 僵尸进程,无效。 [a.out]< defunct> Z+

僵尸进程是一个特别短暂的状态。

停止状态与作业控制,cpulimit

Linux在早期使用cpulimit 进行 cpu利用率控制。
cpulimit 限制进程 CPU利用率的原理如上,利用进程的停止态。但是不是精确的。

cpulimit -l 10 -p 12296  把进程12296CPU使用率控制在 10%以内
cpulimit -l 40 -p 12296

ctrl+z ,fg/bg

进程的睡眠

深睡眠和浅睡眠,都是自发的。停止状态是被动的。

  • 深:必须等到资源才能wake_up.
  • 浅:除了被资源wake_up,还可以被信号唤醒。

睡眠是主动的,暂停是人为的信号控制,属于作业控制。深度睡眠,只能在内核中进入。

睡眠态等到资源后,为什么不能直接进入运行态?
进程醒来后,优先级不一定是最高的。醒来后,准备就绪。

执行应用程序代码段发生page fault,代码段还没有进内存。接下来,要从硬盘中读到内存,此时,会把进程设置到深度睡眠状态。 为什么?
发生两次pagefault,非常难控制。

进程的睡眠实现,依赖内核数据结构wait queue。类似设计模式的,发布者和订阅者。

进程P1,P2,P3,P4 把自己放在等待队列,资源来了只需要唤醒等待队列。等待队列类似订阅消息的中间媒介

初见fork

main()
{
	fork();
    printf("hello\n");
    fork();
    printf("hello\n");
    while(1);
}

内存泄漏的真实含义

内存泄漏,不是(进程死了,内存没释放),而是,进程活着,运行越久,耗费的内存越多。

如何观察 内存泄漏?

连续多点观察法。

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: