进程、操作系统

文章目录

  • 一、冯诺依曼体系(Von Neumann Architecture)
    • 1. 概述
    • 2. CPU
  • 二、操作系统(Operating System)
  • 三、进程(process)/任务(task)

一、冯诺依曼体系(Von Neumann Architecture)

1. 概述

在这里插入图片描述

  • 分类

    • CPU 中央处理器: 进行算术运算和逻辑判断.
    • 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
    • 输入设备: 用户给计算机发号施令的设备.
    • 输出设备: 计算机给用户汇报结果的设备.
  • 针对存储空间:硬盘 > 内存 >> CPU

  • 针对数据访问速度:CPU >> 内存 > 硬盘

2. CPU

(1)如何衡量一个CPU的好坏
通过主频/频率(CPU的时钟频率),数值越大,CPU越好

  • 主频:CPU执行的每个操作的最小单位,称为“指令”,写的一个程序,往往里面包含很多指令,可以简单理解为,1Hz == 一秒钟能够执行1个指令,1.9GHz就是一秒钟能执行19亿条指令,有的指令需要消耗好几个Hz,但是大部分指令1Hz就够了
  • 主频是动态变化的,还可以通过给CPU加电压的方式提高主频

(2)与显卡的区别

  • 显卡的本质和CPU是一样的,CPU是“通用计算芯片”,GPU是“专用计算芯片”。CPU计算能力比GPU更强,能执行复杂的计算,但是CPU只有一个,显卡有很多个,且进行简单运算时很快。
  • 显卡是用来显示图形的,图形的显示需要大量且简单的计算,这种用CPU也能算,但是大材小用,用GPU算更加合适
  • 现在显卡也可以用于AI(也需要进行大量且简单的运算)

(3)寄存器(Register)

  • 存储
    • 是个存储数据的单位,是CPU的一部分
    • 寄存器存储空间更小,访问速度更快,成本更高,掉电后数据会丢失
      • 寄存器的速度和内存速度的差距极大,是3-4个数量级
      • 内存上现在有16GB,服务器上256GB,512GB也有,寄存器一般就几十个字节或者几百个字节,甚至连几kb都达不到
  • 用途:辅助CPU完成指令的执行,一条指令,不仅仅是指令本身,还包括操作数,操作数通常就是在寄存器中保存的

(4)缓存

由于寄存器和内存之间速度和空间上的差异太大,难以协调工作,所以CPU又引入了“缓存”来调和两者之间的速度和空间。比如CPU上要进行一系列运算,在运算过程中,要反复用到一组内存中的数据,这些数据要频繁使用,需要频繁访问内存,同时这些数据又比较多,在寄存器里存不下,这时候就可以放到缓存之中

  • 缓存的存储空间介于寄存器和内存空间,后由于寄存器和内存之前差距太大,CPU又搞了二号缓存、三号缓存……

在这里插入图片描述

二、操作系统(Operating System)

操作系统是一组做计算机资源管理的软件的统称。对下,要管理各种硬件设备,对上要给各种软件提供一个稳定的运行环境
目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
操作系统把硬件屏蔽起来,对软件这里提供出一组API(系统调用),让软件来调用,这样每个写软件的人,就不需要考虑硬件的差别和兼容性

在这里插入图片描述

三、进程(process)/任务(task)

作用:满足“并发编程”这样的需求,可以在多核心CPU的背景下,让应用程序中的代码可以把多个核心充分的利用起来,不至于一核有难,多核微观

1.概念

正在运行的程序

  • 同一个程序,执行多次,就可能会产生出多个进程,平时所说的程序,指的是一些exe的可执行文件,是静态的,得是把程序运行起来(双击,此时操作系统会把可执行文件中的数据和指令,加载到内存中,并且让cpu去执行这里的指令,完成一系列相关的工作),才能说是“进程”
  • 进程能够干活,说明进程能够消耗一定的硬件资源。可执行程序只是占用了硬盘空间,而进程,会消耗CPU资源、内存资源、硬盘、网络带宽
    • 比如下载操作,下载的是一个程序,是静态的,没法执行任何操作,但是安装就是真正运行起来,成为进程了
  • 进程是系统分配硬件资源的基本单位
  • java的生态不鼓励多进程编程

2.管理

当进程非常多的时候,就需要管理进程

