Linux进程线程管理

news2024/11/25 4:31:17

目录

存储管理

linux内存管理基本框架

 系统空间管理和用户空间管理

进程与进程调度 

进程四要素 

用户堆栈的扩展

进程三部曲:创建,执行,消亡

系统调用exit(),wait() 

内核中的互斥操作


存储管理

linux内存管理基本框架

 

 系统空间管理和用户空间管理

 

所以,对于系统空间而言,虚拟地址到物理地址的映射关系。给定一个虚拟地址x,其物理地址是x-PAGE_OFFSET,给定一个物理地址,起虚拟地址为x+ PAGE_OFFSET

 我们刚刚讲完段式映射和页式映射,怎么会有上面的虚拟地址到物理地址的映射关系呢?

其实这是一个单独设立的映射,只是对系统空间而言是这么管理的

而对于用户空间则还是进行段映射和页映射。

因为每个进程都是独自拥有自己的用户空间3G,系统空间却是所有进程共享的。

后面介绍页面管理中的页面换入,换出,分配,撤销,都是对用户虚拟空间进行,不考虑系统空间,因为系统空间已经创建,基本不存在换入换出问题(除进程控制块的创建与撤销)。

所以,这里就理解为系统空间的映射关系为虚拟地址到物理地址的映射关系,而用户空间的映射就是接下来我们要讲的段映射和页映射的全过程。

我们要讲的段映射和页映射的全过程。

  • 虚拟地址(存在于进程创建时系统分配的进程控制块中)通过段映射得到线性地址。
  • 线性地址通过页映射得到物理地址  
linux巧妙的忽略了段式管理的作用,而直接使用分页管理,具体的实现过程是这样的。将段地址描述结构中的基地址统一设置成0,这样虚拟地址就等同于线性地址,然后直接转换成物理地址

 

进程与进程调度 

相信学过操作系统的同学都知道进程这个概念,但肯定有一部分同学无法说清楚进程是什么,只知道进程是程序运行的一个实例。的确,在我学完操作系统课程之后,我依然无法说清楚进程是什么,直到我看了计算机系统这本书,我才有了一个概念,那就是进程不是什么,它是一个抽象的概念(文件其实也是一个抽闲的概念),一张图让我明白进程这个概念。

进程四要素 

然后此书上给出进程的四要素,让我对进程有了一个更深的理解
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之间就陷入了死锁,为了避免死锁,也提出了很说算法,其中最简单就是按序申请,或者一次性能拿到所有资源的进程才允许分配(如银行家算法)。
自旋锁:当不同的处理器访问临界资源时,其中一个处理器允许访问,那么另外一个处理器就必须等待,那么这是处理器干嘛呢,能不能做其他的事呢,对于自旋锁而言,另外一个处理器是什么都不做,一直在循环做无用功,看上去有那么点浪费,但也没办法,只能把处理器锁住。
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/346298.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

sql手工注入练习拿flag

sql手工注入练习拿flag 记录一下自己重新开始学习web安全之路⑤。 1、找注入点 ①url ②搜索框 ③登录框 2、找交互点 用单引号判断是否存在交互点,发现回显不正常,说明url存在有交互点 3、判断类型(char类型) 利用and 11 和…

Linux Shell脚本讲解

目录 Shell脚本基础 Shell脚本组成 Shell脚本工作方式 编写简单的Shell脚本 Shell脚本参数 Shell脚本接收参数 Shell脚本判断用户参数 文件测试与逻辑测试语句 整数测试比较语句 字符串比较语句 Shell流程控制 if条件判断语句 单分支 双分支 多分支 for循环语句…

第五章.与学习相关技巧—参数更新的最优化方法(SGD,Momentum,AdaGrad,Adam)

第五章.与学习相关技巧 5.1 参数更新的最优化方法 神经网络学习的目的是找到使损失函数的值尽可能小的参数,这是寻找最优参数的问题,解决这个问题的过程称为最优化。很多深度学习框架都实现了各种最优化方法,比如Lasagne深度学习框架&#xf…

Vue中使用天地图

Vue项目引入天地图 在vue的静态资源目录下的index.html中引入天地图的底图&#xff0c;开发天地图源码路径&#xff1a;天地图API 方法一&#xff1a;加载天地图&#xff0c;引用&#xff1a;public/index.html <script type"text/javascript" src"http:/…

来来来,手摸手写一个hook

hello&#xff0c;这里是潇晨&#xff0c;今天就带着大家一起来手写一个迷你版的hooks&#xff0c;方便大家理解hook在源码中的运行机制&#xff0c;配有图解&#xff0c;保姆级的教程&#xff0c;只求同学一个小小的&#x1f44d;&#xff0c;&#x1f436;。 第一步&#xf…

【软件测试】团队测试技术体现,遇到不可复现bug处理方式......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 测试技术带来的是PP…

ThingsBoard-规则链-check alarm status

