解析进程 /proc/pid/maps 和 /proc/pid/smaps
目录
/proc//maps
背景
具体描述
代码实现
实践
/proc/pid/smaps
smaps各子项详解
代码实现
代码调用的路径如下:
小结
/proc/<pid>/maps
背景
相对于/proc/meminfo和dumpsys meminfo可以看到系统整体的内存信息,我们还需要能够具体到每一个进程内存占用统计的信息。
在分析内存问题的时候,会经常依赖kernel的proc文件系统下各个进程的文件节点,从中获取当前进程的详细内存信息,今天就来简单介绍一下比较常用的一个节点/proc/pid/maps
Proc/pid/maps显示进程映射了的内存区域和访问权限。对应内核中的操作集为proc_pid_maps_op,具体的导出函数为:show_map
内核中进程的一段地址空间用一个vm_area_struct结构体表示,所有地址空间存储在 :struct task_struct -> struct mm_struct -> mmap链表中。
具体描述
如下为一个vm_area_struct结构体的描述,详解描述了一个虚拟内存区域的信息。
vm_area_struct
struct vm_area_struct {/* The first cache line has the info for VMA tree walking. */unsigned long vm_start; /* Our start address within vm_mm. */ //区域的首地址unsigned long vm_end; /* The first byte after our end address within vm_mm. */ //区域的尾地址/* linked list of VM areas per task, sorted by address *///该vma在一个进程的vma链表中的前驱vma和后驱vma指针,链表中的vma都是按地址来排序的struct vm_area_struct *vm_next, *vm_prev; //vma表,下一个vma;vma表,上一个vmastruct rb_node vm_rb; //红黑树中对应的节点/** Largest free memory gap in bytes to the left of this VMA.* Either between this VMA and vma->vm_prev, or between one of the* VMAs below us in the VMA rbtree and its ->vm_prev. This helps* get_unmapped_area find a free area of the right size.*/unsigned long rb_subtree_gap;/* Second cache line starts here. */struct mm_struct *vm_mm; /* The address space we belong to. */ // 所属的内存描述符,vma属于哪个mm_structpgprot_t vm_page_prot; /* Access permissions of this VMA. */ //vma的访问权限unsigned long vm_flags; /* Flags, see mm.h. */ /** For areas with an address space and backing store,* linkage into the address_space->i_mmap interval tree.** For private anonymous mappings, a pointer to a null terminated string* in the user process containing the name given to the vma, or NULL* if unnamed.*///shared联合体用于和address space关联union {struct {struct rb_node rb;unsigned long rb_subtree_last;} shared;const char __user *anon_name;};/** A file's MAP_PRIVATE vma can be in both i_mmap tree and anon_vma* list, after a COW of one of the file pages. A MAP_SHARED vma* can only be in the i_mmap tree. An anonymous MAP_PRIVATE, stack* or brk vma (with NULL file) can only be in an anon_vma list.*//*anno_vma_chain和annon_vma用于管理源自匿名映射的共享页*/struct list_head anon_vma_chain; /* Serialized by mmap_sem &* page_table_lock */ struct anon_vma *anon_vma; /* Serialized by page_table_lock */ //指向匿名域的指针/*该vma上的各种标准操作函数指针集*/const struct vm_operations_struct *vm_ops;/* Information about our backing store: */unsigned long vm_pgoff; /* 映射文件的偏移量,以PAGE_SIZE为单位 */struct file * vm_file; /* 映射的文件,没有则为NULL;可以通过这个区分匿名页和文件页*/void * vm_private_data; /* was vm_pte (shared mem) */#ifdef CONFIG_SWAPatomic_long_t swap_readahead_info;
#endif
#ifndef CONFIG_MMUstruct vm_region *vm_region; /* NOMMU mapping region */
#endif
#ifdef CONFIG_NUMAstruct mempolicy *vm_policy; /* NUMA policy for the VMA */
#endifstruct vm_userfaultfd_ctx vm_userfaultfd_ctx;
#ifdef CONFIG_SPECULATIVE_PAGE_FAULTseqcount_t vm_sequence;atomic_t vm_ref_count; /* see vma_get(), vma_put() */
#endifANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);ANDROID_VENDOR_DATA(1);
} __randomize_layout;
下表为每一个用vm_area_struct描述的内存区域的具体信息,表格第一列的字段对应上面vm_area_struct结构体内部的一些成员。
vm_start | “-”前一列,如00377000 | 此段虚拟地址空间起始地址 |
vm_pgoff | 第四列,如00000000 | 对有名映射,表示此段虚拟内存起始地址在文件中以页为单位的偏移。对匿名映射,它等于0或者vm_start/PAGE_SIZE |
vm_flags | 第三列,如r-xp | 此段虚拟地址空间的属性。每种属性用一个字段表示,r表示可读,w表示可写,x表示可执行,p和s共用一个字段,互斥关系,p表示私有段,s表示共享段,如果没有相应权限,则用’-’代替 |
vm_file->f_dentry->d_inode->i_sb->s_dev | 第五列,如fd:00 | 映射文件所属设备号。对匿名映射来说,因为没有文件在磁盘上,所以没有设备号,始终为00:00。对有名映射来说,是映射的文件所在设备的设备号 |
vm_file->f_dentry->d_inode->i_ino | 第六列,如9176473 | 映射文件所属节点号。对匿名映射来说,因为没有文件在磁盘上,所以没有节点号,始终为00:00。对有名映射来说,是映射的文件的节点号 |
vm_end | “-”后一列,如00390000 | 此段虚拟地址空间结束地址 |
第七列,如/system/bin/init | 对有名来说,是映射的文件名。对匿名映射来说,是此段虚拟内存在进程中的角色。[stack]表示在进程中作为栈使用,[heap]表示堆。其余情况则无显示 |
具体的/proc/pid/maps文件实例:
vm_start -vm_end vm_flags vm_pgoff f_entry 映射的文件名/虚拟内存的作用
5567882000-55678b2000 r--p 00000000 fd:06 564 /system/bin/init
55678b2000-556797b000 r-xp 00030000 fd:06 564 /system/bin/init
556797b000-556797f000 r--p 000f9000 fd:06 564 /system/bin/init
556797f000-5567980000 rw-p 000fc000 fd:06 564 /system/bin/init
5567980000-5567981000 rw-p 00000000 00:00 0 [heap] //映射到堆
7f14800000-7f14c00000 rw-p 00000000 00:00 0 [anon:libc_malloc]
7f14d22000-7f14d24000 rw-p 00000000 00:00 0
7f14d24000-7f15d22000 ---p 00000000 00:00 0
7f15d22000-7f15d23000 ---p 00000000 00:00 0
7f15d23000-7f15e1f000 rw-p 00000000 00:00 0 [anon:stack_and_tls:508]
7f15e1f000-7f15e20000 ---p 00000000 00:00 0
7f15e20000-7f15e40000 rw-s 00000000 00:12 9778 /dev/__properties__/properties_serial
7f15e40000-7f15e60000 rw-s 00000000 00:12 9777 /dev/__properties__/u:object_r:wifi_prop:s0
7f15e60000-7f15e80000 rw-s 00000000 00:12 9776 /dev/__properties__/u:object_r:wifi_log_prop:s0
7f15e80000-7f15ea0000 rw-s 00000000 00:12 9775 /dev/__properties__/u:object_r:vold_prop:s0
7f15ea0000-7f15ec0000 rw-s 00000000 00:12 9774 /dev/__properties__/u:object_r:vndk_prop:s0
7f15ec0000-7f15ee0000 rw-s 00000000 00:12 9773 /dev/__properties__/u:object_r:virtual_ab_prop:s0
7f15ee0000-7f15f00000 rw-s 00000000 00:12 9772 /dev/__properties__/u:object_r:vendor_zygote_disable_gl_preload:s0
7f15f00000-7f15f20000 rw-s 00000000 00:12 9771 /dev/__properties__/u:object_r:vendor_wifienhancelog_prop:s0
7f15f20000-7f15f40000 rw-s 00000000 00:12 9770 /dev/__properties__/u:object_r:vendor_touchfeature_prop:s0
7f15f40000-7f15f60000 rw-s 00000000 00:12 9769 /dev/__properties__/u:object_r:vendor_thermal_normal_prop:s0
7f15f60000-7f15f80000 rw-s 00000000 00:12 9768 /dev/__properties__/u:object_r:vendor_socket_hook_prop:s0
7f15f80000-7f15fa0000 rw-s 00000000 00:12 9767 /dev/__properties__/u:object_r:vendor_slad_prop:s0
7f15fa0000-7f15fc0000 rw-s 00000000 00:12 9766 /dev/__properties__/u:object_r:vendor_security_patch_level_prop:s0
7f15fc0000-7f15fe0000 rw-s 00000000 00:12 9765 /dev/__properties__/u:object_r:vendor_ro_audio_prop:s0
7f15fe0000-7f16000000 rw-s 00000000 00:12 9764 /dev/__properties__/u:object_r:vendor_payment_security_prop:s0
7f16000000-7f16020000 rw-s 00000000 00:12 9763 /dev/__properties__/u:object_r:vendor_panel_info_prop:s0
7f16020000-7f16040000 rw-s 00000000 00:12 9762 /dev/__properties__/u:object_r:vendor_mtkcam_prop:s0
代码实现
///proc/pid/maps节点的操作集;seq_operations序列操作
static const struct seq_operations proc_pid_maps_op = {.start = m_start,.next = m_next,.stop = m_stop,.show = show_map
};
show_map()
| |->show_map_vma()
| | |->file_inode()
| | |->show_vma_header_prefix()
| | | |->seq_file操作,遍历VMA的信息
| | |->arch_vma_name()
实践
编写能够可视化maps文件的工具
https://www.cnblogs.com/arnoldlu/p/10272466.html
/proc/pid/smaps
/proc/PID/smaps 文件是基于 /proc/PID/maps 的扩展,他展示了一个进程的内存消耗,比同一目录下的maps文件更为详细。
smaps文件能够将maps文件中展示的所有vma内存区都进行详细统计,输出更为详细的数据;
在maps文件中,只会输出每一个vma内存区域的起始/结束地址,属性,偏移量,主从设备号以及映射问文件等等,如下所示
5567882000-55678b2000 r--p 00000000 fd:06 564 /system/bin/init
55678b2000-556797b000 r-xp 00030000 fd:06 564 /system/bin/init
556797b000-556797f000 r--p 000f9000 fd:06 564 /system/bin/init
556797f000-5567980000 rw-p 000fc000 fd:06 564 /system/bin/init
5567980000-5567981000 rw-p 00000000 00:00 0 [heap]
7f14800000-7f14c00000 rw-p 00000000 00:00 0 [anon:libc_malloc]
7f14d22000-7f14d24000 rw-p 00000000 00:00 0
7f14d24000-7f15d22000 ---p 00000000 00:00 0
7f15d22000-7f15d23000 ---p 00000000 00:00 0
7f15d23000-7f15e1f000 rw-p 00000000 00:00 0 [anon:stack_and_tls:508]
7f15e1f000-7f15e20000 ---p 00000000 00:00 0
7f15e20000-7f15e40000 rw-s 00000000 00:12 9778 /dev/__properties__/properties_serial
7f15e40000-7f15e60000 rw-s 00000000 00:12 9777 /dev/__properties__/u:object_r:wifi_prop:s0
7f15e60000-7f15e80000 rw-s 00000000 00:12 9776 /dev/__properties__/u:object_r:wifi_log_prop:s0
7f15e80000-7f15ea0000 rw-s 00000000 00:12 9775 /dev/__properties__/u:object_r:vold_prop:s0
7f15ea0000-7f15ec0000 rw-s 00000000 00:12 9774 /dev/__properties__/u:object_r:vndk_prop:s0
7f15ec0000-7f15ee0000 rw-s 00000000 00:12 9773 /dev/__properties__/u:object_r:virtual_ab_prop:s0
7f15ee0000-7f15f00000 rw-s 00000000 00:12 9772 /dev/__properties__/u:object_r:vendor_zygote_disable_gl_preload:s0
7f15f00000-7f15f20000 rw-s 00000000 00:12 9771 /dev/__properties__/u:object_r:vendor_wifienhancelog_prop:s0
但是smaps文件能够给每一个vma内存区域进行统计,在maps的基础上进行集成统计,显示的信息更加详细和直观
5567882000-55678b2000 r--p 00000000 fd:06 564 /system/bin/init //对应maps中的第一个vma内存区域
Size: 192 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 64 kB
Pss: 42 kB
Shared_Clean: 44 kB
Shared_Dirty: 0 kB
Private_Clean: 20 kB
Private_Dirty: 0 kB
Referenced: 64 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
VmFlags: rd mr mw me dw
55678b2000-556797b000 r-xp 00030000 fd:06 564 /system/bin/init //对于maps文件中的第二个vma内存区域
Size: 804 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 356 kB
Pss: 261 kB
Shared_Clean: 148 kB
Shared_Dirty: 0 kB
Private_Clean: 208 kB
Private_Dirty: 0 kB
Referenced: 356 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
VmFlags: rd ex mr mw me dw
smaps各子项详解
2.1 Size:虚拟内存空间大小。但是这个内存值不一定是物理内存实际分配的大小,因为在用户态上,虚拟内存总是延迟分配的。这个值计算也非常简单,就是该VMA的开始位置减结束位置。
延迟分配就是当进程申请内存的时候,Linux会给他先分配页,但是并不会区建立页与页框的映射关系,意思就是说并不会分配物理内存,而当真正使用的时候,就会产生一个缺页异常,硬件跳转page fault处理程序执行,在其中分配物理内存,然后修改页表(创建页表项)。异 常处理完毕,返回程序用户态,继续执行。
2.2 Rss:是实际分配的内存,这部分物理内存已经分配,不需要缺页中断就可以使用的。
这里有一个公式计算Rss:Rss=Shared_Clean+Shared_Dirty+Private_Clean+Private_Dirty
share/private:该页面是共享还是私有。
dirty/clean:该页面是否被修改过,如果修改过(dirty),在页面被淘汰的时候,就会把该脏页面回写到交换分区(换出,swap out)。有一个标志位用于表示页面是否dirty。
share/private_dirty/clean 计算逻辑:
查看该page的引用数,如果引用>1,则归为shared,如果是1,则归为private,同时也查看该page的flag,是否标记为_PAGE_DIRTY,如果不是,则认为干净的。
2.3 Pss(proportional set size):是平摊计算后的实际物理使用内存(有些内存会和其他进程共享,例如mmap进来的)。实际上包含下面private_clean+private_dirty,和按比例均分的shared_clean、shared_dirty。
举个计算Pss的例子:
如果进程A有x个private_clean页面,有y个private_dirty页面,有z个shared_clean仅和进程B共享,有h个shared_dirty页面和进程B、C共享。那么进程A的Pss为:x + y + z/2 + h/3
2.4 Referenced:当前页面被标记为已引用或者包含匿名映射(The amount of memory currently marked as referenced or a mapping associated with a file may contain anonymous pages)。
在Linux内存管理的页面替换算法里讲过,当某个页面被访问后,Referenced标志被设置,如果该标志设置了,就 不能将该页移出。
2.5 Anonymous:匿名映射的物理内存,这部分内存不来自于文件的内存大小。
2.6 ShmemPmdMapped:PMD页面已经被映射的共享(shmem / tmpfs)内存量。在官方文档中,这样解释:"ShmemPmdMapped" shows the ammount of shared (shmem/tmpfs) memory backed by huge pages.
2.7 Shared/Private_Hugetlb:由hugetlbfs页面支持的内存使用量,由于历史原因,该页面未计入“ RSS”或“ PSS”字段中。 并且这些没有包含在Shared/Private_Clean/Dirty 字段中。
2.8 Swap:存在于交换分区的数据大小(如果物理内存有限,可能存在一部分在主存一部分在交换分区)
2.9 SwapPss:这个我并没有找到对应解释,但从源码可以得知,计算逻辑就跟pss一样,只不过针对的是交换分区的内存。
2.10 KernelPageSize:内核一页的大小
2.11 MMUPageSize:MMU页大小,大多数情况下,和KernelPageSize大小一样。
2.12 Locked:常驻物理内存的大小,这些页不会被换出。相当于被锁住在物理内存中
2.13 THPeligible:映射是否符合分配THP的条件。如果为true,则为1,否则为0。 它仅显示当前状态。
THP,透明大页(Transparent Huge Pages),RHEL 6 开始引入,目的是使用更大的内存页面(memory page size) 以适应越来越大的系统内存,让操作系统可以支持现代硬件架构的大页面容量功能。与标准大页的区别在于分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。
2.14 VmFlags:表示与特定虚拟内存区域关联的内核标志。
VmFlags
//VmFlags标志详解
rd - readable
wr - writeable
ex - executable
sh - shared
mr - may read
mw - may write
me - may execute
ms - may share
gd - stack segment growns down
pf - pure PFN range
dw - disabled write to the mapped file
lo - pages are locked in memory
io - memory mapped I/O area
sr - sequential read advise provided
rr - random read advise provided
dc - do not copy area on fork
de - do not expand area on remapping
ac - area is accountable
nr - swap space is not reserved for the area
ht - area uses huge tlb pages
ar - architecture specific flag
dd - do not include area into core dump
sd - soft-dirty flag
mm - mixed map area
hg - huge page advise flag
nh - no-huge page advise flag
mg - mergable advise flag
代码实现
5567882000-55678b2000 r--p 00000000 fd:06 564 /system/bin/init //----------------------------------------------show_map_vma()//----------------------------------------------__show_smap()
Size: 192 kB
KernelPageSize: 4 kB
MMUPageSize: 4 kB
Rss: 64 kB
Pss: 42 kB
Shared_Clean: 44 kB
Shared_Dirty: 0 kB
Private_Clean: 20 kB
Private_Dirty: 0 kB
Referenced: 64 kB
Anonymous: 0 kB
LazyFree: 0 kB
AnonHugePages: 0 kB
ShmemPmdMapped: 0 kB
Shared_Hugetlb: 0 kB
Private_Hugetlb: 0 kB
Swap: 0 kB
SwapPss: 0 kB
Locked: 0 kB
VmFlags: rd mr mw me dw //---------------------------------------------show_smap_vma_flags()
代码调用的路径如下:
show_smap()|->smap_gather_stats //最重要的获取信息渠道,遍历vma下的所有page,并且找到他们的物理页,判断属于什么页| |->mss->swap += shmem_swapped;| |->walk_page_vma| | |->walk_p4d_range ->| | | |->walk_pud_range ->| | | | |->walk_pmd_range -> //因为这里只设置了pmd的回调,所以只会执行到 walk->pmd_entry(pmd, addr, next, walk);不会执行到pte_entry()| | | | | ->walk_pte_range -> pte_entry()|->show_map_vma| |->vma_get_anon_name|->__show_smap|->show_smap_vma_flags
小结
后续总结更多代码实现细节。
相关文章:

解析进程 /proc/pid/maps 和 /proc/pid/smaps
目录 /proc//maps 背景 具体描述 代码实现 实践 /proc/pid/smaps smaps各子项详解 代码实现 代码调用的路径如下: 小结 /proc/<pid>/maps 背景 相对于/proc/meminfo和dumpsys meminfo可以看到系统整体的内存信息,我们还需要能够具体到…...

【MQ】消息队列概述
📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 定义 消息队列:一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件,很多初学者认为,MQ通过消息的发送…...

交友盲盒系统PHP开源的盲盒源码
源码介绍: 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统,旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性,可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明: PHP版本&…...

【Flutter 面试题】什么是异步编程 Flutter中如何处理异步操作?
【Flutter 面试题】什么是异步编程 Flutter中如何处理异步操作? 文章目录 写在前面解答补充说明从网络API异步获取数据并解析 写在前面 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主&#x…...

处理error: remote origin already exists.及其Gitee文件上传保姆级教程
解决error: remote origin already exists.: 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin (HTTPS) 比如这样: 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…...

网络编程套接字(2)——Socket套接字
目录 一、概念 二、分类 1、流套接字(使用传输层TCP协议) TCP的特点 2、数据报套接字(使用传输层UDP协议) UDP的特点 3、原始套接字 一、概念 Socket套接字,是由系统提供用于网络通信的技术,是基于T…...