(1)步骤

  • 先描述
    • 会使用一个专门的结构体(C语言的结构体,操作系统主要都是C/C++实现的,结构体就是一个低配的类), 叫PCB(进程控制块),这是通用叫法,各种系统用来描述进程的部分都可以称为PCB,来记录一个进程里面的各个属性
      • Linux中的PCB在源码中是一个task_struct结构体
  • 再组织
    • 使用一系列的数据结构,把多个进程进行一个有效的组织,随时方便进行遍历,查找,汇总数据……,LInux通常是使用双向链表把多个PCB结构体串起来来进行组织
      • 当使用双向链表来组织时
        • 查看进程的列表,本质就是在遍历这个链表
        • 创建一个进程,就是创建了一个PCB结构体,并且插入到链表上
        • 销毁一个进程,就是把这个PCB结构体从链表上删除并释放

(2)PCB里的信息

  • pid进程的标识
    同一个系统上,统一时刻中,每个进程的pid一定都是不同的。ps.有的时候,运行的一个exe文件,实际可能会涉及多个进程
  • 内存指针:表示了该进程对应的内存资源是什么样的
    • 里面最主要存储的就是从exe可执行文件中加载过来的指令和数据,还有一些运行过程中的中间结果之类的数据
      • 指令:二进制的指令,是程序员开发这个程序后最终编译生成的结果,也就是代码的逻辑,然后进一步的再交给CPU来执行。指令就是一个剧本,进程就是演员。
      • 数据:执行的这些指令会依赖到一些数据
  • 文件描述符表
    • 硬盘是硬件,应用程序一般是没法直接接触到“硬件”这一层的,于是操作系统抽象了“文件”这样的概念,应用程序操作的是文件,文件实际上是存储在硬盘上的。而“文件描述符表”就是记录当前这个进程正在使用哪些文件(fopen先打开,fread 再使用,fwrite,fclose最后关闭)
    • 操作系统打开一个文件,就会产生一个“文件描述符”(相当于是文件的身份标识,只在进程内部生效)
    • 会使用文件描述符表(类似于数组),把文件描述符组织起来

3.进程的调度和多核心CPU

每个进程想要执行里面的指令,完成对应的任务,都需要在CPU上执行。但是一台机器上只有一个CPU,同一时刻的进程却有很多个,为了解决这个问题,引入了进程的调度以及多核心的CPU

(1)多核心的CPU

  1. 早期的CPU都是单核心的,即一个CPU上只有一个场地,同一时刻只能让一个进程在里面运行。当单核心的集成程度没法提高时,工程师开始增加核心的个数。比如,双核CPU,一个顶俩。甚至超线程技术,让一个CPU的核心一个顶俩,即一个CPU核心是一个物理核心,相当于两个逻辑核心

  2. CPU只有一个,但是给进程提供的舞台不只有一个,现在的CPU都是多核心的

(2)进程的调度

  • 并行:同一时刻,两个进程,同时运行在两个CPU逻辑核心上
  • 并发:两个进程,在同一个舞台上,轮着上,由于CPU切换进程速度极快,微观上,这俩进程是串行执行的,宏观上,看起来这俩进程就是“同时”执行的。
  • 操作系统在调度这个进程的时候,可能是按照并行来的,也可能是按照并发的方式来的,在应用程序这一层,是感知不到的,只有在系统内核中能感知到,相当于下属只知道那天要自己当班,但是不知道具体是怎么安排的,安排的是专门的负责人。也因为宏观感知上都差不多,所以会有“并发”代替“并发”+“并行”

(3)PCB中关于进程调度相关的属性

这些属性也描述了进程对应的CPU资源的使用情况

  • 状态
    • 就绪状态:一个进程已经随时做好了在CPU上执行的准备
    • 阻塞状态/睡眠状态:有的时候,进程没有准备好被调度到CPU上
    • 状态是可以转换的,进程在系统中状态还有很多种,但是上述两种最关键
  • 优先级
    • 系统给进程进行调度的时候,并不是完全公平的,会根据优先级的不同,来决定时间分配的权衡,即把系统资源调配给更重要的进程
  • 上下文
    • 因为进程是轮着上的,如果一次运行不完,就需要保证下次上CPU运行的时候,能够读档,即实现存档和读档的效果。
    • 对于操作系统来说,所记录的上下文就是该进程在执行过程中,CPU的寄存器中对应的数据,这些寄存器有的是存一些中间结果,有的是存一些特定含义的数据(比如下一条指令是在哪里,当前的函数调用关系等),这些寄存器中的数据就需要在进程离开CPU之前,都保存好。下次该进程回到CPU执行,就可以把PCB中的上下文里的数据恢复到对应的寄存器中,这个时候进程就能实现“读档”的操作了
  • 记账信息
    • 相当于是一个统计信息,会统计每个进程在CPU上都执行多久了,执行了多少指令,是对进程的调度工作进行一个“兜底”(不让某一个进程排的时间太多或太少)

