计算机体系结构实验一

news2025/1/23 21:19:03

计算机体系结构实验一

一.实验目的

​理解RISC-V的指令执行的数据流和控制信号,熟悉指令流水线的工作过程。

二.实验过程

1.RISC-V的相关指令

实验的模拟器使用RISC-V指令集,为了便于后续分析,首先学习实验中使用的RISC-V指令。

基本RISC-V使用32位固定长度指令。但标准RISC-V编码模式支持变长指令,可以使用16位指令,这些指令被称为标准压缩指令,被命名为C。这些指令通常是常用操作,可以减少静态和动态的代码大小。以下所有形式为"C.inst"的指令都属于这类指令。

实验中的汇编代码主要包含以下几类指令,

  • 控制转移指令:c.j,c.jr,bge
  • 算数与逻辑运算指令:c.slli,c.addi
  • 整数生成指令:c.li
  • 访存指令:lw,sw

控制转移指令

c.j指令是一个无条件跳转指令,使用PC相对跳转,PC与偏移量相加形成跳转目标地址,等价于Jal指令,跳转后会将PC+4的值写入rd寄存器,对于c.j,rd=x0,而x0不可写入,相当于该指令只完成跳转。c.jr指令执行一个无条件控制跳转取出rs1的值并将最低位设置为0,作为跳转地址,等价于Jalr指令,同样在跳转后会将PC+4的值写入rd寄存器,但rd为x0。bge指令按照有符号数比较rs1和rs2寄存器的值,如果rs1大于等于rs2,就跳转到目标地址。

在这里插入图片描述

c.j指令

在这里插入图片描述

c.jr指令

在这里插入图片描述

bge指令

算数与逻辑运算指令

c.slli指令对rd中的值进行逻辑左移操作,并将结果写入rd,指令中的shamt字段为移位次数。c.addi,add等指令都是加法指令,只有操作数有不同。

在这里插入图片描述

c.slli

整数生成指令

c.li指令将符号扩展的6位立即数写入寄存器rd,并且只在rd!=x0时有效。

在这里插入图片描述

访存指令

lw指令从存储器中读出以rs1+offset为地址的值,存入rd寄存器。sw指令则是把rs2的值写入存储器,地址为rs1+offset。

在这里插入图片描述

2.汇编代码分析

对实验所给出的代码转为汇编后的代码进行分析,可以找到两个循环的汇编指令部分。

第一个循环的部分如下:

1014c:        fe042623        sw x0 -20 x8		#x8-20 : i 
10150:        a005            c.j 32			#-> 10170
10152:        fec42783        lw x15 -20 x8
10156:        078a            c.slli x15 2		#x15 = 4i
10158:        ff040713        addi x14 x8 -16	
1015c:        97ba            c.add x15 x14		
1015e:        fec42703        lw x14 -20 x8		
10162:        e6e7a623        sw x14 -404 x15	#A[i] = i
#i++
10166:        fec42783        lw x15 -20 x8
1016a:        0785            c.addi x15 1
1016c:        fef42623        sw x15 -20 x8
#if(i<100)
10170:        fec42703        lw x14 -20 x8		
10174:        06300793        addi x15 x0 99
10178:        fce7dde3        bge x15 x14 -38	#i<99 -> 10152

第二个循环的部分如下:

1017c:        4785            c.li x15 1		
1017e:        fef42623        sw x15 -20 x8		#x8-20: i
10182:        a80d            c.j 50			#-> 101B4
10184:        fec42783        lw x15 -20 x8
10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14
10192:        e6c7a783        lw x15 -404 x15	#x15: A[i-1]
10196:        3e878713        addi x14 x15 1000
1019a:        fec42783        lw x15 -20 x8
1019e:        078a            c.slli x15 2
101a0:        ff040693        addi x13 x8 -16
101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
#i++
101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8
#if(i<100)
101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56	#i<99 -> 10184

3.RISC-V电路分析

RISC-V的电路设计图如下:

在这里插入图片描述

取址阶段

