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

初始Linux(7):认识进程(下)

1. 进程优先级

    cpu 资源分配的先后顺序,就是指进程的优先权( priority )。
    优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。
    还可以把进程运行到指定的CPU 上,这样一来,把不重要的进程安排到某个 CPU ,可以大大改善系统整体性能

根本原因:每种设备的可用资源(磁盘/显示器/键盘..........)相比进程的数量还是太少了

注意区分优先级和权限的概念,优先级是前与后的问题,权限是能不能的问题。

 1.1 ps -al(查看优先级)

可以用ps -al来查看优先级

PRI(priority)用来看优先级,NI即nice值,是对优先级的修正数据。

PRI是一种存在task_struct中的对优先级属性的描写,通过[60,99]共计40个数字来描写优先级。 

         

一般来说,各个进程竞争的都是CPU资源

NI:优先级的NICE数据,nice数据是一种优先级的修正数据。

使用者通过修改nice值来改变最终优先级。

优先级数字越小(排名越靠前),优先级越高

最终显示在PRI下面的最终优先级=pri(default)+nice。

 每次优先级的调整都是一次 重置


1.2 如何调整优先级

使用top指令,r一下进入以下界面,此时希望你输入一个你想改的PID值,假设我们想修改的是18957

输入后PID:

修改之后再查看:

NI只有[-20,19]的值,保证最终的PRI只会在[60,99]

每次通过ps -al展示的PRI和NI,都满足PRI-NI=原优先级

每次都是从原优先级开始变化。


 引进一个概念:UID

UID: 在ps -al时观察到的UID,即user id

类似于文件权限处的r u o等名字,用于记录是谁启动的该进程,一般来说1000是root,1001是第一个用户。

                               

   修改优先级是一种少见的操作,不建议多使用,OS自主安排的一般就是合理的优先顺序          OS本来的安排更能适合公平合理的安排进程           


2. 进程切换(基于分时操作系统的大背景)

        CPU上下⽂切换:其实际含义是任务切换, 或者CPU寄存器切换。当多任务内核决定运⾏另外的任务时, 它保存正在运⾏任务的当前状态, 也就是CPU寄存器中的全部内容。这些内容被保存在任务⾃⼰的堆栈中, ⼊栈⼯作完成后就把下⼀个将要运⾏的任务的当前状况从该任务的栈中重新装⼊CPU寄存器, 并开始下⼀个任务的运⾏, 这⼀过程就是context switch。

是什么 

       每次时间片到了,都需要保存上下文数据再离开(切换进程),回来的时候要恢复上下文数据

时间片到了100次,就要被保存/恢复数据一百次。

那么OS如何知道你的程序运行到哪里了呢?

cpu在运行时,会将很多临时数据放进寄存器里

计算机中的pc指针(point code), 即eip,会进行这项工作:指向下一条指令的位置

我们先重点研究两种寄存器:eip和ir(下图表示CPU中除了EIP和IR,还有其他多种多样的寄存器)

以及对应的处理部分: 

                 

假设内存中加载进来一个进程,其中有描述他的PCB

CPU内部维护一个寄存器EIP,来记录接下来该怎么去执行

比如当前EIP告诉CPU该去处理code3,那么code3的代码就会被读到ir里去,ir寄存器再将数据拿给CPU,此时EIP就会更新成4。因此,IR保存的就是当前正在处理的代码。

                                                        

寄存器就是EIP,EIP里的数据就叫做上下文数据

为什么 

       如果不保留上下文数据,新切换的进程的运行数据就会进入寄存器,覆盖掉原来的上下文数据,所以每次切换时必须保留上下文数据。保留上下文数据不是目的,是手段,目的依然是恢复上下文数据,让CPU进行新一轮的处理。CPU内部随时都在高速保留,恢复上下文数据。也就是说,上述EIP和IR的过程是一直在持续发生的。注意:CPU读取的其实是汇编代码,以上的前提都是在汇编的基础上进行的,所有语言都会最后变成汇编语言

怎么做

计算机如何保留上下文数据:

基于上文,我们知道进程切换的本质就是1.取指令到ir;2.更新EIP;3.从IR中拿指令来分析和处理

如果只有mov eax 10;mov ebx 20,ret三条指令,我们模拟一下这个过程。

根据上述的过程,假设我们已经到了即将执行ret的一步:此时进来一个要执行sub的task_struct2

如果不保护:

