菜鸡面试遇到有印象的问题(LINUX下内核如何管理内存)

2023-11-18

目录

写在文章的前面---本人C/C++面试岗位,学艺不精,研究生做的与代码无关的工作,仅记录每次面试遇到的问题勉励自己!

一、x86下的物理地址空间布局

二、linux虚拟地址内核空间分布

         三、linux虚拟地址用户空间分布

         1.page(页)

2.zone(区)

3.获得页

4. slab机制


参考:https://www.cnblogs.com/vinozly/p/5618451.html

写在文章的前面---本人C/C++面试岗位,学艺不精,研究生做的与代码无关的工作,仅记录每次面试遇到的问题勉励自己!

  • LINUX下内核如何管理内存

、x86下的物理地址空间布局

物理地址空间的顶部以下一段空间,被PCI设备的I/O内存映射占据,它们的大小和布局由PCI规范所决定。640K~1M这段地址空间被BIOS和VGA适配器所占据。Linux系统在初始化时,会根据实际的物理内存的大小,为每个物理页面创建一个page对象,所有的page对象构成一个mem_map数组。进一步,针对不同的用途,Linux内核将所有的物理页面划分到3类内存管理区中,如图,分别为ZONE_DMA,ZONE_NORMAL,ZONE_HIGHMEM。

  • ZONE_DMA(直接访问内存的区域)的范围是0~16M,该区域的物理页面专门供I/O设备的DMA使用。之所以需要单独管理DMA的物理页面,是因为DMA使用物理地址访问内存,不经过MMU,并且需要连续的缓冲区,所以为了能够提供物理上连续的缓冲区,必须从物理地址空间专门划分一段区域用于DMA。
  • ZONE_NORMAL的范围是16M~896M,该区域的物理页面是内核能够直接使用的。
  • ZONE_HIGHMEM的范围是896M~结束,该区域即为高端内存,内核不能直接使用。

二、linux虚拟地址内核空间分布

在kernel image下面有16M的内核空间用于DMA操作。位于内核空间高端的128M地址主要由3部分组成,分别为vmalloc area,持久化内核映射区,临时内核映射区。

由于ZONE_NORMAL和内核线性空间存在直接映射关系所以内核会将频繁使用的数据如kernel代码、GDT、IDT、PGD、mem_map数组等放在ZONE_NORMAL里而将用户数据、页表(PT)等不常用数据放在ZONE_ HIGHMEM里,只在要访问这些数据时才建立映射关系(kmap())。比如,当内核要访问I/O设备存储空间时,就使用ioremap()将位于物理地址高端的mmio区内存映射到内核空间的vmalloc area中,在使用完之后便断开映射关系。

三、linux虚拟地址用户空间分布

用户进程的代码区一般从虚拟地址空间的0x08048000开始,这是为了便于检查空指针。代码区之上便是数据区,未初始化数据区,堆区,栈区,以及参数、全局环境变量。

1.page(页)

内核把物理页作为内存管理的基本单位,尽管处理器的最小可寻址单位通常为字,但是,内存管理单元(MMU,管理内存并把虚拟地址转换为物理地址的硬件)通常以页为单位进行处理,故从虚拟内存的角度来看,页就是最小单位

struct page{
        unsigned long    flags;//页的状态:脏,锁定等等32中状态
        atomic_t        _counts;//页的被引用计数,-1说明没有使用,可以在新的分配中使用
        atomic_t        _mapcount;
        unsigned long    private;
        struct address_space    *mapping;
        pgoff_t        index;
        struct list_head     lru;
        void            *virtual;//页的虚拟地址,除开高端内存(高端内存为null),基本上就是页在虚拟内存中的地址。
}

需要注意的是:该结构对页的描述是短暂的,内核仅仅用这个数据结构来描述当前时刻在相关的物理页中存放的东西因为内核需要知道一个页是否空闲,如果被分配了是谁拥有的。拥有者可能是用户空间进程、动态分配的内核数据、静态内核代码、页高速缓存等。

2.zone(区)

由于硬件的限制,内核不能对所有的页一视同仁。有些页位于内存页特定的物理地址所以不能将其用于一些特定的任务。所以内核把页分为不同的区(zone)。因为LINUX必须处理如下的两个由于硬件缺陷而引起的寻址问题:

1. 一些硬件只能够用某些特定的内存地址来执行DMA(直接内存访问)

