<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 4》(8)
《Linux操作系统原理分析之Linux 进程管理 4》(8)
- 4 Linux 进程管理
- 4.4 Linux 进程的创建和撤销
- 4.4.1 Linux 进程的族亲关系
- 4.4.2 Linux 进程的创建
- 4.4.3 Linux 进程创建的过程
- 4.4.4 Linux 进程的执行
- 4.4.5 Linux 进程的终止和撤销
4 Linux 进程管理
4.4 Linux 进程的创建和撤销
4.4.1 Linux 进程的族亲关系
1、进程树
在系统加电启动后,系统只有一个进程,它就是由系统创建的初始进程,又称 init 进程。
Init 进程的任务结构体名字为 init_task。Init 进程是系统中所有进程的祖先进程,进程标识号 PID 为 1。
进程之间的父子关系
进程之间的兄弟关系:按照创建时间确定,先者为兄,后者为弟;
2、 Linux 进程的族亲关系
在每个进程的任务结构体中设置了 5 个成员项指针:
Struct task_struct *p_opptr /*指向祖先进程任务结构体指针*/
Struct task_struct *p_pptr /*指向父进程任务结构体指针*/
Struct task_struct *p_cptr /*指向子进程任务结构体指针*/
Struct task_struct *p_ysptr /*指向弟进程任务结构体指针*/
Struct task_struct *p_osptr /*指向兄进程任务结构体指针*/
在任务结构体中只有一个指向子进程指针,它指向该进程子进程中最年轻的一个,其他子进程通过兄弟关系指针与父进程的关系。
4.4.2 Linux 进程的创建
Linux 中,除 init 进程是启动时由系统创建的,其他进程都是由当前进程使用系统调用 fork()创建的。
👉子进程被创建后,通常要继承(共享)父进程所有的资源。包括虚拟存储空间的内容、打开的文件、专用的信号处理程序等。
👉写时拷贝(copy on write)技术:子进程和父进程共享同一个虚拟空间,只是这两个进程中某个进程需要虚拟内存写入时,这时才建立属于该进程的那部分虚拟空间,并把原虚拟空间的那部分内容拷贝到新建的虚拟内存区域中,然后在新建的属于自己的虚拟空间区域中写入信息。 这样既可以使子进程继承父进程的资源,又可以在需要时建立自己的存储空间,避免子进程存储空间的无谓浪费,有效地节省了系统时间。
👉 父进程和子进程在“分裂”后,运行时都在继续执行 fork()程序的代码。但是为了区分两个进程:父进程执行完 fork()时返回值是子进程的 PID 值;而子进程执行 fork()的返回值是 0。
#include <sys/typex.h>
#include <unisd.h>
Main()
{
Pid_t val;
Printf(“PID before fork():%d\n”,(int) getpid());
Val=fork();
If(val!=0)
Printf(“parent process PID:%d\n”,(int) getpid());
Else
Printf(“child process PID:%d\n”,(int) getpid());
}
程序执行结果:
PID before fork(): “此时父进程的 PID”
parent process PID: “此时父进程的 PID”
child process PID: “此时子进程的 PID”
fork()进程的“分裂”过程
4.4.3 Linux 进程创建的过程
Linux 中进程都是由当前进程使用系统调用 fork()创建的,而实际上是 fork()中进一步调用内核函数 do_fork()来完成的。Fork()的源代码定义在/kernel/fork.c 中。下面给出 do_fork()内核函数的主要功能:
1)在内存空间为新进程(子进程)分配任务结构体使用的空间,然后把当前进程(父进程)的任务结构体的所有内容拷贝到子进程的任务结构体中。
2)为新进程在其虚拟内存建立内核堆栈。虽然子进程共享父进程的虚拟空间,但是两个进程在进入核心态后必须有自己独立的内核堆栈。
3)对子进程任务结构体中的部分内容进行初始化设置,例如进程的链接关系(族亲关系)等,主要是与父进程不同的那些数据。
4)把父进程的资源管理信息拷贝给子进程,如虚拟内存信息、文件信息、信号信息等,前面说过,这里的拷贝是建立两个进程对这些资源的共享关系。
5)把子进程加入可运行队列中,由调度进程在适当的时机调度运行,也就是在这个时候,当前进程分裂为两个进程。
6)无论哪个进程使用 CPU 运行,都继续执行 do_fork()函数的代码,执行结束后返回它们各自的返回值。
从以上过程可以看出,do_fork()函数的功能首先是建立子进程的任务结构体和对其进行初始化,然后继承父进程资源,最后设置进程的时间片并把它加入可运行队列。
4.4.4 Linux 进程的执行
1、 系统调用 系统调用 exec()
在系统中创建一个进程的目的是需要该进程完成一定的任务,通过执行它实现所需的功能。在 Linux系统中,使进程执行的唯一方法是使用系统调用 exec()。
Exec()由多种使用形式,它们只是在参数上不同,而功能相同。下面介绍一种最常用的形式:
int execl(path,arg0,…,argn,(char*)0)
char *path,*arg0,…,*argn;
👉Path: 指出要执行的程序文件的完整路径名。
👉arg0: 指出要执行的程序文件的文件名。
👉Arg1,…,argn:程序的参数,这些参数的个数可以不同。
👉该系统调用将引起另一个程序的执行,故它成功调用后不需返回,只有在调用失败时,返回值 -1;
例:在程序运行中要执行 linux 命令“ls –l”,程序编制如下:
#include <stdio.h>
Main()
{
Execl(“/bin/ls”,”ls”,”-l”,0); /*调用成功,则执行 ls 命令*/
Printf(“can only get here on error/n”); /*出错时,返回该程序,显示错误信息*/
}
2.子进程执行新的程序
一个进程使用 fork()建立子进程后,让子进程执行另外一个程序的方法也是通过使用 exec()系统调用。程序的一般形式为:
Main()
{
Pid_t val;
Val =fork();
If(val!=0)
{
…….. /*执行父进程的语句*/
}
Else
{
exec(…..); /*执行程序*/
}
……..
Exit(1);
}
Linux 采用“写时拷贝”技术,所以子进程在创建时是共享父进程的正文段和数据段,但是在执行 exec()时,子进程将建立自己的虚拟空间,并把参数 arg0 制定的可执行程序映像装入子进程的虚拟空间,这是就形成了子进程自己的正文段和数据段。
4.4.5 Linux 进程的终止和撤销
进程终止的两种情况:
👉进程完成自身的任务而自动终止:方法 1,使用系统调用 exit()显示终止进程;方法 2,执行到程序的 main()的结尾而隐式地终止进程。
👉进程被内核强制终止:如进程运行出现致命错误,或者收到不能处理的信号时。
1、进程的终止 exit()
Linux 中终止进程是通过调用内核函数 do_exit()实现的,该函数定义在 kernel/exit.c 中。下面结合do_exit()函数的部分源代码对进程终止和撤销的过程说明如下:
1)函数首先设定当前进程的标志,即任务结构体的 flags 成员项设定为 PF_EXITING,表示该进程将要终止
Current->flags = PF_EXITING;
- 释放系统中该进程在各个管理队列中的任务结构体。
Del_timer(¤t->real_timer);/*从动态计时器系列中释放该进程的任务结构体*/
Sem_exit(); /*从 IPC 进程间通信的信号量机制中释放该进程的任务结构体*/
3)释放进程使用的各种资源。
Kerneld_exit(); /*释放内核*/
_exit_mm(current); /*释放虚拟空间*/
_exit_files(current); /*释放打开的文件*/
_exit_fs(current); /*释放 fs 结构体*/
_exit_sighand(current); /*释放信号*/
Exit_thread(); /*释放线程*/
4)把进程的状态设置为僵死状态。
Current->state = TASK_ZOMBIE;
5)把退出码置入任务结构体。
Current->exit_code =code;/*正常退出时,退出码为 0;异常退出时,为非 0 值,通常是错误编号*/
6)变更进程族亲关系。
Exit_notify();/*把要撤销的进程的子进程的父进程赋予 init 进程*/
7)执行进程调度,选择下一个使用 CPU 的进程。
Schedule();
相关文章:

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 4》(8)
《Linux操作系统原理分析之Linux 进程管理 4》(8) 4 Linux 进程管理4.4 Linux 进程的创建和撤销4.4.1 Linux 进程的族亲关系4.4.2 Linux 进程的创建4.4.3 Linux 进程创建的过程4.4.4 Linux 进程的执行4.4.5 Linux 进程的终止和撤销 4 Linux 进程管理 4.…...

