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

Linux -- 文件系统(文件在磁盘中的存储)

目录

前言:

了解机械磁盘

初始盘片与磁头

盘片是怎么存数据的呢?

详解盘片

如何访问磁盘中的一个扇区呢? -- CHS 定位法

磁盘的逻辑存储

LBA(Logical Block Addressing --- 逻辑块寻址)

如何将 LBA 地址转换为 CHS 地址?

如何管理扇区?

什么是 inode ?

inode 怎么管理文件内容?

什么是数据块?

位图

理解新建/删除文件 

理解文件名 


前言:

进程运行时会把需要用到的文件从磁盘加载到内存中,那么系统是如何在磁盘中快速找到进程想要的文件的呢?

了解机械磁盘

初始盘片与磁头

从下图中我们可以简单地了解一下机械磁盘:

盘片文件的数据都存储在盘片中,一个磁盘中不止一块盘片,多个盘片是摞在一起的。当磁盘开始运作时,盘片中间的马达会带动盘片旋转。

磁头磁头用于读取盘片中的内容。当磁盘运行时,磁头会旋转到盘片的上方读取盘片的数据。一个盘片有上下两面,两面各有磁头。

当磁盘开始运作时,盘片顺时针(或者逆时针)旋转,磁头绕着轴左右摆动,在盘片中进行寻址,找到想要的位置进行读写。

因为磁头和盘片都是金属做的,两个金属相互摩擦,会把盘片刮花,那么盘片的数据都被刮没了,所以磁头不是紧紧挨着盘片的,而是有一定的距离。除此之外,磁盘内部是无尘的,也是为了防止把盘片刮花!

盘片是怎么存数据的呢?

首先需要明确:计算机在底层硬件层面主要使用二进制数系统进行数据处理和运算,这是因为二进制系统非常适合电子电路的工作方式。二进制只有两个数字:0 和 1,这可以很容易地通过电子信号的两种状态来表示,例如电压的高低、电流的通断等。 

但是 0 和 1 只是一种二元状态,盘片中并不是真实地存储着 0 和 1 这两个数字

盘片可以想象成由无数个磁铁构成,磁铁具有南北极,南北极也是一种二元状态,在盘片上修改数据,实际上也是在修改盘片上磁铁南北极的朝向

由于磁铁的磁性保持的时间长,所以磁盘可以长时间保存数据,即使断电了数据也不会丢失,因为它们采用的是磁性、电荷捕获或其他物理性质来持久化地存储信息;而内存无论是DRAM还是SRAM,它们都是易失性存储器,它们都需要电力来维持内部电子元件的状态,意味着在断电情况下不能保留信息。所以说磁盘是永久存储介质!

详解盘片

磁道是指磁盘表面用来存储数据的一系列同心圆每个磁道是磁盘上可以读取或写入数据的一个环形区域。磁盘的每一个面都被划分成许多这样的磁道。

  • 柱面是由所有盘片上的同一半径位置组成的虚拟圆柱体,指在硬盘上多个盘片相同位置的一组同心圆磁道。想象一下,如果你将硬盘垂直切割,并且沿着这个切割面看去,你会看到一组圆形的磁道,这些磁道位于不同盘片的相同径向距离处,这一组磁道就构成了一个柱面。

  • 当提到一个柱面时,实际上指的是该柱面上所有磁头所覆盖的所有磁道

磁道由多个扇区组成(磁道被划分成多个扇区),每个扇区通常是固定大小的数据块常见的大小为512字节或4096字节(随着技术的发展,更大容量的硬盘可能会采用更大的扇区)。当硬盘读写头移动到特定磁道上方时,它可以访问该磁道上的所有扇区。 

磁道被划分成扇区后,扇区的面积大小可能不一样,但是扇区的内存大小都是一样的!

如何访问磁盘中的一个扇区呢? -- CHS 定位法

每个盘面、磁头都有唯一的编号,在一个盘面里,每一个磁道也有唯一的编号,每一个扇区也有唯一的编号。


