自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

静待另一片蓝天

记下学习过程中的点点滴滴

  • 博客(79)
  • 收藏
  • 关注

原创 [Linux][内核学习笔记]--匿名页面缺页中断

1 简介 在缺页中断处理中,匿名页面处理的核心函数是 do_anonymous_page() , 其代码实现在 mm/memory.c 中。在Linux内核中没有关联到文件映射的页面称为匿名映射——Anonymous Page , 简称 anon page。2 源码解析static vm_fault_t do_anonymous_page(struct vm_fault *vmf){ struct vm_area_struct *vma = vmf->vma; struct mem_cgr

2022-04-24 23:44:12 607

原创 [Linux][内核学习笔记]--缺页中断

汇编阶段 当程序访问的虚拟页面没有进行过物理页面的映射时,会通过发生缺页中断来分配和映射物理页面。发生缺页中断时,处理器会跳转到异常向量表 Data abort 向量中开始执行缺页中断的汇编阶段,这个阶段与处理器架构紧密联系,例如对于ARMv7-A架构,汇编处理流程为:__vectors_start -> vector_dabt -> __dabt_usr/__dabt_svc -> dabt_helper -> v7_early_abort 。 从缺页中断的汇编处理流程可以看到

2022-04-24 18:25:57 2205

原创 [Linux][内核学习笔记]--mmap

1 简介 mmap/munmap是用户空间最常用的一个系统调用接口,常用于在用户程序中分配内存、读写文件、链接动态库文件、多进程间共享内存。2 函数原型void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset);int munmap(void *start, size_t length)2.1 参数说明addr :用于指定映射到进程地址空间的起始地址,为了程序的可移植性,一般设置为NULL,让内

2022-04-19 23:53:48 545

原创 [C语言][剑指offer篇]--II. 和为s的连续正数序列 (滑动窗口)

