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

【计算机操作系统】深入探究CPU,PCB和进程工作原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱
ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客
本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如需转载还请通知˶⍤⃝˶​
个人主页:xiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客

系列专栏:xiaoxie的JAVAEE学习系列专栏——CSDN博客●'ᴗ'σσணღ
我的目标:"团团等我💪( ◡̀_◡́ ҂)" 

( ⸝⸝⸝›ᴥ‹⸝⸝⸝ )欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​+关注(互三必回)!

 

一.CPU

1.CPU是什么

CPU(Central Processing Unit)中文翻译为中央处理器,是计算机硬件系统的核心组件之一,负责执行计算机程序的指令,进行各种算术和逻辑运算,控制数据的流动,并管理计算机系统内部的整体操作。CPU可以看作是计算机的大脑,它承担了几乎所有的计算任务和协调其它硬件组件的工作。

2.CPU的工作原理

CPU(中央处理器)的工作原理基于一种称为“指令周期”的循环过程,这个过程主要包括以下几个基本步骤:

  1. 取指令(Fetch)

    • CPU从内存中按照程序计数器(Program Counter, PC)所指向的位置取出下一条待执行的指令。程序计数器是一个专门的寄存器(可以看作一个轻量级的内存,存储空间小于内存不过访问数据的速度远大于内存),它保存着即将执行的指令地址。
    • 当指令被取出后,程序计数器通常自动递增(或按需调整),以便准备取出下一条指令。
  2. 指令解码(Decode)

    • 取出的指令进入指令解码器,CPU对其进行分析以确定这条指令的操作码(Opcode)和相关操作数(Operand)。
    • 操作码告诉CPU要执行何种操作(例如加法、减法、跳转等),而操作数则指示参与操作的具体数据源或目标位置。
  3. 执行(Execute)

    • 根据解码后的指令信息,CPU调用相应的功能部件(如算术逻辑单元ALU、浮点运算单元FPU等)来执行实际操作。
    • 如果指令涉及到数据读取或写入,CPU会通过地址总线与内存交互,从内存读取数据到寄存器或把寄存器中的结果写回内存。
  4. 访存(Memory Access)

    • 在执行过程中,如果需要访问主存,CPU会发出控制信号,通过内存管理单元(MMU)与内存进行数据交换。
  5. 写回(Write Back)

    • 执行完毕后,如果有运算结果需要保存,CPU会将结果写回到相应的寄存器中,或者写入内存指定位置。
  6. 更新程序计数器(PC Update)

    • 根据指令类型,程序计数器可能会被更新以执行顺序执行的下一条指令,或者是跳转到新的指令地址执行分支或循环操作。

以上步骤概括了一个简化版的CPU工作循环,现代CPU为了提高效率,采用了流水线、乱序执行、预测执行等多种优化技术,使得多个指令能够在不同的处理阶段并行工作,极大地提升了CPU的性能表现。不过,上述基本原理依然适用于理解CPU工作的核心逻辑

3.CPU执行指令的流程

上述的内容可能比较抽象,博主举一个具体的示例来演饰一下CPU执行指令的流程

第一轮操作 

1.CPU取出0号地址的指令

0  ->  00101110

2.根据指令表解析指令

因为该指令表表示前4位为操作码 0010 对照指令表的LOAD_A操作将后4位的 1110(14) 地址所指向的数据 存储到寄存器A

3.执行指令

第二轮操作 

1.CPU取出1号地址的指令(PC++)

1  ->  00011111

2.根据指令表解析指令

因为该指令表表示前4位为操作码 0001 对照指令表的LOAD_B操作将后4位的 1111(15) 地址所指向的数据 存储到寄存器B

3.执行指令

第三轮操作 

1.CPU取出2号地址的指令(PC++)

2 ->  10000100

2.根据指令表解析指令

因为该指令表表示前4位为操作码 1000 对照指令表的ADD操作,计算两个寄存器里的数据的和,并将结果放到第二个寄存器中,并且说明了后4位操作码,两个为一组,分别对应两个寄存器的ID(这里ID都是提前约定好的,我们就假设01为B,00为A)

3.执行指令

第四轮操作 

1.CPU取出3号地址的指令(PC++)

3  ->  01001101

2.根据指令表解析指令

因为该指令表表示前4位为操作码 0100 对照指令表的STORE_A操作,将寄存器A的数据写入到后4为操作码指定的地址1101

