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源码的存放路径通常与内核的版本和安装方式有关。以下是一些常见的存放路径:

  1. /usr/src:这是Ubuntu系统默认的源码保存路径。但需要注意的是,使用ls命令查看该目录时,里面可能只有几个header文件夹,并没有源码。源码需要通过特定的步骤下载和安装。

  2. /usr/src/linux-headers-$(uname -r):这个目录下存放的是与当前运行的Linux内核版本相对应的头文件。这些头文件对于编译与内核版本匹配的模块是必要的。

  3. /usr/src/linux-source-$(uname -r):如果通过包管理器(如apt)安装了特定版本的Linux源码,它通常会被解压到这个目录下。例如,如果你安装了5.4.0版本的内核源码,它会存放在/usr/src/linux-source-5.4.0目录下。

  4. 自定义路径:如果你是从源代码手动编译安装的软件,可执行文件通常都安装在/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,新建一个工程, 输入工程名,接着要求你把欲读的源代码加入(可以加入整个目录)后,该软件就分析你所加的源代码。分析完后,就可以进行阅读了。对于打开的阅读文件,如果想看某一变量的定 义,先把光标定位于该变量,然后单击工具条上的相应选项,该变量的定义就显示出来。对于函数的定义与实现也可以同样操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux - 存储管理

1.了解硬件 -- 磁盘 硬盘有机械硬盘(HDD)和固态硬盘(SDD) 接下来&#xff0c;主要以机械磁盘为例(更具代表性&#xff0c;在linux系统层面&#xff0c;无论是机械磁盘还是固态硬盘&#xff0c;文件的读取和写入都iNode(索引节点)管理文件的元数据和实际数据块) 1.盘片&#x…

某名校考研自命题C++程序设计——近10年真题汇总(上)

本帖更新一些某校的编程真题&#xff0c;总体来说不难&#xff0c;考察的都是基本功&#xff0c;92高校大一期末的难度&#xff0c;不过有些细节颇为繁琐&#xff0c;各位还是需要一定程度上注意的~ 目录 一.分数求和 二.大小写字母转换 三.判断当年天序 四.交替合并字符串…

滑动窗口算法专题

滑动窗口简介 滑动窗口就是利用单调性&#xff0c;配合同向双指针来优化暴力枚举的一种算法。 该算法主要有四个步骤 1. 先进进窗口 2. 判断条件&#xff0c;后续根据条件来判断是出窗口还是进窗口 3. 出窗口 4.更新结果&#xff0c;更新结果这个步骤是不确定的&#xff0c…

Prime2_解法二:openssl解密凭据

Prime2_解法二&#xff1a;openssl解密凭据 本博客提供的所有信息仅供学习和研究目的&#xff0c;旨在提高读者的网络安全意识和技术能力。请在合法合规的前提下使用本文中提供的任何技术、方法或工具。如果您选择使用本博客中的任何信息进行非法活动&#xff0c;您将独自承担全…

R语言的数据结构-向量

【图书推荐】《R语言医学数据分析实践》-CSDN博客 《R语言医学数据分析实践 李丹 宋立桓 蔡伟祺 清华大学出版社9787302673484》【摘要 书评 试读】- 京东图书 (jd.com) R语言编程_夏天又到了的博客-CSDN博客 在R语言中&#xff0c;数据结构是非常关键的部分&#xff0c;它提…

SpringBoot使用Nacos进行application.yml配置管理

Nacos是阿里巴巴开源的一个微服务配置管理和服务发现的解决方案。它提供了动态服务发现、配置管理和 服务管理平台。Nacos的核心功能包括服务发现、配置管理和动态服务管理&#xff0c;使得微服务架构下的服务治理 变得简单高效。 Nacos的设计基于服务注册与发现、配置管理、动…

【Java学习笔记】Collections 工具类

一、基本介绍 Collections 是一个操作 Set、List 和 Map 等集合的工具类Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作 二、排序操作&#xff1a;&#xff08;均为 static 方法) 三、查找、替换

【含开题报告+文档+PPT+源码】基于ssm框架的购物交流圈交流及市场服务平台

开题报告 随着互联网技术的迅猛发展&#xff0c;社交网络和电子商务已成为人们日常生活中不可或缺的一部分。特别是在移动互联网的普及下&#xff0c;人们越来越倾向于通过在线平台进行交流、分享和购物。这种趋势为基于 SSM&#xff08;Spring、SpringMVC、MyBatis&#xff0…

Datawhale AI 冬令营(第一期)定制你的第一个专属模型-学习笔记