2.一些体系结构的内存的物理寻址范围比虚拟寻址范围大的多。这样,就有一些内存不能永久的映射到内核空间上。

ZONE_DMA:这个区包含的页能够用来执行DMA。

ZONE_NORMAL这个区包含的都是能够正常映射的页。

ZONE_HIGHMEM: 这个区包含“高端内存”,其中的页不能永久的映射到内核地址空间(若有体系内存能够被全部映射,那么ZONE_HIGHMEM为空)

struct zone{
        /*持有该区的最小值,最低和最高水位值。内核使用水位为每个内存区设置合适的内核消耗基准*/
        unsigned long     watermark[NR_WMARK];
        /*lock是自旋锁,防止该结构被并发访问,只保护结构不保护结构中的页*/
        spinlock_t        lock;
        /*表示这个区的名字:"DMA"、"Normal"、"HighMem"*/
        const char*       name;
        /*
        省略诸多变量及函数
        */
}

3.获得页

/*获得2的order的次方个连续的物理页,并返回一个指向第一个页的page的结构体*/
struct page *alloc_pages(gfp_t gfp_mask, unsigned int order)
void *page_adress(struct page *pages)//该函数可以把指定的page的结构体转化为它的逻辑地址

/*封装了alloc_pages函数,返回第一个物理页的逻辑地址*/
unsigned long __get_free_pages(gfp_t gfp_mask, unsigned int order)//如歌省略order函数则会分配一个页

/*释放页,必须只能释放自己的页,因为内核不存在纠错机制,错误的页地址可能会引起系统崩溃*/
void __free_pages(struct page *pages,unsigned int order)

/*kmalloc一次最多能申请的内存大小由include/linux/Kmalloc_size.h的内容来决定*/
void *kmalloc(size_t size, gfp_t flags)
/*对内存区的请求不是很频繁,较高的内存访问时间也可以接受,这就可以分配一段线性连续,物理不连续的地址

带来的好处是一次可以分配较大块的内存。测试可以分配1G的空间*/
void *vmalloc(unsigned long size)

kmalloc()函数和vmalloc()函数的区别:

  • kmalloc()函数分配的内存是物理上连续的。
  • 而Vmalloc()函数分配的内存仅仅是虚拟地址连续的。 

正常内核编程通常使用kmalloc(),这主要是处于性能的考虑。

  1. vmalloc()将物理不连续的页转换为虚拟地址空间上连续的页,必须专门建立页表项,vmalloc()仅仅在当需要使用大块的内存的时候才会使用,典型的如模块被动态插入内核的时候
  2. 很多硬件设备需要的是物理地址连续的页,因为很多硬件设备存在于内存管理单元(MMU)之外。
  3. vmalloc()函数可能睡眠,不能在中断上下文使用,而kmalloc加GFP_ATOMIC可以保证用在不能睡眠的地方。

4. slab机制

在最高层是 cache_chain,这是一个 slab 缓存的链接列表。这对于 best-fit算法非常有用,可以用来查找最适合所需要的分配大小的缓存(遍历列表)。

cache_chain 的每个元素都是一个 kmem_cache 结构的引用(称为一个 cache)。它定义了一个要管理的给定大小的对象池。

每个缓存都包含了一个 slabs 列表,这是一段连续的内存块(通常都是页面)。存在3 种 slab:

1.slabs_full:完全分配的slab

2.slabs_partial:部分分配的slab。

3.slabs_empty:空slab,或者没有对象被分配。

slab 列表中的每个 slab都是一个连续的内存块(一个或多个连续页),它们被划分成一个个对象。这些对象是从特定缓存中进行分配和释放的基本元素。注意 slab 是 slab分配器进行操作的最小分配单位,因此如果需要对 slab 进行扩展,这也就是所扩展的最小值。通常来说,每个 slab 被分配为多个对象。由于对象是从 slab 中进行分配和释放的,因此单个 slab 可以在 slab列表之间进行移动。例如,当一个 slab中的所有对象都被使用完时,就从slabs_partial 列表中移动到 slabs_full 列表中。当一个 slab完全被分配并且有对象被释放后,就从 slabs_full 列表中移动到slabs_partial 列表中。当所有对象都被释放之后,就从 slabs_partial 列表移动到 slabs_empty 列表中。

