对linux进程的理解

【Linux】进程控制——深刻理解进程创建 进程控制的第一节,进程创建,介绍了进程创建的fork函数和vfork函数 阅读详情

进程是UNIX操作系统抽象概念中最基本的一种,其中涉及进程的定义以及相关的概念,比如线程;它们在内核中如何被列举?如何创建?最终又如何消亡?让我们通过下面的分析,一步步解开内核进程的神秘面纱。

1. 进程和线程

进程和线程是程序运行时状态,是动态变化的,进程和线程的管理操作(比如,创建,销毁等)都是有内核来实现的。

Linux中的进程于Windows相比是很轻量级的,而且不严格区分进程和线程,线程不过是一种特殊的进程。

所以下面只讨论进程,只有当线程与进程存在不一样的地方时才提一下线程。

 进程提供2种虚拟机制:虚拟处理器和虚拟内存

每个进程有独立的虚拟处理器和虚拟内存,

每个线程有独立的虚拟处理器,同一个进程内的线程有可能会共享虚拟内存。

 内核中进程的信息主要保存在task_struct中(include/linux/sched.h)

进程标识PID和线程标识TID对于同一个进程或线程来说都是相等的。

Linux中可以用ps命令查看所有进程的信息:

ps -eo pid,tid,ppid,comm

 

2. 进程的生命周期

进程的各个状态之间的转化构成了进程的整个生命周期。

进程生命周期

 

3. 进程的创建

Linux中创建进程与其他系统有个主要区别,Linux中创建进程分2步:fork()和exec()。

fork: 通过拷贝当前进程创建一个子进程

exec: 读取可执行文件,将其载入到内存中运行

创建的流程:

  1. 调用dup_task_struct()为新进程分配内核栈,task_struct等,其中的内容与父进程相同。
  2. check新进程(进程数目是否超出上限等)
  3. 清理新进程的信息(比如PID置0等),使之与父进程区别开。
  4. 新进程状态置为 TASK_UNINTERRUPTIBLE
  5. 更新task_struct的flags成员。
  6. 调用alloc_pid()为新进程分配一个有效的PID
  7. 根据clone()的参数标志,拷贝或共享相应的信息
  8. 做一些扫尾工作并返回新进程指针

创建进程的fork()函数实际上最终是调用clone()函数。

创建线程和进程的步骤一样,只是最终传给clone()函数的参数不同。

比如,通过一个普通的fork来创建进程,相当于:clone(SIGCHLD, 0)

创建一个和父进程共享地址空间,文件系统资源,文件描述符和信号处理程序的进程,即一个线程:clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0)

在内核中创建的内核线程与普通的进程之间还有个主要区别在于:内核线程没有独立的地址空间,它们只能在内核空间运行。

这与之前提到的Linux内核是个单内核有关。

 

4. 进程的终止

和创建进程一样,终结一个进程同样有很多步骤:

 子进程上的操作(do_exit)

  1. 设置task_struct中的标识成员设置为PF_EXITING
  2. 调用del_timer_sync()删除内核定时器, 确保没有定时器在排队和运行
  3. 调用exit_mm()释放进程占用的mm_struct
  4. 调用sem__exit(),使进程离开等待IPC信号的队列
  5. 调用exit_files()和exit_fs(),释放进程占用的文件描述符和文件系统资源
  6. 把task_struct的exit_code设置为进程的返回值
  7. 调用exit_notify()向父进程发送信号,并把自己的状态设为EXIT_ZOMBIE
  8. 切换到新进程继续执行

子进程进入EXIT_ZOMBIE之后,虽然永远不会被调度,关联的资源也释放掉了,但是它本身占用的内存还没有释放,
比如创建时分配的内核栈,task_struct结构等。这些由父进程来释放。

父进程上的操作(release_task)

父进程受到子进程发送的exit_notify()信号后,将该子进程的进程描述符和所有进程独享的资源全部删除。

从上面的步骤可以看出,必须要确保每个子进程都有父进程,如果父进程在子进程结束之前就已经结束了会怎么样呢?

子进程在调用exit_notify()时已经考虑到了这点。如果子进程的父进程已经退出了,那么子进程在退出时,exit_notify()函数会先调用forget_original_parent(),然后再调用find_new_reaper()来寻找新的父进程。

find_new_reaper()函数先在当前线程组中找一个线程作为父亲,如果找不到,就让init做父进程。(init进程是在linux启动时就一直存在的)


【Linux】进程理解 一、冯诺依曼体系 二、操作系统概念 三、进程地址空间 阅读详情

相关推荐

Halcon手眼标定保姆级教程:从‘眼在手上’到‘眼到手’两种模式全解析(附代码)