如果想访问磁盘中的一个扇区,通过磁头定位,先确定扇区在哪一个磁道(cylinder)上,接着确定要使用哪一个磁头(head)(上面还是下面),最后确认在磁道上的哪个扇区(sector),这种定位方法称为 CHS 定位法。

我们就可以理解,选择哪个磁头,就相当于选择了哪个盘面,磁头的来回摆动是为了定位盘面的磁道,而盘片的旋转是为了寻找磁道上的扇区。

盘片的旋转和磁头的摆动都属于机械运动,机械运动导致磁盘的访问速度是比较慢的,所以需要操作系统把磁盘的数据预加载到内存中,提高效率!

磁盘的逻辑存储

逻辑存储主要涉及文件系统如何管理和访问磁盘上的数据。

LBA(Logical Block Addressing --- 逻辑块寻址)

如果把盘片的所有磁道拉直,磁盘就可以看成非常长的线性空间。

假设有4个盘面(2个盘片),每个盘面有200G,总共800G,每个盘面的基本单元(扇区)为512字节,所以一共有1 677 721 600 个扇区,每一个扇区都有对应的下标,对磁盘的管理,就变成对数组的增删查改

LBA的主要优点包括:

  1. 简化了寻址:不需要考虑物理结构如柱面、磁头和扇区。
  2. 提高了性能:减少了硬件和软件处理复杂寻址逻辑的需求。
  3. 支持更大的磁盘容量:由于LBA是基于数字的线性地址,它不受传统CHS寻址中柱面数、磁头数和扇区数限制的影响。

如何将 LBA 地址转换为 CHS 地址?

  • LBA:逻辑块地址
  • SPT:每磁道的扇区数(Sectors Per Track)
  • HPC:每个柱面的磁头数(Heads Per Cylinder)
  • HPC * SPT : 一个柱面总共有多少个扇区

计算柱面号(C)

C = LBA / ( HPC * SPT )

计算磁头号(H)

H = ( LBA % ( HPC * SPT ))/ SPT

计算扇区号(S)

S = ( LBA % ( HPC * SPT ))% SPT +1

( +1 是因为扇区号是从1开始计数的,而LBA是从0开始计数的。)

如何管理扇区?

假设磁盘中共有 800G,如何管理这 800G 呢?

我们可以对 800G 进行分区,假设分成5个区:100G、100G、150G、150G、300G,假设每个区内部是没有差异的,那么把这 5 个区管理好,不就相当于把 800G 管理好了吗。在我们的电脑中,把磁盘分为 C盘、D盘,就是所说的分区。

同样的道理,假设我们把 100G 进行分组,平均分成 10 组,每组 10G,把这 10G 管理好,100G 也就管理好了。这样把大问题划分成小问题的思想就是分治思想

那么如何管理好这 10G 呢?

首先,文件 = 内容 + 属性,文件的内容大小是不固定的,但是文件的属性的大小是固定的,Linux 将文件的内容和属性分开存储,inode 可以将文件的内容和属性进行管理!

在每个分组中,都有 Block Bitmap、inode Bitmap、inode Table、Data Blocks。其中,Data Blocks 是用来存储文件的内容。

什么是 inode ?

inode 其实是一个结构体,结构体的内容与文件有关,通常包括:

  • 文件类型:表示这是一个普通文件、还是目录、符号链接等。
  • 权限:文件的所有者、组和其他用户的读、写、执行权限。
  • 所有者ID 和 组ID:标识文件所有者和所属用户组的数字ID。
  • 文件大小:以字节为单位的文件大小。
  • 时间戳:包括最后访问时间(atime)、最后修改时间(mtime)和状态改变时间(ctime)。
  • 指向数据块的指针:这些指针指向实际存储文件数据的数据块。对于小文件,可能直接在inode中存储一些数据;对于大文件,则指向一系列的数据块。

注意文件的 inode 中不包含文件名!!!此外,一个 inode 结构体大小为 128 字节,大小是固定的。

一个文件一个 inode,每个文件都有 inode 编号,inode编号 是在整个分区内唯一有效的数字!所以对文件的管理,就变成了对 inode 的管理

inode 怎么管理文件内容?