3.执行指令

 

第五轮操作 

1.CPU取出3号地址的指令(PC++)

4  ->  00000000

2.根据指令表解析指令

发现指令表没有0000 的操作,就表示程序运行完毕

3.执行指令

退出程序

以上只是CPU操作的一点小实例,实际过程更复杂,并且一秒时间内CPU就能运行上亿条指令,我们简单了解一下它的工作原理即可,具体实现,我们这里就不深究了

二.进程(process)

1.什么是进程

进程是计算机操作系统中一个非常核心的概念,它是系统进行资源分配和独立运行的基本单位。进程是正在运行的程序的实例.

2.进程的几个关键特性

  1. 动态性:进程是动态生成和消亡的,它的存在始于程序的执行,终于程序执行的结束或被操作系统终止。

  2. 独立性:每个进程都有自己的地址空间(虚拟内存空间),其中包含了程序代码、数据、堆栈和共享库等,彼此之间相互独立,互不影响。

  3. 并发性:操作系统允许多个进程同时存在于内存中,并通过进程调度算法在多个进程之间切换执行,形成并发执行的效果,尽管实际上单个CPU在同一时刻只能执行一个进程。

  4. 异步性:进程执行不是连续的,而是按照各自独立且不可预知的速度向前推进,进程间的执行进度相互不受对方影响。

  5. 资源分配:操作系统以进程为单位分配系统资源,如CPU时间、内存空间、I/O设备等。

  6. 系统调度:操作系统通过进程调度器决定哪个进程获取CPU使用权,进程状态可以在就绪、运行、等待(阻塞)等状态间转换。

  7. 进程控制块(PCB):操作系统为每个进程维护一个进程控制块(Process Control Block),记录了进程的相关信息,如状态、优先级、CPU寄存器值、内存管理信息等。

总之,进程是操作系统实现多任务并行处理的基础,它将程序的执行表现为一系列操作系统可管理、可调度的任务单元。

3.进程运行的过程

进程运行的过程可以概括为以下几个主要阶段:

  1. 进程创建

    • 应用程序启动或由已运行的进程请求创建新进程时,操作系统首先会响应这个请求。
    • 操作系统为新进程分配必要的系统资源,包括创建一个新的进程控制块(PCB)来存储该进程的状态信息、优先级、程序计数器、内存指针等重要控制信息。
    • 在某些操作系统(如Windows)中,通过类似CreateProcess()这样的系统调用创建进程,并为新进程分配一个独立的地址空间,通常是从父进程复制或者映射文件到内存中加载程序代码和数据段。
  2. 进程加载

    • 操作系统将程序的代码和静态数据从磁盘加载到进程的地址空间中,设置初始堆栈和全局变量。
    • 如果有需要,初始化动态链接库和资源。
  3. 进程调度

    • 新创建的进程被置于就绪队列中等待CPU资源。
    • 当调度程序选择此进程时,将其状态变为“运行”状态,并把CPU控制权交给该进程。
  4. 进程执行

    • 进入“运行”状态的进程开始执行其第一条指令。
    • 进程在CPU上运行,执行程序代码,访问内存,可能涉及到IO操作或其他系统调用。
    • 进程在其生命周期内可能会经历各种状态变迁,例如由于等待某个事件而进入阻塞状态,或因时间片用完而重新回到就绪队列等待下次调度。
  5. 进程同步与通信

    • 在执行过程中,进程可能与其他进程交互,使用同步机制(如信号量、互斥锁等)协调对共享资源的访问,或通过IPC(进程间通信)机制交换数据。
  6. 进程终止

    • 当进程执行完毕或因异常、错误、用户请求等原因被终止时,操作系统释放该进程占用的所有资源,包括内存空间、打开的文件等,并从系统中移除相应的进程控制块。
  7. 进程切换

    • 当前进程因为时间片耗尽、发生中断、等待I/O完成或者其他原因需要让出CPU时,操作系统会保存当前进程的上下文(CPU寄存器状态等),恢复下一个即将运行进程的上下文,然后开始执行新的进程。

整个进程中,操作系统扮演着管理和调度的角色,确保进程在多任务环境下正确地并发执行。

其中进程调度是最核心的一步,接下来我们来详细介绍一下进程调度的过程

4.进程调度

