当前位置: 首页 > news >正文

线程的执行

承接上文CPU原理简介

程序的执行是由控制器发信号推动整个程序一步一步向前走,将数据存储在寄存器,从程序计数器中获取指令,比如先把3放到寄存器,再把5放到寄存器,再做一个加法,加法就是一个指令,从二进制的角度它也是01构成。

QQ.exe从硬盘读到内存里,内存里面装的全是二进制01,一个程序放到内存里面完全是由二进制01构成。

如何区分二进制01是指令还是数据?

二进制01可以把它看成一个指令,比如add指令,也可以看作是数据,比如5,如何区分这个二进制是指令还是数据?这是由IO Bridge(总线)来控制的,总线是从内存到CPU之间的一条数据线路。

总线分3种类型:控制线、地址线、数据线;从地址线读过来的就是地址,从控制线读过来的就是指令,从数据线读过来的就是数据。

地址线是由cpu中专门的地址寄存器来控制的,通过地址线去寻找地址,比如读到的是0101地址就去读取0101地址区域内存储的数字, 这个数字只要通过控制线过来的,就是指令加法,如果是数据线过来的就是数据5。

各干各自的事情,就看从哪里读过来的。

地址线是一个寻址的线,QQ.exe这个程序放到内存之后,它一定会放到内存的某个地址上,比如这个地址是3号地址,在3号地址的起始位置是main方法,在起步的位置一定会放一条指令,操作系统会通知cpu,你去读3号地址,先把指令读过来,读过来指令如果是add,它就会通知地址线,再把后面的2个数字都读过来,读到寄存器,然后计算单元开始做add计算,计算完了之后,存到某个寄存器,然后再写回内存。

QQ.exe双击之后放到内存里,一定会放到内存的某个地址上,比如内存地址从1号到1万号这么多的地址,比如把QQ.exe放3号地址,整个程序占用从3号到2000号地址区间,最开始的号一定是main方法所占的,最开始读的时候从3号地址开始读,操作系统通知cpu,我现在要运行一个程序,这个程序从3号到2000号,你现在帮我运行它,从3号地址开始读一条指令过来,所以通过控制总线读过来一条指令,这条指令是add,add指令的执行是需要数据的,需要2个数字相加,接下来操作系统会告诉你去哪个位置,比如去4号位置、5号位置去把那2个数字读过来,放到寄存器。将数据放到寄存器之后,运算单元去运算,运算完了之后,把结果放到某个寄存器,再把它写回到内存中的某个位置去,每个程序都有自己的地址空间,从虚拟内存到真正放到物理内存的时候需要做一个地址的映射。

一个程序的执行,首先把可执行文件放到内存,找到起始位置即main开始的地址,进行读取指令和数据,进行计算并写回内存。

什么是线程?什么是进程?

最开始的进程只能执行一个程序 ,必须等我把这个程序执行完,其他程序才可以执行。最开始的计算机只有一个cpu、一个计算单元,让它做程序的计算。先把自己的程序写到闪存卡上,插上去,按下按钮,计算机开始执行,计算机执行这个程序的时候,决对不会执行另外一个闪存卡,这个时候是单任务的。

执行3+5这段代码叫一个任务,这个任务放到计算机执行,只要它放到内存里面就称之为一个进程,只要有一个程序进入内存就可以称为一个进程;进程的概念反映到内存里,一个程序进入内存被称之为进程。

一个程序可以跑多个进程吗?

一个QQ.exe是可以运行多份的,一个程序本身是可以有多个进程的。

内存中的2个进程对应的程序是一个,随着程序的越来越复杂,人们发现不可能同时只一个进程。

2张闪存卡,就会有2个进程,但只有一个计算单元怎么能同时计算2个程序?

分时间计算即时间分片,同一个进程里面也可能要求2个不同的任务同时执行,比如一个带图形的界面,输入数字,服务端做计算,也要响应用户的输入,也可能正在接受网络传输的数据,即有多个任务在同时进行。

同一个进程内部有多个任务并发执行的需求,比如一边计算、一边接受网络数据、一边刷新界面,需要设计一种机制同时并发的运行,能不能把原来的一个进程分成3个进程?其实没有必要引入线程的概念,完全用多进程就行了,但进程有个严重的问题:每个进程都有自己地址空间,进程之间有同步和共享数据的过程,很容易出现一件事情,写我自己进程的时候很容易把另外的进程搞死,到此终于发明了线程。