逐个阶段进行电路的分析,首先分析取址阶段。取值阶段的NPC Generator产生下一条指令的地址,而地址来源于Jal跳转的地址计算,Jalr跳转的地址计算,分支的地址计算,通过控制单元和分支选择器的选择信号选择下一条指令的地址。以NPC产生的PC值为地址从指令存储器中取值,传递给译码阶段。NPC的PCF接入的是分支预测,对于BGE这种条件分支,如果预测选中,可以不用等到执行阶段判断条件,可以直接在ID阶段计算出跳转地址就写入NPC。

在这里插入图片描述

译码阶段

译码阶段完成的工作是产生控制信号和读取操作数,主要的工作单元为寄存器组和立即数运算单元。寄存器组的RegWriteW和WD3和A3是写回阶段的信号,这些信号是从译码阶段一直传递到写回阶段的。而立即数运算单元完成立即数的扩展,传递给执行阶段,并且在这里可以直接完成Jal跳转目标地址的计算,传给NPC generator,对于无条件跳转Jal,控制单元在这个阶段就可以发出控制信号JalD,进行跳转了。

在这里插入图片描述

在这里插入图片描述

执行阶段

执行阶段完成三个工作:选择操作数并完成ALU运算;分支选择;Jalr指令的目标地址计算。操作数的来源有ID阶段读取的寄存器值、EX阶段和MEM阶段的数据前推结果、立即数。所有的控制信号都是译码阶段控制单元产生后传递到执行阶段的各部件的。

分支选择器根据分支类型比较两个寄存器的值(可能来自取值阶段,也可能来自执行和访存阶段),选择是否进行分支跳转,并将分支信号发给NPC generator,由于分支选择是在这个阶段进行的,分支目标地址也在这个阶段传给NPC generator的,为EX输出的BrNPC,值为译码阶段得到的立即数。如果一开始动态预测未选中,然而分支计算结果又是选中,则预测错误,在EX这个阶段写入NPC跳转目标地址。

在这里插入图片描述

Alu运算从数据前推和译码阶段读取的寄存器值中选择操作数,控制信号Forward由harzard单元发出,如果当前写入的目的寄存器(上/前一条指令)和当前运算的源寄存器是相同的,就选择访存和写回阶段的结果。AluSrc信号选择操作数是寄存器/PC/立即数,AluContrl给出计算类型。如果是Jalr指令,将rs1的值的最低位设置为0后通过AluOut传递给NPC generator,进行跳转。

在这里插入图片描述

访存阶段

访存阶段的主要工作是存储器的读取和写入,同时还完成执行阶段结果的传递。写使能信号是译码阶段传递过来的。

在这里插入图片描述

对于运算类指令,执行阶段的结果直接传递到写回阶段,写入rd寄存器,而对于jal,jr这类指令,会把PC+4写入rd寄存器,控制单元译码时发出LoadNpc控制信号进行这二者之间的选择。

在这里插入图片描述

写回阶段

写回阶段在访存结果和ALU运算/PC+4这两个结果之间选择,传输给寄存器组,MemToReg为选择信号,由控制单元产生并传递到写回阶段。

在这里插入图片描述

控制单元

控制单元如下:

在这里插入图片描述

其中部分信号的功能如下:

  • RegWriteD:寄存器组的写使能信号

  • MemToRegD:寄存器组写入的数据是否来自存储器

  • LoadNpcD:是否计算PC+4存入rd寄存器

  • RegReadD:是否读取寄存器,传给harzard单元

  • BranchTypeD:表明分支类型

  • AluSrc1D,AluSrc2D:ALU操作数的来源选择信号,Alusrc1D可选来源有寄存器值、PC值;Alusrc2D可选来源有寄存器值、立即数

  • AluContrlD:ALU的具体运算选择信号

  • ImmType:立即数的类型(长度)

4.指令的执行过程

a.add x15, x14, x15的执行过程
该指令位于:

10188:        17fd            c.addi x15 -1
1018a:        078a            c.slli x15 2
1018c:        ff040713        addi x14 x8 -16
10190:        97ba            c.add x15 x14