struct kmem_cache {
    struct array_cache *array[NR_CPUS];//per_cpu数据,记录了本地高速缓存的信息,也是用于跟踪最近释放的对象,每次分配和释放都要直接访问它。
    unsigned int batchcount;//本地高速缓存转入和转出的大批数据数量
    unsigned int limit;//本地高速缓存中空闲对象的最大数目
    unsigned int shared;
 
    unsigned int buffer_size;/*buffer的大小,就是对象的大小*/
    u32 reciprocal_buffer_size;
 
    unsigned int flags;     /* constant flags */
    unsigned int num;       /* # of objs per slab *//*slab中有多少个对象*/
 
    /* order of pgs per slab (2^n) */
    unsigned int gfporder;/*指定了slab包含的页数目以2为底得对数*/
 
    gfp_t gfpflags;       /*与伙伴系统交互时所提供的分配标识*/  
 
    size_t colour;          /* cache colouring range *//*slab中的着色*/
    unsigned int colour_off;    /* colour offset */着色的偏移量
    struct kmem_cache *slabp_cache;
    unsigned int slab_size;              //slab管理区的大小
    unsigned int dflags;        /* dynamic flags */
 
    /* constructor func */
    void (*ctor)(void *obj);    /*构造函数*/
    const char *name;               /*缓存slab上的名字*/
    struct list_head next;         //用于将kmem_cache的所有实例保存在全局链表cache_chain上
#ifdef CONFIG_DEBUG_SLAB
/*
一些用于调试用的变量
*/
#endif /* CONFIG_DEBUG_SLAB */
    //用于组织该高速缓存中的slab
    struct kmem_list3 *nodelists[MAX_NUMNODES];/*最大的内存节点*/
 
};
 
/* Size description struct for general caches. */
struct cache_sizes {
    size_t          cs_size;
    struct kmem_cache   *cs_cachep;
#ifdef CONFIG_ZONE_DMA
    struct kmem_cache   *cs_dmacachep;
#endif
};
    struct kmem_list3 {
    /*三个链表中存的是一个高速缓存slab*/
    /*在这三个链表中存放的是cache*/
        struct list_head slabs_partial; //包含空闲对象和已经分配对象的slab描述符
        struct list_head slabs_full;//只包含非空闲的slab描述符
        struct list_head slabs_free;//只包含空闲的slab描述符
        unsigned long free_objects;  /*高速缓存中空闲对象的个数*/
        unsigned int free_limit;   //空闲对象的上限
        unsigned int colour_next;   /* Per-node cache coloring *//*即将要着色的下一个*/
        spinlock_t list_lock;
        struct array_cache *shared; /* shared per node */
        struct array_cache **alien; /* on other nodes */
        unsigned long next_reap;    /* updated without locking *//**/
        int free_touched;       /* updated without locking */
    };
    struct slab {
        struct list_head list;   //用于将slab连入keme_list3的链表
        unsigned long colouroff;   //该slab的着色偏移
        void *s_mem;        /* 指向slab中的第一个对象*/
        unsigned int inuse; /* num of objs active in slab */已经分配出去的对象
        kmem_bufctl_t free;       //下一个空闲对象的下标
        unsigned short nodeid;   //节点标识符
    };

建立新的kmem_cache:

/*name是一个字符串,存放kmem_cache缓存的名字;size是缓存所存放的对象的大小;align是slab内第一个对象的偏移;flag是可选的配置项,用来控制缓存的行为。最后一个参数ctor是对象的构造函数,一般是不需要的,以NULL来代替kmem_cache_create()成功执行之后会返回一个指向所创建的缓存的指针,否则返NULL。kmem_cache_create()可能会引起阻塞(睡眠),因此不能在中断上下文中使用。
*/

struct kmem_cache * kmem_cache_create( const char *name, size_t size, size_t align,
                   unsigned long flags, void (*ctor)(void*));

/*该函数成功则返回0,失败返回非零值。调用kmem_cache_destroy()之前应该满足下面几个条件:首先,cachep所指向的缓存中所有slab都为空闲,否则的话是不可以撤销的;其次在调用kmem_cache_destroy()过程中以及调用之后,调用者需要确保不会再访问这个缓存;最后,该函数也可能会引起阻塞,因此不能在中断上下文中使用。
*/
int kmem_cache_destroy( struct kmem_cache *cachep);

/*
可以通过下面函数来从kmem_cache中分配一个对象:
这个函数从cachep指定的缓存中返回一个指向对象的指针。如果缓存中所有slab都是满的,那么slab分配器会通过调用kmem_getpages()创建一个新的slab。
*/
void* kmem_cache_alloc(struct kmem_cache* cachep, gfp_t flags);