向量错题本
《1800》 1 看变换求和能不能成为0,为0,就是线性相关 2 矩阵等价 3 4<...

FPGA-VGA成像原理与时序
什么是VGA: VGA, Video Graphics Array。即视频图形阵列,具有分辨率高、显示速率快、颜色丰富等优点。VGA接口不但是CRT显示设备的标准接口,同样也是LCD液晶显示设备的标准接口,具有广泛的应用范围。在FGPA中,常广泛用于图像处理等领域。 VGA 显示器成像原理 在 VGA 标准刚兴…...

【VTKExamples::Points】第三期 ExtractClusters
很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例ExtractClusters,并解析接口vtkEuclideanClusterExtraction,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我…...

迅速上手:CentOS 系统下 SSH 服务配置指南
前言 掌握 SSH 服务,就像拥有了一把解锁网络世界的钥匙。本文深入浅出地介绍了如何使用 SSH(Secure Shell)服务,从连接远程服务器到安全文件传输,让你轻松驾驭远程管理与数据传输,提高工作效率,…...

day38 动态规划part1
509. 斐波那契数 简单 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) 0,F(1) 1 F(n) F(n - 1) F(n - 2),…...

01背包问题 刷题笔记
思路 dp 用f[i][j]来表示当体积为j时 考虑前i件物品可以获得的 最大值 记住f[i][j]本身是个价“价值” 考虑两种状态 是否将第i件物品放入背包里面 将背包的体积从小到大递增来进行考虑 首先 考虑条件 如果当前增加的体积放不下下一件物品 则该体积 可以获得的最大值可以直接…...