取指阶段,PC值为10190,读取该地址的指令,将指令传送到ID阶段。关键控制信号:

  • JalrE,JalE,BrE:均为非使能状态,因为前几条指令没有分支与跳转

译码阶段,A1的值为0xE,表示x14寄存器,A2的值为0xF,表示x15寄存器。从寄存器组中读取这两个寄存器的值,将值传递给EX阶段,同时还会将add指令相应的控制信号传递到EX阶段。此时寄存器组的写入控制信号为前一条指令的写入信号,对于add指令来说,该阶段没有重要的控制信号。

执行阶段,寄存器的值从RegOut1E和RegOut2E进入选择器,由于操作数x14是上一条指令的结果,选择的是上一条指令访存阶段前推的值;操作数x15是前一条指令的结果,选择写回阶段前推的结果。AluContrlD选择加法运算,将两个操作数相加。关键控制信号:

  • Forward1E:选择访存阶段前推的值作为寄存器读取值
  • ForWard2E:选择写回阶段前推的值作为寄存器读取值
  • AluSrc1E、AluSrc2E:都选择寄存器的值
  • AluContrlD:ADDOP信号,ALU进行加法运算

访存阶段,由于不需要访存,MemWriteM信号处于非使能状态,写入的数据为ALU运算结果,而不是PC+4的值,关键信号为:

  • LoadNPCM:非使能,选择ALU运算结果传递到写回阶段

写回阶段,MemToRegW为非使能,选择器选择ALU运算的结果输出给寄存器组的WD3接口,寄存器组的A3为写入寄存器的地址(0xF),RegWriteW信号也一直传递下来,接入寄存器组并为写使能,向x15寄存器写入add指令的加法结果。关键信号:

  • RegWriteW:使能状态
  • MemToRegW:非使能状态,选择ALU运算结果

其整个过程的数据通路为:

在这里插入图片描述

b.bge x15, x14, -56指令的执行过程

该指令及前两条指令为:

101b4:        fec42703        lw x14 -20 x8
101b8:        06300793        addi x15 x0 99
101bc:        fce7d4e3        bge x15 x14 -56

取指阶段关键信号为:

  • JalrE,JalE,BrE:均为非使能状态,因为前几条指令没有分支与跳转

译码阶段,A1的值为0xF,表示x15寄存器,A2的值为0xE,表示x14寄存器。从寄存器组中读取这两个寄存器的值,将值传递给EX阶段,并计算PC-56的值传递给EX阶段,也传递给NPC,作为分支目标地址。此时PCF预测是否进行跳转。如果进行跳转,则写入NPC。

执行阶段,x14和x15的值都是前两条指令更新的,因此选择访存和写回阶段的值,操作数选择寄存器的值,分支选择器比较两值判断是否需要进行跳转。关键信号为:

  • Forward1E:选择访存阶段前推的值作为寄存器读取值
  • ForWard2E:选择写回阶段前推的值作为寄存器读取值
  • AluSrc1E、AluSrc2E:都选择寄存器的值
  • BrType,BrE:bge类型分支,比较两个操作数的值,如果op1>=op2,BrE使能,应该进行跳转,否则不应该跳转

如果预测跳转且满足分支条件发生了跳转,流水线将被冲刷(harzard部件产生flush信号),取指结果为跳转目标,bge指令的下一条指令无效。如果预测跳转且分支条件不满足,预测错误,要在下一周期重新取指。如果预测不跳转且条件不满足,则继续正常指令。如果预测不跳转但条件满足了,预测错误,要在EX阶段将跳转目标写入NPC。下面假设预测不跳转但预测错误,在EX阶段写入NPC。

访存阶段,不需要访存,MemWriteM信号处于非使能状态,该指令不写入寄存器,关键信号为:

  • LoadNPCM:不写入,因此选择任意数据都没有影响,视为默认非使能,传递ALU结果
    写回阶段,不需要写入数据,RegWriteW为非使能。关键信号:

  • RegWriteW:非使能状态,不写入

  • MemToRegW:无影响

整个过程的数据通路为(预测不跳转但预测错误,在EX阶段写入跳转地址):

