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

深入理解Linux虚拟内存管理(七)

在这里插入图片描述

系列文章目录


Linux 内核设计与实现
深入理解 Linux 内核
Linux 设备驱动程序
Linux设备驱动开发详解
深入理解Linux虚拟内存管理(一)
深入理解Linux虚拟内存管理(二)
深入理解Linux虚拟内存管理(三)
深入理解Linux虚拟内存管理(四)
深入理解Linux虚拟内存管理(五)
深入理解Linux虚拟内存管理(六)
深入理解Linux虚拟内存管理(七)
深入理解Linux虚拟内存管理(八)


文章目录

  • 系列文章目录
  • 一、进程内存描述符
    • 1、 进程内存描述符
      • (1)初始化一个描述符
      • (2)复制一个描述符
        • (a)copy_mm
        • (b)mm_init
          • ① ⇒ pgd_alloc
          • ② ⇒ kmem_cache_free
      • (3)分配一个描述符
        • (a)allocate_mm
        • (b)mm_alloc
      • (4)销毁一个描述符
        • (a)mmput
        • (b)mmdrop
        • (c)__mmdrop
    • 2、创建内存区域
      • (1)创建一个内存区域
        • (a)do_mmap
        • (b)do_mmap_pgoff
      • (2)插入一个内存区域
        • (a)__insert_vm_struct
        • (b)find_vma_prepare
        • (c)vma_link
        • (d)__vma_link
        • (e)__vma_link_list
        • (f)__vma_link_rb
        • (g)__vma_link_file
      • (3)合并相邻区域
        • (a)vma_merge
        • (b)can_vma_merge
      • (4)重映射并移动一个内存区域
        • (a)sys_mremap
        • (b)do_mremap
        • (c)move_vma
        • (d)make_pages_present
        • (e)get_user_pages
        • (f)move_page_tables
        • (g)move_one_page
        • (h)get_one_pte
        • (i)alloc_one_pte
        • (j)copy_one_pte
      • (5)删除内存区域
        • (a)do_munmap
        • (b)unmap_fixup
      • (6)删除所有的内存区域
        • (a)exit_mmap
        • (b)clear_page_tables
        • (c)free_one_pgd
        • (d)free_one_pmd
    • 3、查找内存区域
      • (1)查找已映射内存区域
        • (a)find_vma
        • (b)find_vma_prev
        • (c)find_vma_intersection
      • (2)查找空闲内存区域
        • (a)get_unmapped_area
        • (b)arch_get_unmapped_area
    • 4、对内存区域上锁和解锁
      • (1)对内存区域上锁
        • (a)sys_mlock
        • (b)sys_mlockall
        • (c)do_mlockall
        • (d)do_mlock
      • (2)对区域解锁
        • (a)sys_munlock
        • (b)sys_munlockall
      • (3)上锁/解锁后修整区域
        • (a)mlock_fixup
        • (b)ulock_fixup_all
        • (c)mlock_fixup_start
        • (d)mlock_fixup_end
        • (e)mlock_fixup_middle
    • 5、缺页中断
      • (1)x86 缺页中断处理程序
        • (a)do_page_fault
      • (2)扩展栈
        • (a)expand_stack
      • (3)独立体系结构的页面中断处理程序
        • (a)hanle_mm_fault
        • (b)handle_pte_fault
      • (4)请求分配
        • (a)do_no_page
        • (b)do_anonymous_page
      • (5)请求分页
        • (a)do_swap_page
        • (b)can_share_swap_page
        • (c)exclusive_swap_page
      • (6)写时复制(COW) 页面
        • (a)do_wp_page
    • 6、页面相关的磁盘 I/O
      • (1)一般文件读
        • (a)generic_file_read
        • (b)do_generic_file_read
        • (c)generic_file_readahead
      • (2)一般文件 mmap
        • (a)generic_file_mmap
      • (3)一般文件截断
        • (a)vmtruncate
        • (b)vmtruncate_list
        • (c)zap_page_range
        • (d)zap_pmd_range
        • (e)zap_pte_range
        • (f)truncate_inode_pages
        • (g)truncate_list_pages
        • (h)truncate_complete_page
        • (i)do_flushpage
        • (j)truncate_partial_page
      • (4)从页面高速缓存中读入页面
        • (a)filemap_nopage
        • (b)age_cache_read
      • (5)为 nopage() 进行预读文件
        • (a)nopage_sequential_readahead
        • (b)read_cluster_nonblocking
      • (6)交换相关的预读
        • (a)swapin_readahead
        • (b)valid_swaphandles
  • 符号


