计算机速成课Crash Course - 07. 中央处理器

news2025/2/24 21:18:18

今天开始计算机速成课Crash Course的系列讲解。

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

计算机速成课Crash Course - 07. 中央处理器

07. 中央处理器

提示下,这集可能是最难的一集,所以一旦你理解了,就会变得超厉害!

我们已经做了一个算术逻辑单元(ALU),输入二进制,它会执行计算。

图片

我们还做了两种内存:寄存器,很小的一块内存,能存一个值;之后我们增大做出了 RAM,RAM 是一大块内存,能在不同地址存大量数字。

现在是时候把这些放在一起,组建计算机的 "心脏" 了,但这个 "心脏" 不会有任何包袱,比如人类情感。

计算机的心脏是"中央处理单元",简称 "CPU",CPU 负责执行程序,比如 Office,Safari 浏览器,你最爱的 《半条命2》。

程序由一个个操作组成,这些操作叫"指令"(Instruction),因为它们"指示"计算机要做什么,如果是数学指令,比如加/减。

图片

CPU 会让 ALU 进行数学运算,也可能是内存指令,CPU 会和内存通信,然后读/写值,也可能是内存指令,CPU 会和内存通信,然后读/写值。

CPU 里有很多组件,所以我们一边说一边建,我们把重点放在功能,而不是一根根线具体怎么连。当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象,这种高层次视角叫"微体系架构"。

我们首先要一些内存,把上集做的 RAM 拿来就行,为了保持简单,假设它只有 16 个位置,每个位置存 8 位,再来四个 8 位寄存器,叫 A,B,C,D。

图片

寄存器用来临时存数据和操作数据,我们已经知道数据是以二进制值存在内存里,程序也可以存在内存里。

我们可以给 CPU 支持的所有指令,分配一个 ID。

图片

在这个假设的例子,我们用前四位存 "操作代码" (operation code),简称 "操作码" (opcode),后四位代表数据来自哪里,可以是寄存器或内存地址。

(也就是说,每个操作都是8位的,前四位表示操作,后四位是操作的数据)

我们还需要两个寄存器,来完成 CPU。

1. 一个寄存器追踪程序运行到哪里了,我们叫它  "指令地址寄存器",顾名思义,存当前指令的内存地址。

2. 另一个寄存器存当前指令,叫  "指令寄存器",当启动计算机时,所有寄存器从 0 开始。

图片

为了举例,我们在 RAM 里放了一个程序,我们今天会过一遍。

CPU 的第一个阶段叫 "取指令阶段",负责拿到指令。

首先,将 "指令地址寄存器" 连到 RAM,寄存器的值为 0,因此 RAM 返回地址 0 的值。

0010 1110 会复制到 "指令寄存器" 里,现在指令拿到了。

图片

要弄清是什么指令,才能执行(execute),而不是杀死(kill)它,(execute在英文中有两种含义,一个是执行,一个是处死)这是 "解码阶段"。

图片

前 4 位 0010 是 LOAD A 指令,意思是,把 RAM 的值放入寄存器 A,后 4 位 1110 是 RAM 的地址, 转成十进制是 14。

图片

接下来,指令由 "控制单元" 进行解码,就像之前的所有东西,"控制单元" 也是逻辑门组成的。

比如,为了识别 "LOAD A" 指令,需要一个电路,检查操作码是不是 0010,我们可以用很少的逻辑门来实现。

图片

现在知道了是什么指令,就可以开始执行了,开始 "执行阶段",用 "检查是否 LOAD_A 指令的电路",可以打开 RAM 的 "允许读取线", 把地址 14 传过去,RAM 拿到值,0000 0011,十进制的 3。

图片

因为是 LOAD_A 指令,我们想把这个值只放到寄存器 A,其他寄存器不受影响,所以需要一根线,把 RAM 连到 4 个寄存器,用 "检查是否 LOAD_A 指令的电路" ,启用寄存器 A 的 "允许写入线"。

图片

这就成功了,把 RAM 地址 14 的值,放到了寄存器 A。

既然指令完成了,我们可以关掉所有线路,去拿下一条指令,我们把 "指令地址寄存器"+1,"执行阶段"就此结束。

LOAD_A 只是 CPU 可以执行的各种指令之一,不同指令由不同逻辑电路解码,这些逻辑电路会配置 CPU 内的组件来执行对应操作,具体分析这些解码电路太繁琐了。

既然已经看了 1 个例子,干脆把 "控制单元 "包成一个整体,简洁一些。