进程调度是操作系统中的一项核心功能,它负责决定哪一个进程在什么时候获取CPU资源并执行。在多道程序设计系统中,由于CPU、内存等系统资源有限,而同时存在多个进程需要执行,因此必须有一个机制来公平有效地分配这些资源。进程调度主要涉及以下几个方面:

1.进程调度的目的与意义

  • 资源利用率:最大化CPU的使用率,避免CPU空闲。
  • 响应时间:确保交互式系统中的进程能及时响应用户的请求。
  • 公平性:确保所有进程都能得到合理的执行机会,避免饥饿现象(一个进程长时间得不到执行的情况)。
  • 系统吞吐量:提高系统处理任务的整体速度。
  • 平衡性:兼顾进程执行的紧迫性和等待时间。

2.进程调度的时机

  • 进程主动放弃CPU:进程执行时发生I/O请求或其他阻塞事件,此时进程转入阻塞状态,调度程序会选择其他就绪进程运行。
  • 当前进程的时间片用完:在分时系统中,每个进程执行一段时间后会被强制让出CPU,这是时间片轮转调度策略的特点。
  • 新进程创建并进入就绪状态:当有新的进程被创建并且准备好运行时,也可能触发进程调度。

3.进程调度的方式

  • 非抢占式调度(Non-preemptive scheduling):一旦进程获得CPU,它会一直执行直到自己主动放弃(如执行完毕或阻塞)或系统中没有其他进程需要执行为止。例如,先来先服务(FCFS)调度算法。

  • 抢占式调度(Preemptive scheduling):操作系统可以根据需要随时中断当前正在运行的进程,并把CPU分配给另一个进程。这种调度方式允许更灵活的响应实时性和优先级变化,例如短进程优先(SPN)或时间片轮转(Round Robin, RR)调度算法。

4.进程调度的算法

  • 先来先服务(First-Come, First-Served, FCFS):按照进程到达就绪队列的顺序依次执行。
  • 短进程优先(Shortest Process Next, SPN 或 Shortest Job First, SJF):优先选择预计执行时间最短的进程执行。
  • 优先级调度(Priority Scheduling):根据进程的优先级高低选择进程执行,优先级高的进程优先执行。
  • 时间片轮转(Round Robin, RR):每个进程都分配一个固定的时间片,时间片结束后不论进程是否执行完毕都要让出CPU,转至下一个进程。
  • 多级反馈队列(Multilevel Feedback Queue):使用多个就绪队列,每个队列有不同的优先级和时间片长度,进程可以根据一定条件在队列间迁移。

5.进程调度的过程

  • 进程状态转换:进程在就绪、运行、阻塞等状态间切换。
  • 上下文切换:当进行进程调度时,操作系统需要保存当前进程的上下文(CPU寄存器状态、程序计数器等信息),并恢复即将执行进程的上下文。
  • 调度决策:调度程序根据所采用的调度算法和当前系统状态作出调度决策。

6.进程调度准则

  • 公平性:保证所有进程都能得到合理的执行机会。
  • 效率:尽量减少进程在就绪队列中的等待时间,降低进程的响应时间。
  • 平衡性:既考虑进程的紧迫程度,也顾及进程的等待时间长短。
  • 系统开销:最小化进程调度引起的上下文切换开销。

总之,进程调度是操作系统内核中的核心组成部分,其性能直接影响到整个系统的性能和用户体验。通过精心设计和实现高效的进程调度算法,操作系统能够更好地满足各类应用程序的需求,提高系统的整体效能。

三.PCB(进程控制块)

1.PCB是什么

进程控制块是操作系统中用于管理和控制进程的一个数据结构。操作系统为系统中的每一个进程都维护一个唯一的PCB,其中包含了描述进程状态、控制信息以及与该进程相关的一些重要数据。注意这里提的PCB在每个操作系统中的名字是不一样的,例如在Linux里的PCB是叫task_struct

2.操作系统如何组织PCB

