自己看的操作系统

news2024/11/28 4:29:17

计算机网络

  • 冯诺依曼体系
  • 进程线程
  • 内核和虚拟内存
  • os管理线程

冯诺依曼体系

计算机五大组成:输入设备、输出设备、控制器、运算器、存储器

进程线程

在这里插入图片描述
这些应用都是进程

在这里插入图片描述
进程相当于一个菜谱,读取到内存中去使用。
电脑一时间能运行很多进程。

进程中为什么要有线程:
在这里插入图片描述
因为一个非常简单的操作,比如在第四行和第三行之间打个回车这么简单的操作,同时是有多个操作在一起进行的
1.接收键盘上的事件
2.重新渲染页面之后显示出来
3.随时往硬盘中存储

这三个操作发生在同一个文档中,也就是同一个进程里面,最好是可以同时发生的。

线程是并行的最小单位,需要并行进行执行。
在这里插入图片描述
CPU是轮流过来执行的,就相当于是,一个妈妈,家里两个孩子,妈妈轮流往返于两个房间,给两个孩子讲题。
孩子等待讲题这个过程,就是就绪状态,因为我们就绪好了,等待你过来讲题,讲题这个过程就是运行状态。

线程空转状态:
线程向硬盘发送访问请求,相当于等待权限,这个时候线程就进入阻塞状态,相当于我在等待写的权限呢,线程阻塞住了。
在这里插入图片描述
等访问结果回来,我再顺利变成非阻塞状态,就会就绪状态。

有个跟确切的说法,一个人同时接到三个项目,三个项目的人都在催你,让你赶紧干,要进度。你只能干一会A,交个结果,干一会B交个结果,干一会C再去交个结果。项目等待被干的状态,就是就绪状态,被干时候就是运行状态,项目那边跑过去申请权限,等待权限回来的那个状态就是阻塞状态,由于手续不齐全原因,项目推动被阻塞住了,那就等手续下来之后再推动项目。

内核和虚拟内存

电脑或手机开机以后,上电跑启动代码,运行OS内核,内核里也有线程,这个我们把它叫做内核态。

内核启动以后, 内核将物理内存管理起来。内核提供虚拟内存管理机制给每个进程(应用程序App)内存服务。

它的思路是什么呢?每个进程(应用App) 都有自己的虚拟内存空间,注意这里的空间只是一个数字空间,没有划分实际的物理内存

这样做的好处是多个进程(应用App)内存都是独立的相互不影响,物理内存只有一个,多个进程(应用App)不会因为直接使用物理内存而冲突

那么OS是如何管理物理内存的呢?进程(应用App)需要内存的时候,OS分配一块虚拟内存(起点—终点),然后OS在从自己管理的物理内存里面分配出来物理内存页,然后通过一个MMU的单元**,将分配的虚拟内存与物理内存页映射起来,这样,读写虚拟内存地址最终通过映射来使用物理内存地址,**这样每个进程之间的内存是独立的,安全的。每个进程会把虚拟内存空间分成4个段(代码段, 数据端,堆,栈)
相当于先给一个分配方案,在分配方案商量妥当之后,再按照虚拟方案进行执行,在方案都没商量妥的时候就执行,很容易出现问题。

例如"在桌面上双击打开一个App", 桌面App程序会调用OS的系统调用接口fork,让OS 创建一个进程出来,OS为你准备好进程的结构体对象,将这个App的文件(xxx.exe, 存放编译好的代码指令)加载到进程的代码段,同时OS会为你创建一个线程(main thread), 在代码里面,还可以调用OS的接口,来创建多个线程,这样OS就可以调度这些线程执行了。

虚拟内存空间是进程的概念,那么线程如何使用的呢?各线程使用共享进程的代码段,数据段,堆,每个线程在进程的栈空间创建一个属于自己的栈空间。

线程们之间像是同事,一同推进一件事,因为需要共享资源和情报。

所以这样就得到一些结论如下:
每个线程共享进程的代码段内存空间,所以我们编写多线程代码的时候,可以在任何线程调用任何函数。

每个线程共享进程的数据段内存空间,所以我们编写多线程代码的时候,可以在任何线程访问全局变量

每个线程共享进程的堆,所以我们编写多线程代码的时候,可以在一个线程访问另外一个线程new/malloc出来的内存对象。