图片

没错,一层新抽象。

控制单元就像管弦乐队的指挥,"指挥" CPU 的所有组件,"取指令→解码→执行" 完成后,现在可以再来一次,从 "取指令" 开始,"指令地址寄存器" 现在的值是 1,所以 RAM 返回地址 1 里的值:0001 1111。

图片

到 "解码" 阶段!0001 是 LOAD B 指令,从 RAM 里把一个值复制到寄存器 B,这次内存地址是 1111,十进制的 15。

图片

现在到 "执行阶段","控制单元" 让RAM 读地址 15,并配置寄存器 B 接收数据。

图片

成功,我们把值 0000 1110,也就是十进制的 14 存到了寄存器 B。

最后一件事是 "指令地址寄存器" +1,我们又完成了一个循环,下一条指令有点不同,来取它吧。

1000 0100,1000 是 ADD 指令,后面的 4 位不是 RAM 地址,而是分别代表 2 个寄存器,2 位可以表示 4 个值,所以足够表示 4 个寄存器。

第一个地址是 01, 代表寄存器B;第二个地址是 00, 代表寄存器A。因此,1000 0100,代表把寄存器 B 的值,加到寄存器 A 里,为了执行这个指令,我们要整合第 5 集的 ALU。

图片

"控制单元" 负责选择正确的寄存器作为输入,并配置 ALU 执行正确的操作,对于 "ADD" 指令, "控制单元" 会启用寄存器 B,作为 ALU 的第一个输入,还启用寄存器 A,作为 ALU 的第二个输入。

图片

之前说过,ALU 可以执行不同操作,所以控制单元必须传递 ADD 操作码告诉它要做什么。最后,结果应该存到寄存器 A,但不能直接写入寄存器 A。

这样新值会进入 ALU ,不断和自己相加,因此,控制单元用一个自己的寄存器暂时保存结果,关闭 ALU,然后把值写入正确的寄存器。

这里 3+14=17,二进制是 0001 0001,现在存到了寄存器 A,和之前一样,最后一件事是把指令地址 + 1,这个循环就完成了。

好,来看最后一个指令:0100 1101,解码得知是 STORE A 指令(把寄存器 A 的值放入内存),RAM 地址 13。

图片

接下来,把地址传给 RAM,但这次不是 "允许读取" ,而是 "允许写入",同时,打开寄存器 A 的 "允许读取",这样就可以把寄存器 A 里的值,传给 RAM。

图片

恭喜,我们刚运行了第一个电脑程序!它从内存中加载两个值,相加,然后把结果放回内存。

刚刚是我一步步来讲的,我们人工切换 CPU 的状态 "取指令→解码→执行",但不是每台电脑里都有一个迷你 Carrie Anne,其实是 "时钟" 来负责管理 CPU 的节奏,时钟以精确的间隔触发电信号。

控制单元会根据时钟的信号,推进 CPU 的内部操作,确保一切按步骤进行,就像罗马帆船的船头,有一个人负责按节奏的击鼓,让所有划船的人同步,就像节拍器一样,节奏不能太快。

因为就算是电也要一定时间来传输,CPU "取指令→解码→执行" 的速度叫 "时钟速度",单位是赫兹,赫兹是用来表示频率的单位,1 赫兹代表一秒 1 个周期。

因为我花了大概 6 分钟,给你讲了 4 条指令,读取→读取→相加→存储,所以我的时钟速度大概是 0.03 赫兹,我承认我算数不快,但哪怕有人算数很快,最多也就是一秒一次,或 1 赫兹。

第一个单芯片 CPU 是 "英特尔 4004",1971 年发布的 4 位CPU,它的微架构很像我们之前说的 CPU,虽然是第一个单芯片的处理器,但它的时钟速度达到了 740 千赫兹 - 每秒 74 万次,你可能觉得很快。

图片

但和如今的处理器相比不值一提,一兆赫兹是 1 秒 1 百万个时钟周期,现在看视频的电脑或手机,肯定有几千兆赫兹,1 秒 10 亿次时钟周期。

你可能听过有人会把计算机超频,意思是修改时钟速度,加快 CPU 的速度,就像罗马帆船要撞另一艘船时,鼓手会加快敲鼓速度。芯片制造商经常给 CPU 留一点余地,可以接受一点超频,但超频太多会让 CPU 过热,或产生乱码,因为信号跟不上时钟。