一、进程内存描述符

1、 进程内存描述符

(1)初始化一个描述符

传送门 4.3.2 初始化一个描述符

    系统中的 mm_struct 开始称为 init_mm ,它在编译时由宏 INIT_MM() 静态初始化。

// include/linux/sched.h
#define INIT_MM(name) \
{			 				\mm_rb:		RB_ROOT,			\pgd:		swapper_pg_dir, 		\mm_users:	ATOMIC_INIT(2), 		\mm_count:	ATOMIC_INIT(1), 		\mmap_sem:	__RWSEM_INITIALIZER(name.mmap_sem), \page_table_lock: SPIN_LOCK_UNLOCKED, 		\mmlist:		LIST_HEAD_INIT(name.mmlist),	\
}// arch/i386/kernel/init_task.c
struct mm_struct init_mm = INIT_MM(init_mm);

    新 mm_struct 在建立以后,是它们父 mm_struct 的备份,并且它们由 copy_mm()init_mm() 初始化的字段来复制。

(2)复制一个描述符

(a)copy_mm

    这个函数为给定的进程复制一份 mm_struct 。它仅在创建一个新进程后且需要它自己的 mm_struct 时由 do_fork() 调用。

// kernel/fork.c
// 这一块重置没有被子 mm_struct 继承的字段并找到一个复制源 mm 的字段。
// 这些参数是为克隆而传入的标志位和那些复制 mm_struct 的进程。
static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
{struct mm_struct * mm, *oldmm;int retval;// 初始化与内存管理相关的task_struct字段。tsk->min_flt = tsk->maj_flt = 0;tsk->cmin_flt = tsk->cmaj_flt = 0;tsk->nswap = tsk->cnswap = 0;tsk->mm = NULL;tsk->active_mm = NULL;/** Are we cloning a kernel thread?** We need to steal a active VM for that..*/// 借用当前运行进程的mm来复制。	 oldmm = current->mm;// 一个没有mm的内核线程,所以它可以立即返回。if (!oldmm)return 0;// 如果设置了 CLONE_VM 标志位,子进程将与父进程共享mm。像 pthreads 这// 样的用户需要这样做。mm_users 字段加1, 以使mm不会过早销毁。// good_mm 标记设置 tsk->mm 和 tsk->active_mm, 并返回成功if (clone_flags & CLONE_VM) {atomic_inc(&oldmm->mm_users);mm = oldmm;goto good_mm;}retval = -ENOMEM;// 分配新的mm。mm = allocate_mm();if (!mm)goto fail_nomem;/* Copy the current MM stuff.. */// 复制父mm, 并利用mm_init()来初始化特定进程的mm字段。memcpy(mm, oldmm, sizeof(*mm));if (!mm_init(mm))goto fail_nomem;// 为那些无法自动管理其MMU的体系结构初始化MMU上下文。if (init_new_context(tsk,mm))goto free_pt;// 调用dup_mmap(),它负责复制所有VMA父进程用到的区域。down_write(&oldmm->mmap_sem);retval = dup_mmap(mm);up_write(&oldmm->mmap_sem);// 一旦成功,dup_mmap() 返回 0。如果失败,标记 free_pt 将调用 mmput() 。它将// mm 的使用计数减 1if (retval)goto free_pt;/** child gets a private LDT (if there was an LDT in the parent)*/// 基于父进程为新进程复制LDT。 copy_segments(tsk, mm);good_mm:// 设置新mm,active_mm 并返回成功。tsk->mm = mm;tsk->active_mm = mm;return 0;free_pt:mmput(mm);
fail_nomem:return retval;
}

(b)mm_init

    这个函数初始化特定进程的 mm 字段。

// kernel/fork.c
#define free_mm(mm)	(kmem_cache_free(mm_cachep, (mm)))static struct mm_struct * mm_init(struct mm_struct * mm)
{// 设置用户数为l。atomic_set(&mm->mm_users, 1);// 设置mm的引用计数为1。atomic_set(&mm->mm_count, 1);// 初始化保护VMA链表的信号量。init_rwsem(&mm->mmap_sem);// 初始化保护写访问的自旋锁。mm->page_table_lock = SPIN_LOCK_UNLOCKED;// 为该结构分配新的PGD。mm->pgd = pgd_alloc(mm);mm->def_flags = 0;if (mm->pgd)return mm;free_mm(mm);return NULL;
}
① ⇒ pgd_alloc

    pgd_alloc 函数