每个线程都有自己的栈的空间,所以可以独立调用执行函数(参数,局部变量,函数跳转)相互之间不受影响

os管理线程

OS会根据线程的优先级分配每次调度最多执行的时间片,这个时间一到,无论如何都要重新调度一次线程(也许还是调度到这个线程,这个不重要)。

除了时间片以外,线程会等待某些条件(磁盘读取文件,网卡发送完数据,线程休眠, 等待用户操作)这样也会把这个线程挂起,OS会重新找一个新的线程继续执行,只到挂起的这个线程的条件满足了,重新把这个线程放到可调度队列里面,这个线程又有机会被OS调度CPU核心来执行。

当我们打开电脑的任务管理器,**你会发现很多线程的CPU占有率为0%, 说明这些线程都由于某些条件而挂起了,**没有被OS调度。

每个线程“随时随地”都可能被OS中断执行,并调度到其它的线程执行。

OS是如何保证一个线程在调度出去后,再重新调度回来能继续之前的数据状态来执行呢?

也就是线程中,PC计数器(代表上次执行的位置)和栈是独立的。

这不得不让我想起一个形象的比喻,就是法官的案卷。
好几个案子,同时先后开庭,每次只推进一点,然后把推进的东西记到文书上,一个案子开庭之后,法官先去看文书了解上次判到哪里(相当于PC计数器),然后根据上次判决的文字记录(数据和代码),继续这次推进。

线程和进程,就像一个项目中的三个任务,三个任务都有人催要进度,A,B,C任务之间还存在相互依赖关系,比如A任务依赖B任务推进到X位置才能继续进行,B任务依赖C任务推荐都X位置才能进行,干工作的只有一个人,所以他必须推进一下A工作,然后就去推进B工作,然后再去推进一下C工作,轮流推进。三个工作共同属于一个项目,而内存空间是根据项目进行分配的,所以线程地址相同,共享大量数据,比如代码端,全局变量和堆(也就是对象)。线程之间是强调协作,共同完成动作的。
比如我们前面说的那个,读取键盘数据,渲染页面和写入硬盘,这些操作需要一同进行,一同推进,同协作完成任务。

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

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

相关文章

excel函数技巧:MAX在数字查找中的应用妙招

大家都知道VLOOKUP可以按给定的内容去匹配到我们所需的数据,正因为如此,它在函数界有了很大的名气。但是今天要分享的这三个示例,如果使用VLOOKUP去匹配数据的话,就有些麻烦了。就在VLOOKUP头疼不已的时候,MAX函数二话…

2022 年度总结

1、CSDN 年度总结 2022年的粉丝涨幅比较明显竟然超过了之前几年的总和,这是比较意外的。应该是因为今年研究了一些云原生、元宇宙的原因,方向比努力真的重要的多。 1500的阅读确实没想到~~~说明低头一族还是没白当 涨粉稍微明细,不过还需…

English Learning - L1-11 时态 + 情态动词 2023.1.9 周一

English Learning - L1-11 时态 情态动词 2023.1.9 周一8 时态8.4 完成进行时(一)现在完成进行时核心思维:动作开始于现在之前,并有限地持续下去,动作到目前为止尚未完成1. 动作从过去某时开始一直持续到现在并可能继…

【Python】如何使用python将一个py文件变成一个软件?

系列文章目录 这个系列文章将写一些python中好玩的小技巧。 第一章 使用Python 做一个软件 目录 系列文章目录 前言 一、第一步:写好文件 二、第二步:生成程序 1.安装库 2.使用安装的库进行转化 总结 前言 本文重点说如何将py文件转化为exe文件…

回溯法--符号三角形(杂记)