多线程执行多个任务只使用了计算单元,并没有自己具体的地址空间,如果这3个任务想去访问数据的话,访问的是进程里面的同一份空间的数据即共享进程的空间,但是并不共享计算。

进程是静态的概念,一个程序只要放到内存,分配对应的资源主要是内存空间;线程是动态概念,可执行计算任务。

第一个进程进入内存之后,都会对应一个主线程,进程是分配资源用的,分配的资源是和存储、文件、网络相关的,最主要的是空间资源,进程都有自己的空间,线程是共享进程的空间。

多个线程访问的进程中的同一份数据,就会产生并发的问题。

线程是一条一条指令执行的,数据在进程里。协程是用户级别的线程。

为什么同一个代码可以被多个线程所执行?

线程是可执行的计算单元,做任务计算;

这颗cpu或这个计算单元正在执行这段代码,另外一个cpu正在执行的也是这段代码,2个线程,同一份代码即同一份指令,同一份指令怎么可以有多个线程在执行?

虽然是同一份指令,但有可能里面的数据是不一样的,每次执行参数都是不一样的,比如递归,第一次入参是n,第二次入参是n-1,即便参数是一样的,也可以同时执行2次,这里就会牵扯到线程切换的问题,

cpu正在执行t1,t1有它自己的指令和数据,这些数据是需要放到寄存器的,在t1没有执行完的时候,比如10多毫秒的时间片到了,切换到t2,t2执行完回来又轮到t1,t1不需要从头开始执行,要把t1执行到哪里了给记录下来,保存好上下文;t1执行到了哪条指令以及t1在寄存器是什么状态,全部放到一个缓存里,这个缓存是位于整个进程空间的,这叫保存现场,这就是线程切换的过程,但缓存宕掉了就会丢失,简单的理解为存储到了内存里,严格来讲是存到了锁存器中。

线程的切换,需要保存上下文(保存现场),是不是线程数量越多,执行效率越高?

一个线程正在等待网络的输入,但网络还没有输入,只有一个线程一个cpu的情况下就等着?这个时候显然需要把你的计算资源切换给其他人使用,所以中间有个切换的过程,10个线程可以切换,若有1万个活着的线程,操作系统必须保证每个线程都有时间来执行,不然就不叫活线程了 ,那就会把整个线程资源全部耗在线程切换上了。

对于一个程序或一个线程池设置多少个线程合适?线程池设定多少核心线程?

比如有1颗cpu,如果一个线程有50%的时间做计算,剩下的50%的时间等待着网络的输入和输出,在一颗cpu的情况下,多少个线程可以充分利用好这个cpu,答案是2个线程,在这个线程50%的时间计算完等待网络输入和输出的时候切换给另外一个线程使用。

根据线程等待的时间和计算时间的比值来计算所需的线程数,这里有一个理论上的计算公式,

Ucpu是期望cpu的利用率,比如期望cpu利用率是100%;

100% * (1+50% / 50%)=2个线程,1颗cpu 2个线程,2颗cpu就是4个线程。

当然这是理论,但实际中不能精确的计算出来多少时间做计算多少时间做wait ,最终还是要压测做决定。

这里面有个理想的情况 ,整个机器都被我这个进程所使用,其他进程不用,但是操作系统自己也有线程,其他正在跑着的程序自己也会有线程,那肯定会影响我这个进程,所以理论计算的结果会有一些偏差,实际中肯定是要做压测,可以通过理论计算出来一个初始值,比如10,将线程数设置为10个来做压测,看看是否达到期望值,再根据实际做调整。

相关文章:

线程的执行

承接上文CPU原理简介程序的执行是由控制器发信号推动整个程序一步一步向前走,将数据存储在寄存器,从程序计数器中获取指令,比如先把3放到寄存器,再把5放到寄存器,再做一个加法,加法就是一个指令&#xff0c…...

【视频】海康摄像头、NVR网络协议简介

1、软硬件整体架构 2、涉及的网络协议 3、协议简介 3.1 海康私有协议 设备发现SADP:进行设备的发现、激活、修改网络参数、忘记密码等; SDK:4200、系统平台的接入前端设备,协议不对外开放,但对外提供接口库; ISAPI:Intelligent Security API(智能安全API),基于HTTP传输…...

【Spring的事务传播行为有哪些呢?Spring事务的隔离级别?讲下嵌套事务?】

如果你想寻求一份与后端相关的开发工作,那么关于Spring事务相关的面试题你就不能说不会并且不能不知道? 人生如棋,我愿为卒,行动虽慢,可谁曾见我后退一步? 一.Spring中声明事务的方式 1.1 编程式事务 编程…...