本文详细解析Halcon在机器人视觉引导中的手眼标定技术,涵盖Eye-in-Hand和Eye-to-Hand两种模式,提供从硬件准备到实战代码的完整解决方案。通过精确的相机标定和坐标转换,帮助实现工业自动化中机械臂与视觉系统的高精度协同作业。

weixin_42544461的博客 209

Linux内核设计与实现

于是,内核用C语言编写了函数context_switch()用于实现进程切换,而在它的内部,则会调用switch_to()和switch_mm()分别完成处理器上下文和地址空间的切换。它们只能看到允许它们使用的部分系统资源,并且只能使用某些特定的系统功能,不能直接访问硬件,也不能访问内核划给别人的内存范围,还有一些使用限制。许多操作系统的中断服务程序,包括Linux的,都不在进程上下文中执行。一些库调用提供了系统调用不具备的许多功能,在那些较为复杂的函数中,调用内核的操作通常只是整个工作的一个步骤而已。

Caramel_biscuit的博客 1248

CanOpen PDO映射实战:从原理到配置的完整指南

本文详细解析了CanOpen PDO映射的原理与配置流程,从基础通信机制到实战配置步骤,涵盖禁用PDO、清空映射、逐项映射和使能PDO等关键环节。特别针对西门子G120变频器、台达伺服和倍福CX控制器等不同厂商设备,提供了具体的配置技巧和常见问题排查指南,帮助工程师快速掌握多厂商设备间的PDO通信配置。

weixin_30718391的博客 517

Linux内核设计与实现 第一章 Linux内核简介

Linux内核设计与实现 第一章

weixin_55255438的博客 1732

华为eNSP实战:手把手教你配置DHCP全局地址池(含AP固定IP分配)

本文通过华为eNSP模拟器,详细演示了如何配置DHCP全局地址池,为不同业务VLAN动态分配IP地址,并重点讲解了如何通过MAC地址绑定为接入点(AP)分配固定IP。文章涵盖了从拓扑设计、基础网络搭建到地址池精细配置、验证测试及常见故障排查的全流程,是网络工程师掌握企业级DHCP部署与AP管理的实用指南。

weixin_29235923的博客 600

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4649

《Linux内核设计与实现》

《Linux内核设计与实现》阅读记录

weixin_52259848的博客 2556

Nerf 训练自有数据

colmap相机位姿转为LLFF格式数据

zfjBIT的专栏 2309

《linux内核设计与实现》 读书笔记

linux内核

linken_yue的博客 666

Unreal5.6从入门到精通之 如何实现MetaHuman数字人

本文介绍了使用HYPER3D-ChatAvatar网站生成3D头部模型,并导入Unreal Engine制作数字人的完整流程。首先上传照片生成头部模型(约2分钟),设置参数后下载模型文件。然后在UE5.6中创建项目,激活MetaHuman插件,导入头部模型并调整肤色、面部特征和身体模板。通过MetaHuman Creator组装数字人蓝图,支持添加音频/视频动画功能。关键步骤包括:取消Rigging选项节省时间、切换英文模式避免材质问题、使用Live Link Face应用实现面部捕捉等。整个流程约需5-1

TxNet 1348

11、CUDA 内存优化:平铺矩阵乘法技术解析

本文深入解析了CUDA中的平铺矩阵乘法技术,重点介绍了如何利用共享内存和线程协作减少全局内存访问,提升计算效率。通过矩阵乘法实例,详细阐述了平铺算法的执行流程、内核代码实现及性能优化策略,包括平铺大小选择、线程同步机制和代码优化建议。文章还分析了该技术在深度学习、图像处理和科学计算等领域的应用价值,为CUDA程序的内存优化提供了系统性指导。

peace的博客 70

【免费下载】 深入Linux内核:《Linux内核设计与实现》第三版PDF下载推荐

深入Linux内核:《Linux内核设计与实现》第三版PDF下载推荐 【下载地址】Linux内核设计与实现_第三版PDF下载分享 Linux内核设计与实现_第三版 PDF 下载 项目地址: https://gitcode.com/...

gitblog_06671的博客 785

[SV]SystemVerilog学习笔记之struct & union