在这里插入图片描述

c.lw x15, -20 x8的执行过程

该指令及前两条指令为:

101a4:        97b6            c.add x15 x13
101a6:        e6e7a623        sw x14 -404 x15	#A[i] = A[i-1]+1000
101aa:        fec42783        lw x15 -20 x8

取指阶段关键信号为:

  • JalrE,JalE,BrE:均为非使能状态,因为前几条指令没有分支与跳转

译码阶段,A1的值为0x8,表示x8寄存器,从寄存器组中读取该寄存器的值,将值传递给EX阶段。另一个操作数是立即数,通过立即数单元传递给EX阶段,该阶段没有重要的控制信号。

执行阶段,操作数1选择从寄存器中读取的x8的值,操作数2选择立即数的值,运算类型为加法,将结果传递到访存阶段。关键信号:

  • Forward1E:选择寄存器读取的值
  • ForWard2E:无影响
  • AluSrc1E、AluSrc2E:OP1选择寄存器的值,OP2选择立即数
  • AluContrl:ADDOP信号,加法运算

访存阶段,将ALU运算的结果作为地址从存储器中读取值,传递给写回阶段。关键信号:

  • LoadNPCM:无影响,从存储器读取数据
  • MemWriteM:非使能,读取数据

写回阶段将访存结果传给寄存器组,写入寄存器x15。关键信号:

  • RegWriteW:使能状态,写入寄存器
  • MemToRegW:使能状态,选择访存结果

整个过程的数据通路为:

在这里插入图片描述

d.sw x15 -20 x8指令的执行过程

该指令及前两条指令为:

101aa:        fec42783        lw x15 -20 x8
101ae:        0785            c.addi x15 1
101b0:        fef42623        sw x15 -20 x8

取指阶段关键信号为:

  • JalrE,JalE,BrE:均为非使能状态,因为前几条指令没有分支与跳转

译码阶段,A1的值为0x8,读出x8寄存器,A2的值为0XF,读取x15寄存器的值,另一个操作数是立即数,读取与传递的过程与lw指令相同。没有重要的控制信号。

执行阶段,需要计算存储地址,前两条指令未写入x8,因此选择译码阶段读取的x8的值和立即数作为操作数进行运算。关键信号为:

  • Forward1E:选择寄存器读取的值
  • ForWard2E:无影响
  • AluSrc1E、AluSrc2E:OP1选择寄存器的值,OP2选择立即数
  • AluContrl:ADDOP信号,加法运算

访存阶段,需要向存储器写入,写入的值是上一条指令写回的数据,地址为ALU计算的结果。关键信号:

  • LoadNPCM:无影响
  • MemWriteM:写使能,写入数据

写回阶段不需要写入寄存器。关键信号:

  • RegWriteW:非使能状态,不需要写入寄存器

​其数据通路为:

在这里插入图片描述

蓝色的为上一条指令在写回阶段的结果,传给StoreDataM作为写入数据,原电路图中未画出StoreDataM的数据来源,应该和执行阶段的操作数选择一样,可以选择寄存器读取的值或先前指令的计算结果。

4.BranchE信号的作用

BranchE信号的作用是判断分支条件是否正确。对于分支指令,需要在执行阶段比较rs1和rs2的值,根据分支类型进行两个值的比较,判断是否需要跳转,如果需要跳转,BrE信号将处于使能状态,NPC generator应该写入跳转的目标地址,对于动态分支预测,可能这个值在ID阶段就已经写入了,EX阶段只是验证预测正确,如果失败了,则要重新取指,冲刷流水线。

如果预测正确并发生了跳转,那么跳转指令之后的一条指令是无效的,因此需要冲刷流水线,取消后一条指令的执行,因此BrE信号也传递给harzard单元,当需要跳转时,接收到跳转信号的harzard单元会向流水线中间寄存器发出flush信号,冲刷流水线,取消正在执行的指令,重新读取跳转目标地址的指令继续执行。

预测选中且预测正确

