Linux进程线程管理
目录
存储管理
linux内存管理基本框架
系统空间管理和用户空间管理
进程与进程调度
进程四要素
用户堆栈的扩展
进程三部曲:创建,执行,消亡
系统调用exit(),wait()
内核中的互斥操作
存储管理
linux内存管理基本框架

系统空间管理和用户空间管理
所以,对于系统空间而言,虚拟地址到物理地址的映射关系。给定一个虚拟地址x,其物理地址是x-PAGE_OFFSET,给定一个物理地址,起虚拟地址为x+ PAGE_OFFSET
我们刚刚讲完段式映射和页式映射,怎么会有上面的虚拟地址到物理地址的映射关系呢?
其实这是一个单独设立的映射,只是对系统空间而言是这么管理的
而对于用户空间则还是进行段映射和页映射。
因为每个进程都是独自拥有自己的用户空间3G,系统空间却是所有进程共享的。
后面介绍页面管理中的页面换入,换出,分配,撤销,都是对用户虚拟空间进行,不考虑系统空间,因为系统空间已经创建,基本不存在换入换出问题(除进程控制块的创建与撤销)。
所以,这里就理解为系统空间的映射关系为虚拟地址到物理地址的映射关系,而用户空间的映射就是接下来我们要讲的段映射和页映射的全过程。
我们要讲的段映射和页映射的全过程。
- 虚拟地址(存在于进程创建时系统分配的进程控制块中)通过段映射得到线性地址。
- 线性地址通过页映射得到物理地址
进程与进程调度
相信学过操作系统的同学都知道进程这个概念,但肯定有一部分同学无法说清楚进程是什么,只知道进程是程序运行的一个实例。的确,在我学完操作系统课程之后,我依然无法说清楚进程是什么,直到我看了计算机系统这本书,我才有了一个概念,那就是进程不是什么,它是一个抽象的概念(文件其实也是一个抽闲的概念),一张图让我明白进程这个概念。
进程四要素
然后此书上给出进程的四要素,让我对进程有了一个更深的理解
1有一段程序供其执行,这段程序不一定是进程所专有,可以与其他进程公用
2有前面的“私有财产”,就是进程专用的系统堆栈空间。(系统空间不是独立的,任何进程不能直接改变系统空间的内容(除自身的系统堆栈空间))
3有“户口”,每一个进程都必须有一个task_struct数据结构,有了这个结构,才能成为内核调度的一个基本单位接收内核调度,这个结构记录着进程所占用的各项资源。
4有独立的用户空间,这部分是供进程独自占有的
然后,书中有这么一段话(帮助大家度进程和线程有一个了解):缺少上面的任何一条都不能称为进程,如果只具备前面3条,那就称为线程,如果完全没有用户空间,就称为“内核线程”,而如果是共享用户空间则称为“用户线程”。 但是,注意,不要把这里的“线程”与有些系统中在用户空间的同一进程内实现的“线程”相混淆。那种线程显然不拥有独立、专用的系统堆栈,也不作为一个调度单位接收内核调度。
其中系统空间堆栈用于分配下面2页内容