原来的task_struct的数据会被抹除,再次调度回来时只能从main开始执行,根本无法进行多进程的调度和切换。

                      

但是真实的保存方法不仅是简单的放入PCB。

每次的临时数据一定都是保存在内存里的tss_struct中。(Task State Segment,任务状态段)

  • 内核会为每个 CPU 分配一个 tss_struct 结构,并将其存储在内核分配的内存中。这些内存通常是从内核的动态内存分配器(如 slab 分配器)中分配的。

  • 每个 CPU 的 TSS:在多核系统中,每个 CPU 核心都有自己的 tss_struct,并且存储在独立的内存区域中,以避免多核之间的冲突。

所以我们也可以说,task_struct中是存储了以下信息的: 


3. Linux下进程切换的调度算法

3.1 CPU的均衡负载

首先需要知道的是,接下来的讨论都是基于单核CPU;如果是多核CPU,就要考虑每一个CPU均衡负载的问题。其次,每个CPU上不会是FIFO算法,太蠢了,失去了算法的意义。


3.2 rqueue的大概结构

首先,每一个CPU都有一个自己的rqueue

                        

    其中的active*(活跃进程)和expired*(过期进程),分别指向下面的蓝色框和红色框。 

两个框中的结构是完全一样的,将他们封装成一个prio_arry_t的类型(每个类型是一个框),然后创建一个array[]数组,里面有两个元素,分别是红框和蓝框,active*和expired*就是prio_arry_t类型的指针。

每个prio_arry_t里面有一个queue[140],存储的是task_struct*

前一百个是实时操作系统的位置,后40个是分时操作系统:

因此我们不考虑前100个位置,只研究后四十个位置。

3.3 本质是2个HashBucket

queue[140]中下标(应该是100-139)与哈希值(右边是PRI值,PRI就看作是此处的哈希值):

                                                 

这样,每次查询都是O(1)。

3.4 如何调度

CPU只会从active*指向的队列中去调度。

                                       

由此延伸出来的问题:

都是高优先级,那怎么均衡调度(如何调度优先级较低的进程)?——饥饿问题(比如你是一个89号,65号的刚刚调度完回到队列中,由于优先级高,又该调度他。除非65号的退出,否则永远轮不到这个89号的),或者用户一直在添加高优先级的新进程,也无法调度低优先级进程(PRI越高优先级越低)

为了解决新建进程加剧饥饿问题的情况,新建的进程一般都不直接添加到active中,而是添加到expired,刚刚调度过的高优先级进程也不能放回active,而是直接放到expired中去(刚刚括号中的问题)。

因此:

                                

active是会为空的,当active为空的时候,操作系统只需要交换一下两个指针的内容。

这样,一个简单的时间窗口(即一次调度周期)能调度所有的进程

nr_active表示当前结构里有多少进程,用于判断是否等于0,等于0的时候就需要进行swap

                                                 

active指向原来的expired,而原来的expired全是进程,从此可以开始新一轮的调度。

3.5 位图优化

但是,目前为止的queue[140](其中的后40位)还是需要我们遍历和维护的,全部遍历一遍任然有一丢丢的成本,因此采用了位图的设计来进一步优化

bitmap:

整形是32位的,32*5 = 160,每一个位置用1和0来表示是否有进程

                                 

这样,最多遍历五次,然后每次如果是0就可以直接跳过该32种优先级,如果不是0就进去,进去寻找每次也最多是32次,同时每当找到了有进程的哈希桶,对每个桶里的头删也是O(1)的算法


4. 进程在各种队列中的连接方式

之前提到过,进程连接都是通过队列链接。

不过之前学习到的链接方式太不优雅,可扩展性也很弱,我们建议使用下述新的方法。

每一个队列当中只放入向前和向后的指针。 

队列当中只链接一个struct link。

意义:

操作系统中有太多的队列需要进程进入,同一个进程,可能既需要放在整体管理队列中,又需要放到活跃队列中,如果单独封装一层link,就能很好的实现这一功能。这样的作法同样存在于STL中。

现在的问题是,怎么在遍历一种队列的时候,去访问当前被遍历的link结构体所对应的进程属性?

通过偏移量解决访问的问题

复习两个概念:

栈的增长方向 与 结构体(或类)的增长方向是反的。

而对于结构体和类的存储:在大多数现代计算机系统中,结构体(struct)或类(class)中的数据成员通常是从低地址到高地址依次存储的。

假设我们知道了A结构体中C的地址,只需要通过(struct A*) (&C - 偏移量),就能获得obj的指针。 