什么是数据块?

每个分组中,都有一个 Data Blocks,也就是数据块。

在EXT2文件系统中,数据块并不是数组。数据块是存储文件内容的最小单位,它们是磁盘上的固定大小的连续空间。EXT2文件系统将磁盘划分为多个相同大小的数据块,每个数据块可以用来存放文件的数据或元数据(如inode信息)。尽管数据块不是数组,但是文件的内容可以通过类似数组的方式来访问。一个数据块只能存放 4KB 大小的数据。

而 inode 定义了数组  block[ 15 ] ,数组中存放着指向数据块的指针,一个数组只能记 15 个数据块的位置,那一个文件最大只有 60KB 吗?

  • 数组下标从 0 到 11 是直接映射,指针指向的数据块直接存放文件的内容;
  • 下标从 12 到 13 指针指向的数据块存放的是其他数据块的内容,文件的内容存储在这些其他数据块中(一次间接);
  • 下标 14 存储的是其他数据块的位置,指针指向的数据块存放的是其他数据块的内容,这些其他数据块中存储的还是其他数据块的内容,此时的数据块的内容为文件的内容(二次间接)。

位图

在Data Blocks 中,有的数据块已经使用了,有的还没有使用,  Block Bitmap 可以更快的分辨出哪些已经使用了,哪些还没有使用!

同样的,inode Table 中有的 inode 已经使用了,有的没有,inode Bitmap 的作用和  Block Bitmap 相同!

从下面这张图可以看出,每一个分组都有一张位图,一个分区就会有很多张位图,而 inode编号是在分组中唯一的,那么怎么确定 inode 在哪张位图中呢?

每个分组都会记录自己组的 inode 的起始编号和组内 inode 的个数,假设分组内的起始编号如下:

 

假设 inode 编号为 1500,通过比较每个分组的 inode 的起始编号,我们就可以确定 inode 在 Block group 1 中。

根据偏移量 500(500 = 1500 - 1000),就可以在 Block group 1 的位图中查询该文件是否存在

理解新建/删除文件 

新建文件,先查 inode bitmap,找到最小的为 0 的位置,把这个位置改为 1,然后去 inode table 找到对应的位置,把文件的属性填好,把文件的内容填写到数据区中,并把填写的数据区的位置填入到 inode 的block 中。


删除文件,找文件的 inode 编号,把 inode bitmap 改为 0,把 inode 结构体中的 block 数组对应的 block bitmap 改为 0,只是把位图清掉,并不会把inode 和数据区里面的内容清除掉!!


可见,删除文件比新建文件快很多。

理解文件名 

作为用户,我们知道的是文件名,并不知道 inode 编号,在不知道文件 inode 编号的情况下,如何找到这个文件呢?

首先我们需要了解目录,目录也是一个文件,文件都有自己的属性+内容,那目录的内容是什么呢?

因为任何一个普通文件,一定在一个目录中,目录的内容是目录中的文件的文件名和 inode 编号之间的映射关系,找文件,只需要找到文件所处的目录,就可以字符串匹配到文件名,进而找到文件名和 inode 的映射关系,找到文件对应的 inode 编号。


目录这个文件的数据块存的就是文件名和 inode 编号之间的映射关系。

新建文件,假设在组 0 里面新建文件,在 inode 位图中找到一个最小的还没有用过的编号,然后把文件的属性都写到对应的 inode 中,有文件内容的话就把文件内容写入到数据块中,然后向上层返回 inode 编号,接着建立文件名和 inode 编号的映射关系,把这个关系写入到文件目录的数据块中


  • 目录没有权限时,我们没办法在该目录下创建新文件,因为我们新建文件,会修改目录的内容,没有写权限就不能修改目录内容
  • 没有权限就不能读取inode 和文件名的映射关系

    删除文件,拿着文件名,就可以知道与 inode 的映射关系,找到映射关系,知道 inode 编号后,清掉位图,然后在目录的内容中去掉文件名和 inode 的映射关系没有目录的写权限也是没办法删除目录下的文件的

相关文章:

Linux -- 文件系统(文件在磁盘中的存储)