/*
这个函数是将被释放的对象返还给先前的slab,其实就是将cachep中的对象objp标记为空闲而已
*/
void kmem_cache_free(struct kmem_cache* cachep,  void* objp);

 

 

  • LINUX下进程和线程的同步方式
  • 继承的public,protected,private以及new出来的子类与没有new的子类里面的包含的基类函数的区别
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

菜鸡面试遇到有印象的问题(LINUX下内核如何管理内存) 的相关文章

  • Java设计模式-单例模式

    单例模式 在有些系统中 为了节省内存资源 保证数据内容的一致性 对某些类要求只能创建一个实例 这就是所谓的单例模式 单例模式的定义与特点 单例 Singleton 模式的定义 指一个类只有一个实例 且该类能自行创建这个实例的一种模式 例如
  • MySQL之事务与引擎

    目录 一 事物 1 事务的概念 2 事务的ACID特点 3 事务之间的相互影响 4 Mysql及事务隔离级别 四种 1 查询会话事务隔离级别 2 查询会话事务隔离级别 3 设置全局事务隔离级别 4 设置会话事务隔离级别 5 事务控制语句 6
  • ssm+mysql+小程序+ssm智慧社区管理系统 毕业设计源码101635

    基于SSM的智慧社区管理小程序 摘 要 随着互联网大趋势的到来 社会的方方面面 各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去 而其中最好的方式就是建立网络管理系统 并对其进行信息管理 由于现在网络的发达 社区管理通过网
  • Vue JeecgBoot 下拉选使用数据字典,设置默认值,默认选中第一个值 - 附完整示例

    效果 一 使用步骤 1 导入依赖文件 import initDictOptions filterDictText from components dict JDictSelectUtil 2 声明变量 data return dataVal
  • 巧妙利用unbuffer实时写入

    大家好 我是早九晚十二 目前是做运维相关的工作 写博客是为了积累 希望大家一起进步 我的主页 早九晚十二 场景描述 我们常常在写脚本时 会涉及到一些比较耗时的操作 当要输出日志时 没办法实时获取命令的进度 进而不好判断脚本的流程 这时 就引
  • C# 画坐标,graphics,C# 坐标自定义X轴、Y轴

    先看效果 其中X轴 Y轴都是可以自定义的 可以从零开始 也可以从任意位置开始 看坐标的画法 下面通过五个函数 来分别说明 注意这里坐标的定位是通过外层的Panel来实现的 using System using System Collecti
  • 强化学习中 on-policy与off-policy 的理解;如何区分on-policy 与 off-policy;RL更新策略、policy结构总结

    目录 基本概念 Q learning VS Sarsa DQN VS PPO 区分on policy 与 off policy 一些总结 基本概念 如果要学习的 agent 跟和环境互动的 agent 是同一个的话 这个叫做on polic
  • Linux 查看磁盘容量情况

    查看整体的磁盘容量 df h 详细的磁盘占用情况 du max depth 1 h h是用来把容量显示成易看的方式 max depth 查看的文件的最大深度 进查询某个文件夹的容量 du sh s 和 max depth 0等效
  • 等保2.0介绍

    等保2 0全称网络安全等级保护2 0制度 是我国网络安全领域的基本国策 基本制度 等级保护标准在1 0时代标准的基础上 注重主动防御 从被动防御到事前 事中 事后全流程的安全可信 动态感知和全面审计 实现了对传统信息系统 基础信息网络 云计
  • Jenkins以root用户运行

    Jenkins安装完成后默认会创建一个jenkins的用户 并以jenkins用户运行 在我们通过jenkins编写一些命令的时候容易出现权限不足的提示 permision denied 通过为jenkins工作区赋予777的权限以后 也可
  • 图像处理——边缘检测

    边缘检测 一 边缘检测的目的 二 边缘检测算子有哪些 三 Canny算子 3 1 简述Canny算子 3 2 简述下Canny的计算过程 四 sobel算子 4 1 简述一下sobel算子 五 深度学习下的边缘检测 5 1 HED 整体嵌套
  • opencv-基于颜色的目标检测(含代码)

    先推荐下自己的公众号 Joe学习笔记 公众号上会不定期更新一些文章 主要是自己平时学到的知识 内容包括自动驾驶 计算机视觉 人工智能和机器人技术 我会第一时间把文章更新在公众号上 欢迎大家订阅和分享 文章是从公众号搬过来的 邀请朋友在公众号
  • 带你三分钟了解算力

    导读 数字经济时代 算力是新生产力 是支撑数字经济发展的坚实基础 加快发展算力 是我国打造数字经济新优势 构建 双循环 新发展格局 提升国家整体竞争力的重要保障 一 何为算力 算力是设备通过处理数据 实现特定结果输出的计算能力 常用FLOP
  • abp去掉AbpUser中的Name,Surname

    abp是国外的框架 默认的框架中的AbpUser表中的Name和Surname是分开的 这不符合国情 可以先去掉 1 在User类中重写Name和Surname 并设置为私有 2 在DbContext类中 重写OnModelCreating
  • 使用ThreadPoolTaskExecutor解决高并发性的问题

    ThreadPoolTaskExecutor 使用ThreadPoolTaskExecutor解决高并发性的问题 1 创建一个ThreadPoolTaskExecutor 2 往线程里面添加FutureTask对象 3 然后等待Future
  • VMware虚拟机扩容 磁盘分配过慢 直接添加物理磁盘 挂载ntfs mount: unknown filesystem type ‘ntfs’解决办法

    场景描述 在VMware虚拟机的使用过程中 有一些较大的文件需要存储 准备给虚拟机扩容 宿主机有一块机械硬盘 已格式化为两个ntfs格式的分区 我们准备用第二个分区给虚拟机扩容 且分区中已经存有文件 备份文件和虚拟机分配磁盘空间 这两个步骤
  • darknet+yolo4的windows下图片验证码识别一:环境编译和运行

    原创来自本人的公众号 阿嚏个技术 公众号文章地址 darknet yolo4的windows下图片验证码识别 之一 环境编译和运行 目前有很多采取深度学习的方式 进行图片验证码的文字识别 然后实现打码功能 本文采用darknet yolo4
  • Linux服务篇-FTP-文件传输协议

    一 FTP 文件传输协议 1 介绍 FTP服务器 File Transfer Protocol Server 是在互联网上提供文件存储和访问服务的计算机 它们依照FTP协议提供服务 是 TCP IP 协议组中的协议之一 FTP是用来传输文件
  • 【实战】淘宝电商用户行为分析——SQL

    目录 一 项目背景 1 1分析目的 1 2分析思路 二 数据来源 清洗 2 1数据集介绍 2 2数据清洗 2 2 1 检查是否存在重复值 2 2 2 检查是否存在缺失值 2 2 3 一致化处理 对timestamp 2 2 4异常值处理 时