② ⇒ kmem_cache_free

    kmem_cache_free 函数

(3)分配一个描述符

    提供了两个函数来分配一个 mm_struct。虽然有点容易混淆,但它们实际上都是一样的。allocate_mm() 将从 slab 分配器中分配一个 mm_structmm_alloc() 将分配结构,然后调用 mm_init() 来初始化。

(a)allocate_mm

// kernel/fork.c
#define allocate_mm()	(kmem_cache_alloc(mm_cachep, SLAB_KERNEL))
// 从slab分配器分配一个mm_struct。

(b)mm_alloc

// kernel/fork.c
/** Allocate and initialize an mm_struct.*/
struct mm_struct * mm_alloc(void)
{struct mm_struct * mm;// 从slab分配器分配一个mm_struct。mm = allocate_mm();if (mm) {// 将结构的所有字段归0。memset(mm, 0, sizeof(*mm));// 进行基本的初始化。		return mm_init(mm);}return NULL;
}

(4)销毁一个描述符

    mm 的一个新用户利用如下调用将使用计数加1:
    atomic_inc( &mm->mm_users );
    利用 mmput() 将使用计数减 1。如果 mm_users 计数减到 0,将调用 exit_mmap() 将所有的已映射区域删除,而且所有的页表也将会销毁,因为已经没有任何使用用户空间部分的使用者。mm_count 计数由 mmdrop() 减 1,因为页表和 VMA 的使用者都记为一个 mm_struct 使用者。在 mm_count 减到 0 时,mm_struct 将会被销毁。

(a)mmput

// kernel/fork.c
/** Decrement the use count and release all resources for an mm.*/
void mmput(struct mm_struct *mm)
{if (atomic_dec_and_lock(&mm->mm_users, &mmlist_lock)) {extern struct mm_struct *swap_mm;if (swap_mm == mm)swap_mm = list_entry(mm->mmlist.next, struct mm_struct, mmlist);list_del(&mm->mmlist);mmlist_nr--;spin_unlock(&mmlist_lock);exit_mmap(mm);mmdrop(mm);}
}

(b)mmdrop

(c)__mmdrop

2、创建内存区域

(1)创建一个内存区域

(a)do_mmap

(b)do_mmap_pgoff

(2)插入一个内存区域

(a)__insert_vm_struct

(b)find_vma_prepare

(c)vma_link

(d)__vma_link

(e)__vma_link_list

(f)__vma_link_rb

(g)__vma_link_file

(3)合并相邻区域

(a)vma_merge

(b)can_vma_merge

(4)重映射并移动一个内存区域

(a)sys_mremap

(b)do_mremap

(c)move_vma

(d)make_pages_present

(e)get_user_pages

(f)move_page_tables

(g)move_one_page

(h)get_one_pte

(i)alloc_one_pte

(j)copy_one_pte

(5)删除内存区域

(a)do_munmap

(b)unmap_fixup

(6)删除所有的内存区域

(a)exit_mmap

(b)clear_page_tables

(c)free_one_pgd

(d)free_one_pmd

3、查找内存区域

(1)查找已映射内存区域

(a)find_vma

(b)find_vma_prev

(c)find_vma_intersection

(2)查找空闲内存区域

(a)get_unmapped_area

(b)arch_get_unmapped_area

4、对内存区域上锁和解锁

(1)对内存区域上锁

(a)sys_mlock

(b)sys_mlockall

(c)do_mlockall

(d)do_mlock

(2)对区域解锁

(a)sys_munlock

(b)sys_munlockall

(3)上锁/解锁后修整区域

(a)mlock_fixup

(b)ulock_fixup_all

(c)mlock_fixup_start

(d)mlock_fixup_end

(e)mlock_fixup_middle

5、缺页中断

(1)x86 缺页中断处理程序

(a)do_page_fault

(2)扩展栈

(a)expand_stack

(3)独立体系结构的页面中断处理程序

(a)hanle_mm_fault

(b)handle_pte_fault

(4)请求分配

(a)do_no_page

(b)do_anonymous_page

(5)请求分页

(a)do_swap_page

(b)can_share_swap_page

(c)exclusive_swap_page

(6)写时复制(COW) 页面

(a)do_wp_page

6、页面相关的磁盘 I/O

(1)一般文件读

(a)generic_file_read

(b)do_generic_file_read

(c)generic_file_readahead

(2)一般文件 mmap

(a)generic_file_mmap