目录 前言: 了解机械磁盘 初始盘片与磁头 盘片是怎么存数据的呢? 详解盘片 如何访问磁盘中的一个扇区呢? -- CHS 定位法 磁盘的逻辑存储 LBA(Logical Block Addressing --- 逻辑块寻址) 如何将 LBA 地址转换为…...

微服务(Microservices),服务网格(Service Mesh)以及无服务器运算Serverless简单介绍

文章目录 什么是微服务?一、定义与特点二、优势三、组件与架构四、应用场景五、挑战与解决方案什么是服务网格?一、定义与特点二、核心组件三、主要功能四、实现工具五、应用场景六、优势与挑战什么是Serverless?一、定义与特点二、主要领域三、优势四、应用场景五、挑战三者…...

【AIGC】AI时代的数据安全:使用ChatGPT时的自查要点

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯法律法规背景中华人民共和国保守秘密法中华人民共和国网络安全法中华人民共和国个人信息保护法遵守法律法规的重要性 💯ChatGPT的数据使用特点ChatGPT数据安全…...

什么是区块链桥?

什么是区块链桥? 区块链桥是一种实现资产从一个区块链转移至另一个区块链的工具,它解决了区块链技术中不同网络之间缺乏互操作性的问题。区块链桥通过创建代表另一区块链资产的合成衍生品,使得原本互不兼容的区块链资产能够相互连接和转移。…...

机器学习框架

机器学习框架 机器学习框架是用于开发和部署机器学习模型的软件工具。它们提供了一组API和工具,帮助开发人员在各种计算设备上构建、训练和部署机器学习模型。以下是几个常见的机器学习框架: 1.TensorFlow: TensorFlow是一个开源的人工智能…...

金三银四:20道前端手写面试题

文章目录 一、前言二、题目1. 防抖节流解读 2.一个正则题3. 不使用a标签,如何实现a标签的功能4. 不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好5. 深拷贝解读 6. 手写call bind applycall 解读apply 解读 …...

RAC被修改权限及相关问题