操作系统组织进程控制块(PCB)的方法主要有以下几种:

  1. 线性表方式: 在这种方式下,操作系统将所有进程的PCB连续地存放在内存的一个区域内。这是一种简单的组织形式,适合于进程较少且系统不支持复杂调度策略的情况。查找、添加和删除操作需要遍历整个线性表,所以当系统中进程数量较多时,这种方式效率较低。

  2. 索引表方式: 改进线性表方法,按照进程的状态(如就绪、运行、阻塞等)建立不同的索引表。这样,操作系统可以更快地定位到处于特定状态的进程。例如,系统会有一个就绪队列的索引表,一个阻塞队列的索引表等,每个表中包含了对应状态的所有进程的PCB地址。

  3. 链接表方式: 使用链表数据结构来组织PCB,将具有相同状态的进程PCB链接在一起,形成不同的队列,如就绪队列、阻塞队列、运行队列等。每个PCB中包含一个指向下一个PCB的指针,这样可以方便地插入和删除进程,同时也便于进行调度操作。

在现代操作系统中,往往结合以上几种方法的优点,采用更为复杂的数据结构和技术来组织PCB。例如,可能会采用优先级队列、红黑树、哈希表等高效的数据结构,依据进程的不同属性(如优先级、状态等)来组织和管理PCB,以提高调度和管理的效率。此外,还可能结合多级队列或多维数据结构来应对不同的调度策略和系统需求。

3.PCB所包含的信息

1.几个重要的信息

1.进程标识符(PID, Process ID)每个进程都有一个独一无二的标识符,用于区分系统中的不同进程就像我们的身份证一样,用于区别每一个进程

2.内存指针:一个进程运行时,就会被从硬盘加载到内存中,同时加载这个进程所的指令/依赖的数据

注意这个指针不是一个,而是一组,这一组就告诉操作系统,这个进程要运行的指令在内存的那个地址上,以及这个进程依赖的数据存储在内存的那个地址上.

2.和进程调度有关的信息

上文也提到了进程调度是进程运行的核心部分主要也是因为解决了操作系统如何在有限资源条件下管理大量并发任务的问题特别是我们现如今的CPU都是多核心的,所要求的如何在单一CPU核心上轮流执行多个进程以提供并发效果,而且更要在多个CPU核心之间智能分配任务,以实现真正意义上的并行执行,最大限度地利用硬件资源。

在PCB(进程控制块)中,与进程调度相关的几个关键属性包括

1.进程状态:进程状态字段记录了进程的当前状态,如就绪,阻塞等。调度器会根据进程状态来决定具体的调度

举一个例子说明: 博主同时约了两个人,一个叫小美,一个叫小花.其中小美是富二代,家里有矿,我约她她随时就可以出来,属于是随叫随到, (随叫随到 -> 在操作系统那里看来,就说明进程处于就绪状态)

而小花,就是一个普通人,因为需要考研,所以现在就在图书馆学习,所以呢约不出来(约不出来  ->在操作系统那里看来,就说明进程处于阻塞状态);

2.优先级:

 

 进程优先级决定了进程在调度算法中的优先级,优先级高的进程通常会比优先级低的进程更早得到CPU资源。操作系统可以根据不同的调度策略赋予进程不同的优先级。

这个很好理解,博主就不举例说明,就是很简单的优先级问题

3.上下文切换信息

包括程序计数器(PC)、栈指针等,这些信息在进程切换时用于保存和恢复进程上下文,确保进程能在合适的时候恢复执行。

举一个例子说明:

假设博主是一位老师,一天之中我需要辅导多位学生做作业。我手中有一份详细的“学生辅导计划表”,这份计划表就像进程控制块(PCB)一样,记录了每位学生的学习进度、需要解答的问题和当前的状态(正在辅导、等待辅导、已完成辅导)。

当我正在辅导第一个学生A做数学题时,突然电话响了,通知你马上要去接待一位来访的家长B。这时,你必须放下学生的作业和教学思路(这就是保存当前进程A的上下文),记下A做到哪一题、思考到何处(相当于保存CPU寄存器状态和程序计数器)。

接着,我接待了家长B讨论了一会儿孩子的学习情况(执行另一个“进程”),完成后我返回继续辅导学生A。这时,我需要查看辅导计划表(PCB)并回想刚才中断的地方(恢复上下文),然后继续从之前离开的地方帮助学生A解答数学题。

上下文切换”就好比我从辅导一个学生切换到处理其他事务,再回到辅导学生的过程中保存和恢复执行状态的过程。在计算机中,上下文切换则是操作系统在多个进程或线程之间切换执行时,保存和恢复进程或线程状态的过程。

4.进程调度标志

有些系统中,PCB还可能包含特殊的调度标志,比如是否需要立即调度、是否可以被抢占等,用于指导调度器做出更细致的决策。

