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

【CMU15-445数据库】bustub Project #2:B+ Tree(上)

(最近两个月学校项目有亿点忙,鸽得有点久,先来把 Project 2 补上)

本节实验文档地址:Project #2 - B+Tree

Project 2 要实现的是数据结构课上都会讲的一个经典结构 B+ 树,但是相信大多数的同学(包括博主)当时都没有自己动手实现过它,本节就是一个很好的锻炼机会。

本节内容会大量使用到 Project 1 实现的 BufferPoolManager(当然也包含了其内部用到的 ExtendibleHashTable 和 LRUKReplacer),所以需要完成前置内容(博主也比较建议这样做,否则直接上手本节可能不好理解对 Page 的 Fetch 和 Unpin 操作)。

由于代码量较多,打算拆成上下两篇写完,本篇介绍用到的数据结构和 B+ 树的查找和插入实现,下一篇讲迭代器,删除和并发控制。

关于 B+ 树的文字介绍就不赘述了,查阅资料过程中发现维基百科的 B+ 树词条的算法描述不够具体,推荐一个有比较具体的例子的博客:
B树和B+树的插入、删除图文详解
(同时不建议参考那些插入和删除分 N 多种具体情况讨论的介绍)

数据结构

B+ 树中有内部节点和叶节点两种结构,它们存储的数据格式和内容不同。bustub 为我们设计好了下面这三个类:

  • 节点基类 BPlusTreePage
    在这里插入图片描述
    内部节点和叶节点的基类,包含了节点类型、当前容量、最大/最小容量、ID、父节点 ID 信息,从类结构上可以看做是两种节点的头信息。按照函数字面意思将其实现即可。可以规定 parent_page_id_INVALID_PAGE_ID 表示根节点

  • 内部节点 BPlusTreeInternalPage<KeyType, ValueType, KeyComparator>

在这里插入图片描述
在这里插入图片描述
内部节点,首先看用到的三个泛型 KeyType, ValueType, KeyComparatorKeyType 不一定直接可用大于小于号比较,所以引入了 KeyComparator,从 cpp 文件中的实例化可以看出用的是 GenericKeyGenericComparator,查看二者源码可以得到以下信息:

  • GenericKey 可以调用 ToString() 函数得到其 int64 表示,然后用 %ld 格式符打印。这对我们后面调试时非常重要。
  • GenericComparator 的比较规则是:左边小于右边时,返回 -1;左边大于右边时,返回 1;相等返回 0。

ValueType 代表的是指向子页面的指针,从实例化可以看出实际只用了 page_id_t,也就是 int。

数据存储上,其理论结构应为 <指针,键,指针,键…,键,指针>,为方便存储,实际上在头部多补了一个无效键,从而可以用一个 pair 的数组存储:

#define MappingType std::pair<KeyType, ValueType>
...
class BPlusTreeInternalPage : public BPlusTreePage {
...
private:// Flexible array member for page data.MappingType array_[1];
}

array_[1] 等价于一个指针,按照一般习惯应该在构造函数中为其 new 出一片大小为 max_size_ 的空间,但实际上不需要这样做,因为:

Each B+Tree leaf/internal page corresponds to the content (i.e., the data_ part) of a memory page fetched by buffer pool. So every time you try to read or write a leaf/internal page, you need to first fetch the page from buffer pool using its unique page_id, then reinterpret cast to either a leaf or an internal page, and unpin the page after any writing or reading operations.