回溯法说来简单,写起来难,真的是要愁死。回溯法有两种模板--子集树、排列树5.4符号三角形--dfs计算多少个满足条件的符号三角形,同号下面为“”,异号下面为“-”。根据异或的规则我们令“”0,“-”1,(异或的…

postgresql 启用ssl安全连接方式

SSL的验证流程 利用openssl环境自制证书 CA 证书签发 创建私钥ca.key,使用des3算法,有效期2048天 openssl genrsa -des3 -out ca.key 2048生成根CA证书请求(.csr) openssl req -new -key ca.key -out ca.csr -subj "/CCN/STGuangDong/LGuangZhou…

Cloudflare免费版不支持cname解析解决办法

最近调整CDN,使用云盾CDN的话基本上节点都在国内,国外访问就比较难了,虽然我们的站国外用户基本没有,但作为一个有大抱负的站长,眼界必须得宽,必须得支持国外访问才行!说起国外免费CDN&#xff…

iOS开发之Code:-402653103,Code:5

问题一:Code:-402653103 Demo中添加了第三方库,然后运行Demo时,总是运行不起来,现象如下: 遇到这种问题常见的几种方式: 方式一:command shift K,清理Xcode缓存&…

常用的字符串与内存操作函数(1)

Tips 1. 2. 3. 在进行数值计算的时候,补码能算对,因此计算机里面放的都是补码,运算的对象都是补码 但是与真实数值吻合的是原码,因此打印,求值等都要转化为原码 4. for (exp1 ; exp2 ; exp3),是先…

从0到1完成一个Vue后台管理项目(十九、地图区域样式设置、区域文字和立体设置)

往期 从0到1完成一个Vue后台管理项目(一、创建项目) 从0到1完成一个Vue后台管理项目(二、使用element-ui) 从0到1完成一个Vue后台管理项目(三、使用SCSS/LESS,安装图标库) 从0到1完成一个Vu…

上半年要写的博客文章25

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

分享86个NET源码,总有一款适合您

NET源码 分享86个NET源码,总有一款适合您 链接:https://pan.baidu.com/s/1JOY-9pJIM7sUhafxupMaZw?pwdfs2y 提取码:fs2y 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下...,大家下载…

Blender里的三种绑定:(一)主从绑定

文章目录Blender里的三种绑定.主从绑定.进行物体绑定.进行顶点绑定.解除绑定.保持变换.无反向.进行晶格绑定.Blender里的三种绑定. 1 Blender中一共有三种绑定模式,分别是 主从绑定,约束,骨骼 主从绑定. 1 主从绑定即父子关系,…

【Spark常用算子合集】一文搞定spark中的常用转换与行动算子

🚀 作者 :“大数据小禅” 🚀文章简介:本篇文章属于Spark系列文章,专栏将会记录从spark基础到进阶的内容 🚀 内容涉及到Spark的入门集群搭建,核心组件,RDD,算子的使用&…

【数据结构与算法】——第六章:图

文章目录1、图的定义1.1 图的其他定义1.2 图的顶点与边之间的关系1.3 连通图相关术语2、图的存储结构2.1 邻接矩阵2.2 邻接表3、图的遍历3.1 深度优先遍历3.2 广度优先遍历4、最小生成树4.1 普利姆算法(Prim)4.2 克鲁斯卡尔(kruskal)5、最短路径5.1 迪杰斯特拉(Dijkstra)算法5.…

Sentinel限流-@SentinelResource注解配置

SentinelResource 配置-上 (按资源名配置限流规则) 1) Sentinel 控制台配置流控规则: 2)java 代码: GetMapping("/byResource")SentinelResource(value "byResource", blockHandler …

Django项目——通过APIView实现API访问

前提 该文章在已有项目的基础上进行修改 https://blog.csdn.net/qq_38122800/article/details/128583379?spm1001.2014.3001.5502 1、配置序列化器 序列化器包含序列化和反序列化两个过程,简单点理解就是 序列化 : 将从数据库中查的数据变为前端页面可以接受的json数据 反…

Odoo 16 企业版手册 - 库存管理之重订货规则

重订货规则 在Odoo 库存模块中,您可以配置一组规则,帮助您确保库存永远不会用完。Odoo将尝试使用重订货规则在您的库存中保持至少最低数量的产品。让我们看看此功能在Odoo 16中是如何工作的。为此,您可以从库存模块中选择一个可存储的产品。 …

qt学习记录

一、新建项目时只有pro文件而没有其他文件 此时需要在Kits界面将所有编译器选择,即可出现其他文件 二、QMainWindow、QWidget、QDialog的区别 ①QWidget继承于QObject和QPaintDevice,QDialog和QMainWindow则继承于QWidget,QDialog、QMainWi…

[ 数据结构 ] 弗洛伊德算法(Floyd)--------最短路径问题

0 Floyd算法介绍 和 Dijkstra 算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978 年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名弗洛伊德算法(Floyd)计算图中各个顶点之间的最短路…