最近我报名参加了Datawhale组织的主题为“动手学系列&#xff0c;人人都能应用的AI”的Datawhale AI冬令营&#xff08;第一期&#xff09;。 本次学习一共12天&#xff0c;从12月10日-12月21日&#xff0c;学习会包含【跑通速通手册】&#xff0c;【学习大模型微调&数据集…

GS-SLAM论文阅读--RGBDS-SLAM

前言 最近GS-SLAM领域的工作层出不穷&#xff0c;有很多不错的工作出现。接下来慢慢写一下相关博客。 文章目录 前言1.背景介绍2.关键内容2.1 3D多层次金字塔高斯喷溅2.2 紧密耦合多特征重构优化2.3总体流程 3.文章贡献4.个人思考 1.背景介绍 高保真重建是密集SLAM的关键。最…

使用EventLog Analyzer进行Apache日志监控和日志分析

一、什么是Apache日志分析 Apache日志分析是网站管理和维护的重要部分&#xff0c;通过分析Apache服务器生成的日志文件&#xff0c;可以了解网站的访问情况、识别潜在的安全问题、优化网站性能等。 二、Apache日志类型 Apache日志主要有两种类型&#xff1a;访问日志&a…

[计算机网络]IP地址推行的“书同文,车同轨”

硬件地址无法直接转换的故事 在很久很久以前&#xff0c;网络世界就像一个庞大的帝国&#xff0c;各个村落&#xff08;网络&#xff09;都有自己的语言&#xff08;硬件地址&#xff09;。每个村落都有自己的规则和习惯&#xff0c;村里的每户人家&#xff08;设备&#xff0…

鸿蒙NEXT开发案例:九宫格随机

【引言】 在鸿蒙NEXT开发中&#xff0c;九宫格抽奖是一个常见且有趣的应用场景。通过九宫格抽奖&#xff0c;用户可以随机获得不同奖品&#xff0c;增加互动性和趣味性。本文将介绍如何使用鸿蒙开发框架实现九宫格抽奖功能&#xff0c;并通过代码解析展示实现细节。 【环境准…

idea 配置 git .gitignore文件配置

.gitignore 内容 .idea/ *.iml target/ *.class *.log .iml在idea项目里面创建一个.gitignore名字的文件&#xff0c;然后把这个文件提交到git上。我一般是放到.idea同级目录。 我遇到了几种情况这个文件配置了但是不生效的情况 第一种 Git的缓存可能会导致配置不生效。尝试…

H.323音视频协议

概述 H.323是国际电信联盟&#xff08;ITU&#xff09;的一个标准协议栈&#xff0c;该协议栈是一个有机的整体&#xff0c;根据功能可以将其分为四类协议&#xff0c;也就是说该协议从系统的总体框架&#xff08;H.323&#xff09;、视频编解码&#xff08;H.263&#xff09;、…

快速掌握Quartz.Net计划任务调度框架,轻松实现定时任务

前言 Quartz.Net是一个开源的作业调度框架&#xff0c;可以用于管理计划任务和定期执行。Quartz.Net提供了丰富的作业计划选项&#xff0c;例如精确或模糊时间表达式、日期和时间限制等。Quartz.Net采用分布式架构&#xff0c;允许在多个计算机上运行任务。 Quartz.Net架构设…

【开源大屏】玩转开源积木BI,从0到1设计一个大屏

积木 BI 重磅推出免费大屏设计器&#xff01;功能超强大&#xff0c;操作超流畅&#xff0c;体验超酷炫。快来体验一下吧。 让我们一起来看一下如何从0到1设计一个大屏。 一、积木BI大屏介绍 积木BI可视化数据大屏 是一站式数据可视化展示平台&#xff0c;旨在帮助用户快速通…

【JVM】JVM基础教程(四)

上一章&#xff1a;【JVM】JVM基础教程&#xff08;三&#xff09;-CSDN博客 目录 自动垃圾回收 方法区的回收 方法区回收条件 手动触发回收 堆回收 如何判断堆上的对象可以回收&#xff1f; 可以给对象引用赋值null&#xff0c;切断引用 引用计数法 循环引用缺点 查…

数据结构(Queue队列)

前言&#xff1a; 在计算机科学中&#xff0c;数据结构是构建高效算法和程序的基础&#xff0c;而队列&#xff08;Queue&#xff09;作为一种经典的线性数据结构&#xff0c;具有重要的地位。与栈&#xff08;Stack&#xff09;不同&#xff0c;队列遵循“先进先出”&#xf…

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…