5.等待原因(Wait Reason)

如果进程处于阻塞状态,PCB会记录进程等待的原因,可能是等待某个资源(如I/O操作完成),当等待条件满足时,调度器会改变其状态。

四.总结

CPU(Central Processing Unit)是计算机硬件系统的核心部件,负责执行指令、处理数据和控制计算机系统的运行。CPU执行指令流,对数据进行算术逻辑运算,并根据操作系统提供的指令控制整个系统的运作。

进程(Process)是计算机操作系统中运行的程序的实例,它包含了程序代码、数据、堆栈以及进程控制块(PCB)。进程是一个动态的概念,代表着程序在执行过程中的实体,是系统资源分配和调度的基本单位。操作系统通过创建、调度和销毁进程来管理计算机系统的并发执行。

PCB(Process Control Block)是操作系统内维护的一个数据结构,用于记录进程的状态信息以及控制进程运行所需的各种参数。每个进程都有一个与之对应的PCB,它包含了进程标识符、进程状态(如就绪、运行、阻塞等)、程序计数器(PC)、CPU寄存器的上下文、内存管理信息、优先级、资源列表(如打开的文件描述符、内存地址空间等)、以及与进程调度有关的信息如时间片、等待事件等。操作系统通过PCB来管理和调度进程,实现进程的创建、切换、同步、通信以及资源的分配和回收等功能。

感谢你的阅读,祝你一天心情愉悦.

相关文章:

【计算机操作系统】深入探究CPU,PCB和进程工作原理

˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN 如…...

Pillow教程04:学习ImageDraw+Font字体+alpha composite方法,给图片添加文字水印

---------------Pillow教程集合--------------- Python项目18:使用Pillow模块,随机生成4位数的图片验证码 Python教程93:初识Pillow模块(创建Image对象查看属性图片的保存与缩放) Pillow教程02:图片的裁…...

fastjson2 反序列化包含多层泛型结构的实体类

前言 由于使用到httpUtill来调用接口 工具类的返回是字符串 其中接口的实现返回值是个多层泛型结构的实体类 例如Result<Page<UserDto>> 当使用 JSON.parseObject("res",new TypeReference<Result<Page<UserDto>>>{})发现在page中存在…...

P6学习:解析P6 WBS-工作分解结构的原则

前言 WBS&#xff0c;及Work Breakdown Structure&#xff0c;中文工作分解结构&#xff0c;是总结工作阶段的项目的层次结构分解。 WBS 就像项目的大纲——它将项目分解为特定的可交付成果或阶段。 然后将活动添加到这些层中以创建项目计划的时间表。 WBS 使用流程会有所不…...

C++ empalce_back 和 push_back的区别

在C中&#xff0c;push_back和emplace_back都是向容器&#xff08;如std::vector、std::list等&#xff09;尾部添加元素的成员函数。它们的主要区别在于元素的构造方式和参数传递方式。 push_back函数接受一个已经构造好的元素&#xff0c;并将其复制或移动到容器的尾部。这意…...

java1.8常考面试题

在Java 1.8版本中&#xff0c;引入了很多重要的新特性&#xff0c;这些特性常常成为面试的焦点。下面是一些在面试中常见的关于Java 1.8的问题及其解答&#xff0c;帮助你准备面试&#xff1a; 1. Java 1.8的主要新特性有哪些&#xff1f; Lambda表达式&#xff08;Lambda Ex…...

Java 中的业务是指什么?

在 Java 编程中&#xff0c;业务&#xff08;Business&#xff09;是指软件系统中负责实现特定功能或处理特定任务的一组逻辑和功能。业务通常是指与业务需求直接相关的功能和处理过程&#xff0c;包括数据处理、业务逻辑、交易处理、业务规则等。在软件开发中&#xff0c;业务…...

【MySQL】聊聊自增id用完怎么办?

在实际的开发中&#xff0c;一般都会将数据存储到数据库中&#xff0c;在设计表的时候&#xff0c;其实id如果达到最大值的话&#xff0c;会出现什么问题。其实主要分两种情况&#xff0c;一种是设置了主键id&#xff0c;另一种没有设置主键id。 表定义自增值id create table…...

新能源汽车充电桩主板各模块成本占比解析