你可能很少听说降频,但降频其实很有用,有时没必要让处理器全速运行,可能用户走开了,或者在跑一个性能要求较低的程序,把 CPU 的速度降下来,可以省很多电,省电对用电池的设备很重要,比如笔记本和手机,为了尽可能省电,很多现代处理器可以按需求加快或减慢时钟速度,这叫 "动态调整频率"。

加上时钟后,CPU 才是完整的,现在可以放到盒子里,变成一个独立组件。

图片

一层新的抽象!

RAM,上集说过,是在 CPU 外面的独立组件,CPU 和 RAM 之间,用 "地址线"、"数据线" 和 "允许读/写线" 进行通信。

虽然今天我们设计的 CPU 是简化版的,但我们提到的很多机制,依然存在于现代处理器里。

下一集,我们要加强 CPU,给它扩展更多指令,同时开始讲软件。


以上内容就是 07. 中央处理器 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

图片

我们还做了两种内存:寄存器,很小的一块内存,能存一个值;之后我们增大做出了 RAM,RAM 是一大块内存,能在不同地址存大量数字。

现在是时候把这些放在一起,组建计算机的 "心脏" 了,但这个 "心脏" 不会有任何包袱,比如人类情感。

计算机的心脏是"中央处理单元",简称 "CPU",CPU 负责执行程序,比如 Office,Safari 浏览器,你最爱的 《半条命2》。

程序由一个个操作组成,这些操作叫"指令"(Instruction),因为它们"指示"计算机要做什么,如果是数学指令,比如加/减。

图片

CPU 会让 ALU 进行数学运算,也可能是内存指令,CPU 会和内存通信,然后读/写值,也可能是内存指令,CPU 会和内存通信,然后读/写值。

CPU 里有很多组件,所以我们一边说一边建,我们把重点放在功能,而不是一根根线具体怎么连。当我们用一条线连接两个组件时,这条线只是所有必须线路的一个抽象,这种高层次视角叫"微体系架构"。

我们首先要一些内存,把上集做的 RAM 拿来就行,为了保持简单,假设它只有 16 个位置,每个位置存 8 位,再来四个 8 位寄存器,叫 A,B,C,D。

图片

寄存器用来临时存数据和操作数据,我们已经知道数据是以二进制值存在内存里,程序也可以存在内存里。

我们可以给 CPU 支持的所有指令,分配一个 ID。

图片

在这个假设的例子,我们用前四位存 "操作代码" (operation code),简称 "操作码" (opcode),后四位代表数据来自哪里,可以是寄存器或内存地址。

(也就是说,每个操作都是8位的,前四位表示操作,后四位是操作的数据)

我们还需要两个寄存器,来完成 CPU。

1. 一个寄存器追踪程序运行到哪里了,我们叫它  "指令地址寄存器",顾名思义,存当前指令的内存地址。

2. 另一个寄存器存当前指令,叫  "指令寄存器",当启动计算机时,所有寄存器从 0 开始。

图片

为了举例,我们在 RAM 里放了一个程序,我们今天会过一遍。

CPU 的第一个阶段叫 "取指令阶段",负责拿到指令。

首先,将 "指令地址寄存器" 连到 RAM,寄存器的值为 0,因此 RAM 返回地址 0 的值。

0010 1110 会复制到 "指令寄存器" 里,现在指令拿到了。

图片

要弄清是什么指令,才能执行(execute),而不是杀死(kill)它,(execute在英文中有两种含义,一个是执行,一个是处死)这是 "解码阶段"。

图片

前 4 位 0010 是 LOAD A 指令,意思是,把 RAM 的值放入寄存器 A,后 4 位 1110 是 RAM 的地址, 转成十进制是 14。

图片

接下来,指令由 "控制单元" 进行解码,就像之前的所有东西,"控制单元" 也是逻辑门组成的。

比如,为了识别 "LOAD A" 指令,需要一个电路,检查操作码是不是 0010,我们可以用很少的逻辑门来实现。

图片

现在知道了是什么指令,就可以开始执行了,开始 "执行阶段",用 "检查是否 LOAD_A 指令的电路",可以打开 RAM 的 "允许读取线", 把地址 14 传过去,RAM 拿到值,0000 0011,十进制的 3。

图片

因为是 LOAD_A 指令,我们想把这个值只放到寄存器 A,其他寄存器不受影响,所以需要一根线,把 RAM 连到 4 个寄存器,用 "检查是否 LOAD_A 指令的电路" ,启用寄存器 A 的 "允许写入线"。

图片