RDBMS : 19.19 修改RAC权限及相关问题 修改RAC权限,参考文档: How to check and fix file permissions on Grid Infrastructure environment (Doc ID 1931142.1) Script to capture and restore file permission in a directory (for eg. O…...

Golang | Leetcode Golang题解之第441题排列硬币

题目: 题解: func arrangeCoins(n int) int {return sort.Search(n, func(k int) bool { k; return k*(k1) > 2*n }) }...

数学建模--什么是数学建模?数学建模应该怎么准备?

前言 这是去年底学数学建模老哥的建模课程笔记;未来本人将陆陆续续的更新数学建模相关的一些基础算法,大家可以持续关注一下;提示:数学建模只有实战才能提升,光学算法没有啥意义,也很难学的很懂。 文章目录…...

Java项目实战II基于Java+Spring Boot+MySQL的智能物流管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 随着电商行业的蓬勃发展,物流行业迎来了前所未有的机遇与挑战。面对日益增长的订单量和复…...

【数据分享】2000—2023年我国省市县三级逐月植被覆盖度(FVC)数值(Shp/Excel格式)

之前我们分享过2000—2023年我国250米分辨率逐月植被覆盖度(FVC)栅格数据(可查看之前的文章获悉详情),该数据来源于高吉喜等学者在国家青藏高原科学数据中心平台上分享的数据,合成方式采用月最大值合成&…...

《Linux从小白到高手》理论篇(十一):Linux的系统环境管理

值此国庆佳节,深宅家中,闲来无事,就多写几篇博文。本篇详细深入介绍Linux的系统环境管理。 环境变量 linux系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not found”的提示内容。如果每…...

Qt/C++开源控件 自定义雷达控件

使用Qt框架创建一个简单的雷达图&#xff0c;包含动态扫描、目标点生成、刻度和方向标识。代码实现使用C编写&#xff0c;适合用作学习和扩展的基础。 1. 头文件与基本设置 #include "RadarWidget.h" #include <QPainter> #include <QPen> #include &…...

什么是IDE(集成开发环境)?

集成开发环境(IDE)详解 在软件开发的世界中,集成开发环境(IDE,Integrated Development Environment)扮演着至关重要的角色。它是一个综合性的软件应用程序,旨在为软件开发者提供一整套的、易于使用的工具集,以便他们能够更高效地编写、调试、测试和部署代码。简而言之…...

【Linux】用虚拟机配置Ubuntu 24.04.1 LTS环境

目录 1.虚拟机安装Ubuntu系统 2.Ubuntu系统的网络配置 3.特别声明 首先我们先要下载VMware软件&#xff0c;大家自己去下啊&#xff01; 1.虚拟机安装Ubuntu系统 我们进去之后点击创建新的虚拟机&#xff0c;然后选择自定义 接着点下一步 再点下一步 进入这个界面之后&…...

MacOS升级Ruby版本详解:步骤、挑战与解决方案

MacOS升级Ruby版本详解&#xff1a;步骤、挑战与解决方案 在MacOS上升级Ruby版本是一个涉及多个步骤和考虑因素的过程。Ruby作为一种广泛使用的编程语言&#xff0c;其新版本通常会引入一系列改进&#xff0c;包括性能优化、安全修复和新特性。因此&#xff0c;升级Ruby版本不…...

Log4j的配置与使用详解

Log4j的配置与使用详解 Log4j介绍 Log4j是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;我们可以控制每条日志的输出格式&#xff1b;只需要通过一个配置文件就可以灵活的配置&#xff0c…...

docker 的目录有那些,分别存放什么东西

Docker 的目录结构和文件存放位置取决于你所使用的操作系统和Docker的版本。以下是一些常见的目录和它们通常存放的内容&#xff1a; 通用目录 /var/lib/docker (Linux) 这是Docker在Linux系统上的主要数据目录。存放了镜像、容器、数据卷、网络等的元数据和状态信息。具体结构…...

开源模型应用落地-模型微调-语料采集-数据格式化(四)

一、前言 在自然语言处理(NLP)的快速发展中,语料采集作为基础性的步骤显得尤为重要。它不仅为机器学习模型提供了所需的训练数据,还直接影响模型的性能和泛化能力。随着数据驱动技术的不断进步,如何有效并高效地收集、清洗和整理丰富多样的语料,已成为研究者和工程师们亟…...

C语言+单片机

今天内容有点水哈哈&#xff08;忙着练焊铁技术了嘻嘻&#xff09; C语言 简单学习了while语言以及其与for语言的区别和适用方法 .循环结构&#xff1a; 初始化语句条件判断句条件控制句 for语句 for(int1;i<100;i){执行条件} for (int i 1; i < 100; i) {printf(&quo…...

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…...

使用 Vue3 和 Axios 实现 CRUD 操作

文章目录 1、准备工作2、创建 Vue 3 项目3、项目结构4、实现 CRUD 操作5、运行项目6、小结在当今的前端开发中,Vue.js 作为一款流行的 JavaScript 框架,正在被越来越多的开发者所青睐。尤其是 Vue 3 引入了 Composition API 和更优雅的响应式处理,使得模板编写和状态管理变得…...

.NET MAUI(.NET Multi-platform App UI)下拉选框控件

MAUI下拉选框控件详解&#xff1a; 在开发跨平台应用程序时&#xff0c;下拉选框&#xff08;ComboBox&#xff09;是一个极为常见且实用的控件&#xff0c;它允许用户从一组预定义的选项中选择一个。在.NET MAUI&#xff08;.NET Multi-platform App UI&#xff09;框架中&am…...

C++平台跳跃游戏

目录 开头程序Game.cpp源文件Player.h头文件Player.cpp源文件 程序的流程图程序游玩的效果下一篇博客要说的东西 开头 大家好&#xff0c;我叫这是我58。 程序 Game.cpp源文件 #include <iostream> #include "Player.h" using namespace std; void printma…...

多系统萎缩患者必看!这些维生素助你对抗病魔

亲爱的朋友们&#xff0c;今天我们来聊聊一个相对陌生但重要的健康话题——多系统萎缩&#xff08;MSA&#xff09;。这是一种罕见的神经系统疾病&#xff0c;影响着患者的自主神经系统、运动系统和平衡功能。面对这样的挑战&#xff0c;科学合理的饮食和营养补充显得尤为重要。…...

深度学习模型性能优化实战之从评估到提升的全流程解析

1. 概述 在构建和使用机器学习模型的过程中&#xff0c;模型的效果评估和优化是两个至关重要的环节。无论模型是用于分类、回归还是其他任务&#xff0c;评估其表现以及持续优化模型性能&#xff0c;都是确保模型在实际应用中取得成功的关键。本节将重点介绍模型效果评估的定义…...

C++ | Leetcode C++题解之第446题等差数列划分II-子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int numberOfArithmeticSlices(vector<int> &nums) {int ans 0;int n nums.size();vector<unordered_map<long long, int>> f(n);for (int i 0; i < n; i) {for (int j 0; j < i;…...

【解密 Kotlin 扩展函数】扩展属性与扩展函数类似(十九)

导读大纲 1.1.1 扩展属性的创建和使用 1.1.1 扩展属性的创建和使用 之前, 我们已经了解声明 Kotlin 属性的语法 Kotlin中的顶级属性–传送门就像扩展函数一样,我们也可以指定扩展属性就像之前所说&#xff0c;属性和函数的区别在于前者是特征&#xff0c;后者是行为 相比扩展函…...

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…...

OpenCV第十二章——人脸识别

1.人脸跟踪 1.1 级联分类器 OpenCV中的级联分类器是一种基于AdaBoost算法的多级分类器&#xff0c;主要用于在图像中检测目标对象。以下是对其简单而全面的解释&#xff1a; 一、基本概念 级联分类器&#xff1a;是一种由多个简单分类器&#xff08;弱分类器&#xff09;级联组…...

哈尔滨网站域名备案/北京千锋教育培训机构怎么样

在优化智能客服时&#xff0c;添加泛化语料是最麻烦也是最必要的一个环节&#xff0c;意图的泛化得越好&#xff0c;机器人就看起来就越智能&#xff0c;根据之前的工作经验&#xff0c;我整理了一下思路&#xff0c;给大家介绍三个语法泛化能力的方案。 一、短期(单个词泛化…...

自己可以做电子商务网站/2023年免费b站推广大全

思路&#xff1a;枚举可能的完全平方数&#xff0c;用个map存储a[i]的出现次数&#xff0c;看每个数对完全平方数的贡献次数 #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include<iostream> #include<vecto…...

wordpress remal主题/百度指数介绍

审查元素中看到的这两个标签&#xff0c;表示内容并不在元素中&#xff0c;而是在css中&#xff0c;可以查看style看到具体内容。 一般来说这样做是为了清除浮动&#xff08;clearfix&#xff09;的代码&#xff0c;防止后边的容器因为浮动出现布局的混乱。 添加在选择到的元素…...

江西威乐建设集团有限公司企业网站/网络营销成功案例ppt免费

2019独角兽企业重金招聘Python工程师标准>>> 1 Shell中的特殊符号 1.1 $ 美元符号。用来表示变量的值。如变量NAME的值为Mike&#xff0c;则使用$NAME就可以得到“Mike”这个值。 1.2 # 井号。除了做为超级用户的提示符之外&#xff0c;还可以在脚本中做为注释的开头…...

wordpress无法连接app/seopeixun com cn

2019独角兽企业重金招聘Python工程师标准>>> 上一篇讲完了java内存模型中线程私有部分&#xff08;程序计数器、虚拟机栈、本地方法栈&#xff09;&#xff0c;这篇讲下所有线程公有部分 问&#xff1a;元空间(MetaSpace)和永久代(PermGen)的区别? 元空间使用本地内…...

联赛网站建设不足/重庆seo扣费

Mobile Controls exposes device independent programmable events. Mobile Controls&#xff08;手机控件&#xff09;揭示了部件之间相对独立的程序设计事件。 Programming Events 程序设计事件 Mobile controls have an object model with programmable properties, methods…...