CLK1CLK2CLK3CLK4CLK5CLK6CLK7
pipline i1IF(NPC=NPC+4)ID(分支预测,分支地址计算)EX(计算分支条件)MEMWB
pipline i2IF(根据预测结果更新NPC=NPC+4/branch target)IDflushflushflush
pipline i3IF(NPC=PC+4)ID(branch target)EXMEMWB

预测不选中且预测正确

CLK1CLK2CLK3CLK4CLK5CLK6CLK7
pipline i1IF(NPC=NPC+4)ID(分支预测,分支地址计算)EX(计算分支条件)MEMWB
pipline i2IF(根据预测结果更新NPC=NPC+4/branch target)IDEXMEMWB
pipline i3IF(NPC=NPC+4)ID(LAST NPC)EXMEMWB

5.NPC Generator跳转目标的选择

NPC generator有四种可选的下址目标:

  • PC+4:默认执行下一条指令
  • BrT:分支跳转地址
  • JalrT:无条件跳转地址,目标地址为寄存器的值设置最低位为0,执行阶段计算
  • JalT:无条件跳转地址,目标地址在译码阶段计算,为PC+Imm

对应的有三种使能信号和一个分支预测信号,只要有分支和跳转使能或预测跳转信号,就不使用PC+4作为下址。分支计算的结果验证和Jalr的目标地址都要到执行阶段才能得到,Jal指令的目标地址在译码阶段就计算好了,控制信号也是译码阶段就传递给NPC generator,此时可能同时有处于执行阶段的另外两种指令之一也确定要发生跳转,处于执行阶段的指令是先执行的,因此应该按照执行阶段的跳转目标地址进行跳转,因此如果存在使能信号,BrT和JalrT的选择优先于JalT的选择。

指令
BrTIFIDEX: BrE true
JalIFID: JalE true

此处BrT是预测未选中,预测错误的情况,是最晚确定跳转的情况,如果预测跳转且正确,在ID就将跳转,不会产生冲突。

6.Harzard单元(附加思考题)

冲突处理

流水线有三类冲突:

  • 结构冲突:由资源冲突产生
  • 数据冲突:相邻指令对相同的数据对象读写产生的冲突
  • 控制冲突:分支和跳转指令修改NPC导致的冲突

使用分离的指令存储器和数据存储器,以及寄存器读写在一个时钟周期的前半和后半进行避免了结构冲突,但仍然可能存在结构冲突。当发生指令缓存未命中时,下一条指令不能进入取值阶段,当发生数据缓存未命中时,下一条指令不能进入访存阶段,因此当Harzard单元接收到DCacheMiss或ICacheMiss时,需要让流水线暂停,需要暂停多个周期。

数据冲突共有三种:RAW,WAR,WAW。其中WAW和WAR在顺序执行的标量处理器中不会出现。重点考虑RAW写后读冲突。写后读冲突出现在当前指令的源操作数是先前指令的结果时,例如以下情形:

c.slli x15 2
addi x14 x8 -16
c.add x15 x14

x15和x14的更新值都还未被写入,而add指令已经要在执行阶段使用这两个值了。这种冲突通过数据前推解决。当Harzard单元接收到RegWrite和RegRead信号同时为使能状态,并且源寄存器和写入目的寄存器相同时,就通过forward信号选择数据前推的结果。

在这里插入图片描述

还有前推不能处理的RAW冲突,如下:

lw x15 -20 x8
addi x14 x15 -16

lw指令在访存阶段后读出x15的新值,但此时add指令已经在执行阶段,需要这个值了,此时就只能暂停流水线。当harzard单元收到MemToRegE为使能状态,rs寄存器和rd寄存器为同一个寄存器时,就能发现该冲突,发出stall信号,让执行阶段及之前的所有阶段暂停,而访存和写回阶段继续,只需要暂停一个周期,写回的结果就可以前推回执行周期,流水线就可以继续工作了。

控制冲突由分支和跳转指令产生,当BrE,JalE,JalrE有一个处于使能状态,harzard单元就检测到了分支跳转,发出flush信号,冲刷执行阶段之前的部分,同时访存阶段和写回阶段继续工作,完成之前的指令。