这就成功了,把 RAM 地址 14 的值,放到了寄存器 A。

既然指令完成了,我们可以关掉所有线路,去拿下一条指令,我们把 "指令地址寄存器"+1,"执行阶段"就此结束。

LOAD_A 只是 CPU 可以执行的各种指令之一,不同指令由不同逻辑电路解码,这些逻辑电路会配置 CPU 内的组件来执行对应操作,具体分析这些解码电路太繁琐了。

既然已经看了 1 个例子,干脆把 "控制单元 "包成一个整体,简洁一些。

图片

没错,一层新抽象。

控制单元就像管弦乐队的指挥,"指挥" CPU 的所有组件,"取指令→解码→执行" 完成后,现在可以再来一次,从 "取指令" 开始,"指令地址寄存器" 现在的值是 1,所以 RAM 返回地址 1 里的值:0001 1111。

图片

到 "解码" 阶段!0001 是 LOAD B 指令,从 RAM 里把一个值复制到寄存器 B,这次内存地址是 1111,十进制的 15。

图片

现在到 "执行阶段","控制单元" 让RAM 读地址 15,并配置寄存器 B 接收数据。

图片

成功,我们把值 0000 1110,也就是十进制的 14 存到了寄存器 B。

最后一件事是 "指令地址寄存器" +1,我们又完成了一个循环,下一条指令有点不同,来取它吧。

1000 0100,1000 是 ADD 指令,后面的 4 位不是 RAM 地址,而是分别代表 2 个寄存器,2 位可以表示 4 个值,所以足够表示 4 个寄存器。

第一个地址是 01, 代表寄存器B;第二个地址是 00, 代表寄存器A。因此,1000 0100,代表把寄存器 B 的值,加到寄存器 A 里,为了执行这个指令,我们要整合第 5 集的 ALU。

图片

"控制单元" 负责选择正确的寄存器作为输入,并配置 ALU 执行正确的操作,对于 "ADD" 指令, "控制单元" 会启用寄存器 B,作为 ALU 的第一个输入,还启用寄存器 A,作为 ALU 的第二个输入。

图片

之前说过,ALU 可以执行不同操作,所以控制单元必须传递 ADD 操作码告诉它要做什么。最后,结果应该存到寄存器 A,但不能直接写入寄存器 A。

这样新值会进入 ALU ,不断和自己相加,因此,控制单元用一个自己的寄存器暂时保存结果,关闭 ALU,然后把值写入正确的寄存器。

这里 3+14=17,二进制是 0001 0001,现在存到了寄存器 A,和之前一样,最后一件事是把指令地址 + 1,这个循环就完成了。

好,来看最后一个指令:0100 1101,解码得知是 STORE A 指令(把寄存器 A 的值放入内存),RAM 地址 13。

图片

接下来,把地址传给 RAM,但这次不是 "允许读取" ,而是 "允许写入",同时,打开寄存器 A 的 "允许读取",这样就可以把寄存器 A 里的值,传给 RAM。

图片

恭喜,我们刚运行了第一个电脑程序!它从内存中加载两个值,相加,然后把结果放回内存。

刚刚是我一步步来讲的,我们人工切换 CPU 的状态 "取指令→解码→执行",但不是每台电脑里都有一个迷你 Carrie Anne,其实是 "时钟" 来负责管理 CPU 的节奏,时钟以精确的间隔触发电信号。

控制单元会根据时钟的信号,推进 CPU 的内部操作,确保一切按步骤进行,就像罗马帆船的船头,有一个人负责按节奏的击鼓,让所有划船的人同步,就像节拍器一样,节奏不能太快。

因为就算是电也要一定时间来传输,CPU "取指令→解码→执行" 的速度叫 "时钟速度",单位是赫兹,赫兹是用来表示频率的单位,1 赫兹代表一秒 1 个周期。

因为我花了大概 6 分钟,给你讲了 4 条指令,读取→读取→相加→存储,所以我的时钟速度大概是 0.03 赫兹,我承认我算数不快,但哪怕有人算数很快,最多也就是一秒一次,或 1 赫兹。

第一个单芯片 CPU 是 "英特尔 4004",1971 年发布的 4 位CPU,它的微架构很像我们之前说的 CPU,虽然是第一个单芯片的处理器,但它的时钟速度达到了 740 千赫兹 - 每秒 74 万次,你可能觉得很快。

图片

但和如今的处理器相比不值一提,一兆赫兹是 1 秒 1 百万个时钟周期,现在看视频的电脑或手机,肯定有几千兆赫兹,1 秒 10 亿次时钟周期。