简单翻译一下就是 内部节点和叶节点对象都不是直接创建出来,而是由一个 Buffer Pool 管理的 Page 的 data 部分类型转化而来(所以要用到很少用很暴力的 reinterpret_cast。所以,节点对象使用的是预先分配好的固定空间,array_ 可以控制从该位置开始到 Page 的 data 结束为止的这一段空间。因此,节点对象的生命周期也不是由 new 和 delete,而是由我们上节实现的 BufferPoolManager 管理:取一个页面,用 FetchPage;使用结束归还一个页面,用 UnpinPage。同时也就能理解 BPlusTreePagepage_id_ 成员的另一个含义:它不仅是 B+ 树中节点的编号,同时也是这个节点使用的 Page 在 BufferPool 中的编号

  • 叶节点 BPlusTreeLeafPage<KeyType, ValueType, KeyComparator>

在这里插入图片描述
数据存储上,叶节点也是一个 键+值 的数组,但不像内部节点那样第一个键无效。值的类型实际用的也只有一种:RID。这个和我们本节的内容关系不大,大致知道它是代表数据实际存放的位置即可。

BPlusTree 类代表整个 B+ 树:

在这里插入图片描述
其主要成员有:buffer_pool_manager_,由外部传入;root_page_id,表示根节点 ID;comparator_KeyComparator 类型的对象,用于键的大小比较;leaf_max_size_internal_max_size_,表示叶节点和内部节点的最大容量。我们需要实现 B+ 树的四个功能:查找,插入,删除和迭代器。

Checkpoint 1:查找,插入和删除

实验非常贴心地将所有内容分为了两个 checkpoint,其中 checkpoint 1 要实现查找,插入和删除功能,checkpoint 2 要实现迭代器和并发控制,Autograder 上也对应有两个提交位置。下面放出的代码都只通过 checkpoint 1,没有考虑加锁,这样能更专注于讲解其本身的逻辑。本篇先讲查找和插入。

查找(GetValue)

给定一个键 xxx,查找其是否在 B+ 树中存在。实现逻辑是先找到键可能在的叶节点,然后扫描一遍叶节点的内容确定是否存在,其中重点是前者。编写一个函数 GetLeafPage,根据 B+ 树的规则,应该从根节点开始,每次在内部节点中找到 ki<x<ki+1k_i < x < k_i+1ki<x<ki+1 的位置,然后沿着 viv_ivi 指针继续向下,直到达到叶节点。函数实现如下:

在这里插入图片描述

Tips:循环时找内部节点中第一个比 xxx 大的键,取其左侧的值即可(k[0]k[0]k[0]无效),而这样不能探测到 xxx 比所有 kkk 都大的情况,所以要将 next_page_id 初始化为最右侧的键

在此基础上,GetValue 的实现就很简单了:

在这里插入图片描述

插入(Insert)

热身完毕,下面进入本节第一个难点,插入的实现。B+ 树的插入流程为:

  1. 如果是空树,创建一个叶节点作为根。注意涉及 root_page_id_ 更新时都要调用一次 UpdateRootPageId,如果是第一次创建传 1 作为参数,更新不用,以下不再复述
  2. 从根节点向下查找到键值应该所在的叶节点。文档说明了不支持重复键,所以先扫描一遍叶节点,如果发现键存在则直接返回 false
  3. 如果叶节点 插入后 达到了 max_size,则要进行分裂(split),创建一个新的叶节点,将原节点的一半内容拷贝到新节点,分裂点的键插入父节点,该键对应的值指向新的叶节点。(如果父节点不存在,说明是第一个叶节点兼根节点,需要创建一个新的根,这种情况和 4 的建根可以合并处理)
  4. 如果父节点(内部节点)插入前 达到了 max_size,也要递归进行分裂并向上插入,此时还要调整原节点的一半子节点的 parent_id_ 指针指向新的内部节点。如果根节点满了,则要创建一个新的根节点,使得 B+ 树长高一层。

Tips:特别注意这里叶节点和内部节点的判断条件是不同的,摘一段文档原文:
You should correctly perform splits if insertion triggers the splitting condition (number of key/value pairs AFTER insertion equals to max_size for leaf nodes, number of children BEFORE insertion equals to max_size for internal nodes).

第 1、2 步代码:

在这里插入图片描述
第 3 步,未溢出情况,插入的具体逻辑可以放到 LeafPage 类中做,所以添加一个 Insert 函数,找到插入位置,将所有后面的键值对后移一位,再设置。由于 array_ 是有序的,如果还想提高效率,可以把找插入位置用二分搜索实现。

在这里插入图片描述

Tips:comparator_ 也要作为参数传入 Insert,否则 LeafPage 中无法进行键的比较,也就无法查找

在这里插入图片描述
叶节点溢出情况,注意处理好 next_page_id_。移动一半数据的逻辑也可以放到 LeafPage 类中,添加一个 MoveDataTo 函数:

在这里插入图片描述
在这里插入图片描述

Tips:MoveDataTo 不用真的对原叶节点后一半数据进行“抹除”,修改 size 即可,以后的新数据自然会覆盖掉这些数据。

真正的难点来了:如何处理向父节点插入、同时处理父节点可能继续分裂的递归逻辑。需要想清楚的是:在两次递归之间,需要传递的数据是什么?我的设计是,传递两个子节点对象和分裂点的键。前者是为了获取到其父节点,也可以对其本身的父节点指针进行更新,后者是要插入父节点的键。进一步思考,在第一轮,传递的子节点对象是叶节点,而后面每轮是内部节点,看起来不统一,但实际上我们需要这两个子节点只涉及到 page_id 的父子指针的更改,所以,传递的形式应设计为基类指针 BPlusTreePage *,就可以兼顾这两种情况。

这里我用一个 while(true) 循环实现,写成函数递归调用当然也可以。三个传递数据分别命名为 old_tree_pagenew_tree_pagesplit_key

第一轮初始化和到达根节点的处理。正因为用的是 BPlusTreePage *,所以可以兼顾 3 和 4,即上一层是叶节点和内部节点两种情况的建根。

在这里插入图片描述
未到达根节点,则在父节点进行插入。这里类似地我在 InternalPage 中也添加了一个 Insert 函数,但要注意逻辑上有一丁点不同,就是查找插入位置要从 1 开始

在这里插入图片描述
如果父节点也溢出,创建新的内部节点并移动一半数据。这里涉及到子节点的指针修改,所以直接把逻辑写在这里了。最后将三个传递数据更新,准备做下一轮处理。

在这里插入图片描述
细心的读者可能注意到上面达到跳出循环条件后没有 return true 而是写了 break,这是因为在最后一轮循环结束后还要统一做一件事情:释放最后两个页面。

在这里插入图片描述
如果你做完后本地测试和 AutoGrader 其它测试都能通过,只有 ScaleTest 报错 SIGSEGV,InternalPage 或 LeafPage 的函数(比如 GetSize())访问了空地址,则很可能是 Insert 函数中没有把所有 Fetch 的 Page 最后 Unpin 掉,导致其一直占着 BufferPoolManager 的空间,最终空间耗尽无法取到新页面,FetchPage 返回 nullptr。检查也很简单,改一下 BufferPoolManagerInstance 的代码,例如每次 Fetch 和 Unpin 时打印一个信息,看一下是不是所有的页面都被释放了(0 号页面不被释放是正常的)。

Debug 方法

这里我要吹爆 bustub 的开发组,他们提供了一个非常好用的工具 b_plus_tree_printer,可视化展现树的结构,帮助检查你的实现效果是否正确。

在这里插入图片描述
更感人的是他们还提供了一个打印正确实现的 B+ 树的在线版本,可以与自己本地的效果对比(泪目)

在这里插入图片描述
本篇内容到此结束,下一篇继续讲迭代器,删除和并发控制的实现

相关文章:

【CMU15-445数据库】bustub Project #2:B+ Tree(上)

&#xff08;最近两个月学校项目有亿点忙&#xff0c;鸽得有点久&#xff0c;先来把 Project 2 补上&#xff09; 本节实验文档地址&#xff1a;Project #2 - BTree Project 2 要实现的是数据结构课上都会讲的一个经典结构 B 树&#xff0c;但是相信大多数的同学&#xff08;…...

功率放大器在lamb波方向算法的损伤定位中的应用

实验名称&#xff1a;基于PZT结Lamb波方向算法的损伤定位方法研究方向&#xff1a;损伤定位测试目的&#xff1a;Lamb波是在具有自由边界的固体板或层状结构中传输的一种弹性导波&#xff0c;由于其本身的传播特性&#xff0c;如沿传播路径衰减小&#xff0c;能量损失小&#x…...

时的科技迎1亿融资,这辆“空中的士”能否实现真正飞行?

近期&#xff0c;进行载人eVTOL的研发、生产和销售的时的科技宣布完成1亿元Pre-A轮融资&#xff0c;成立不到两年&#xff0c;这已是时的科技的第三轮融资&#xff0c;此前&#xff0c;时的科技已获得蓝驰创投和德迅投资千万美元种子轮投资。在不少人看来&#xff0c;时的科技所…...

idea 折叠代码块技巧 关于<editor-fold>

最近在使用delombok插件的时候&#xff0c;发现了一个有意思的小技巧 以前用VSstudio写代码的时候。经常使用代码块折叠的方法。但是在写java的时候&#xff0c;没怎么使用过 VSStudio中的写法 即 #region xxx ... your great coding #endregion这样在浏览的时候&#xff0c…...

python|第五章考试题及练习题

本篇文章是对北京理工大学嵩天老师的《Python语言程序设计》第五章考试题及练习题的学习记录。 一、考试题 1、随机密码生成 问题描述&#xff1a; 描述 补充编程模板中代码&#xff0c;完成如下功能&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪…...

DIY生日蛋糕笔记

自制6寸生日蛋糕笔记 实验环境&#xff1a; 长帝CRTF32PD搪瓷烤箱32升&#xff0c; 九阳电动打蛋器&#xff0c; 裱花盘一套 蛋糕盒子 称重器 硅胶刀 两个大碗1号和2号。 材料&#xff1a; 参考&#xff1a; https://www.bilibili.com/video/BV1t34y1Z7mL/?spm_id_from333…...

MybatisPlus------常用注解和逻辑删除以及设置统一前缀以及主键生成策略(六)

MybatisPlus------常用注解以及设置统一前缀以及主键生成策略&#xff08;六&#xff09; 在使用MybatisPlus的过程中时&#xff0c;实力类的Mapper继承BaseMapper&#xff0c;此时不要添加TableName注解也能够对表数据实现增删改查。 // mybatispuls 提供了接口实现单表的增…...

JQuery工具框架

JQuery工具框架 直接使用js编程比较麻烦&#xff0c;而且还必须考虑浏览器的差异性。 为了简化javascript的开发&#xff0c;一些javascript库诞生了。当今流行的javascript库有&#xff1a;jQuery诞生于2005 年&#xff0c;Dojo、 EXT_JS、DWR、YUI… jQuery是John Resig在…...

同一个整型常量怎样在不同进制间之间转换?

整型常量可以分别用二进制、八进制、十进制和十六进制表示&#xff0c;不同的进制并不影响数据本身的大小&#xff0c;同一个整型常量可以在不同进制之间转换&#xff0c;具体转换方式如下。1.十进制和二进制之间的转换(1)十进制转二进制。十进制转换成二进制就是一个除以2取余…...

UVa 225 Golygons 黄金图形 暴力搜索 剪枝 状态判断

题目链接&#xff1a;Golygons 题目描述&#xff1a; 给定nnn和kkk个障碍物的坐标&#xff0c;你需要走nnn次&#xff0c;第一次走一个单位距离&#xff0c;第二次走二个单位距离&#xff0c;…&#xff0c;第nnn次走nnn个单位距离。走得过程中不能穿过或者到达障碍物所在的点&…...

PowerShell中的对象是神马?

在PowerShell中,无处不在体现出一个概念,这个概念是什么呢?就是对象,对象是面向对象的语言中非常重要的概念,PowerShell的底层是.net,也是面向对象的语言,因此它也继承了面向对象的语言的语法特性。但是很多人在使用PowerShell 语言的时候会觉得有些疑惑,到底什么是Pow…...

Proxy lab

CSAPP Proxy Lab 本实验需要实现一个web代理服务器&#xff0c;实现逐步从迭代到并发&#xff0c;到最终的具有缓存功能的并发代理服务器。 Web 代理是充当 Web 浏览器和终端服务器之间的中间人的程序。浏览器不是直接联系终端服务器获取网页&#xff0c;而是联系代理&#x…...

【机器学习】Sklearn 集成学习-投票分类器(VoteClassifier)

前言 在【机器学习】集成学习基础概念介绍中有提到过&#xff0c;集成学习的结合策略包括&#xff1a; 平均法、投票法和学习法。sklearn.ensemble库中的包含投票分类器(Voting Classifier) 和投票回归器&#xff08;Voting Regressor)&#xff0c;分别对回归任务和分类任务的…...

Day892.MySql读写分离过期读问题 -MySQL实战

MySql读写分离过期读问题 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于MySql读写分离过期读问题的内容。 一主多从架构的应用场景&#xff1a;读写分离&#xff0c;以及怎么处理主备延迟导致的读写分离问题。 一主多从的结构&#xff0c;其实就是读写分离的基本…...

无线蓝牙耳机哪个品牌音质好?性价比高音质好的蓝牙耳机排行榜

其实蓝牙耳机购买者最担忧的就是音质问题&#xff0c;怕拿到手的蓝牙耳机低频过重又闷又糊&#xff0c;听歌闷耳的问题&#xff0c;但从2021年蓝牙技术开始突飞猛进后&#xff0c;蓝牙耳机的音质、连接甚至是功能都发生了很大的变化&#xff0c;下面我分享几款性价比高音质的蓝…...

店铺微信公众号怎么创建?

有些小伙伴问店铺微信公众号怎么创建&#xff0c;在解答这个问题之前&#xff0c;先简单说说店铺和微信公众号关系&#xff1a; 店铺一般是指小程序店铺&#xff0c;商家通过小程序店铺来卖货&#xff1b;微信公众号则是一个发布信息的平台。但是两者之间可以打通&#xff0c;…...

goLang Mutex用法案例详解

Golang以其并发性Goroutines而闻名。不仅是并发,还有更多。 因此,在这种情况下,我们必须确保多个goroutines不应该同时试图修改资源,从而导致冲突。 为了确保资源一次只能被一个goroutine访问,我们可以使用一个叫做sync.Mutex的东西。 This concept is called mutual ex…...

java常见的异常

异常分类 Throwable 是java异常的顶级类&#xff0c;所有异常都继承于这个类。 Error,Exception是异常类的两个大分类。 Error Error是非程序异常&#xff0c;即程序不能捕获的异常&#xff0c;一般是编译或者系统性的错误&#xff0c;如OutOfMemorry内存溢出异常等。 Exc…...

从0开始学python -33

Python3 输入和输出 -1 在前面几个章节中&#xff0c;我们其实已经接触了 Python 的输入输出的功能。本章节我们将具体介绍 Python 的输入输出。 — 输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数。 第三种方式是使用文件对象的 write() 方法&#xff…...

ModuleNotFoundError: No module named ‘glfw‘ 解决方案

错误描述 env gym.make(env_id) File "/opt/conda/envs/WNPG/lib/python3.8/site-packages/gym/envs/registration.py", line 619, in make env_creator load(spec_.entry_point) File "/opt/conda/envs/WNPG/lib/python3.8/site-packages/gym/envs/r…...

RadZen运行和部署,生成业务web应用程序

RadZen运行和部署,生成业务web应用程序 快速简单地生成业务web应用程序&#xff0c;可视化地构建和启动web程序&#xff0c;而我们为您创建新代码。 从信息开始 连接到数据库。Radzen推断您的信息并生成一个功能完备的web应用程序。支持MSSQL REST服务。 微调 添加页面或编辑生…...

分享7个比B站更刺激的老司机网站,别轻易点开

俗话说摸鱼一时爽&#xff0c;一直摸一直爽&#xff0c;作为一个程序员老司机了&#xff0c;一头乌黑浓密的头发还时不时被同事调侃&#xff0c;就靠这10个网站让我健康生活&#xff0c;不建议经常性使用&#xff0c;因为还有一句俗话&#xff0c;那就是“摸鱼一时爽&#xff0…...

浅析:如何在Vue3+Vite中使用JSX

目录 0. Vue3&#xff0c;Vite&#xff0c;JSX 三者的关系 JSX介绍 在 Vue3 中使用 JSX 安装插件&#xff08;vitejs/plugin-vue-jsx&#xff09; 新建 jsx 文件 语法 补充知识&#xff1a;注意事项 0. Vue3&#xff0c;Vite&#xff0c;JSX 三者的关系 Vue3、Vite 和 …...

开发小程序需要什么技术?

小程序是一种新的开发能力&#xff0c;相比于原生APP 开发周期短&#xff0c;开发者可以快速地开发一个小程序。小程序可以在微信内被便捷地获取和传播&#xff0c;同时具有出色的使用体验。 开发小程序需要什么技术? 前端技术基础&#xff1a;html、js、css。具体到小程序&a…...

7个营销人员常见的社交媒体问题以及解决方法

在如今的数字营销时代&#xff0c;许多营销人员都害怕在社交媒体上犯错。他们担心他们的社交媒体中的失误会演变成一场公关危机。面对一些常见的社交媒体问题&#xff0c;您需要知道如何避免和解决。对于数字营销人员来说&#xff0c;在现在这个信息互通&#xff0c;每时每刻都…...

BFC 是什么

在页面布局的时候&#xff0c;经常出现以下情况&#xff1a; 这个元素高度怎么没了&#xff1f;这两栏布局怎么没法自适应&#xff1f;这两个元素的间距怎么有点奇怪的样子&#xff1f;...... 原因是元素之间相互的影响&#xff0c;导致了意料之外的情况&#xff0c;这里就涉及…...

07 react+echart+大屏

reactechart大屏大屏ECharts 图表实际步骤React Typescript搭建大屏项目&#xff0c;并实现屏幕适配flexible rem实现适配1. 安装插件对echarts进行的React封装&#xff0c;可以用于React项目中&#xff0c;支持JS、TS如何使用完整例子官网参考大屏 ECharts 图表 ECharts 图…...

Linux/Ubuntu安装部署Odoo15仓管系统,只需不到十步---史上最成功

sudo apt-get update sudo apt install postgresql -y sudo apt-get -f install sudo dpkg -i /home/ubuntu/odoo_15.0.latest_all.deb —报错再次执行上一条命令再执行 —安装包地址&#xff1a;http://nightly.odoo.com/15.0/nightly/deb/–翻到最下面 sudo apt-get ins…...

Python奇异值分解

当AAA是方阵时&#xff0c;可以很容易地进行特征分解&#xff1a;AWΣW−1AW\Sigma W^{-1}AWΣW−1&#xff0c;其中Σ\SigmaΣ是AAA的特征值组成的对角矩阵。如果WWW由标准正交基组成&#xff0c;则W−1WTW^{-1}W^TW−1WT&#xff0c;特征分解可进一步写成WTΣWW^T\Sigma WWTΣ…...

AWS攻略——子网

文章目录分配子网给Public子网分配互联网网关创建互联网网关附加到VPC给Public子网创建路由表关联子网打通Public子网和互联网网关创建Public子网下的EC2进行测试配置Private子网路由给Private子网创建路由表附加在Private子网创建Private子网下的EC2进行测试创建实例在跳板机上…...

广东网站备案进度查询/上海百度seo优化

现在Spring Boot 非常火&#xff0c;各种技术文章&#xff0c;各种付费教程&#xff0c;多如牛毛&#xff0c;可能还有些不知道 Spring Boot 的&#xff0c;那它到底是什么呢&#xff1f;有什么用&#xff1f;今天给大家详细介绍一下。 SpringBoot相关的视频课程也分享给大家&…...

微信分销系统价格/seo优化代理

在日志中记录Java异常信息的正确姿势参考文章&#xff1a; &#xff08;1&#xff09;在日志中记录Java异常信息的正确姿势 &#xff08;2&#xff09;https://www.cnblogs.com/nuccch/p/11061929.html 备忘一下。...

网络培训法/seo外链推广工具下载

原标题&#xff1a;一加6T被曝将预装Android P 这一点其它品牌比不了近年来国产手机群雄崛起&#xff0c;不仅在国内获得了很高的呼声&#xff0c;一些品牌在国外也拥有着很高的热度&#xff0c;从以往的三星、苹果手中抢占了很多的份额&#xff0c;如今三星在国内的销量非常惨…...

政府制作网站收费/怎么制作一个简单的网页

往期热门文章&#xff1a;1、牛客网&#xff1a;为什么不能将实数作为 HashMap 的 key&#xff1f; 2、RedisJson发布官方性能报告&#xff0c;性能碾压ES和Mongo 3、分布式数据一致性思考-B端系统一致性 4、Java字符串拼接的五种方法&#xff0c;哪种性能最好&#xff1f; 5、…...

网站建设服务兴田德润/优化网站标题名词解释

SET QUOTED_IDENTIFIER ON GO 是什么意思&#xff1f; 语法 SET QUOTED_IDENTIFIER { ON | OFF } 注释 当 SET QUOTED_IDENTIFIER 为 ON 时&#xff0c;标识符可以由双引号分隔&#xff0c;而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时&#xff0c;标识符不可加…...

做教案比较好的网站/磁力搜索器

Linux网络的IPv6应用(2)(转)-F &#xff1a;清除所有的已订定的规则&#xff1b;-X &#xff1a;杀掉所有使用者建立的表&#xff08;table&#xff09;。-Z &#xff1a;将所有的链(chain) 的计数与流量统计都归零。(2)建立政策#ip6tables [-t tables] [-P] [INPUT,OUTPUT,FOR…...