预测未命中

如果采用预测未命中机制,下一条指令正常执行,在需要跳转时,后两条指令无效,写入NPC,对于IF,ID和EX,flush信号为true,冲刷流水线。不需要暂停流水线。下一周期重新取址执行新的指令。

指令
BrTIFIDEX: BrE true -> flush
JalIFID: JalE true
addIF
BrTnextIFIDEX…

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

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

相关文章

Cesium最新版使用天地图地形及注记服务

天地图三维地名服务和地形服务需要利用 cesium 开源三维地球API与天地图扩展插件共同使用&#xff0c;目前支持cesuim1.52、1.58、1.63.1。 天地图调用demo: http://lbs.tianditu.gov.cn/docs/#/sanwei/ 注意&#xff1a; demo里的地形服务地址不对&#xff0c;需要自己更换成…

MCU通用移植方案

MCU通用移植方案 目录 MCU通用移植方案前言1 硬件移植2 软件移植2.1 底层移植方法2.1.1 移植原理2.1.2 移植方法 2.2 中间层移植方法2.2.1 移植原理2.2.2 移植方法 2.3 两种移植方法比对 3 结束语 前言 因为项目的需求或者成本控制等因素&#xff0c;我们经常会遇到更换MCU的情…

华硕 PRIME H610M-A D4 i5-12490F 1060电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板华硕 PRIME H610M-A D4&#xff08;LPC Controller/eSPI Controller H610芯片组&#xff09; 处理器12th Gen Intel Core i5-12490F 六核已驱动 内…

Mysql的重要知识点以及问题

查看索引的命令 show index from mytable 索引的原理 索引用来快速地寻找那些具有特定值的记录。如果没有索引&#xff0c;⼀般来说执行查询时遍历整张表。 索引的原理&#xff1a;就是把无序的数据变成有序的查询 把创建了索引的列的内容进行排序 对排序结果生成倒排表…

货运物流小程序开发功能有哪些?

移动互联网的深入发展让网购等线上交易更加盛行&#xff0c;货运快递物流也随之增多&#xff0c;成为我们日常生活的重要组成部分。传统的货运物流管理主要依赖人工&#xff0c;不仅效率慢还容易出错。随着市场的发展以及人们对服务质量要求的提高&#xff0c;现在很多中大型货…

Oracle 12c安装

前言 版本&#xff1a;12c第二版 检查弹出窗口程序&#xff0c;需要安装xmanager,并执行以下命令&#xff1a; xhost 192.168.194.91 安装步骤如下 安装必须的安装包&#xff1a; rpm -q bc binutils compat-libcap1 compat-libstdc-33 glibc glibc-devel ksh libaio libaio…

c++ 多态与虚函数

c中多态分为静态多态和动态多态&#xff0c;静态多态是函数重载&#xff0c;在编译阶段就能确定调用哪个函数。动态多态是由继承产生的&#xff0c;指不同的对象根据所接收的消息(成员函数)做出不同的反应。例如&#xff0c;动物都能发出叫声&#xff0c;但不同的动物能发出不同…

esp32之解析json

文章目录 前言一、json的作用二、json结构三、esp32 json解析安装库解析StaticJsonDocumentDynamicJsonDocument 四、解析今天的北京天气总结 前言 在现代Web开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为常用的数据传输格式。ESP32是一款…

Netty 爱好者必看!一文详解 ChannelHandler 家族,助你快速掌握 Netty 开发技巧!

1 Channel 接口的生命周期 Channel 定义了一组和 ChannelInboundHandler API 密切相关的简单但功能强大的状态模型 1.1 Channel 的状态 状 态描 述ChannelUnregisteredChannel 已经被创建&#xff0c;但还未注册到 EventLoopChannelRegisteredChannel 已经被注册到了 EventL…

Wealth 开源的账本响应式网站系统免费部署

演示网站&#xff1a; https://wealth.willin.wang 前置准备 首先需要注册一个 Github 账号&#xff0c;Fork 这个开源项目&#xff1a; https://github.com/willin/wealth &#xff08;欢迎 Star&#xff09; 然后使用 Github 账号分别注册 Vercel 和 Planetscale&#xf…