(先对C取地址,再减去c元素相对于结构体首元素的地址偏移量,获得首元素地址,再将该地址强转为struct A*,就能自由访问了。)

                         

并且,此处的偏移量的单位是字节。

那么,如何获得该偏移量呢?

由前置知识,一个结构体中,数据是从低地址存向高地址的,假设起始地址是0

那么C的偏移量就是C地址的本身——数轴上大于0的数和零点的距离等于其数字大小本身。

将0强转为一个struct A结构体,然后访问其对应的c,再取地址,这就是偏移量。

结合刚刚的得到首元素的办法:

(struct A*) (&c - &((struct A*)0)->c)

那么,可以用一个宏函数来解决这个问题:

#define Who(type,x)  (struct type*)(&x - (&((struct type*)0) -> x))

补充:库中的offset宏

         

宏函数复习: 

相关文章:

初始Linux(7):认识进程(下)

1. 进程优先级 cpu 资源分配的先后顺序,就是指进程的优先权( priority )。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。 还可以把进程运行到指定的CPU 上,这样一来…...

人工智能第2章-知识点与学习笔记

结合教材2.1节,阐述什么是知识、知识的特性,以及知识的表示。人工智能最早应用的两种逻辑是什么?阐述你对这两种逻辑表示的内涵理解。什么谓词,什么是谓词逻辑,什么是谓词公式。谈谈你对谓词逻辑中的量词的理解。阐述谓词公式的解…...

Kotlin 协程 与 Java 虚拟线程对比测试(娱乐性质,请勿严谨看待本次测试)

起因 昨天在群里聊到虚拟线程的执行效率问题的时候虽然最后的结论是虚拟线程在针对IO密集型任务时具有很大的优势。但是讨论到虚拟线程和Kotlin 的协程的优势对比的话,这时候所有人都沉默了。所以有了本次的测试 提前声明:本次测试是不严谨的&#xff0…...

C++中的拷贝构造器(Copy Constructor)