1、概述 从今天开始,专门讲解ThingsBoard的规则链,每一个节点都会详细讲解,并且配套案例,让大家都能理解,喜欢请点个关注。今天讲的是筛选器的第第一个节点【check alarm status】,意思是检测告警状态。 2、节点理解 2.1、概述 【check alarm status】节点如图所示:…

解立方根-蓝桥杯

题目 分析 主要是运用二分法使复杂度减低。 代码 #include<iostream> #include<iomanip> #include<cmath> using namespace std; #define double long double const double eps 1e-12; int main() {int T 1;cin >> T;while (T--){double n;cin &g…

LMS 最佳实践:学习管理系统中的知识管理!

企业需要在整个组织中收集、存储和传播知识。我们被信息淹没了&#xff0c;因此应该充分利用学习管理系统&#xff08;LMS&#xff09;来组织业务资产并支持知识管理&#xff08;KM&#xff09;战略。LMS 不仅仅是一个捕获电子学习单元和多项选择题的系统。它很可能没有充分发挥…

代码随想录算法训练营第二十八天 | 491.递增子序列,46.全排列,47.全排列 II

一、参考资料递增子序列题目链接/文章讲解&#xff1a;https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1EG4y1h78v 全排列题目链接/文章讲解&#xff1a;https://programmercarl.…

从零学架构-基础部分

一、架构的基础将学习的架构设计知识总结出来&#xff0c;分享给大家。1.1什么是架构架构和框架是什么关系&#xff1f;有什么区别?Linux有架构&#xff0c;MySQL有架构&#xff0c;JVM也有架构&#xff0c;应该关注哪个架构&#xff1f;金融有架构&#xff0c;支付有架构&…

【排序算法】数据结构排序详解

前言&#xff1a; 今天我们将讲解我们数据结构初阶的最后一部分知识的学习&#xff0c;也是最为“炸裂”的知识---------排序算法的讲解&#xff01;&#xff01;&#xff01;&#xff01; 目录1.排序的概念及其运用1.1排序的概念1.2排序运用2.常见排序算法的实现2.1 插入排序2…

Java 基础面试题——集合

目录1.Java 有哪些常用容器&#xff08;集合&#xff09;&#xff1f;2.Collection 和 Collections 有什么区别&#xff1f;3.List、Set、Map 之间的区别是什么&#xff1f;4.HashMap 的长度为什么是 2 的 N 次方&#xff1f;源码中是如何保证的&#xff1f;5.HashMap 和 Hasht…

ChatGPT 下一步,分配对象脱单有望

ChatGPT 火了&#xff0c;上一次这么热闹还是上一次……那时最紧俏的概念叫元宇宙。 混沌时期&#xff0c;鱼龙混杂。资本市场靠新故事造梦&#xff0c;科技巨头争相加入竞赛&#xff0c;也有脑子活泛的已经利用它的巨大热度搞上了小钱钱——活跃在某宝某鱼上&#xff0c;贩卖…

2023版Java面试汇总!全面对标阿里P7,学完,化身offer收割机

最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;本文主要是为了帮大家快速回顾Java中知识点&#xff0c;这套&#xff08;详细笔记/面试题&#xff09;它几乎涵盖了所有的Java技术栈面试题和答案&#xff0c;相信可以帮助大家在金三银四&#xff0c;最短的时间内用作学习和面…

基于微信小程序的优选驾考小程序

文末联系获取源码 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7/8.0 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.3.9 浏览器…

SpringBoot查询接口传入参数为List,XML的写法

✉️ 查询业务 ➿ 目前互联网项目的诸多业务中数查询业务居多&#xff0c;而查询业务中又数展示类接口、报表类接口是我们接触最多的查询类接口。在实际项目中&#xff0c;不是全局查询数据就做完了业务&#xff0c;这样的需求也没有意义。条件查询因此作为最普遍的查询业务&am…

软件测试之优秀的产品质量评估模型的特征

产品质量评估中的几个场景&#xff1a; 场景1&#xff1a;项目计划的时间到了&#xff0c;就发布产品。 场景2&#xff1a;将缺陷修复率作为产品的质量目标。产品必须达到一定的缺陷修复率&#xff0c;才能发布。 场景3&#xff1a;我们为产品建立了很多指标来作为质量目标&…

报表开发工具FastReport .Net 如何在移动端生成Web报表应用?

FastReport .Net是一款全功能的Windows Forms、ASP.NET和MVC报表分析解决方案&#xff0c;使用FastReport .NET可以创建独立于应用程序的.NET报表&#xff0c;同时FastReport .Net支持中文、英语等14种语言&#xff0c;可以让你的产品保证真正的国际性。专业版和企业版包括Fast…

软件测试1-测试就是找茬游戏

软件测试是找茬游戏以前有一个很火的游戏叫《大家来找茬》&#xff0c;我玩这个游戏很厉害&#xff0c;在这个游戏中&#xff0c;两幅图中有几个不一样的地方&#xff0c;有些地方很明显&#xff0c;一眼就能看到&#xff0c;有的地方隐藏得比较深&#xff0c;要仔细看才能看清…