随机推荐

  • 微信小程序使用setData方法修改data中对象或数组的属性值

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 微信小程序使用setData方法修改data中对象或数组的属性值 使用微信小程序开发时 涉及到data的修改一般使用微信官方推荐的setDat
  • mysql读写分离(mysql-proxy-0.85)

    读写分离代理172 25 11 1 主 172 25 11 2 从库172 25 11 3 从库172 25 11 4 proxy端 代理端 yum install y gcc gcc c autoconf automake zlib li
  • 脱机使用计算机,电脑设备变成脱机状态的解决办法

    计算机网络信息的发展是一把双刃剑 虽然为人们的生活带来很大的方便 但是其中隐含的计算机网络信息安全问题是不可忽视的 近些年来计算机网络信息安全频频受损 影响了人们日常生活 下面是小编为大家整理的关于 一起来看看吧 1 首先要检查你的网络是否
  • 每日小练习 ——《计算布尔表达式的值》LeetCode Plus 会员专享题【详细解析】Hive / MySQL

    大家早上好 本人姓吴 如果觉得文章写得还行的话也可以叫我吴老师 欢迎大家跟我一起走进数据分析的世界 一起学习 感兴趣的朋友可以关注我的数据分析专栏 里面有许多优质的文章跟大家分享哦 另外也欢迎大家关注我的SQL刷题专栏 里面有我分享的高质量
  • 开源的AI算法可以进行物体识别,动物识别

    有许多开源的AI算法可以进行物体识别和动物识别 其中最常用的算法是深度学习中的卷积神经网络 Convolutional Neural Network CNN 如Google开源的Inception和ResNet模型 以及Facebook开源
  • Java VS Python各自在AI人工智能领域的应用前景

    目前AI领域应用最广泛的开发语言是Python Python在过去几年里在人工智能和机器学习领域取得了巨大的成功和普及 有几个原因使得Python成为AI开发的首选语言 丰富的库和框架 Python拥有许多专门用于AI和机器学习的优秀库和框
  • STM32学习笔记

    GPIO 通用输入输出口 所有GPIO口都是挂载在APB2外设总线上 GPIO外设名称按照GPIOA GPIOB GPIOC来命名 每个GPIO外设有16个引脚 0 15 GPIOA的第0号引脚称作PA0 八种输入输出模式 1 浮空输入 可
  • 去除快捷方式箭头BAT脚本

    去除快捷方式箭头BAT脚本 1 脚本功能 去除window电脑桌面图标右下角的快捷方式小箭头 对于强迫症患者绝对是福音 总之清除了之后非常的舒畅 2 脚本内容 echo off color 2 reg delete HKCR lnkfile
  • Knowledge Distillation and Student-Teacher Learning for Visual Intelligence

    本文是蒸馏学习综述系列的第四篇文章 Knowledge Distillation and Student Teacher Learning for Visual Intelligence A Review and New Outlooks的
  • C89和C99标准比较

    1 增加restrict指针 C99中增加了公适用于指针的restrict类型修饰符 它是初始访问指针所指对象的惟一途径 因此只有借助restrict指针表达式才能访问对象 restrict指针指针主要用做函数变元 或者指向由malloc
  • PAT B 1055 集体照(C语言)

    一 题目 拍集体照时队形很重要 这里对给定的 N 个人 K 排的队形设计排队规则如下 每排人数为 N K 向下取整 多出来的人全部站在最后一排 后排所有人的个子都不比前排任何人矮 每排中最高者站中间 中间位置为 m 2 1 其中 m 为该排
  • 设备退出:“设备正在使用”的快速解决办法

    我们常常遇到U盘或移动硬盘显示因为 设备正在使用 而无法拔出的情况 如果冒然拔出 可能会造成数据丢失或损坏设备的情况 现在提供一个可以快速解决的办法 步骤一 win r 打开cmd命令命令面板 步骤二 输入diskpart 进入磁盘分区管理
  • android手机拍摄权限,react-native 手机拍照权限

    第一步 在 android app src main AndroidManifest xml 添加 然后运行项目在手机应用权限哪里查看 这是添加前的 这是添加后的 第二步调用 import React Component from reac
  • Vuforia的各种Target的简单介绍(包括地面识别)

    Vuforia的各种Target的简单介绍 包括地面识别 前言 Vuforia的两种识别分类 1 需要特定目标的识别 2 不需要特定目标的识别 上边两种的优缺点 基于优缺点进行的阿应用场景推荐 需要目标的类型 上传你的目标到服务器 不需要目
  • Android UI-开源框架ImageLoader的完美例子

    android layout gravity left center vertical android layout marginLeft 20dip android textSize 22sp gt GridView异步加载图片显示 20
  • Android APK反编译 最新版 解决Could not decode arsc file

    本人小白 初学Android 这不想着找点成熟的app看看 学习一下 就找到反编译了 拜读各位前辈大神的文章 弄啊弄 总是出现 Could not decode arsc file 的错误 擦擦 愁人啊 百度不行 就Google 捯饬啊捯饬
  • Ubuntu 安装与使用 Visual Studio Code

    1 Visual Studio Code简介 1 1 什么是Visual Studio Code Visual Studio Code是微软推出的一个运行于 Mac OS X Windows和 Linux 之上的 针对于编写现代 Web 和
  • 服务计算:简单的web程序

    CloudGo 框架选择 看了go的一些框架如beego和iris觉得挺好的 本来想用 但是虚拟机出了点问题装不成 windows上装成了没ab指令 所以使用官方的net http库做简单的实验 看完beego和iris的特性我还是比较想用
  • Linux下yum安装dstat,安装配置整理之 dstat

    tech163 usr local download dstat help Usage dstat afv options delay count Versatile tool for generating system resource
  • 菜鸡面试遇到有印象的问题(LINUX下内核如何管理内存)

    目录 写在文章的前面 本人C C 面试岗位 学艺不精 研究生做的与代码无关的工作 仅记录每次面试遇到的问题勉励自己 一 x86下的物理地址空间布局 二 linux虚拟地址内核空间分布 三 linux虚拟地址用户空间分布 1 page 页 2