你可能听过有人会把计算机超频,意思是修改时钟速度,加快 CPU 的速度,就像罗马帆船要撞另一艘船时,鼓手会加快敲鼓速度。芯片制造商经常给 CPU 留一点余地,可以接受一点超频,但超频太多会让 CPU 过热,或产生乱码,因为信号跟不上时钟。

你可能很少听说降频,但降频其实很有用,有时没必要让处理器全速运行,可能用户走开了,或者在跑一个性能要求较低的程序,把 CPU 的速度降下来,可以省很多电,省电对用电池的设备很重要,比如笔记本和手机,为了尽可能省电,很多现代处理器可以按需求加快或减慢时钟速度,这叫 "动态调整频率"。

加上时钟后,CPU 才是完整的,现在可以放到盒子里,变成一个独立组件。

图片

一层新的抽象!

RAM,上集说过,是在 CPU 外面的独立组件,CPU 和 RAM 之间,用 "地址线"、"数据线" 和 "允许读/写线" 进行通信。

虽然今天我们设计的 CPU 是简化版的,但我们提到的很多机制,依然存在于现代处理器里。

下一集,我们要加强 CPU,给它扩展更多指令,同时开始讲软件。


以上内容就是 07. 中央处理器 的内容,感兴趣的同学记得点赞、关注、转发、收藏哦!

我会不定期发布课程的讲解!

更多技术文章,全网首发公众号 “摸鱼IT” 锁定 -上午11点 - ,感谢大家关注、转发、点赞!

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

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

相关文章

python之记录程序运行时长工具

