Linux内核结构及源码概述
参考:深入分析LINUX内核源码
深入分析Linux内核源码 (kerneltravel.net)
Linux 是一个庞大、高效而复杂的操作系统,虽然它的开发起始于 Linus Torvalds 一个人,但随着时间的推移,越来越多的人加入了 Linux 的开发和对它的不断完善。如何从整体上把握 Linux 内核的体系结构,对于 Linux 的开发者和分析者都至关重要。 1.5.1 Linux 内核在整个操作系统中的位置 Linux 的内核不是孤立的,必须把它放在整个系统中去研究,如图 1.1 所示,显示了 Linux 内核在整个操作系统的位置。
由图 1.1 可以看出,Linux 操作系统由 4 个部分组成。
1.用户进程
用户应用程序是运行在 Linux 操作系统最高层的一个庞大的软件集合。当一个用户程序在操作系统之上运行时,它成为操作系统中的一个进程。
2.系统调用接口
在应用程序中,可通过系统调用来调用操作系统内核中特定的过程,以实现特定的服务。 例如,在程序中安排一条创建进程的系统调用,则操作系统内核便会为之创建一个新进程。 系统调用本身也是由若干条指令构成的过程。但它与一般的过程不同,主要区别是:系统调用是运行在内核态(或叫系统态),而一般过程是运行在用户态。在 Linux 中,系统调用是内核代码的一部分。
3.Linux 内核
这是本书要讨论的重点。内核是操作系统的灵魂,它负责管理磁盘上的文件、内存,负责启动并运行程序,负责从网络上接收和发送数据包等。简言之,内核实际是抽象的资源操作到具体硬件操作细节之间的接口。
4.硬件
这个子系统包括了 Linux 安装时需要的所有可能的物理设备。例如,CPU、 内存、硬盘、 网络硬件等。
上面的这种划分把整个 Linux 操作系统分为 4 个层次。把用户进程也纳入操作系统的范围内是因为用户进程的运行和操作系统密切相关,而系统调用接口可以说是操作系统内核的 扩充,硬件则是操作系统内核赖以生存的物质条件。这 4 个层次的依赖关系表现为:上层依 赖下层。
Linux内核的作用
从程序员的角度来讲,操作系统的内核提供了一个与计算机硬件等价的扩展或虚拟的计算平台。它抽象了许多硬件细节,程序可以以某种统一的方式进行数据处理,而程序员则可 以避开许多硬件细节。从另一个角度讲,普通用户则把操作系统看成是一个资源管理者,在 它的帮助下,用户可以以某种易于理解的方式组织自己的数据,完成自己的工作并和其他人 共享资源。
Linux 以统一的方式支持多任务,而这种方式对用户进程是透明的,每一个进程运行起来就好像只有它一个进程在计算机上运行一样,独占内存和其他的硬件资源,而实际上,内核在并发地运行几个进程,并且能够让几个进程公平合理地使用硬件资源,也能使各进程之间互不干扰安全地运行。
Linux 内核由 5 个主要的子系统组成,如图 1.2 所示。
(1)
进程调度(SCHED)
控制着进程对 CPU 的访问。当需要选择下一个进程运行时,由调度程序选择最值得运行的进程。可运行进程实际是仅等待 CPU 资源的进程,如果某个进程在等待其他资源,则该进程是不可运行进程。Linux 使用了比较简单的基于优先级的进程调度算法选择新的进程。
(2)
内存管理(MM)
允许多个进程安全地共享主内存区域。Linux 的内存管理支持虚拟内存,即在计算机中运行的程序,其代码、数据和堆栈的总量可以超过实际内存的大小,操作系统只将当前使用的程序块保留在内存中,其余的程序块则保留在磁盘上。必要时,操作系统负责在磁盘和内存之间交换程序块。
内存管理从逻辑上可以分为硬件无关的部分和硬件相关的部分。硬件无关的部分提供了进程的映射和虚拟内存的对换;硬件相关的部分为内存管理硬件提供了虚拟接口。
(3)
虚拟文件系统(Virtul File System,VFS)
隐藏了各种不同硬件的具体细节,为所有设备提供了统一的接口,VFS 还支持多达数十种不同的文件系统,这也是 Linux 较有特色的一部分。
虚拟文件系统可分为逻辑文件系统和设备驱动程序。逻辑文件系统指 Linux 所支持的文件系统,如 ext2,fat 等,设备驱动程序指为每一种硬件控制器所编写的设备驱动程序模块。
(4)
网络接口(NET)
提供了对各种网络标准协议的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序两部分。网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱动程序。
(5)
进程间通信(IPC)
支持进程间各种通信机制。从图 1.2 所示可以看出,处于中心位置的是进程调度,所有其他的子系统都依赖于它,因为每个子系统都需要挂起或恢复进程。一般情况下,当一个进程等待硬件操作完成时,它被挂起;当操作真正完成时,进程被恢复执行。例如,当一个进程通过网络发送一条消息时,网络接口需要挂起发送进程,直到硬件成功地完成消息的发送,当消息被发送出去以后,网络接口给进程返回一个代码,表示操作的成功或失败。其他子系统(内存管理,虚拟文件系统及进程间通信)以相似的理由依赖于进程调度。
各个子系统之间的依赖关系如下。
• 进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,程序要运行必须为之创建进程,而创建进程的第一件事,就是要将程序和数据装入内存。
• 进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有内存,还可存取共同的内存区域。
• 虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统 (NFS),也利用内存管理支持 RAMDISK 设备。
• 内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
除了如图 1.2 所示的依赖关系以外,内核中的所有子系统还要依赖一些共同的资源,但在图中并没有显示出来。这些资源包括所有子系统都用到的过程,例如分配和释放内存空间的过程,打印警告或错误信息的过程,还有系统的调试例程等。
Linux 内核源代码
为了深入地了解 Linux 的实现机制,还必须阅读 Linux 的内核源代码,下面是对有关源代码的介绍。
多版本的内核源代码
对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用, 但旧的系统调用将依然不变,这对于保持向后兼容是非常必要的,一个新的内核版本不能打破常规的过程。在大多数情况下,设备文件将仍然相同,而另一方面,版本之间的内部接口有所变化。
Linux 内核源代码有一个简单的数字系统,任何偶数内核(如 2.0.30)是一个稳定的版本,而奇数内核(如 2.1.42)是正在发展中的内核。本书是基于稳定的 2.4.16 源代码的。 发展中的内核总是有最新的特点,支持最新的设备,尽管它们还不稳定,也许不是你所想要的,但它们是发展最新而又稳定的内核的基础。
目前,较新而又稳定的内核版本是 2.2.x 和 2.4.x,因为版本之间稍有差别,因此,如 果你想让一个新驱动程序模块既支持 2.2.x,也支持 2.4.x,就需要根据内核版本对模块进行条件编译。
对内核源代码的修改是以补丁文件的形式发布的。patch 实用程序用来对内核源文件进行一系列的修订,例如,如果你有 2.4.9 内核源代码,而想移到 2.4.16,你可以获得 2.4.16 的补丁文件,应用 patch 来修订 2.4.9 源文件。例如:
$ cd /usr/src/linux $ patch -p1 < patch-2.4.16
继续往下看
Linux 内核源代码的结构
Linux 内核源代码位于/usr/src/linux 目录下,其结构分布如图 1.3 所示
补充:ubuntu中linux源码放在哪个路径?
在Ubuntu中,Linux源码的存放路径通常与内核的版本和安装方式有关。以下是一些常见的存放路径:
/usr/src:这是Ubuntu系统默认的源码保存路径。但需要注意的是,使用ls命令查看该目录时,里面可能只有几个header文件夹,并没有源码。源码需要通过特定的步骤下载和安装。
/usr/src/linux-headers-$(uname -r):这个目录下存放的是与当前运行的Linux内核版本相对应的头文件。这些头文件对于编译与内核版本匹配的模块是必要的。
/usr/src/linux-source-$(uname -r):如果通过包管理器(如apt)安装了特定版本的Linux源码,它通常会被解压到这个目录下。例如,如果你安装了5.4.0版本的内核源码,它会存放在/usr/src/linux-source-5.4.0目录下。
自定义路径:如果你是从源代码手动编译安装的软件,可执行文件通常都安装在/usr/local/bin目录下,除非配置时指定了其他位置。同样,源码也可以解压到自定义的路径下。
要查看当前运行的Linux内核版本,可以使用uname -r命令。然后,根据内核版本去查找对应的源码路径。如果系统中没有预装源码,可以使用包管理器来下载和安装对应的内核源码包。
此外,如果你想获取最新的内核源码或者特定版本的源码,还可以使用源码管理工具如git来克隆Linux内核源码仓库。
每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。
include/ 目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其他模块重建内核。
init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。
arch/ 子目录包含了所有硬件结构特定的内核代码,如图 1.3所示,arch/子目录下有 i386 和 alpha 模块等。
drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等。
fs/ 目录包含了所有文件系统的代码,如:ext2,vfat 模块的代码等。
net/ 目录包含了内核的连网代码。
mm/ 目录包含了所有的内存管理代码。
ipc/ 目录包含了进程间通信的代码。
kernel/ 目录包含了主内核代码。
图 1.3 显示了 8 个目录,即 init、kernel、mm、ipc、drivers、fs、arch 及 net 的包含文件都在“include/”目录下。
在 Linux 内核中包含了 drivers、fs、arch 及 net 模块, 这就使得 Linux 内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式” 结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。
在图 1.3 中所示的模块结构,代表了一种工作分配单元。利用这种结构,我们期望 Linus Torvalds能维护和增强内核的核心服务,即 init/、kernel/、mm/及 ipc/,其他的模块 drivers、 fs、arch 及 net 也可以作为工作单元,例如,可以分配一组人对块文件系统进行维护和进一 步地开发,而另一组人对 scsi 文件系统进行完善。图 1.3 所示类似于 Linux 的自愿者开发队伍一起工作来增强和扩展整个系统的框架。
从何处开始阅读源代码
像 Linux 内核这样庞大而复杂的程序看起来确实让人望而生畏,它像一个很大的球,没有起点和终点。在读源代码的过程中,你会遇到这样的情况,当读到内核的某一部分时又会涉及到其他更多的文件,当返回到原来的地方想继续往下读时,又忘了原来读的内容。在 Internet 上,很多人为此付出了很大的努力,制作出了源代码导航器,这为源代码阅读提供了很好的条件,下载站点为http://lxr.linux.no/source。下面给出阅读源代码的一些线索。
1.系统的启动和初始化
在基于 Intel 的系统上,当 loadlin.exe 或 LILO 把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看 arch/i386/kernel/head.S ,head.S 进行特定结构的设置,然后跳转到 init/main.c 的 main()例程。
2.内存管理
内存管理的代码主要在/mm,但特定结构的代码在 arch/*/mm。缺页中断处理的代码在mm/memory.c ,而内存映射和页高速缓存器的代码在 mm/filemap.c。缓冲器高速缓存是在 mm/buffer.c 中实现,而交换高速缓存是在 mm/swap_state.c 和 mm/swapfile.c 中实现。
3.内核
内核中,特定结构的代码在 arch/*/kernel,调度程序在 kernel/sched.c,fork 的代码 在 kernel/fork.c,task_struct 数据结构在 include/linux/sched.h 中。
4.PCI
PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在 include/linux/pci.h。每一种结构都有一些特定的 PCI BIOS 代码,Intel 的在 arch/alpha/kernel/bios32.c。
5.进程间通信
所 有 System V IPC 对 象 权 限 都 包 含 在 ipc_perm 数 据 结 构 中 , 这 可 以 在 include/linux/ipc.h 中找到 System V 消息是在 ipc/msg.c 中实现, 共享内存在 ipc/shm.c 中,信号量在 ipc/sem.c 中,管道在 ipc/pipe.c 中实现。
6.中断处理
内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在 arch/i386/kernel/irq.c 中,其定义在 include/asm-i386/irq.h 中。
7.设备驱动程序
Linux 内核源代码的很多行是设备驱动程序。Linux 设备驱动程序的所有源代码都保存 在/driver,根据类型可进一步划分为:
/block 块设备驱动程序如 ide(在 ide.c)。如果想看包含文件系统的所有设备是如何被初始 化的,应当看 drivers/block/genhd.c 中的 device_setup(),device_setup()不仅初始 化了硬盘,当一个网络安装 nfs 文件系统时,它也初始化网络。块设备包含了基于 IDE 和 SCSI 的设备。
/char 这是看字符设备(如 tty,串口及鼠标等)驱动程序的地方。
/cdrom Linux 的所有 CDROM 代码都在这里,如在这儿可以找到 Soundblaster CDROM 的驱动程序。 注意 ide CD 的驱动程序是 ide-cd.c,放在 drivers/block;SCSI CD 的驱动程序是 scsi.c, 放在 drivers/scsi。
/pci 这是 PCI 伪驱动程序的源代码,在这里可以看到 PCI 子系统是如何被映射和初始化的。
/scsi 在这里可以找到所有的 SCSI 代码及 Linux 所支持的 scsi 设备的所有设备驱动程序。
/net 在这里可以找到网络设备驱动程序,如 DECChip 21040 PCI 以太网驱动程序在 tulip.c 中。
/sound 这是所有声卡驱动程序的所在地。
关于pci参考:
linux驱动之PCI和PCIE-提问篇_linux pcie驱动-CSDN博客
PCI(Peripheral Component Interconnect)是一种广泛采用的总线标准,提供了许多优于其它总线标准的新特性。
在Linux系统中,PCI设备通常通过PCI桥与CPU相连,这些桥可以是Host/PCI桥、PCI-to-PCI桥或PCI/ISA桥。每种桥都有特定的功能,例如Host/PCI桥连接CPU与PCI根总线,而PCI-to-PCI桥则用于连接主总线和次总线。
在Linux中,PCI设备驱动程序负责枚举和配置PCI设备。这包括从Host/PCI桥开始探测和扫描所有连接在PCI总线上的设备,并递归地处理任何发现的PCI-PCI桥,以枚举所有PCI设备。
什么是scsi
SCSI是小型计算机系统接口。
SCSI,全称为Small Computer System Interface,是一种用于计算机和智能设备之间(如硬盘、软驱、光驱、打印机、扫描仪等)系统级接口的独立处理器标准。它定义了与大量设备(主要是与存储相关的设备)通信所需的接口和协议。在Linux中,SCSI子系统用于与这些设备进行通信。Linux提供了一种分层架构来处理SCSI设备,将高层的驱动器(比如磁盘驱动器或光驱)连接到物理接口,如Fibre Channel或Serial Attached SCSI(SAS)。
SCSI命令集是在Command Descriptor Block (CDB)中定义的,包含了用来定义要执行的特定操作的操作代码以及大量特定于操作的参数。SCSI命令支持读写数据以及很多非数据命令,如test-unit-ready(设备是否已就绪)、inquiry(检索有关目标设备的基本信息)、read-capacity(检索目标设备的存储容量)等。
8.文件系统
EXT2 文 件 系 统 的 源 代 码 全 部 在 fs/ext2/ 目 录 下 , 而 其 数 据 结 构 的 定 义 在 include/linux/ ext2_fs.h,ext2_fs_i.h 及 ext2_fs_sb.h 中。虚拟文件系统的数据结构在 include/linux/fs.h 中描述,而代码是在 fs/*中。缓冲区高速缓存与更新内核的守护进程的 实现是在 fs/buffer.c 中。
9.网络
网络代码保存在/net 中,大部分的 include 文件在 include/net 下,BSD 套节口代码在 net/socket.c 中,IP 第 4 版本的套节口代码在 net/ipv4/af_inet.c。一般的协议支持代码 (包括 sk_buff 处理例程)在 net/core 下,TCP/IP 联网代码在 net/ipv4 下,网络设备驱动程序在/drivers/net 下。
10.模块
内核模块的代码部分在内核中,部分在模块包中,前者全部在 kernel/modules.c 中, 而 数 据 结 构 和 内 核 守 护 进 程 kerneld 的 信 息 分 别 在 include/linux/module.h 和 include/linux/kerneld.h 中。如果想看 ELF 目标文件的结构,它位于 include/linux/elf.h 中。
Linux 内核源代码分析工具
凡是尝试做过内核分析的人都知道,Linux 的内核组织结构虽然非常有条理,但是,它毕竟是众人合作的结果,在阅读代码的时候要将各个部分结合起来,确实是件非常困难的事情。因为在内核中的代码层次结构肯定分多个层次,那么对一个函数的分析,肯定会涉及到多个函数,而对每一个函数都可能有多层的调用,一层层下来,直接在代码文件中查找肯定会让你失去耐心和兴趣的。最后,很多人只能望洋兴叹,或者只是找一本书来看看基本原理, 却不敢去说自己真正看过内核源代码。任何一本原理书只能是你阅读源代码的导航器,绝不能代替源代码的阅读。 俗话说:“工欲善其事,必先利其器”。面对 Linux 这样庞大的源代码,必须有相应工具的支持才能使分析有效地进行下去。
Windows 平台下的源代码阅读工具(Source Insight)
为了方便地学习 Linux 源程序,我们不妨回到我们熟悉的 Windows 环境下。但是在 Windows 平台上,使用一些常见的集成开发环境,效果也不是很理想,比如难以将所有的文件加进去,查找速度缓慢,对于非 Windows 平台的函数不能彩色显示。在 Windows 平台下有一个强大的源代码编辑器,它的卓越性能使得学习 Linux 内核源代码的难度大大降低,这便 是 Source Insight 3.0 , 它 是 一 个 Windows 平 台 下 的 共 享 软 件 , 可 以 从 http://www.sourceinsight.com/上下载 30天试用版本。由于 Source Insight是一个 Windows 平台的应用软件,所以首先要通过相应手段把 Linux 系统上的程序源代码移到 Windows 平台 下,这一点可以通过在 linux 平台上将/usr/src 目录下的文件拷贝到 Windows 平台的分区上, 或者从网上或光盘中直接拷贝文件到 Windows 平台的分区上。 这个软件的安装非常简单,双击安装文件名,然后按提示进行即可。安装完成后,就可启动该程序。这个软件使用起来也非常简单:先选择 Project 菜单下的 new,新建一个工程, 输入工程名,接着要求你把欲读的源代码加入(可以加入整个目录)后,该软件就分析你所加的源代码。分析完后,就可以进行阅读了。对于打开的阅读文件,如果想看某一变量的定 义,先把光标定位于该变量,然后单击工具条上的相应选项,该变量的定义就显示出来。对于函数的定义与实现也可以同样操作。
相关文章:
Linux内核结构及源码概述
参考:深入分析LINUX内核源码 深入分析Linux内核源码 (kerneltravel.net) Linux 是一个庞大、高效而复杂的操作系统,虽然它的开发起始于 Linus Torvalds 一个人,但随着时间的推移,越来越多的人加入了 Linux 的开发和对它的不断完善…...
《探索C++在3D重建中的算法与技术要点》
3D重建作为计算机视觉领域的重要技术,在诸多行业有着广泛应用,而C以其高效性和对底层硬件的良好控制,成为实现3D重建算法的常用语言。以下是利用C进行3D重建的一些常见算法和技术要点。 多视图立体视觉算法 多视图立体视觉是3D重建的基础算…...
【老白学 Java】数字格式化
数字格式化 文章来源:《Head First Java》修炼感悟。 很多时候需要对数字或日期进行格式化操作,来达到某些输出效果。Java 的 Formatter 类提供了很多扩展性功能用于字符串的格式化,只要调用 String 静态方法 format() ,传入参数…...
useCallback和forwardRef的联合使用
文章目录 一、useCallback二、forwardRef 总结了useCallback、forwardRef中的deps,以及操作子组建时会遇到数据流不同步的问题 一、useCallback useCallback可以缓存函数,这样避免组建更新导致的函数重建;useCallback在函数更新以后会在deps中…...
C# .NET CORE 开发问题汇总
1. error MSB4803: .NET Core 版本的 MSBuild 不支持“ResolveComReference”。请使用 .NET Framework 版本的 MSBuild。 引用了一个COM组件, 使用donet 命令时,提示不支持, 可以先将项目设置为x86以构建, 将COM引用添加到核心项目中,构建它,在obj\x86\…...
【C语言】拆数字组成最大数
相信你是最棒哒!!! 文章目录 题目描述 正确代码 法一注释版 简洁版 法二注释版 简洁版 题目描述 任意输入一个自然数,输出该自然数的各位数字组成的最大数。例如,输入 1593 ,则输出为 9531 。 输入描述 …...
【Git系列】根据提交打印邮箱
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Nginx在处理客户端请求的并发性发面是否依赖Linux的多线程原理
Nginx在处理客户端请求的并发性发面是否依赖Linux的多线程原理 Nginx 在处理客户端请求的并发性方面,并不依赖于 Linux 的多线程原理。 Nginx 的并发处理主要基于 事件驱动模型 和 异步非阻塞 I/O,而不是传统的多线程或多进程模型。 Nginx 的并发处理模…...
Python生成对抗神经网络GAN预测股票及LSTMs、ARIMA对比分析ETF金融时间序列可视化
全文链接:https://tecdat.cn/?p38528 本文聚焦于利用生成对抗网络(GANs)进行金融时间序列的概率预测。介绍了一种新颖的基于经济学驱动的生成器损失函数,使 GANs 更适用于分类任务并置于监督学习环境中,能给出价格回…...
深入了解C++中const的用法
文章目录 一、C中的const如何理解?二、C中的const与C语言中的const有何区别?三、const与指针、引用的结合使用 一、C中的const如何理解? 在C中,const是一个关键字,用来表示常量性,意在告诉编译器某些变量或…...
【Linux金典面试题(上)】41道Linux金典面试问题+详细解答,包含基本操作、系统维护、网络配置、脚本编程等问题。
大家好,我是摇光~,用大白话讲解所有你难懂的知识点 之前写了一篇关于 python 的面试题,感觉大家都很需要,所以打算出一个面试专栏。 【数据分析岗】Python金典面试题 这个专栏主要针对面试大数据岗位、数据分析岗位、数据运维等…...
利用Python实现多元回归预测汽车价格
引言: AI技术的热门使得大家对机器学习有了更多的关注,作为与AI技术息息相关的一门课程,从头了解基础的机器学习算法就显得十分有必要,如:梯度下降,线性回归等。 正文: 本文将讲解线性回归中多元回回归的案例 机器学习大致可以分为监督学习,非监督学习、半监督学习还…...
抓包软件fiddler和wireshark使用手册
fiddler官方文档 Fiddler 抓包教程1 Fiddler 抓包教程2 wireshark抓包学习 2添加链接描述 ip 过滤 ip.src_host ip.dst_host ip.addr mac 过滤 eth.src eth.dst eth.addr 端口过滤 tcp.port tcp.srcport tcp.dstport 协议类型过滤 arp dhcp 规则组合 and or...
初识三大 Observer
文章目录 ResizeObserver、MutationObserver和IntersectionObserver用MutationObserver实现图片懒加载MutationObserver 兼容性问题IntersectionObserver 应用MutationObserver和IntersectionObserver的区别IntersectionObserver 实例示例一:图片懒加载示例二&#…...
Eclipse MAT(Memory Analyzer Tool) 使用手册
参考:JAVA内存泄露使用MAT(Memory Analyzer Tool)快速定位代码 Eclipse MAT 1.15.0提示JDK版本最低需要使用17版本的,如果不想安装可以下载ZIP包,或者使用较低版本的MAT。 为了避免下载的17版本JDK和本地环境干扰,可以直接在MAT配…...
TongWe7.0-东方通TongWeb控制台无法访问 排查
**问题描述:**无法访问TongWeb的控制台 逐项排查: 1、控制台访问地址是否正确:http://IP:9060/console #IP是服务器的实际IP地址 2、确认TongWeb进程是否存在,执行命令:ps -ef|grep tongweb 3、确认TongWeb服务启动…...
Ariba Procurement: Administration_Master data
采购主数据集成Procurement Master Data Integration 注意:并非所有元素都是必需的,数据元素的名称可能根据ERP的不同,有所不同。 Types of Master Data Accounting 在SAP Ariba中的各种会计元素字段中,填充有效值选择列表。建…...
爬虫学习案例4
爬取猪八戒网站数据:2024-12-12 使用xpath解析元素,安装依赖库 pip install lxml使用selenium步骤我的上篇博客有提到,这里就不重复了 selenium使用博客导航 # 安装pip install lxml,使用xpath from lxml import etree import time from s…...
Angular模块化应用构建详解
文章目录 前言一、理解Angular模块(NgModule)二、创建功能模块三、懒加载模块以提高性能四、共享模块五、库模块六、最佳实践与注意事项七、案例研究:重构电子商务平台结语 前言 Angular是一款由Google支持的、用于构建动态Web应用程序的前端…...
51c大模型~合集89
我自己的原文哦~ https://blog.51cto.com/whaosoft/12815167 #OpenAI很会营销 而号称超强AI营销的灵感岛实测成效如何? OpenAI 是懂营销的,连续 12 天发布,每天一个新花样,如今刚过一半,热度依旧不减。 毫无疑问&…...
【蓝桥杯备战】Day 1
1.基础题目 LCR 018.验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama…...
FedAdam算法:供给方信用,数据质量;更新一致性
FedAdam算法:供给方信用,数据质量;更新一致性 FedAdam算法概述 FedAdam是一种联邦学习(Federated Learning)算法。联邦学习是一种机器学习技术,它允许在多个设备或数据中心(称为客户端)上训练模型,而无需将数据集中到一个中央服务器,从而保护数据隐私。FedAdam主要用于…...
内存卡格式化后的数据恢复全攻略
一、内存卡格式化简述 内存卡,作为现代电子设备中不可或缺的存储媒介,广泛应用于手机、相机、行车记录仪等各类设备中。然而,在使用过程中,我们可能会遇到内存卡需要格式化的情况。格式化是一种将内存卡上的所有数据和文件系统清…...
介绍交叉熵损失(Cross-Entropy Loss)以及交叉熵在对比学习中的应用:中英双语
中文版 本文解释 交叉熵损失(Cross-Entropy Loss),并结合对比学习的应用说明它如何工作,以及如何让正样本对更近、负样本对更远。 什么是交叉熵损失? 交叉熵损失是机器学习中常用的一种损失函数,主要用于…...
RabbitMQ的几个概念
注:这篇文章会随时添加新的内容,就是将RabbtiMQ中的概念添加到这里。助力大家的学习 自动ACK和手动ACK的区别 自动ACK和手动ACK是消息队列中两种不同的消息确认机制,它们在消息处理的可靠性和灵活性方面存在显著差异。 自动ACK(…...
Ollama部署大模型并安装WebUi
Ollama用于在本地运行和部署大型语言模型(LLMs)的工具,可以非常方便的部署本地大模型 安装 Linux curl -fsSL https://ollama.com/install.sh | sh我是ubuntu系统安装,其他系统可以看项目的开源地址有写 GitHub - ollama/ollama: Get up and running with Llama 3, Mist…...
Debedium如何忽略Oracle的purge命令
报错 截至目前3.0版本,Debezium的Oracle Connector并不支持purge table这个指令。 所以,在使用Debezium解析Oracle变更的时候,如果在源端执行了类似 purge table "$BIN… 的语句,就会导致Debezium罢工,日志里显…...
PlantUML 语言
PlantUML 是一种开源工具,用于通过简单的文本描述生成 UML 图。它支持多种 UML 图类型,如类图、序列图、用例图、活动图、组件图、状态图等。PlantUML 语言非常简洁,采用类似编程语言的语法,允许用户使用文本定义模型,…...
linux的 .so和.ko文件分别是什么?主要区别是什么?
前言: .so和.ko文件的主要区别在于它们的应用层次和功能不同。 应用层次 .so文件:这是用户层的动态链接库(Shared Object),主要用于用户态的程序中。 它用于动态链接,多个程序可以共享同一个库文件&…...
XX服务器上的npm不知道咋突然坏了
收到同事的V,说是:182上的npm不知道咋突然坏了,查到这里了,不敢动了。 咱一定要抓重点:突然坏了。这里的突然肯定不是瞬间(大概率是上次可用,这次不可用,中间间隔了多长时间&#x…...
临湘网站建设/整合营销传播案例
在不知道未来的时候,要把握住现在。 第一部分:结缘计算机 你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢?(必答)我上大学之前对于计算机专业真的了解不多,顶多知道它是…...
公司做竞拍网站的收入怎么报税/现在什么app引流效果好
2019独角兽企业重金招聘Python工程师标准>>> 学习阶段可以安装一个windows版本的mongodb,尽快把mongodb服务跑起来,让程序连上。mongodb的安装、运行、基础命令的知识,可以参考 菜鸟教程mongodb spring mongodb 依赖版本ÿ…...
胶州市住房建设局网站/关键词密度
《三年零六个月山歌其四.灯笼》 …羽野 薄纸吞火红连连 外冷内热胜无言 纵使千蛾来相约 烛晖只映画中檐转载于:https://blog.51cto.com/whish/1879162...
网站搜索引擎优化技术/2345网址大全
事件背景:工具:tomcat7,jdk1.7,eclipse mars.2。起因:看马士兵老师servlet视频,写了个servlet,在控制台打印一句话,也就是在doGet里写System.out.println("hello");结果&a…...
wordpress回复经典编辑器/旅游最新资讯
引言 自从下定决心认真学习机器学习理论开始,接触到很多基本问题,但其实都不是很理解,比如损失函数、风险函数、经验结构最小化、结构风险最小化、学习方法的泛化能力、VC维等,这些概念在学习中都纯属空泛的概念存在,我…...
wordpress轻博客模板/关键词自助优化
步骤系列文章前言1.快捷键2.网上的Neat Bookmarks拓展总结系列文章 提示:转到日常小技巧专栏,观看更多内容! 点我直达–>日常小技巧专栏 前言 Chrome浏览器设置打开书签时在新标签页打开(保姆级图文) 成功的方法按…...