1. 题目描述输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。2. 理清思路 根据题意“输出所有和为target的连续正整数序列”,首先“连续正整数序列和”在数学上有求和公式,比方 l 指向连续正整数序列的首元素,r指向连续正整数序列的尾元素,由题意可知初始值 l = 1 , r = 2 ,则 l ~ r 之间的和为: sum=(l+r)∗(r−l+1)2sum=\frac{(l + r)*

2022-04-18 23:38:38 361

原创 [Linux][内核学习笔记]--VMA操作

 进程地址空间在内核中用VMA抽象描述,VMA离散分布在3G(32位)的用户空间中,内核中提供相应的API来管理VMA,总结如下:查找VMAstruct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)struct vm_area_struct *find_vma_prev(struct mm_struct *mm, unsigned long addr,struct vm_area_struct **pprev

2022-04-17 17:28:58 310

原创 [Linux][内核学习笔记]--vmalloc

vmalloc代码逻辑分析:

2022-04-16 14:01:24 266

原创 [Linux][内核学习笔记]--kmalloc

文章目录简介函数原型简介 kmalloc通常用于内核中分配以字节为单位的小块内存,它的底层实现是slab机制,因此分配的内存在物理上是连续的。类似伙伴系统,它按照内存块的2order来创建多个slab描述符,例如16B、32B、64B、128B、···、32MB等大小,对应的slab描述符的名称分别是kmalloc_16、kmalloc_32、kmalloc_64····等,这在系统启动时,由create_kmalloc_caches()函数来完成。函数原型static __always_inlin

2022-04-11 21:33:10 586

原创 [C语言][剑指offer篇]--57. 和为s的两个数字(对撞指针法)

题目描述输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。理清思路 因为数组递增排序,所以用双指针,left指向数组头部,right指向数组尾部,循环遍历数组,并计算头尾和 sum = nums[left] + nums[right]:如果 s > target , 则 right – 。如果 s < target ,则 left ++ 。直到 s = targe时,退出循环,保存两个数,返回数组,over

2022-04-11 21:01:23 927

原创 [C语言][剑指offer篇]--II. 平衡二叉树(后序遍历 + 剪枝)

题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。理清思路 后序遍历二叉树,由底向上返回某一子树的深度,并判断是否某一子树是否是平衡树,只要任意子树不是平衡树,则整棵数都不是平衡树:当节点的左右子树的深度差 < 2 ,则返回子树的深度,即:max(left_hight,right_hight)+1 。当节点的左右子树的深度差 > 2,则返回-1,说明不是平衡树。递归终止条件:root == NU

2022-04-10 20:45:44 1070

原创 [Linux][内核学习笔记]--slab分配器

1. 简介 slab分配器负责分配小于页的内存块,例如以Byte为单位的内存块。我们知道伙伴系统的分配单位是页,slab分配器则在伙伴系统分配的页面上实现自己的算法,专门用于满足小块内存的分配需求。2. slab描述符(高速缓存) struct kmem_cache 是slab分配器的核心数据结构,称它为slab描述符(高速缓存),其在内核中的定义如下:struct kmem_cache { struct array_cache __percpu *cpu_cache;/* 1) Cache

2022-04-10 18:08:48 1915

原创 [C语言][剑指offer篇]--I. 二叉树的深度(深度优先搜索)

1. 题目描述输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。2. 理清思路 考虑到采用深度优先搜索,分别计算出左右子树的深度,最后取左右子树中最大的一个并加1即为二叉树的深度,即: 二叉树的深度 = Max(左子树的深度,右子树的深度) 3. 代码实现int getMax(int a,int b){ return a > b ? a :b;}int maxDepth(struct TreeN

2022-04-08 21:37:21 1108

原创 [C语言][剑指offer篇]--二叉搜索树的第k大节点(中序遍历)

1. 题目描述给定一棵二叉搜索树,请找出其中第 k 大的节点的值。2. 理清思路2.1 二叉搜索树 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,时间复杂度O(log2n) ~ O(logn),对于每个节点有:若其有左子树,则左子树中的节点都不大于该节点。若其有右子树,则右子树中的节点都不小于该节点。二叉搜索树的中序遍历是递减序列或递增序列。例如:2.2 中序遍历 若树为空,则空操作返回,否则从根节点开始(注意不是先访问根节点),中序遍历根节点的左子树,然后访问根节点,最

2022-04-07 23:30:53 1138

原创 [C语言][剑指offer篇]--II. 0~n-1中缺失的数字(二分法)

题目描述一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 排序数组的查找一般采用二分法。考虑左子数组有 nums[left] = left , 右子数组有

2022-04-06 23:26:36 81

原创 [Linux][内核学习笔记]--内存管理

文章目录1.内存管理概览2.物理内存管理2.1 物理内存初始化流程2.2 zone2.3 zonelist2.4 fallbacks2.5 伙伴系统2.6 pg_data_t3. 虚拟空间管理3.1 进程虚拟地址空间3.2 虚拟地址空间布局3.2.1 内核空间3.2.2 用户空间3.2 描述用户空间的数据结构4. 内存管理机制4.1 地址映射(页表映射)4.1.1 页面高速缓存4.1.2 64位机器的页表映射5. 物理页面的分配5.1 gfp_mask标志5.2 常见的gfp_mask使用时机5.3 物理内

2022-04-03 16:11:40 1193 1

原创 [C语言][剑指offer篇]--在排序数组中查找数字 I (二分查找)

题目描述统计一个数字在排序数组中出现的次数。理清思路 遍历数组,用一个计数count记录数组中出现target的次数,最后返回count,时间复杂度为O(n)。但是这个方法没有利用到题目中 “排序数组”的条件。所以此题采用二分查找方法符合题意,且时间复杂度为O(log(n)),分别找到数组中第一个target的下标和数组中最后一个target的下标,最后两个下标相减再加1便是target在数组中出现的次数。此题二分查找的关键点在于查找两个下标的位置,具体做法如下:单独编写一个查找下标的函数 fi

2022-04-02 17:53:05 1037

原创 [C语言][剑指offer篇]--两个链表的第一个公共节点

题目描述输入两个链表,找出它们的第一个公共节点。理清思路双指针定义ptrA指向headA,ptrB指向headB。首先判断特殊情况,只要其中一个链表为空,则永远不会相交,返回BULL。分别遍历链表,当ptrA走到尾时,指向headB,同时ptrB走到尾时,指向headA。只有当ptrA 等于 ptrB时才退出循环,返回ptrA。代码实现双指针struct ListNode *getIntersectionNode(struct ListNode *headA, struct List

2022-04-01 21:50:31 1333

原创 [C语言][剑指offer篇]--第一个只出现一次的字符

题目描述在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。理清思路 比较简单,哈希思想即可。代码实现char firstUniqChar(char* s){ int bitmap[26]; int size; int i = 0; if(s == NULL) { return ' '; } size = strlen(s); memset(bitmap,0,sizeof

2022-03-31 22:41:16 921

原创 [C语言][剑指offer篇]--连续子数组的最大和(动态规划)

1.题目描述输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de-zui-da-he-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2.

2022-03-29 23:35:24 264

原创 [C语言][剑指offer篇]--最小的k个数(堆排序)

1. 题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。2. 理清思路2.1 堆排序的基础概念2.1.2 完全二叉树 如果二叉树的深度为n,则除第n层外其余所有层节点都有2个子

2022-03-24 23:47:15 1953

原创 [C语言][剑指offer篇]--数组中出现次数超过一半的数字(Boyer-Moore 投票算法)

题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-chu-xian-ci-shu-chao-guo-yi-ban-de-shu-zi-lcof著作权归

2022-03-17 21:53:34 926

原创 [C语言][剑指offer篇]--从上到下打印二叉树 II(广度优先搜索)

题目描述从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],提示:节点总数 <= 1000来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-ii-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 广度优先搜索(BFS):B

2022-03-15 23:15:24 1268

原创 [Linux][内核学习笔记]--CFS调度器

进程的状态转换 系统中的进程在调度程序schedule()的协调下按既定规则运转,保证每个进程尽可能公平地获得CPU运行时间。在单处理器系统中,同一时刻只能有一个进程占用CPU,由于CPU的运行速度很快,加上有调度程序的协调,肉眼看到所有进程在同时运行的假象。在多处理器系统中,同一时刻可以有多个进程在运行,具体由处理器个数决定。...

2022-03-13 19:50:07 1284

原创 [C语言][剑指offer篇]--顺时针打印矩阵(深度优先搜索&顺序遍历)

题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shun-shi-zhen-

2022-03-12 15:55:50 1605

原创 [C语言][剑指offer篇]--对称二叉树

题目描述请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:root = [1,2,2,null,3,null,3]输出:false来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/dui-cheng-de-er-cha-shu-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处

2022-03-09 22:58:56 91

原创 [C语言][剑指offer篇]--二叉树的镜像

题目描述请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:镜像输出:来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 递归法:依次改变左右节点的指针。代码实现struct TreeNode* mirrorTree(struct TreeNode* root){ if(ro

2022-03-07 23:10:46 608

原创 [C语言][剑指offer篇]--反转链表

题目描述定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/fan-zhuan-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 双指针思想:pre

2022-03-03 22:33:07 61

原创 [C语言][剑指offer篇]--链表中倒数第k个节点

题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/lian-bia

2022-03-02 22:30:42 166

原创 [C语言][剑指offer篇]--调整数组顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/著作权归领扣网络所有。

2022-02-28 22:50:38 392

原创 [C语言][剑指offer篇]--删除链表的节点(解读Linus大大的写法)

题目描述给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shan-chu-lian-biao-de-jie-dian-lcof著作权归领扣网络

2022-02-24 23:37:36 1100

原创 [C语言][剑指offer篇]--打印从1到最大的n位数

题目描述输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/da-yin-cong-1dao-zui-da-de-nwei-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 n = 1 时

2022-02-21 21:48:48 388

原创 [C语言][剑指offer篇]--二进制中1的个数

题目描述编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路  运用 & 位运算和移位运算来判断输入整数的每一个二进制位是否为1。但首先需要了解实际系统是32位还是6

2022-02-20 21:05:05 459

原创 [Linux][内核学习笔记]--进程管理

进程是什么? 进程是Linux系统抽象出来的,表示正在执行程序的实时结果。进程不等于程序,程序是静态地存储在磁盘上,而进程活动于操作系统中。多个进程有可能在执行同一份程序代码。进程除了包括程序代码外,还包括其他资源,像打开的文件、挂起的信号、内核数据、处理器状态、一个或多个具有内存映射的内存地址空间、一个或多个执行线程等。 线程是进程中的活动对象,一个进程对应多个线程。线程共享进程的部分资源,像代码段、数据段、堆、当前目录、用户ID、组ID、打开的文件描述符等,也独有资源,像栈、程序计数器、程序运行时用

2022-02-20 16:09:50 611

原创 [Linux][内核学习笔记]--内核开发的特点

内核编程时既不能访问标准C库,也不能访问外部标准的C头文件 外部C库或其他的函数库对于内核来说大且低效,所以内核不支持链接外部函数。但内核提供了开发必备的大部分类似用户空间的标准C函数,在使用时包含相关的头文件即可。大部分头文件在源码根目录下的include/linux/下,在C文件中一般通过#include <linux/xxx.h>的方式包含进来。另外,与体系结构高度相关的头文件在arch/<architecture/include/asm>下,通过#include <.

2022-02-19 11:25:42 374

原创 [C语言][剑指offer篇]--合并两个排序的链表

题目描述输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 双

2022-02-16 22:42:11 93

原创 [C语言][剑指offer篇]--从尾到头打印链表

题目描述输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路方法一 尾填数组法 尾填数组法是指正向遍历链表,将节点数据从数组的尾部开始填入。第一次遍历链表,计算出链表的长度sizemalloc分配size大小的内存

2022-02-15 22:59:20 569

原创 [C语言][剑指offer篇]--替换空格

题目描述请实现一个函数,把字符串 s 中的每个空格替换成"%20"。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 利用双指针思想,第一指针遍历数组找到每个空格,并将空格替换为’\0’ ,第二指针指向源字符串的首地址,然后利用strcat将第二指针所指地址到第一个’\0’的字符串追加到目标地址中,最后,第二指针移动到第一

2022-02-14 23:25:11 495

原创 [C语言][剑指offer篇]--旋转数组的最小数字

题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转,该数组的最小值为1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof著作权归

2022-02-12 23:05:08 56

原创 [C语言][剑指offer篇]--青蛙跳台阶

问题描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/qing-wa-tiao-tai-jie-wen-ti-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 青蛙跳台阶解法类似于斐波那契数列 ,唯一

2022-02-12 22:29:33 370

原创 [C语言][剑指offer篇]--数组中重复的数字

题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。理清思路 位映射法(bitmap) nums数组中的值

2022-02-12 22:10:23 77

原创 [C语言][剑指offer篇]--斐波那契数列

题目描述 写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。来源:力扣(LeetCode)链接:https://leetcode

2022-02-12 17:47:17 102

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除