汽车充电桩主板是汽车充电桩的重要组件&#xff0c;主要由微处理器模块、通信模块、控制模块、安全保护模块、传感器模块等多个模块构成。深入探究各模块在总成本中的比重&#xff0c;我们可以更好地优化成本结构、提高生产效率&#xff0c;并为未来的技术创新和市场需求变化做…...

【面试经典150 | 动态规划】三角形最小路径和

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等内容进行…...

【线段树二分】第十三届蓝桥杯省赛C++ A组/研究生组 Python 研究生组《扫描游戏》(C++)

【题目描述】 有一根围绕原点 O 顺时针旋转的棒 OA&#xff0c;初始时指向正上方&#xff08;Y 轴正向&#xff09;。 在平面中有若干物件&#xff0c;第 i 个物件的坐标为&#xff08;,)&#xff0c;价值为 。 当棒扫到某个物件时&#xff0c;棒的长度会瞬间增长 &#xff…...

类模板与继承及成员、全局函数的实现

一、类模板与继承 当类模板碰到继承时&#xff0c;需要注意一下几点&#xff1a; 1.当子类继承的父类是一个类模板时&#xff0c;子类在声明的时候&#xff0c;要指定出父类中T的类型 2.如果不指定&#xff0c;编译器无法给子类分配内存 3.如果想灵活指定出父类中T的类型&a…...

怎么制作iOS证书

首先我们登录appuploder官网 搜索 appuploder 第一个就是我们官网啦&#xff0c;网址是&#xff1a;Appuploader home -- A tool improve ios develop efficiency such as submit ipa to appstore and manage ios certificate 可以跨平台开发&#xff0c;无论是Windows还是Ma…...

图床项目实战:从零搭建一个简易图床

项目背景与需求分析 随着互联网的发展&#xff0c;图片分享、存储和管理的需求日益增长。图床作为一种专门用于存储和分享图片的服务&#xff0c;受到了广大用户的欢迎。本项目旨在搭建一个简易的图床系统&#xff0c;满足用户上传、查看和删除图片的基本需求。 技术选型 本项…...

双亲委派机制总结

回顾了一下双亲委派机制&#xff0c;在这记录记录&#xff0c;下一篇会基于打破双亲委派机制来更新 1. 类加载&#xff1a; 多个java文件经过编译打包后生成可运行jar包&#xff0c;最后启动程序。首先需要通过类加载器把主类加载到JVM。主类在运行过程中如果使用到其他类&a…...

C语言数据结构基础————二叉树学习笔记(四)简单的OJ题目练习

1.单值二叉树 965. 单值二叉树 - 力扣&#xff08;LeetCode&#xff09; 建立一个新的函数&#xff0c;用函数传参的方法来记录val的值 如上一篇最后的对称二叉树的习题&#xff0c;建立新的函数来传参 多采用使用反对值的方法&#xff0c;因为如果是相等return true的话&am…...

protobuf学习笔记(一):生成一个比较综合的message

一年前学过对应的知识&#xff0c;终究是太潦草了&#xff0c;这几天网上学习了一下&#xff0c;重新写一下笔记。这里是protobuf和golang的结合 一、protobuf protobuf实际上是一种类似json和gob之类的数据格式&#xff0c;也是grpc的御用格式吧&#xff08;有自己的优势&am…...

[BT]BUUCTF刷题第8天(3.26)

第8天 Web [CISCN2019 华北赛区 Day2 Web1]Hack World 题目明确提示flag在flag表里的flag列&#xff0c;这里先尝试1 返回&#xff1a;你好&#xff0c;glzjin想要一个女朋友。 再尝试1&#xff0c;返回bool(false) 到这里就感觉是布尔盲注的题目类型了&#xff08;虽然我没…...

【前端】-

相对路径和绝对路径是描述文件位置的两种方式。 1. 相对路径&#xff1a;相对于自己的目标文件的位置&#xff0c;以引用文件之间网页所在位置为参考基础&#xff0c;而建立出的目录路径。因此&#xff0c;当保存于不同目录的网页引用同一个文件时&#xff0c;所使用的路径将不…...

uniapp安装axios

先npm安装 npm i axios然后在项目里面建一个utils文件&#xff0c;再建一个index.js 以下是index.js代码&#xff1a; import axios from axios; const service axios.create({baseURL: //xxxx.xxxxx.com///你的请求接口域名, timeout: 6000, // request timeoutcrossDomai…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...