其中非常有必要介绍一下进程控制块task_struct数据结构,里面包含了一个进程各种信息,进程调度得以实现,绝大功劳归功于进程控制块
注意,系统空间堆栈的空间不像用户堆栈那样可以在运行时动态扩展,而是静态的确定了的。所以在中断服务程序,内核软中断服务程序以及设备驱动程序的设计中,应该注意不然这些函数嵌套太深。同时,这些函数也避免使用太多太大局部变量。
用户堆栈的扩展
越界访问其中一种情况——相应的页面目录项和页表项未空,也就是线性地址与物理地址的映射关系尚未建立,或者已撤销。
然后需要注意的是,在建立页面目录和页表项的同时,我们不光在内存上分配页面目录项和页表项,而且需要把虚存上的内容拷贝到内存页面上,即一页4K,但不一定是建立完全,可以慢慢来嘛,这也就是为什么那么多的进程可以同时运行在计算机上,当他们所占的内存总和大于内存实际大小时,操作系统同样能使其有条不紊的运行。这里举个例子,想象一下,比如要铺设从南昌到北京的火车轨道,需要最短的轨道长度是多少,答案不是两点线段最短,而是只需要火车的长度就行,因为我们可以拆东墙补西墙,理论上只要我们铺轨道的速度足够快的话,那么火车就好像一直行驶在轨道上了。
当用户进程申请扩展堆栈区间时,由于申请的部分还没建立页面映射,所以会产生一次缺页异常,然后建立页面映射,在内存分配页表,而且分配一部分必须的页面空间。
进程三部曲:创建,执行,消亡
linux操作系统,每一个进程的创建都需要父进程,复制出来的子进程有自己的task_struct(进程控制块)和系统空间堆栈,但与父进程共享其他所有的资源。
实际上,子进程通过fork(),clone()创建一个基于父进程一样的进程,他们之间的区别在于子进程继承父进程资源的多少问题,fork是完全继承,而clone是有选择性的继承。
其中继承的资源有,系统空间和用户空间,但是子进程有自己的进程控制块。好了,进程创建好了,可以开始执行么,显然,和父进程一样的子进程有何用,子进程必须得独立起来,
这就到第二步,子进程通过execve()加载自己的目标程序,然后子进程和父进程分道扬镳,走自己的路。
那么父进程呢,父进程有三种选择,
- 继续走自己的路,与子进程分道扬镳,如果子进程先于父进程“去世”,则有内核给父进程发一个报丧信号(若父进程没有收到,那么子进程就成立僵尸进程,需要init进程来处理)。
- 停下来进入睡眠,等待子进程结束后唤醒父进程。
- 父进程结束自己的生命,此时子进程就成了孤儿进程,全部都指向init作为自己的父进程,子进程结束后统一给init进程发信号。
系统调用exit(),wait()
exit()系统调用是用来结束一个进程,一个进程的结束,那么就必须得释放它生前所占有的资源,但是有部分资源是他自己不能主动释放的,必须交给父进程来处理,
还有两个关键问题
- 一个进程结束自己后,他的子进程就成孤儿了,它需要发送一个信号给它的所有子进程,然后修改子进程的父进程指针,统一指向init
- 一个进程结束自己后,它必须的通知它的父进程,最后给它收尸(获得一个信号,然后释放子进程结束后还占有的资源)
注意,
所谓的父进程有“生父”和“养父”之分,一个进程在创建之初其生父和养父是一致的,所以两个指针指向同一个父进程。
养父在运行时可以被短暂的改变,比如。debug能让我们跟踪进程的执行情况,被跟踪的进程同样成为子进程,主动跟踪的进程则为其养父进程,
如果一个进程在其子进程之前“去世”的话,就要把它的子进程托付给某个进程。托付给谁呢?如果当前进程是一个线程,就托付给同一线程组中的下一个线程,否则,就只好托付给init进程,
wait()调用可以说是进程同步的一个系统调用,因为之前讲过父进程的情况又三种,其中一种就是等待子进程结束,那么wait()系统调用就是这么一个作用,使自己进入睡眠,并进行一次进程调用操作,直到子进程结束后发送一个信号量唤醒父进程,重新让父进程挂入活动进程队列,参与进程调度。
内核中的互斥操作
如果一个进程进入了临界区A,而又企图进入另外一个临界区B的话,那就可能 因为进入不了那个临界区,也就是得不到所需的资源,而只好在B的队列中等待。那么,所等待的资源又在谁的手里呢?如果已经占有了那项资源的进程恰好也在A的队列中等待,那就发生了“死锁”
互斥操作的两种机制就是信号量和锁。
信号量一般用于解决进程间互斥问题,
锁则有很多种类,其中自旋锁常用于多处理器之间互斥操作
======
信号量: 简单的理解用信号量来表示某种资源(一般资源数大多为1),使用一次down一次,直到为0后就不允许使用,需要使用的进程都暂时进入睡眠状态,等其他进程使用完up一次后又资源可以使用后再唤醒因此资源而睡眠的进程,一次只能唤醒一个。
然后需要注意的一个问题就是当两个进程A,B分别申请资源a,b而进程A申请到a,进程B申请到了b,而彼此必须两者都拥有才能执行下次,那么AB之间就陷入了死锁,为了避免死锁,也提出了很说算法,其中最简单就是按序申请,或者一次性能拿到所有资源的进程才允许分配(如银行家算法)。
自旋锁:当不同的处理器访问临界资源时,其中一个处理器允许访问,那么另外一个处理器就必须等待,那么这是处理器干嘛呢,能不能做其他的事呢,对于自旋锁而言,另外一个处理器是什么都不做,一直在循环做无用功,看上去有那么点浪费,但也没办法,只能把处理器锁住。
相关文章:
Linux进程线程管理
目录 存储管理 linux内存管理基本框架 系统空间管理和用户空间管理 进程与进程调度 进程四要素 用户堆栈的扩展 进程三部曲:创建,执行,消亡 系统调用exit(),wait() 内核中的互斥操作 存储管理 linux内存管理基本框架 系统空间管理…...
分享111个HTML电子商务模板,总有一款适合您
分享111个HTML电子商务模板,总有一款适合您 111个HTML电子商务模板下载链接:https://pan.baidu.com/s/1e8Wp1Rl9RaFrcW0bilIatg?pwdc97h 提取码:c97h Python采集代码下载链接:采集代码.zip - 蓝奏云 HTML5家居家具电子商务网…...
百度前端必会手写面试题整理
请实现一个 add 函数,满足以下功能 add(1); // 1 add(1)(2); // 3 add(1)(2)(3);// 6 add(1)(2, 3); // 6 add(1, 2)(3); // 6 add(1, 2, 3); // 6function add(...args) {// 在内部声明一个函数,利用闭包的特性保存并收集…...
ubuntu 安装支持GPU的Docker详细步骤
安装依赖项 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common 添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerpr…...
usbmon+tcpdump+wireshark USB抓包
文章目录usbmon抓包及配合wireshark解析usbmon抓包及配合wireshark解析 usbmon首先编译为内核模块,然后通过modprobe usbmon加载到linux sys文件系统中 rootroot-PC:~# modprobe usbmon 而后 linux系统下安装 tcpdump rootroot-PC:~# apt-get install tcpdump…...
【LeetCode】剑指 Offer 04. 二维数组中的查找 p44 -- Java Version
题目链接: https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 1. 题目介绍(04. 二维数组中的查找) 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递…...
TDengine 3.0.2.5 查询再优化!揭秘索引文件的工作原理
TDengine 3.0 虽然对底层做了大规模的优化重构,但是相对于数据文件的工作逻辑和 2.0 相比是整体保持不变的。本系列文章的主旨在于帮助用户深入理解产品,并且拥有基本的性能调试思路,从而获得更好的产品体验。本期文章会在讲解 TDengine 时序…...
蓝牙耳机哪个品牌性价比高?性价比高的无线蓝牙耳机
现如今耳机已经十分普及,大多数人会随身佩戴蓝牙耳机,相较于传统耳机,无线耳机不仅携带方便,舒适度上也更加出色。不过市面上的无线耳机种类繁多,很多朋友不知道该如何挑选,所以小编特意整理了一期性价比高…...
python的disutils创建分发包
python中的distutils包主要用创建共享包,安装包,在平时安装python模块的时候,使用的命令如下: python setup.py install 其实以上代码就是distuitls包提供的功能,直接使用setup.py来进行安装一个包,在用这种…...
【洛谷】P1195 口袋的天空
明显看出为最小生成树,那么:难点在哪里呢?if(cntn-k)//******{flag1;break;}为什么是cntn-k呢而不是k呢?!!!解释:(如果每个已经连在一起了就不能分开,不管多少…...
JavaScript高级程序设计读书分享之3章——3.5操作符
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 目录 操作符 一元操作符 递增/递减操作符 一元加和减 布尔操作符 逻辑非 逻辑与 逻辑或 乘性操作符 乘法操作符 除法操作符 取模操作符 加性操作符 加法操作符 减法操作符 关系操作符 相等操…...
moveToCoordinateF3DconcatenateRotations
moveToCoordinate 演示视频: 注意:前提是3~6轴机器人机构且不是PickAndPlace 该方法_3D。Poses.moveToCoordinate 移动由 指定的对象,该对象 对应于支持的机器人配置之一,只要标识的机器人配置支持,其第一个动画指向指定坐标和指定旋转。这无需您定义姿势即可工作。 工…...
多线程面试题开胃菜6(5道)
一、Fork/Join 框架是干什么的?大任务自动分散小任务,并发执行,合并小任务结果。二、线程数过多会造成什么异常?线程过多会造成栈溢出,也有可能会造成堆异常。三、说说线程安全的和不安全的集合。Java 中平时用的最多的…...
植物大战 List——C++
这里写目录标题vector和stirng的细节对于stringlist的使用list的迭代器反向迭代器构造函数关于list::sort的排序uniquelist的底层模拟实现结点类的实现迭代器模拟实现list实现插入的实现迭代器失效inserterase析构函数拷贝构造赋值构造函数vector和stirng的细节 复习vector的深…...
安灯(andon)系统是车间现场管理的必备工具
安灯(andon)系统应用越来越广泛,不单单局限于汽车行业,更多生产型企业意识到了提高工作效率的重要性,提高工作效率根本的能提高生产水平,提高产量,而且安灯(andon)系统不…...
Hazel游戏引擎(004)
本人菜鸟,文中若有代码、术语等错误,欢迎指正 我写的项目地址:https://github.com/liujianjie/GameEngineLightWeight(中文的注释适合中国人的你) 文章目录前言操作步骤讲解GitHubHazel项目此项目定位项目属性修改Sand…...
【CS224W】(task4)图嵌入表示学习
note node2vec: 计算随机游走概率从节点uuu开始模拟rrr条长度为lll的游走链路使用 Stochastic Gradient Descent 优化损失函数 Node2vec在节点分类方面表现更好;而其他方法在链路预测上效果更好,如random walk效率更高;graph emb…...
分享111个HTML医疗保健模板,总有一款适合您
分享111个HTML医疗保健模板,总有一款适合您 111个HTML医疗保健模板下载链接:https://pan.baidu.com/s/1YInaQDnUVsXYtMh1Ls-BHg?pwdxvfc 提取码:xvfc Python采集代码下载链接:采集代码.zip - 蓝奏云 import os import shuti…...
山东大学2022操作系统期末
接力:山东大学2021操作系统期末 2022—2023山东大学计算机操作系统期末考试回忆版 简答题(4 10 points) (1)用户态,核心态是什么 (2)这种区分对现代操作系统的意义 (3)printf(“…...
Hadoop高可用搭建(一)
目录 创建多台虚拟机 修改计算机名称 快速生效 修改网络信息 重启网络服务 关闭和禁用每台机的防火墙 同步时间 安装ntpdate 定时更新时间 启动定时任务 设置集群中每台机器的/etc/hosts 把hosts拷贝发送到每一台虚拟机 配置免密登陆 将本机的公钥拷贝到要免密登…...
告别繁琐组态:用SVG + JavaScript 5分钟为你的工业设备创建可交互HMI组件
工业设备HMI组件开发革命:5分钟用SVGJavaScript打造智能交互界面 在工业自动化领域,人机界面(HMI)是连接设备与操作者的关键纽带。传统HMI开发往往陷入两个极端:要么使用笨重的组态软件进行繁琐配置,要么投入大量时间开发定制化界…...
STM32 GPIO八种配置模式详解:从推挽输出到模拟输入实战指南
1. 项目概述:从“点灯”到“通信”,GPIO配置是嵌入式开发的基石如果你玩过STM32,哪怕只是点个灯,也一定和GPIO打过交道。但很多人对GPIO的理解,可能就停留在“输出高电平灯亮,输出低电平灯灭”的层面。实际…...
终极指南:如何用FFXIV TexTools模组管理器轻松定制最终幻想14外观
终极指南:如何用FFXIV TexTools模组管理器轻松定制最终幻想14外观 【免费下载链接】FFXIV_TexTools_UI 项目地址: https://gitcode.com/gh_mirrors/ff/FFXIV_TexTools_UI FFXIV TexTools模组管理器是《最终幻想14》玩家社区中最强大的外观定制工具ÿ…...
ARM项目模板在嵌入式开发中的高效应用
1. ARM项目模板在嵌入式开发中的核心价值在嵌入式系统开发领域,ARM架构处理器凭借其优异的功耗性能比占据着主导地位。作为开发者,我们经常面临这样的困境:每个新项目都要重复搭建基础框架,配置编译工具链,设置调试环境…...
codex出现Reconnecting和stream disconnected before completion:stream closed before response.complete解决方案
大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...
开源物联网网关openclaw-gateway:架构解析与本地化智能家居部署实践
1. 项目概述与核心价值最近在折腾一些物联网和智能家居项目,发现一个挺有意思的东西,叫openclaw-gateway。这名字听起来有点“机械感”,claw是爪子,gateway是网关,合起来像是一个“开放爪子的网关”。乍一看可能有点摸…...
递归的终极形态:彻底搞懂尾递归优化 (TCO)
🔄 递归的终极形态:彻底搞懂尾递归优化 (TCO) 🤔 为什么普通递归会“爆栈”? 在理解尾递归之前,先看看普通递归发生了什么。 通俗比喻: 想象你在玩一个“传话游戏”,需要计算 1 2 3 ... n…...
OpenCore Legacy Patcher技术揭秘:4步实现老旧Mac硬件兼容性修复与系统升级
OpenCore Legacy Patcher技术揭秘:4步实现老旧Mac硬件兼容性修复与系统升级 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 在苹果生态系统中&…...
会话包装器设计:提升API连接弹性与可观测性的工程实践
1. 项目概述:一个被低估的会话管理利器如果你经常和API打交道,尤其是那些需要维护会话状态的服务,肯定遇到过这样的烦恼:每次请求都要手动处理token、处理重连逻辑、管理超时和重试,代码里到处都是重复的胶水代码。更头…...
Arm CADI 2.0调试接口架构与多调试器协同实践
1. CADI接口调试架构深度解析在嵌入式系统开发领域,调试接口的设计质量直接影响着开发效率。CADI(Component Architecture Debug Interface)作为Arm推出的标准化调试接口,其2.0版本通过创新的架构设计解决了传统调试方案中的诸多痛…...