在C中,拷贝构造器(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。当使用一个已存在的对象来初始化一个新对象时,拷贝构造器会被调用。 拷贝构造器的定义 拷…...

Spring Boot项目如何使用MyBatis实现分页查询

写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...

独立开发经验谈:如何借助 AI 辅助产品 UI 设计

我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独…...

笔灵ai写作技术浅析(三):深度学习

笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…...

https数字签名手动验签

以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构,由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体(如子 CA 或终端实体)颁发证书。层级结构的顶端是 根 CA(Root CA),它是整个 PKI 体…...

为什么LabVIEW适合软硬件结合的项目?

LabVIEW是一种基于图形化编程的开发平台,广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面,使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...

C# 操作符重载对象详解

.NET学习资料 .NET学习资料 .NET学习资料 一、操作符重载的概念 在 C# 中,操作符重载允许我们为自定义的类或结构体定义操作符的行为。通常,我们熟悉的操作符,如加法()、减法(-)、乘法&#…...

git:恢复纯版本库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...

java异常处理——try catch finally

单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后,才会执行catch里的代码,程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常,则会强制停止程序,报错 3.finally修饰的代码一定会执行,除…...

【架构面试】二、消息队列和MySQL和Redis

MQ MQ消息中间件 问题引出与MQ作用 常见面试问题:面试官常针对项目中使用MQ技术的候选人提问,如如何确保消息不丢失,该问题可考察候选人技术能力。MQ应用场景及作用:以京东系统下单扣减京豆为例,MQ用于交易服和京豆服…...

A4988一款常用的步进电机驱动芯片

A4988 是一款常用的步进电机驱动芯片,广泛应用于 3D 打印机、CNC 机床和小型自动化设备中。它可以驱动多种类型的步进电机,但需要根据电机的参数(如电压、电流、相数等)进行合理配置。 一、A4988 的主要特性 驱动能力:…...

TypeScript语言的语法糖

TypeScript语言的语法糖 TypeScript作为一种由微软开发的开源编程语言,它在JavaScript的基础上添加了一些强类型的特性,使得开发者能够更好地进行大型应用程序的构建和维护。在TypeScript中,不仅包含了静态类型、接口、枚举等强大的特性&…...

A星算法两元障碍物矩阵转化为rrt算法四元障碍物矩阵

对于a星算法obstacle所表示的障碍物障碍物信息,每行表示一个障碍物的坐标,例如2 , 3; % 第一个障碍物在第二行第三列,也就是边长为1的正方形障碍物右上角横坐标是2,纵坐标为3,障碍物的宽度和高度始终为1.在rrt路径规划…...

什么情况下,C#需要手动进行资源分配和释放?什么又是非托管资源?

扩展:如何使用C#的using语句释放资源?什么是IDisposable接口?与垃圾回收有什么关系?-CSDN博客 托管资源的回收有GC自动触发,而非托管资源需要手动释放。 在 C# 中,非托管资源是指那些不由 CLR(…...

【最长上升子序列Ⅱ——树状数组,二分+DP,纯DP】

题目 代码&#xff08;只给出树状数组的&#xff09; #include <bits/stdc.h> using namespace std; const int N 1e510; int n, m; int a[N], b[N], f[N], tr[N]; //f[i]表示以a[i]为尾的LIS的最大长度 void init() {sort(b1, bn1);m unique(b1, bn1) - b - 1;for(in…...

day37|完全背包基础+leetcode 518.零钱兑换II ,377.组合总和II

完全背包理论基础 完全背包与01背包的不同在于01背包的不同物品每个都只可以使用一次&#xff0c;但是完全背包的不同物品可以使用无数次 在01背包理论基础中&#xff0c;为了使得物品只被使用一次&#xff0c;我们采取倒序遍历来控制 回顾&#xff1a;>> for(int j …...

【VM】VirtualBox安装ubuntu22.04虚拟机

阅读本文之前&#xff0c;请先根据 安装virtualbox 教程安装virtulbox虚拟机软件。 1.下载Ubuntu系统镜像 打开阿里云的镜像站点&#xff1a;https://developer.aliyun.com/mirror/ 找到如图所示位置&#xff0c;选择Ubuntu 22.04.3(destop-amd64)系统 Ubuntu 22.04.3(desto…...

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…...

DeepSeek 云端部署,释放无限 AI 潜力!

1.简介 目前&#xff0c;OpenAI、Anthropic、Google 等公司的大型语言模型&#xff08;LLM&#xff09;已广泛应用于商业和私人领域。自 ChatGPT 推出以来&#xff0c;与 AI 的对话变得司空见惯&#xff0c;对我而言没有 LLM 几乎无法工作。 国产模型「DeepSeek-R1」的性能与…...

【论文复现】基于Otsu方法的多阈值图像分割改进鲸鱼优化算法

目录 1.摘要2.鲸鱼优化算法WOA原理3.改进策略4.结果展示5.参考文献6.代码获取 1.摘要 本文提出了一种基于Otsu方法的多阈值图像分割改进鲸鱼优化算法&#xff08;RAV-WOA&#xff09;。RAV-WOA算法能够在分割灰度图像和彩色图像时&#xff0c;自动选择最优阈值&#xff0c;并确…...

Hive之数据定义DDL

Hive之数据定义DDL 文章目录 Hive之数据定义DDL写在前面创建数据库查询数据库显示数据库查看数据库详情切换当前数据库 修改数据库删除数据库创建表管理表(内部表)外部表管理表与外部表的互相转换 修改表重命名表增加、修改和删除表分区增加/修改/替换列信息 删除表 写在前面 …...

Golang 应用的 Docker 部署方式介绍及使用详解

本文将介绍如何使用 Docker 部署一个基于 Go 语言的后台服务应用 godco&#xff0c;并介绍如何配置 MongoDB 数据库容器的连接&#xff0c;确保应用能够成功启动并连接到容器方式部署的mongoDB数据库。 前提条件 1.已安装 Docker/Podman 2.已安装 MongoDB 数据库容器&#xff…...

SuccessFactors OData OAuth with SAP IAS-generated SAML assertion

导读 IAS:一句话说明白。SAP相关的系统可以通过IAS登录&#xff0c;只要IAS登录&#xff0c;其他系统免密登录。 作者&#xff1a;vivi&#xff0c;来源&#xff1a;osinnovation 上图有三个角色&#xff1a;brower&#xff0c;就是自己的浏览器&#xff0c;sp就是我们的目标…...

vue入门到实战 三

目录 3.1 v-bind 3.1.1 v-bind指令用法 ​编辑3.1.2 使用v-bind绑定class 3.1.3 使用v-bind绑定style 3.2.1 v-if指令 3.2.1 v-if指令 3.2.2 v-show指令 ​3.3 列表渲染指令v-for 3.3.1 基本用法 3.3.2 数组更新 3.3.3 过滤与排序 3.4 事件处理 3.4.1 使用v-on指令…...

音视频入门基础:RTP专题(7)——RTP协议简介

一、引言 本文对RTP协议进行简介。在简介之前&#xff0c;请各位先下载RTP的官方文档《RFC 3550》。该文档总共有89页&#xff0c;本文下面所说的“页数”是指在pdf阅读器中显示的页数&#xff1a; 二、RTP协议简介 根据《RFC 3550》第5页&#xff0c;实时传输协议&#xff08…...

06-机器学习-数据预处理

数据清洗 数据清洗是数据预处理的核心步骤&#xff0c;旨在修正或移除数据集中的错误、不完整、重复或不一致的部分&#xff0c;为后续分析和建模提供可靠基础。以下是数据清洗的详细流程、方法和实战示例&#xff1a; 一、数据清洗的核心任务 问题类型表现示例影响缺失值数值…...

《逆向工程核心原理》第三~五章知识整理

查看上一章节内容《逆向工程核心原理》第一~二章知识整理 对应《逆向工程核心原理》第三章到第五章内容 小端序标记法 字节序 多字节数据在计算机内存中存放的字节顺序分为小端序和大端序两大类 大端序与小端序 BYTE b 0x12; WORD w 0x1234; DWORD dw 0x12345678; cha…...

影视文件大数据高速分发方案

在当今的数字时代&#xff0c;影视行业的内容创作和传播方式经历了翻天覆地的变化。随着4K、8K高清视频的普及&#xff0c;以及虚拟现实(VR)和增强现实(AR)技术的发展&#xff0c;影视文件的数据量正以前所未有的速度增长。这就要求行业内的参与者必须拥有高效的大数据传输解决…...

使用朴素贝叶斯对散点数据进行分类

本文将通过一个具体的例子&#xff0c;展示如何使用 Python 和 scikit-learn 库中的 GaussianNB 模型&#xff0c;对二维散点数据进行分类&#xff0c;并可视化分类结果。 1. 数据准备 假设我们有两个类别的二维散点数据&#xff0c;每个类别包含若干个点。我们将这些点分别存…...

pytorch线性回归模型预测房价例子

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 import torch import torch.nn as nn import torch.optim as optim import numpy as np# 1. 创建线性回归模型类 class LinearRegressionModel(nn.Module):def __init__(self):super(LinearRegressionModel, self).…...

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…...

C++运算符重载

C的运算符重载&#xff1a;使对象的运算表现得和编译器内置类型一样 以复数类为例&#xff1a; #include <iostream> using namespace std;class CComplex { public:CComplex(int r 0, int i 0): mreal(r), mimage(i){}// 指导编译器怎么做CComplex类对象的加法操作CC…...

pandas(三)Series使用

一、Series基础使用 import pandasd {x:100,y:200,z:300} s1 pandas.Series(d) #将dict转化为Series print(s1)print("") l1 [1, 2, 3] l2 [a, b, c] s2 pandas.Series(l1, indexl2) #list转为Series print(s2)print("") s3 pandas.Series([11…...

PVE 中 Debian 虚拟机崩溃后,硬盘数据怎么恢复

问题 在 PVE 中给 Debian 虚拟机新分配硬盘后&#xff0c;通过 Debian 虚拟机开启 Samba 共享该硬盘。如果这个 Debian 虚拟机崩溃后&#xff0c;怎么恢复 Samba 共享硬盘数据。 方法 开启 Samba 共享相关知识&#xff1a;挂载硬盘和开启Samba共享。 新建一个虚拟机&#xf…...

【大数据技术】案例01:词频统计样例(hadoop+mapreduce+yarn)

词频统计(hadoop+mapreduce+yarn) 搭建完全分布式高可用大数据集群(VMware+CentOS+FinalShell) 搭建完全分布式高可用大数据集群(Hadoop+MapReduce+Yarn) 在阅读本文前,请确保已经阅读过以上两篇文章,成功搭建了Hadoop+MapReduce+Yarn的大数据集群环境。 写在前面 Wo…...

PySPARK带多组参数和标签的SparkSQL批量数据导出到S3的程序

设计一个基于多个带标签SparkSQL模板作为配置文件和多组参数的PySPARK代码程序&#xff0c;实现根据不同的输入参数自动批量地将数据导出为Parquet、CSV和Excel文件到S3上&#xff0c;标签和多个参数&#xff08;以“_”分割&#xff09;为组成导出数据文件名&#xff0c;文件已…...

分享刷题过程中有价值的两道题目

小编在这里先祝大家新的一年里所愿皆得&#xff0c;万事顺意&#xff0c;天天开心&#xff01;&#xff01;&#xff01; 一.水仙花数 题目描述&#xff1a; 求100∼999中的水仙花数。若三位数ABCA^3B^3C^3&#xff0c;则称ABC为水仙花数。例如153&#xff0c;135333112527153&…...

Java篇之继承

目录 一. 继承 1. 为什么需要继承 2. 继承的概念 3. 继承的语法 4. 访问父类成员 4.1 子类中访问父类的成员变量 4.2 子类中访问父类的成员方法 5. super关键字 6. super和this关键字 7. 子类构造方法 8. 代码块的执行顺序 9. protected访问修饰限定符 10. 继承方式…...

7.DP算法

DP 在C中&#xff0c;动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种通过将复杂问题分解为重叠子问题来高效求解的算法设计范式。以下是DP算法的核心要点和实现方法&#xff1a; 一、动态规划的核心思想 重叠子问题&#xff1a;问题可分解为多个重…...

[SAP ABAP] 在ABAP Debugger调试器中设置断点

在命令框输入/H&#xff0c;点击回车以后&#xff0c;调试被激活&#xff0c;点击触发任意事件进入ABAP Debugger调试器界面 点击按钮&#xff0c;可以在Debugger调试器中新增临时断点 我们可以从ABAP命令、方法、功能、表单、异常、消息、源代码等多个维度在Debugger调试器中设…...

使用LLaMA-Factory对AI进行认知的微调

使用LLaMA-Factory对AI进行认知的微调 引言1. 安装LLaMA-Factory1.1. 克隆仓库1.2. 创建虚拟环境1.3. 安装LLaMA-Factory1.4. 验证 2. 准备数据2.1. 创建数据集2.2. 更新数据集信息 3. 启动LLaMA-Factory4. 进行微调4.1. 设置模型4.2. 预览数据集4.3. 设置学习率等参数4.4. 预览…...

2 [GitHub遭遇严重供应链投毒攻击]

近日&#xff0c;有黑客针对 Discord Top.gg 的GitHub 账户发起了供应链攻击&#xff0c;此次攻击导致账户密码、凭证和其他敏感信息被盗&#xff0c;同时也影响到了大量开发人员。 Checkmarx 在一份技术报告中提到&#xff0c;黑客在这次攻击中使用了多种TTP&#xff0c;其中…...

[c语言日寄]C语言类型转换规则详解

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋&#xff1a;这是一个专注于C语言刷题的专栏&#xff0c;精选题目&#xff0c;搭配详细题解、拓展算法。从基础语法到复杂算法&#xff0c;题目涉及的知识点全面覆盖&#xff0c;助力你系统提升。无论你是初学者&#xff0c;还是…...

Python魔法函数

在Python中&#xff0c;的确有“魔法函数”&#xff08;Magic Methods&#xff09;这种说法&#xff0c;也被称为特殊方法&#xff08;Special Methods&#xff09;。这些函数的名称以双下划线开始和结束&#xff0c;例如 __init__、__len__ 等。它们为Python提供了一种约定俗成…...

Cypher入门

文章目录 Cypher入门创建数据查询数据matchoptional matchwhere分页with 更新数据删除数据实例&#xff1a;好友推荐 Cypher入门 Cypher是Neo4j的查询语言。 创建数据 在Neo4j中使用create命令创建节点、关系、属性数据。 create (n {name:$value}) return n //创建节点&am…...

excel如何查找一个表的数据在另外一个表是否存在

比如“Sheet1”有“张三”、“李四”“王五”三个人的数据&#xff0c;“Sheet2”只有“张三”、“李四”的数据。我们通过修改“Sheet1”的“民族”或者其他空的列&#xff0c;修改为“Sheet2”的某一列。这样修改后筛选这个修改的列为空的或者为出错的&#xff0c;就能找到两…...

【华为OD-E卷 - 连续出牌数量 100分(python、java、c++、js、c)】

【华为OD-E卷 - 连续出牌数量 100分&#xff08;python、java、c、js、c&#xff09;】 题目 有这么一款单人卡牌游戏&#xff0c;牌面由颜色和数字组成&#xff0c;颜色为红、黄、蓝、绿中的一种&#xff0c;数字为0-9中的一个。游戏开始时玩家从手牌中选取一张卡牌打出&…...