(3)一般文件截断

(a)vmtruncate

(b)vmtruncate_list

(c)zap_page_range

(d)zap_pmd_range

(e)zap_pte_range

(f)truncate_inode_pages

(g)truncate_list_pages

(h)truncate_complete_page

(i)do_flushpage

(j)truncate_partial_page

(4)从页面高速缓存中读入页面

(a)filemap_nopage

(b)age_cache_read

(5)为 nopage() 进行预读文件

(a)nopage_sequential_readahead

(b)read_cluster_nonblocking

(6)交换相关的预读

(a)swapin_readahead

(b)valid_swaphandles

符号

   
⇐ ⇒ ⇔ ⇆ ⇒ ⟺
①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿
⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑿⒀⒁⒂⒃⒄⒅⒆⒇
➊➋➌➍➎➏➐➑➒➓⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴
⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵
ⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ
ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏ
🅐🅑🅒🅓🅔🅕🅖🅗🅘🅙🅚🅛🅜🅝🅞🅟🅠🅡🅢🅣🅤🅥🅦🅧🅨🅩

123

y = x 2 + z 3 y = x^2 + z_3 y=x2+z3

y = x 2 + z 3 + a b + b a y = x^2 + z_3 + \frac {a}{b} + \sqrt[a]{b} y=x2+z3+ba+ab

y = x 2 + z 3 (1) y = x^2 + z^3 \tag{1} y=x2+z3(1)

相关文章:

深入理解Linux虚拟内存管理(七)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理(一) 深入理解Linux虚拟内存管理(二) 深入理解Linux虚拟内存管理(三) 深入理…...

GSR II 智能速度辅助系统的型式认证和系统作为独立技术单元的型式认证测试流程和技术要求