【Linux 】 ps命令详解,查看进程pid

文章目录 ps概述ps语法指定pid进行查看 ps概述 ps 命令是最常用的监控进程的命令&#xff0c;通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令有多种不同的使用方法&#xff0c;这常常给初学者带来困惑。在各种 Linux 论坛上&#xff0c;询问 ps 命令语法的帖子屡…

双向链表--C语言实现数据结构

本期带大家一起用C语言实现双向链表&#x1f308;&#x1f308;&#x1f308; 文章目录 一、链表的概念&#x1f30e;二、链表中数据元素的构成&#x1f30e; &#x1f30d;三、链表的结构&#x1f30e; &#x1f30d; &#x1f30f;四、 双向带哨兵位循环链表的实现&#x1f3…

ROS2 中 使用奥比中光 Orbbec Astra Pro 深度相机

本文将以 Ubuntu 20.04 和 ROS2 foxy 环境为例&#xff0c;详细介绍如何在 ROS2 中使用奥比中光 Orbbec Astra Pro 深度相机。在这一篇文章中&#xff0c;你会学到如何创建工作空间&#xff0c;使用 usb_cam 功能包&#xff0c;编译安装使用 ros_astra_camera 等。 文章目录 1.…

年薪50万的程序员和一般的中学教师相比,被亲戚看不起

我是一名程序员&#xff0c;已经工作五年&#xff0c;年薪大概有50万左右。然后&#xff0c;亲戚家的孩子是博士生&#xff0c;在一所中学教书&#xff0c;自己一年的工资可以抵达五六年的薪资&#xff0c;不过还是被亲戚给鄙视了。 很多人都持有不同的观点。我自己是一名程序…

vue-事件修饰符+键盘事件

事件修饰符 1、prevent&#xff1a; 阻止默认事件&#xff08;或在方法中使用e.preventDefault()&#xff09; <a hrefhttps://blog.csdn.net/weixin_52993364?typeblog click.preventshowInfo>点我</a> 说明&#xff1a;这样点击后就不会发生地址的跳转 2、s…

Linux查找指令 时间查看

date 我们在windows中想要看一下时间&#xff0c;我们可以直接在显示器上看到&#xff0c;但是如果我们用的是linux远程登录软件我们像查看一下时间&#xff0c;我们应该怎么做&#xff1f; 我们直接输入date&#xff0c;我们就可以看到当前的时间&#xff0c;不过这个是系统按…

蚁群算法ACS处理旅行商问题TSP【Java实现】

1. 介绍 蚁群算法是一种群体智能算法&#xff0c;模拟了蚂蚁寻找食物时的行为&#xff0c;通过蚂蚁之间的信息交流和合作&#xff0c;最终实现全局最优解的寻找【是否找得到和迭代次数有关】。 蚁群算法的基本思想是将搜索空间看作一个由节点组成的图&#xff0c;每个节点代表…

Linux awk [-v] {print} 命令

AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。 语法&#xff1a;语法&#xff1a;awk 条件1 {动作 1} 条件 2 {动作 2} … 文件名 awk是处理文本文件的语言&#xff0c;所以要传入文本数据供其处理&#xff08;文件逐行读入&#xff09;&#xff0c;…

合宙Air780e C-SDK开发

Air78e简介 AirXXXE系列模组&#xff0c;是合宙通信基于移芯EC618平台设计研发的新款4G Cat.1模组。 Air780e的资料点击这里打开。 Air78e开发板简介 一代 IPEX 天线连接器&#xff08;选配&#xff09;4G 弹簧天线一个下载/调试串口&#xff0c;两个通用串口IO 口默认电平…

电子电气架构——车辆电子电气架构的网络安全汇总

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本文主要分享关于车辆电子电气架构的网络安全常见隐患和对应现阶段解决办法。 背景信息 不知道是否还记得《速度与激情8》中黑客Cipher通过网络侵入车辆,…