(4)虚拟地址空间

使用场景:每个进程都需要一定的内存资源,早期的操作系统就是直接把物理内存分配给进程(某块内存给哪个进程),但是一旦某个进程内部代码写出bug,内存越界访问了,就可能会影响到别的进程,为了解决这个问题,操作系统引入了“虚拟地址空间”这样的概念

在这里插入图片描述

  • 这样设定之后,每个进程的有效的虚拟地址,都是固定范围,进程使用该虚拟地址的内存,都需要操作系统进行转换成物理地址的过程,这个转换过程中,就可以针对虚拟地址是否有效作出一个校验
    • 校验:系统自动检查看是否出现非法的地址的使用,能够及时地通知这个进程,甚至直接让进程挂掉,避免影响到其他的进程,提高了整个系统的稳定性。
  • 在虚拟空间地址的加持下,进程具有了“独立性”,每个进程有自己的虚拟地址空间,一个进程无法直接访问,或者修改其他进程虚拟地址空间的内存,强化了系统的稳定性

(5)进程间通信

在进程隔离性的基础上,放松一点,让进程能够有限制的进行相互影响。本质上是:找一个公共的区域,多个进程都能访问到的区域,借助公共区域来完成数据的交换

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于图像切割计算轨迹相似度

目录 背景思路与核心代码数值实验优缺点分析参考文献 背景 在前面2文,我们分别讨论了利用夹角余弦来计算轨迹相似度和利用缓冲原理来计算轨迹相似度两种方法,前者可以作为一个baseline提供参考,后者的计算更符合人们的感官和事实&#xff0c…

【ES】笔记-Promise基本使用

笔记-基本使用 一、初始Promise1. 抽象表达:2. 具体表达:为什么要用 Promise?promise的基本流程 二、fs读取文件三、AJAX请求四、Promise封装fs模块五、util.promisify方法六、Promise封装AJAX操作 一、初始Promise 1. 抽象表达: 1. Promise 是一门新的技术(ES6 规范) 2. Pr…

性能提升3-4倍!贝壳基于Flink + OceanBase的实时维表服务

作者介绍:肖赞,贝壳找房(北京)科技有限公司 OLAP 平台负责人,基础研发线大数据平台部架构师。 贝壳找房是中国最大的居住服务平台。作为居住产业数字化服务平台,贝壳致力于推进居住服务的产业数字化、智能…

2023-9-2 染色法判定二分图

题目链接&#xff1a;染色法判定二分图 #include <iostream> #include <cstring> #include <algorithm>using namespace std;const int N 100010l, M 200010;int n, m; int h[N], e[M], ne[M], idx;int color[N];void add(int a, int b) {e[idx] b, ne[id…

文本标注技术方案(NLP标注工具)

Doccano doccano 是一个面向人类的开源文本注释工具。它为文本分类、序列标记和序列到序列任务提供注释功能。您可以创建用于情感分析、命名实体识别、文本摘要等的标记数据。只需创建一个项目&#xff0c;上传数据&#xff0c;然后开始注释。您可以在数小时内构建数据集。 支持…

Leetcode19 删除链表指定节点

思路&#xff1a;用列表保存链表&#xff0c;然后分情况讨论。 class Solution:def removeNthFromEnd(self, head, n: int):node_list[head]while head.next:headhead.nextnode_list.append(head)remove_loclen(node_list)-n#要移除的位置if len(node_list)1:return Noneif re…

Unity中Transform移动相关

路程 方向 * 速度 * 时间 参数一&#xff1a;表示位移多少 路程 方向 * 速度 * 时间 参数二&#xff1a;表示 相对坐标系 默认 该参数 是相对于自己坐标系的 相对于世界坐标系的 Z轴 动 始终是朝 世界坐标系 的 Z轴正方向移动 this.transform.Translate(Vector3.forwar…

matlab绘制局部放大图

ZoomPlot是一个交互式的matlab局部绘图库&#xff0c;其github仓库地址为 https://github.com/iqiukp/ZoomPlot-MATLAB。在使用库之前需要先将库下载到本地&#xff0c;可以直接添加到matlab的库中&#xff0c;也可以放在项目文件中直接使用。 简单使用 其实使用这个库只需要…