智能速度辅助系统ISA的型式认证和系统作为独立技术单元的型式认证测试流程和技术要求 补充欧洲议会和欧洲理事会第2019/2144号条例,为机动车智能速度辅助系统的型式认证和这些系统作为独立技术单元的型式认证规定了详细的测试程序和技术要求,并修订该条例的附件二 (1)(EU…...

工厂方法模式(五)

过气的,终究是过气了 上一章简单介绍了工厂模式(四), 如果没有看过,请观看上一章 一.工厂方法模式 工厂方法模式,通过定义工厂父类负责定义创建对象的公共接口,而子类则负责生成具体的对象。 将类的实例化(具体产品的创建&…...

力扣笔记(每日随机一题)——最佳买卖股票时机含冷冻期

问题(中等) 给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票): 卖出股票后&a…...

yolov5 6.1 关于 tensorrt 加速的使用以及问题说明

文章目录 1. 参考连接2. 使用说明2.1 导出加速模型2.1 使用加速模型2.2 加速参数对比 3. 问题说明3.1 在 Tensorrt 8.4.1.5 版本上使用 export.py 导出失败的问题3.2 把模型文件由 best.pt 更换成加速后的 best.engine 后,执行推理时标注的类别名不正确的问题3.3 导…...

SVR(支持向量机)用法介绍

一、SVR回归介绍 SVR(Support Vector Regression)是支持向量机(SVM)在回归问题中的应用。与SVM分类模型相似,SVR也是一种非概率性算法,通过使用核函数将数据映射到高维空间,并在该空间上寻找最优的超平面与训练数据之间的间隔最大化&#xf…...

是面试官放水,还是公司实在是太缺人?这都没挂,腾讯原来这么容易进···

本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到腾讯可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…...

算法模板(5):数学(1):数学知识(1)

数论 整数的整除性 [x]表示不超过x的最大整数,叫做取整函数或高斯函数。设整数a,b不同时为零,则存在一对整数m,n,使得 ( a , b ) a m b n (a, b) am bn (a,b)ambn。注:a和b的最大公因数会写成 (a, b)…...

电子行业 K 公司对接 Nexperia EDI 项目案例

项目背景 Nexperia 是一家全球领先的半导体制造商,专注于提供高性能、高可靠性和创新性的半导体解决方案。公司成立于2017年,是前飞思卡尔半导体业务的一部分,并在全球范围内拥有多个设计、研发和生产基地。 Nexperia 使用 EDI(…...

chatgpt赋能python:Python如何将英文转化为中文的最佳方法

Python如何将英文转化为中文的最佳方法 介绍 在现代全球化社会中,国与国之间的交流越来越频繁,相应的语言翻译工具的需求也愈发迫切。Python是一种易于学习、快速上手的编程语言,适合初学者和经验丰富的程序员使用,在语言翻译方…...

知道这些英文文档翻译的方式吗

在工作中,大家有没有遇到领导交给你一份外语的文档,要你去观看和理解,但是我们看不太懂或者没啥时间去一点点翻译怎么办呢?我们就需要有工具来将文档翻译,它是一项非常实用和便捷的功能,它可以将文档中的文…...

供应链安全

供应链安全 目录 文章目录 供应链安全目录本节实战可信任软件供应链概述构建镜像Dockerfile文件优化镜像漏洞扫描工具:Trivy检查YAML文件安全配置:kubesec准入控制器: Admission Webhook准入控制器: ImagePolicyWebhook关于我最后…...

华硕天选4原装Windows11系统带ASUSRECOVERY恢复工厂模式安装

华硕工厂恢复系统 ,安装结束后带隐藏分区以及机器所有驱动软件,奥创Myasus Recovery 文件地址https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 文件格式:5个底包(HDI KIT COM MCAFEE EDN) 1个引导工具TLK 支持ASUSRECOVERY型…...

数据库期末复习(8)并发控制

笔记 数据库DBMS并发控制(1)_旅僧的博客-CSDN博客 数据库 并发控制(2)死锁和意向锁_旅僧的博客-CSDN博客 同一个对象不能既有slock又有xlock; 冲突可串行化和锁 怎么判断是否可以进行冲突可串行化:简便的方法是优先图 只有不同对象和同一对象都是读才不能发生非串行化调…...

一文说透:低代码开发平台和零代码平台区别是什么?

低代码开发平台和零代码平台区别是什么? 一个简单的例子就可以解释清楚。 假设你想入住一套新房,回看住房变迁史: 最原始方式是:自己建造往后一点,交付“毛坯房”:开发商统一建小区,不需要自…...

4.将图神经网络应用于大规模图数据(Cluster-GCN)

到目前为止,我们已经为节点分类任务单独以全批方式训练了图神经网络。特别是,这意味着每个节点的隐藏表示都是并行计算的,并且可以在下一层中重复使用。 然而,一旦我们想在更大的图上操作,由于内存消耗爆炸&#xff0c…...

pymongo更新数据

使用 PyMongo,可以通过以下步骤将查询到的记录进行更新: 下面是一个简单的示例代码片段,展示如何向名为users的集合中的所有文档添加一个新字段age。 import pymongo # 连接 MongoDB client pymongo.MongoClient("mongodb://localh…...

手机软件测试规范(含具体用例)

菜单基本功能测试规范一、短消息功能测试规范测试选项操作方法观察与判断结果创建、编辑短消息并发送书写短消息1、分别使用菜单或快捷方式进入书写短消息是否有异常; 2、输入0个字符,选择、输入号码发送,应成功; 3、输入1个中文…...

mysql having的用法

having的用法 having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些函数生存。 SQ…...

大数据需要学习哪些内容?

大数据技术的体系庞大且复杂,每年都会涌现出大量新的技术,目前大数据行业所涉及到的核心技术主要就是:数据采集、数据存储、数据清洗、数据查询分析和数据可视化。 Python 已成利器 在大数据领域中大放异彩 Python,成为职场人追求…...

【c++】static和const修饰类的成员变量或成员函数

目录 1、静态成员变量 2、静态成员函数 3、常函数 4、常对象 当我们使用c的关键字static修饰类中的成员变量和成员函数的时候,此时的成员变量和成员函数被称为静态成员。 静态成员包含: 静态成员变量静态成员函数 1、静态成员变量 静态成员变量有…...

DVWA-9.Weak Session IDs

大约 了解会话 ID 通常是在登录后以特定用户身份访问站点所需的唯一内容,如果能够计算或轻松猜测该会话 ID,则攻击者将有一种简单的方法来访问用户帐户,而无需暴力破解密码或查找其他漏洞,例如跨站点脚本。 目的 该模块使用四种…...

Bug序列——容器内给/root目录777权限后无法使用ssh免密登录

Linux——创建容器并将本地调试完全的前后端分离项目打包上传docker运行_北岭山脚鼠鼠的博客-CSDN博客 接着上一篇文章结尾出现403错误时通过赋予/root目录以777权限解决403错误。 chmod 777 /root 现在又出现新的问题,远程ssh无法免密登录了,即使通过…...

华为OD机试真题 JavaScript 实现【服务中心选址】【2023Q1 100分 】

一、题目描述 一个快递公司希望在一条街道建立新的服务中心。公司统计了该街道中所有区域在地图上的位置,并希望能够以此为依据为新的服务中心选址,使服务中心到所有区域的距离的总和最小。 给你一个数组 positions,其中 positions[i] [le…...

<Linux>《OpenSSH 客户端配置文件ssh_config详解》

《OpenSSH 客户端配置文件ssh_config详解》 1、 ssh获取配置数据顺序2、关键字2.1 Host2.2 Match2.3 AddKeysToAgent2.4 AddressFamily2.5 BatchMode2.6 BindAddress2.7 BindInterface2.8 CanonicalDomains2.9 CanonicalizeFallbackLocal2.10 CanonicalizeHostname2.11 Canonic…...

Linux内核中内存管理相关配置项的详细解析8

接前一篇文章:Linux内核中内存管理相关配置项的详细解析7 十一、Enable KSM for page merging 对应配置变量为:CONFIG_KSM。 此项只有选中和不选中两种状态,默认为选中。 内核源码详细解释为: Enable Kernel Samepage Merging:…...

深入浅出Vite:Vite打包与拆分

一、背景 在生产环境下,为了提高页面加载性能,构建工具一般将项目的代码打包(bundle)到一起,这样上线之后只需要请求少量的 JS 文件,大大减少 HTTP 请求。当然,Vite 也不例外,默认情况下 Vite 利用底层打包引擎 Rollup 来完成项目的模块打包。 某种意义上来说,对线上环…...

大数据ETL工具Kettle

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言最近公司在搞大数据数字化,有MES,CIM,WorkFlow等等N多的系统,不同的数据源DB,需要将这些不同的数据源DB里的数据进行整治统一…...

大学物理(上)-期末知识点结合习题复习(4)——质点运动学-动能定理 力做功 保守力与非保守力 势能 机械能守恒定律 完全弹性碰撞

目录 1.力做功 恒力作用下的功 变力的功 2.动能定理 3.保守力与非保守力 4.势能 引力的功与弹力的功 引力势能与弹性势能 5.保守力做功与势能的关系 6.机械能守恒定律 7.完全弹性碰撞 题1 题目描述 题解 题2 题目描述 题解 1.力做功 物体在力作用下移动做功…...

这两个小众的资源搜索工具其实很好用

01 小不点搜索是一个中国网络技术公司开发的网盘搜索引擎,该网站通过与多个主流网盘进行整合,为用户提供一种快速查找和下载文件的方式。小不点搜索因其高效性、便利性和实用性受到了广大用户的喜爱。 在技术实现上,小不点搜索拥有先进的搜…...

地方门户网站建设/一键免费创建论坛网站

第一次正式学习Java的Lambda编程,感觉并不陌生,在Spotfire,PL/SQL, C语言、Excel等很多地方都用过函数式编程。 Summary Section 17.1 Introduction • Prior to Java SE 8, Java supported three programming paradigms—procedural programming, objec…...

寿光市建设局网站/合肥网站维护公司

各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题…...

网站开发所得税/爱战网官网

题目链接 链接&#xff1a;https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1、暴力枚举所有的情况&#xff0c;时间复杂度O(n^2*m^2)&#xff0c;实际耗时759 ms class Solution { public:int maxSumSubmatrix(vector<ve…...

网站建设怎样接业务/市场推广

W3cplus有关于CSS3的教程在国内来说算是比较多&#xff0c;也比较全的了&#xff0c;有理论介绍&#xff0c;也有实例分析。但有关于质感这种细节上的分析文章还没有写过。由于自己的美感较差&#xff0c;也不敢班门弄斧&#xff0c;恐怕误人子弟。今天由好友99客串W3cplus&…...

excel网站做链接/app宣传推广方案

[iOS]获取工程代码总量 昨天公司让填申请软件著作权的资料&#xff0c;需要知道代码总量&#xff0c;于是找了方法这里备注一下。 1.打开"终端"用cd命令切换工作目录 cd 拖入工程中指定的某个文件夹 2.执行指令 返回代码总量的同时还会返回目录下各文件的代码…...

wordpress文章页多个产品图/深圳seo关键词优化

不走索引的其它原因&#xff1a;    1、建立组合索引&#xff0c;但查询谓词并未使用组合索引的第一列&#xff0c;此处有一个INDEX SKIP SCAN概念。    2、在包含有null值的table列上建立索引&#xff0c;当时使用select count(*) from table时不会使用索引。    …...