python之记录程序运行时长工具 废话不多话,上代码 from datetime import datetime, timedelta import timestart_time datetime.now()while True:current_time datetime.now()elapsed_time current_time - start_timeformatted_time str(elapsed_time).split(…

QGIS之二十六pbf转osm转shp

效果 步骤 1、下载工具 用于转换osm.pbf–>.osm,当然也可以反过来,还支持其它格式互相转换 osmconvert64-0.8.8p.exe 链接:https://pan.baidu.com/s/1Mj-6b30f6voOkQI8QFh_rw 提取码:1111 2、国内各省下载OSM数据 http://download.openstreetmap.fr/extracts/asia/c…

AI入侵B站鬼畜区!网友辣评:不如传统“活字乱刷术”

11月27日,B站UP主“女孩为何穿短裙”突破传统,投稿一则使用AI合成语音制作的鬼畜视频,标志着AI视频制作正式进入B站鬼畜区。视频播放量截至目前已达167.3万,获得14.5万的点赞和2.8万个投币。 鬼畜视频一直以其独特之处引起关注&a…

vue el-select多选封装及使用

使用了Element UI库中的el-select和el-option组件来构建多选下拉框。同时&#xff0c;也包含了一个el-input组件用于过滤搜索选择项&#xff0c;以及el-checkbox-group和el-checkbox组件用于显示多选项。 创建组件index.vue (src/common-ui/selectMultiple/index.vue) <tem…

宝塔部署appache部署ssl证书无法访问443端口

原因&#xff1a; 不是部署方法错误&#xff0c;而是操作不当&#xff0c;原来一开始为了测试我去修改了appache默配置路径下的httpd-ssl.donf&#xff0c;此文件一般 在appche/conf/extra/目录下&#xff08;版本不同目录可能有所区别&#xff09;。 导致问题&#xff1a; 在…

java连接池 理解及解释(DBCP、druid、c3p0、HikariCP)

一、在Java开发中&#xff0c;有许多常见的数据库连接池可供选择。以下是一些常见的Java数据库连接池&#xff1a;不使用数据库连接池的特性&#xff1a; 优点&#xff1a;实现简单 缺点&#xff1a;网络 IO 较多数据库的负载较高响应时间较长及 QPS 较低应用频繁的创建连接和关…

高低压供配电智能监控系统

高低压供配电智能监控系统是一种综合运用物联网、云计算、大数据和人工智能等技术的智能化监控系统&#xff0c;用于实时监测高低压供配电设备的运行状态和电能质量&#xff0c;及时发现和处理供配电系统中存在的问题&#xff0c;提高供配电系统的安全性和可靠性。依托电易云-智…

漏洞复现--万户ezoffice wpsservlet任意文件上传

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

A股风格因子看板 (2023.12第1期)

该因子看板跟踪A股风格因子&#xff0c;该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子&#xff0c;用以分析市场风格切换、组合风格景 露组合等。 今日为该因子跟踪第1期&#xff0c;指数组合数据截止日2023-11-30&#xff0c;要点如下 近1年A股风格因子收…

如何理解方块电阻与宽度的关系(RPSQ_VS_SI_WIDTH)

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 来自星球提问: 解释如下: 单看方块电阻的公式&#xff0c;Rs&#xff1d;电阻率/厚度 在半导体制造过程中&#xff0c;由于工艺偏差&#xff0c;电阻跟金属线的density是相关的…

windows10系统下替换、修改jar中的文件并重新打包成jar文件然后运行

目录 1、jar文件简述2、问题来源3、操作步骤3.1 解压jar包3.2 替换或者更改操作3.3 重新打成jar包3.4 确认是否修改成功3.5 运行程序 附录&#xff1a;常见命令参数 1、jar文件简述 JAR 文件就是 Java Archive &#xff08; Java 档案文件&#xff09;&#xff0c;它是 Java 的…

IntelliJ IDEA 2023.2新特性详解第三弹!Docker、Kubernetes等支持!

9 Docker 在 Docker 镜像层内预览文件 现在可以在 Services&#xff08;服务&#xff09;工具窗口中轻松访问和预览 Docker 镜像层的内容。 从列表选择镜像&#xff0c;选择 Show layers&#xff08;显示层&#xff09;&#xff0c;然后点击 Analyze image for more informati…

电气自动化专业求职简历11篇

电气自动化专业求职简历下载&#xff08;可在线编辑制作&#xff09;&#xff1a;来幻主简历&#xff0c;做好简历&#xff01; 电气自动化专业简历1&#xff1a; 求职意向 求职类型&#xff1a;全职 意向岗位&#xff1a;自动化工程师 意向城市&#xff1a;广东广州…

二维码智慧门牌管理系统升级解决方案:优化制牌存疑管理

文章目录 前言一、解决方案关键特点二、解决方案的优势 前言 二维码智慧门牌管理系统在城市管理中发挥着重要作用&#xff0c;然而&#xff0c;制牌审核过程中遇到存疑地址数据是常见问题&#xff0c;需要更有效的处理方法。为此&#xff0c;我们提出了二维码智慧门牌管理系统…

编写并调试运行一个简单的 Java 应用程序,显示自己的学号、姓名、兴趣爱好等。

源代码&#xff1a; public class Main { public static void main(String[] args) { System.out.println("学号是:""0233217821"); System.out.println("姓名是:""赵港"); System.out.println("兴趣爱好是:""运动&qu…

elasticsearch 内网下如何以离线的方式上传任意的huggingFace上的NLP模型(国内避坑指南)

es自2020年的8.x版本以来&#xff0c;就提供了机器学习的能力。我们可以使用es官方提供的工具eland&#xff0c;将hugging face上的NLP模型&#xff0c;上传到es集群中。利用es的机器学习模块&#xff0c;来运维部署管理模型。配合es的管道处理&#xff0c;来更加便捷的处理数据…

软件性能测试之压力测试详解

压力测试 压力测试是一种软件测试&#xff0c;用于验证软件应用程序的稳定性和可靠性。压力测试的目标是在极其沉重的负载条件下测量软件的健壮性和错误处理能力&#xff0c;并确保软件在危急情况下不会崩溃。它甚至可以测试超出正常工作点的测试&#xff0c;并评估软件在极端条…

15:00的面试,15:06就出来了,问的问题过于变态了。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

【AI绘画】万字长文——(超详细)ControlNet的详细介绍使用Stable Diffusion的艺术二维码完全生成攻略

目录 前言一、名词解释1-1、Stable Diffusion介绍1-2、ControlNet介绍1-2-1、ControlNet介绍&工作原理1-2-2、ControlNet控制方法介绍 1-3、案例分析1-3-1、室内装修设计1-3-2、品牌创意海报 1-4、stable-diffusion-webui 的参数解释 二、生成方法2-1、图像到图像2-1-1、二…

NSS [HUBUCTF 2022 新生赛]Calculate

NSS [HUBUCTF 2022 新生赛]Calculate 题目描述&#xff1a;python is a good tool in CTF 需要答对20题&#xff0c;每题回答时间&#xff08;其实就是两次发包之前的间隔&#xff09;要大于一秒小于三秒。 抓个包&#xff0c;我们的答案是POST发包。并且在这里看到了cookie&…