iOS开发Swift-2-图片视图、App图标-赏月App

1.创建新项目 点击File - New - Project。 选择Single View App&#xff0c;点击Next。 填写文件信息&#xff0c;点击Next。 选择文件位置&#xff0c;点击Create。 修改App显示名称为 “赏月”。 2.设置背景色 选择Main&#xff0c;点击View界面&#xff0c;选择右边属性&…

【数学建模竞赛】Matlab逻辑规则,结构基础及函数

逻辑基础 逻辑变量 在Matlab中&#xff0c;逻辑变量是一种特殊类型的变量&#xff0c;用于表示逻辑值。逻辑变量只有两个可能的值&#xff1a;true&#xff08;真&#xff09;和false&#xff08;假&#xff09;。在Matlab中&#xff0c;我们可以使用0和1来表示逻辑变量的值。…

go语言-协程

mOS结构体 每一种操作系统不同的线程信息 g给g0栈给g0协程内存中分配的地址&#xff0c;记录函数跳转信息&#xff0c; 单线程循环 0.x版本 1.0版本 多线程循环 操作系统并不知道Goroutine的存在 操作系统线程执行一个调度循环&#xff0c;顺序执行Goroutine 调度循环非常…

linux 下安装配置nexus

一、安装包获取方式 方式一 1、直接把下载好的安装包上传到服务器中 方式二 2、通过wget安装Nexus压缩包 ①、可以使用以下命令进行安装Nexus的最新版本 wget https://download.sonatype.com/nexus/3/latest-unix.tar.gz②、也可以点击官网复制想要下载的Nexus压缩包进行安装…

读word模板批量生成制式文件

文章目录 1、Maven依赖2、.docx或.doc格式的word模板准备3、读word模板&#xff0c;批量替换代码域&#xff0c;生成文件&#xff0c;demo4、结果展示 1、Maven依赖 <dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagre…

qt creater11 翻译国际化教程教程:

先出效果图。 闲聊几句&#xff1a;qt这个翻译很方便&#xff0c;能直接导出项目里所有文字。 具体步骤如下&#xff1a; 在Qt中&#xff0c;我们可以使用QTranslator类来实现多语言切换。以下是一般步骤&#xff1a; 1. 在你的源代码中&#xff0c;所有需要翻译的字符串都…

OpenGL-入门-BMP像素图glReadPixels(1)实现读取屏幕中间的颜色和获取屏幕上鼠标点击位置的颜色

glReadPixels函数用于从帧缓冲区中读取像素数据。它可以用来获取屏幕上特定位置的像素颜色值或者获取一块区域内的像素数据。下面是该函数的基本语法&#xff1a; void glReadPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *da…

Go实现LogCollect:海量日志收集系统【下篇——开发LogTransfer】

Go实现LogAgent&#xff1a;海量日志收集系统【下篇】 0 前置文章 Go实现LogAgent&#xff1a;海量日志收集系统【上篇——LogAgent实现】 前面的章节我们已经完成了日志收集&#xff08;LogAgent&#xff09;&#xff0c;接下来我们需要将日志写入到kafka中&#xff0c;然后…

【SpringSecurity】十二、集成JWT搭配Redis实现退出登录

文章目录 1、登出的实现思路2、集成Redis3、认证成功处理器4、退出成功处理器5、修改token校验过滤器6、调试 1、登出的实现思路 这是目前的token实现图&#xff1a; 因为JWT的无状态&#xff0c;服务端无法在使用过程中主动废止某个 token&#xff0c;或者更改 token 的权限…

【算法刷题-双指针篇】

目录 1.leetcode-27. 移除元素2.leetcode-344. 反转字符串3.leetcode-剑指 Offer 05. 替换空格4.leetcode-206. 反转链表5.leetcode-19. 删除链表的倒数第 N 个结点6.leetcode-面试题 02.07. 链表相交7.leetcode-142. 环形链表 II8.leetcode-15. 三数之和9.leetcode-18. 四数之…

python unitest自动化框架

以下举一个最简单的unitest实例&#xff0c;包含备注&#xff0c;自己拉取代码运行一次就知道原理了 import unittest import osclass TestSample(unittest.TestCase):classmethoddef setUpClass(cls) -> None:print(整个测试类只执行一次)def setUp(self) -> None:prin…

【python零基础入门学习】python基础篇之判断与for循环(二)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…