RT-Thread STM32F407 PWM
为了展示PWM效果,这里用ADC来采集PWM输出通道的电平变化 第一步,进入RT-Thread Settings配置PWM驱动 第二步,进入board.h,打开PWM宏 第三步,进入STM32CubeMX,配置时钟及PWM 第四步,回到R…...

idea中把spring boot项目打成jar包
打jar包 打开项目,右击项目选中Open Module Settings进入project Structure 选中Artifacts,点击中间的加号(Project Settings->Artifacts->JAR->From modules with dependencies ) 弹出Create JAR from Modules&#…...
levelDB之基础数据结构-Slice
Slice是levelDB中用于操作字符串的数据结构,以字节为单位。 定义与实现 namespace leveldb {class LEVELDB_EXPORT Slice {public:// Create an empty slice.Slice() : data_(""), size_(0) {}// Create a slice that refers to d[0,n-1].Slice(const c…...
上位机模块之通用重写相机类
在常用的视觉上位机中,我们通常会使用单个上位机匹配多个相机或者多品牌相机,所以在此记录一个可重写的通用相机类,用于后续长期维护开发。 先上代码。 using HalconDotNet; using System.Collections.Generic;namespace WeldingInspection.M…...

机器人导航+OPENCV透视变换示例代码
透视变换又称四点变换,所以不能用于5边形这样的图形变换,不是真正的透视变换,但是这个方法可以把机器人看到的图像转换为俯视图,这样就可以建立地图,要不然怎么建立地图呢。 void CrelaxMyFriendDlg::OnBnClickedOk()…...

KofamScan-KEGG官方推荐的使用系同源和隐马尔可夫模型进行KO注释
文章目录 简介安装使用输入蛋白序列输出detail-tsv格式输出detail格式输出mapper格式 输出结果detail和detail-tsv格式mapper格式常用命令tmp目录 与emapper结果比较其他参数参考 简介 KofamScan 是一款基于 KEGG 直系同源和隐马尔可夫模型(HMM)的基因功…...

代码随想录算法训练营第五十五天丨 动态规划part16
583. 两个字符串的删除操作 思路 #动态规划一 本题和动态规划:115.不同的子序列 (opens new window)相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的。 这次是两个字符串可以相互删了,这…...
【Linux】kernel与应用消息队列的一种设计
Linux进程间通讯的方式有很多种,这里介绍一种通过消息队列的方式来实现kernel与APP之间的消息收发实现方式,这种方式特别适用于,kernel中发送消息,应用层收取消息。 消息队列设备驱动 该方法的设计思路即是创建一个消息队列的设…...

我们常说的网络资产,具体是如何定义的?
文章目录 什么叫网络资产?官方定义的网络资产网络资产数字化定义推荐阅读 什么叫网络资产? 通过百度查询搜索什么叫网络资产?大体上都将网络资产归类为计算机网络中的各类设备。 基本上会定义网络传输通信架构中用到的主机、网络设备、防火…...
WPF中可冻结对象
在WPF(Windows Presentation Foundation)中,"可冻结对象"指的是那些在创建之后可以被设置为不可更改状态的对象。这种特性允许这些对象更有效地被共享和复制,并且可以增加性能。 例如,Brushes,P…...

【人工智能实验】A*算法求解8数码问题 golang
人工智能经典问题八数码求解 实际上是将求解转为寻找最优节点的问题,算法流程如下: 求非0元素的逆序数的和,判断是否有解将开始状态放到节点集,并设置访问标识位为true从节点集中取出h(x)g(x)最小的节点判断取出的节点的状态是不…...

Kafka学习笔记(二)
目录 第3章 Kafka架构深入3.3 Kafka消费者3.3.1 消费方式3.3.2 分区分配策略3.3.3 offset的维护 3.4 Kafka高效读写数据3.5 Zookeeper在Kafka中的作用3.6 Kafka事务3.6.1 Producer事务3.6.2 Consumer事务(精准一次性消费) 第4章 Kafka API4.1 Producer A…...

Typora for Mac:打造全新文本编辑体验
Typora for Mac是一款与众不同的文本编辑器,它不仅拥有直观易用的界面,还融合了Markdown语法和富文本编辑的功能,为用户带来了前所未有的写作和编辑体验。 一、简洁明了的界面设计 Typora for Mac的界面简洁明了,让用户可以专注…...

TikTok与媒体素养:如何辨别虚假信息?
在当今数字时代,社交媒体平台如TikTok已经成为信息传播和社交互动的主要渠道之一。然而,随之而来的是虚假信息的泛滥,这对用户的媒体素养提出了严峻的挑战。本文将探讨TikTok平台上虚假信息的现象,以及如何提高媒体素养࿰…...

Spring Boot 中使用 ResourceLoader 加载资源的完整示例
ResourceLoader 是 Spring 框架中用于加载资源的接口。它定义了一系列用于获取资源的方法,可以处理各种资源,包括类路径资源、文件系统资源、URL 资源等。 以下是 ResourceLoader 接口的主要方法: Resource getResource(String location)&am…...

1688往微信小程序自营商城铺货商品采集API接口
一、背景介绍 随着移动互联网的快速发展,微信小程序作为一种新型的电商形态,正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而,对于许多传统企业而言,如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…...
QStatusBar开发详解
一、QStatusBar接口说明 QStatusBar 类是 Qt 中用于创建和管理状态栏的类。它继承自 QFrame 类,提供了在主窗口底部显示消息、进度等信息的功能。以下是一些 QStatusBar 类的重要接口: 1.1 QStatusBar构造函数 QStatusBar(QWidget *parent nullptr);…...

后端接口性能优化分析-程序结构优化
👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…...

【SpringBoot3+Vue3】三【实战篇】-后端(优化)
目录 一、登录优化-redis 1、SpringBoot集成redis 1.1 pom 1.2 yml 1.3 测试程序(非必须) 1.4 启动redis,执行测试程序 2、令牌主动失效(代码优化) 2.1 UserController设置token到redis 2.2 登录拦截器Log…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

【UE5 C++】通过文件对话框获取选择文件的路径
目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 ,这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器,右键点击 .uproject 文件,选择 "Generate Visual Studio project files",重…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

【笔记】AI Agent 项目 SUNA 部署 之 Docker 构建记录
#工作记录 构建过程记录 Microsoft Windows [Version 10.0.27871.1000] (c) Microsoft Corporation. All rights reserved.(suna-py3.12) F:\PythonProjects\suna>python setup.py --admin███████╗██╗ ██╗███╗ ██╗ █████╗ ██╔════╝…...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...
基于 HTTP 的单向流式通信协议SSE详解
SSE(Server-Sent Events)详解 🧠 什么是 SSE? SSE(Server-Sent Events) 是 HTML5 标准中定义的一种通信机制,它允许服务器主动将事件推送给客户端(浏览器)。与传统的 H…...