其实一点不难学会这三步一定让你学会制作一个『3D建模』大屏

上次已经教过大家怎样制作一个简单的2D数据可视化大屏~那有一些朋友们就会说那些炫酷的3D可视化大屏是怎样制作的呢?这不就来了,今天就教大家怎样用山海鲸可视化软件制作一个带3D建模的可视化大屏,并且最重要的是无需会特别复杂的3D建模知识。…...

【C++】C++的内存模型之四大分区

程序的内存模型 C程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的全局区:存放全局变量和静态变量以及常量栈区:由编译器自动分配释放,存放函数的参数值&…...

Vue跨级通信(重点)

当不使用Vuex的前提下,子孙传递就得使用另外一种办法:provide 和 inject 总结:provide / inject 类似于消息的订阅和发布。- inject接收数据。- provide提供或发送数据,(1)provide(name&#xf…...

支付系统中的设计模式07:责任链模式

最近公司业务的发展果然如老板当初所画(预)饼(言)的那样红(恍)红(恍)火(惚)火(惚),蒸蒸日上,每天的流水都在不断攀升到新的高度,有不少人都从公司开发的电商平台挣到了钱。 不过问题也接着来了——运营部门经过老板的同意,也学着产品经理提出了下面几项非常合理…...

期末综合考试

一、概率论1、全概率公式、贝叶斯公式应用2、期望、方差、协方差的定义以及性质证明(1) 期望(2) 方差(3) 协方差二、数理统计1、参数估计(1) 矩估计(2) 最大似然估计(3) 综合例题一、概率论 1、全概率公式、贝叶斯公式应用 记住标黄的两段,上考场直接套数据&#x…...

数据结构与算法之爬楼梯动态规划

一.题目(爬楼梯)假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1:输入: 2输出: 2解释: 有两种方法可以爬…...

CleanMyMac4.12最新Mac电脑系统垃圾清理神器

CleanMyMac是Mac一款神器,特别是清理已卸载软件残留垃圾文件信息库比较全面。 clearmymac以极其快速和时尚的方式为您提供及时的建议,组织,更新和保护您的Mac。完全支持macOS 11(Big Sur)操作系统;它以其简…...

数据治理如何做?火山引擎 DataLeap 帮助这款产品 3 个月降低计算成本 20%

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 本文讲述字节跳动一款 App 产品的数据治理故事。该产品随着用户体量和数据体量不断增长,数仓的任务量、数据量也不断攀升,运维难、成本贵、稳…...

求职3个月,简历大多都石沉大海,一听是手工测试都纷纷摇头....太难了

距离被上家公司裁员已经过去了3个月了,3个月的求职经历真的让我痛不欲生,我也从中理解感叹到了很多,想写出来,告诫跟我一样的经历的人。 我今年26岁,大学是一所普通的大专,学的是机电专业,如何…...

Visual Studio快捷键汇总

常用快捷键CtrlEC 注释代码CtrlEU 取消注释代码CtrlED 格式化全部代码CtrlShiftA 新建类CtrlRG 删除无效UsingCtrlH 批量替换CtrlG 跳转到指定行CtrlEE 在交互窗口中运行选中代码(很实用)AltEnter 快速引用shiftF9 监控(代码运行时)shiftF6 生成(当前类库)F6 生成(整个解决方案…...

ctf pwn基础-2

今天学了一个保护的绕过,这里讲一讲,这个好像是使用的是格式化字符串漏洞。 目录 基础 实例讲解 基础 首先我们要知道什么是canary保护,就是在入栈EBP以后加一个Canary 我可能讲的不是很好,大家可以看看这些 文章 用通俗一点将就…...

从一个SQL打印全年日历漫谈数据仓库中时间操作场景的重点写法

文章目录前言一、我如何快速确定今年是否是闰年的😣二、 我如何从DATE类型数据获取年、月(月初&月末)、周、日、时、分、秒信息🤯三、我如何快速查到本月月初第一周的周一和本月最后一周周一是在几号😑四、我如何快速确定每个季度的开始和…...

Java跳槽涨薪之路-想学Java的赶紧上车了

前言Java 是近 10 年来计算机软件发展过程中的传奇,在很多开发者心中的地位可谓“爱不释手”,与其他一些计算机语言随着时间的流逝影响也逐渐减弱不同,Java 随着时间的推移反而变得更加强大。按应用范围,Java 可分为 3 个体系&…...

MyBatis解析全局配置文件

目录 MyBatis介绍 传统JDBC和Mybatis相比的弊病 传统JDBC的问题如下 mybatis对传统的JDBC的解决方案 Mybaits整体体系图 使用大致过程 MyBatis 源码编译 源码解析 配置文件解析 读取配置文件 返回SqlSessionFactory 配置文件内容 解析的核心方法 解析出来的对象 …...

37-Golang中的封装

封装介绍 封装就是把抽象出的字段和对字段的操作封装在一起,数据被保护在内部,程序的其他包只有通过被授权的操作(方法),才能对字段进行操作 封装的理解和好处 1.隐藏实现细节 2.可以对数据进行验证,保证安全合理 如何体现封…...

Python Pytorch开发环境搭建(Windows和Ubuntu)

Python Pytorch开发环境搭建(Windows和Ubuntu) 目录 Pytorch开发环境搭建 1. 安装cuda cudnn (1)Windows安装方法 (2)Ubuntu18.04安装方法 2. 安装Python(推荐使用Anaconda) (1)Windows安装方法 (2)Ubuntu18.04安装方法 3. Pytorch安装 4. 安装…...

多种方法进行去基线处理

目录detrend函数去除基线多项式拟合原函数BEADS 基线处理小波算法经验模态分解(EMD)参考detrend函数去除基线 detrend函数只能用于去除线性趋势,对于非线性的无能为力。 函数表达式:y scipy.signal.detrend(x): 从信号中删除线…...

二叉树——最大二叉树

最大二叉树 链接 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…...

【Redis】Redis 的过期策略以及内存淘汰机制详解

Redis 的过期策略以及内存淘汰机制详解1. Redis 的过期策略1.1 如何设置 key 的过期时间?1.2 key 设置且到了过期时间后,该 key 保存的数据还占据内存么?1.3 Redis 如何删除过期的数据1.3.1 定期删除1.3.2 惰性删除2. Redis 的内存淘汰机制2.…...

边缘云是什么?

涂鸦边缘云服务 旨在解决物联网边缘位置的连接需求和提高设备自主管理能力。并与涂鸦 IoT 云服务和 IoT 终端形成云边端三位一体的端到端产品架构。使用涂鸦边缘云,能极大降低设备响应延时、降低网络带宽压力、提高算力分发能力,并构建以下技术优势&…...

Java常用数据结构

Java常用数据结构 Java中有几种常用的数据结构,主要分为Collection和map两个主要接口(接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。 一、几个常用类的区别 1&#xff0e…...

【Java基础 下】 026 -- 集合进阶(不可变集合、Stream流、方法引用)

目录 一、不可变集合 1、创建不可变集合的应用场景 2、创建不可变集合的书写格式 ①、不可变的List集合 ②、不可变的Set集合 ③、不可变的Map集合 3、小结 二、Stream流 1、体验Stream流的作用 2、Stream流的思想 3、Stream流的使用步骤 ①、单列集合获取Stream流 ②、双列集合…...

SAP 跨工厂或特定工厂的物料状态设置

在物料主数据的Basic data 1 View和MRP1 View可分别设置“跨工厂物料状态(X-plant matl status)”和“特定工厂的物料状态(Plant-sp.matl status)”。 通过对物料状态的设置,可实现对物料使用范围的限制。 例:在采购中不可用;在库存管理中不…...

jupyter的安装步骤

1.安装python文件 首先去官网python去下载python的安装包,点击donwload,选择合适的系统。这里我是windown系统,点击进去,如图找到有installer的去下载。不建议下载最新版本的,会有兼容问题。 2.安装python 点击第二个选项是自己配…...

Optional使用详解

Optional使用详解 文章目录Optional使用详解1.构造函数2.Optional.of(T value)作用使用源码&#xff08;只想知道怎么用的可以略过&#xff09;Optional.ofNullable(T value)作用使用源码.orElse(T other)作用使用源码.orElseGet(Supplier<? extends T> other)作用使用源…...

如何实现文件高速传输,推荐镭速高速文件传输解决方案

随着互联网的发展&#xff0c;文件传输越来越频繁&#xff0c;如何实现文件高速传输已经越来越成为企业发展过程中需要解决的问题&#xff0c; 在当今的业务中&#xff0c;随着与客户和供应商以及内部系统的所有通信的数据量不断增加&#xff0c;对高速文件传输解决方案的需求…...

SpringBoot整合Mybatis+人大金仓(kingbase8)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Mybatis框架整合人…...