SystemVerilog学习笔记(四) 一、结构体(struct) 1.1、结构体(struct) 结构体声明:结构体默认是变量,也可以声明为线网 var struct{ //通过var进行结构体变量声明 logic [31:0] a, b; logic [ 7:0] opcode; } Instruction_Word_var; wire struct{ //结构体线网声明,定义为线网类型时,结构体的所有成员必须...

元直的博客 1万+

LInux下进程的理解

进程是什么,进程其实就是一个运行起起来的程序,操作系统为了更好的管理进程,会给进程创建一个PCB用来记录进程的属性,对进程的数据属性进行管理,可以理解成对进程的间接管理进程本质 = 可执行程序 + 进程对应的内核数据结构操作系统会创建一个进程队列来记录每个进程的信息tack_struct是PCB的一种,也是Linux内核的一种数据结构,包含着进程信息。......

m0_62616069的博客 633

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Linux c 进程的理解

Linux进程的理解: 1.       父子进程的关系          独立的两个进程          互为父子关系 2.       问题: 2.1. 父进程先结束?                        子进程就依托根进程init:孤儿进程                         孤儿进程没有任何问题(没有任何危害) 2.2. 子进程先结束?

Y_23k_bug的专栏 1437

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux中对进程的理解

文章目录再次谈谈进程的概念进程的PCB(task_struck)中到底有什么东西,如何理解这些属性 再次谈谈进程的概念 我们都知道,进程只不过是一个被加载到内存的一个可执行程序罢了,但是仅仅这么理解是不够的,进程,绝对不是就是一个被加载到内存的可执行程序; 再次期间,我们需要理解,程序是谁把它加载到内存的?答案是操作系统; 那么程序被操作系统加载到内存时候,是否需要对进程进行管理呢?答案也是肯定的,当然需要管理。 那么进程一旦被操作系统管理,那么操作系统又是如何管理进程的呢?答案是:通过描述进程的各种属性,

呋喃吖的博客 762

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

linux下进程的理解

1.关于进程的理解 进程即运行的所有程序和打开的服务,关掉其进程和服务将有利于释放内存,减轻电脑空间压力。 (1)windows的进程如下 (2)linux中的进程如下 查看所有进程 ,ps命令可以列出系统中当前运行的进程,所列出的进程是在执行ps命令这个时刻正在运行的进程。此外也可以用: [root@tandelin ~]# ls /proc/ 2.查看指定进程(例如要查看PID为2的进程...

dltan 636

【Linux】怎么理解进程

本文通过冯诺依曼体系结构(硬件部分)和操作系统(软件部分)为基础来介绍我们应该如何理解进程

阿润菜菜的博客 2134

【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 理解操作系统

本文介绍了计算机系统的核心概念,包括冯诺依曼体系结构和操作系统的基本原理。冯诺依曼体系是计算机的物理骨架,由输入单元、中央处理器、存储器和输出单元组成。其核心特点是数据通过内存流动,CPU只能与内存交互,外设也需通过内存进行数据传输。该体系通过引入内存平衡外设与CPU的速度差异,提升整体效率,是计算机性价比优化的关键。 操作系统是管理软硬件的核心软件,分为内核和外壳程序。其设计目的是为上层应用程序提供良好的执行环境,并通过系统调用实现软硬件交互。用户程序无法直接访问硬件,必须通过操作系统提供的接口完成操作。

Linux、C++、图形软件开发等。不一定每次都能写出完美的代码,但会认真搞懂每一个问题。 3176

Linux系统编程:理解进程概念

OS中不仅仅只有一个进程,可能运行着多个进程(比如我们可能同时运行着qq和qq音乐),所以OS必须要将进程管理起来!!根据我们以往的管理经验,我们需要先描述再组织!!

weixin_51142926的博客 4200

【Linux进程】 进程的理解

在计算机科学领域,进程是一种重要的概念,在日常学习中也经常遇到进程这个概念,那么进程到底是什么?我们又应该如何去理解,本文将为你详细解释什么是进程,以及如何在Linux环境下如何查看进程。

2202_75605090的博客 1214

Linux 理解进程

理解LInux进程

Han同学 1820

【Linux】Linux进程控制 --- 进程创建、终止、等待、替换、shell派生子进程的理解…

进程等待给僵尸进程收尸,轮询等待,阻塞和非阻塞等待,7个exec替换函数,shell派生子进程的程序替换,shell的内建命令,cwd和exe路径……

The porters of knowledge 2560

Linux【进程理解】

Linux【进程理解】

m0_59292239的博客 3145

Linux进程理解【进程认识】

Linux进程概念理解与创建操作详细讲解,干货满满!

cw412524的博客 238

Linux下进程的理解(一)

系统调用在使用上,功能比较基础,对用户的要求相对也比较高,所以,有心的开发者可以对部分系统 调用进行适度封装,从而形成库,有了库,就很有利于更上层用户或者开发者进行二次开发。操作系统对硬件管理的本质:先使用结构体将硬件组织起来,再通过数据结构将硬件管理起来,对下进行软硬件进行管理,对上提供一个良好的运行环境,用户不能直接跨过操作系统对硬件进行操作,操作系统提供了各种用户操作接口用,例如库函数等于用于进行开发和操作。通过观察,可以发现,每次启动进程的PID都是变化的,而PPID是不变的。

m0_75262940的博客 1207
上一篇: Linux 虚拟地址,逻辑地址,物理地址
下一篇: linux内核中断处理
LinuxWorking
博客等级 码龄10年 24粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值