docker安装包(Linux和windows)
Linux——docker-20.10.9.tgz 网盘地址:链接:https://pan.baidu.com/s/1T3qfVZ-uT-vMAo8w6heTMw 提取码:qu85 windows——docker19.03.1 链接:https://pan.baidu.com/s/1mK6hqhkGCBs6tdBHJxrdPw 提取码:4dkj...

RabbitMQ 安装使用
文章目录 RabbitMQ 安装使用安装下载 Erlang下载 RabbitMQ 的服务安装好后看是否有 RabbitMQ 的服务开启管理 UIRabbitMQ 端口使用一览图 使用输出最简单的 Hello World!生产者定义消费者消费消息小拓展 RabbitMQ 安装使用 安装 下载 Erlang RabbitMQ 是用这个语…...

echarts x轴名称过长tip显示全称
xAxis的axisLabel的内容如下: axisLabel: { rotate: -45, color: document.body.className.indexOf(custom-f4c46d) > -1 ? #fff : #343434, // 显示省略号操作(第一步) formatter: function (value) { var val if (value.length >…...

js和css阻塞问题
面试常见问题 css 加载会不会阻塞 js 的加载?(不会)css 加载会不会阻塞 js 的执行?(会)css 加载会不会阻塞 DOM 的解析?(不会)css 加载会不会阻塞 DOM 的渲染࿱…...

MySQL 的基础操作
数据库的基础操作 1. 库操作2. 表的操作3. 数据类型 数据库是现代应用程序中至关重要的组成部分,通过数据库管理系统(DBMS)存储和管理数据。 1. 库操作 创建数据库 创建数据库是开始使用数据库的第一步。下面是一些常见的创建数据库的示例&a…...

【python进阶篇】面向对象编程(1)
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定…...

力扣面试经典150 —— 6-10题
力扣面试经典150题在 VScode 中安装 LeetCode 插件即可使用 VScode 刷题,安装 Debug LeetCode 插件可以免费 debug本文使用 python 语言解题,文中 “数组” 通常指 python 列表;文中 “指针” 通常指 python 列表索引 文章目录 6. [中等] 轮转…...

[密码学]入门篇——加密方式
一、概述 加密方法主要分为两大类: 单钥加密(private key cryptography):加密和解密过程都用同一套密码双钥加密(public key cryptography):加密和解密过程用的是两套密码 历史上,…...

构建前后端分离项目常用的代码
构建前后端分离项目常用的代码 1.代码生成器 import com.baomidou.mybatisplus.generator.FastAutoGenerator;import com.baomidou.mybatisplus.generator.config.OutputFile;import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;import java.util.…...

2575. 找出字符串的可整除数组(Go语言)
https://leetcode.cn/problems/find-the-divisibility-array-of-a-string/ 在看题解之前,我的代码是以下这样: package mainimport ("fmt" )func main() {fmt.Println(divisibilityArray("998244353", 3)) }func divisibilityArray…...

Redis与 Memcache区别
Redis与 Memcache区别 1 , Redis 和 Memcache 都是将数据存放在内存中,都是内存数据库。不过 Memcache 还可用于缓存 其他东西,例如图片、视频等等。 2 , Memcache 仅支持key-value结构的数据类型,Redis不仅仅支持简单的key-value类型的数据&…...

#QT(智能家居界面-界面切换)
1.IDE:QTCreator 2.实验 3.记录 (1)创建一个新界面(UI界面) (2)可以看到新加入一个ui文件,双击打开,设置窗口大小与登录界面一致 (3)加入几个PUS…...

js拓展-内置对象
目录 1. 数组对象 1.1 数组的四种方式 1.2 JS中数组的特点 1.3 常用方法 2. 日期对象 2.1 日期对象的创建 2.2 日期对象的方法 2.3 案例:输出现在的时间 3. 全局对象 3.1 字符串转换成数字类型 3.2 编码解码函数 1. 数组对象 注:数组在JS中是一…...

【李沐精读系列】GPT、GPT-2和GPT-3论文精读
论文: GPT:Improving Language Understanding by Generative Pre-Training GTP-2:Language Models are Unsupervised Multitask Learners GPT-3:Language Models are Few-Shot Learners 参考:GPT、GPT-2、GPT-3论文精读…...

Libevent的使用及reactor模型
Libevent 是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,不如 ACE 那么臃肿庞大;源代码相当精炼、易读…...

查看Linux服务器配置
# chkconfig --list # 列出所有系统服务 # chkconfig --list | grep on # 列出所有启动的系统服务 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置 # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连…...

【机器学习】包裹式特征选择之递归特征添加法
🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...

解决cs不能生成Linux木马的问题
要解决的问题:众所周知,msf上面的shell或者是其他的shell想反弹给cs默认情况下是只支持windows的,因为cs的监听模块默认没有linux的,但是有些主机就是用linux搭建的,这可怎么办呢。就要用到一个插件CrossC2。 下载插件…...