自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 OpenHarmony地图

沟通地图

2022-06-12 11:33:28 272

原创 [OpenHarmony]下载与编译

OpenHarmony代码下载与编译

2022-06-09 10:28:26 423

原创 pthread的编译问题

写了一个多线程的程序,说一下怎么去编译这样的程序。例如文件名叫做plock.c,现在编译需要得到其可执行文件plock。我们执行下面命令:gcc plock.c -o plock -lpthread如果需要将其写成Makefile的形式,可以采用下面的这种实例:第三行这个位置的命令-lpthread这个的位置放在前面的时候好像是会出现问题的,这里放置在后面就不会出现什么问题。a...

2018-12-17 15:00:09 1068

原创 f2fs系列文章truncate

    这篇文章讲f2fs文件系统的截断,在调用这个函数之前会设置inode的i_size,这个函数完成在文件中i_size之后的数据的删除。其起始的函数是f2fs_truncate。    f2fs_truncate:检查inode的mode,如果不是REG或者是目录或者是LNK,那么直接返回。然后再调用f2fs_may_inline_data检查文件是否可以以内联的形式存放,如果不行,调用...

2018-11-26 21:37:17 1135

原创 f2fs系列文章——缓存summary写入磁盘的问题

    这篇文章讲述一下f2fs文件系统中缓存在内存中的f2fs_summary写入磁盘的问题,这个涉及到f2fs_summary写入磁盘的时机、位置以及curseg在do_checkpoint中的写入问题和mount的时候的恢复curseg的问题。    首先,对于curseg_info中的f2fs_summary_block有两种方式同步到page cache中。一种是在curseg_in...

2018-11-26 21:37:00 1333

原创 f2fs系列文章——sit/nat_version_bitmap

    f2fs为了防止宕机对元数据造成不可恢复的损害,所以sit/nat这种元数据有着两个副本,但是这两个副本只有一个是表示最新的数据,f2fs通过保存在cp pack中的sit/nat version bitmap来指示哪个才是最新的。本文将讲述sit和nat两个副本的放置情况,以及sit/nat version bitmap在cp pack中的放置情况,最后将描述sit/nat更新时的ver...

2018-11-26 21:36:49 2050 2

原创 f2fs系列文章——do_checkpoint关于data summary的两种写入方式

    为了保存current segment的summary信息,f2fs在do_checkpoint的时候会调用会调用write_data_summaries和write_node_summaries将其sumamries信息写到page cache中然后随后同步到磁盘中,其中write_node_summaries也是只有在umount和fastboot的情况下才会调用。我们可以看到writ...

2018-11-26 21:36:38 1116

原创 f2fs系列文章——cp pack的组成

    f2fs将分区分为super block、cp pack、sit、nat、ssa、main area四个区域,除了cp pack外,其他的区域的组成都比较简单,基本只有一种数据结构,只有cp pack由于承载了check point的功能,所以其组成比较复杂,这篇文章就cp pack的组成来详细讲述。    cp pack是由f2fs_checkpoint、sit_version_bi...

2018-11-26 21:36:25 1399

原创 f2fs系列文章fill_super(四)

    这篇文章将讲述f2fs的node的管理结构f2fs_nm_info的构建和恢复。       build_node_manager:首先分配f2fs_nm_info的空间,然后调用init_node_manager初始化f2fs_nm_info并分配一些位图的空间。最后调用build_free_nids读取一定page中的f2fs_nat_entry对free_nid进行初始化,然后根...

2018-11-26 21:36:06 595

原创 f2fs系列文章fill_super(三)

    这篇文章完成f2fs的segment管理结构f2fs_sm_info的创建和恢复。        build_segment_manager:首先分配容纳f2fs_sm_info的空间,然后用f2fs_super_block中的数据对f2fs_sm_info的一些关于segment数量的信息进行初始化。接着初始化其中的三个链表discard_list、wait_list、sit_ent...

2018-11-26 21:35:57 1049

原创 f2fs系列文章fill_super(二)

    sb_set_blocksize通过函数set_blocksize对size进行检查并设置块设备的块大小。然后将super block的s_blocksize,s_blocksize_bits设置F2FS_BLKSIZE和F2FS_BLKSIZE相应的bit位数。int sb_set_blocksize(struct super_block *sb, int size){ if ...

2018-11-26 21:35:47 1322

原创 f2fs系列文章fill_super(一)

    这个系列文章将讲述文件系统的安装过程,以函数f2fs_fill_super为起点。    f2fs_fill_super:通过调用sb_set_blocksize来检查和设置super_block的块大小字段和快设备的块大小。然后调用read_raw_super_block来对物理设备上的f2fs_super_block进行读取。接下来就可以对f2fs_sb_info的某些字段进行初始...

2018-11-26 21:35:30 1961 1

原创 f2fs系列文章fsck(五)

    fsck_verify通过前面的检查结果来修正元数据。    首先是对nid的检查情况进行查看,f2fs_fsck中的nat_area_bitmap从开始的读取f2fs_nat_block中的所有的f2fs_nat_entry来记录所有有效的nid,但是在遍历的过程中在调用sanity_check_nid的时候已经将所有正常的nid都给clear掉了,所以在检查这个位图的时候,如果发现...

2018-11-26 21:33:43 1679

原创 f2fs系列文章fsck(四)

    补充一下之前略过的关于direct node、indirect node、dindirect node的检查。    fsck_chk_didnode_blk,对NIDS_PER_BLOCK个nid进行遍历,如果nid ==0,就直接跳过,nid!=0的话,就调用以TYPE_INDIRECT_NODE的标志调用fsck_chk_node_blk。如果成功就直接将i_block++。否则...

2018-11-26 21:33:34 567

原创 f2fs系列文章fsck(三)

    fsck_chk_inode_blk接下来就是对一个文件进行处理了,内容比较丰富。首先对inode对应的地址在f2fs_fsck的main_area_bitmap中有没有置位,如果没有置位,也就是检查到了一个新的inode,将f2fs_fsck中的check_result的valid_inode_cnt++,这里需要检查的原因是,可能有硬链接这些在之前就已经将main_area_bitma...

2018-11-26 21:33:20 1075

原创 f2fs系列文章fsck(二)

    fsck_chk_node_blk完成对所有类型的node进行检查。    node类型有:TYPE_INODE,TYPE_DIRECT_NODE,TYPE_INDIRECT_NODE,TYPE_DOUBLE_INDIRECT_NODE,TYPE_XATTR。但是调用这个函数不会是TYPE_XATTR。    文件类型有:F2FS_FT_UNKNOWN、F2FS_FT_REG_FI...

2018-11-26 21:33:06 979

原创 f2fs系列文章fsck(一)

     do_fsck首先调用fsck_init对f2fs_fsxk的一些字段进行初始化。    fsck_init首先对f2fs_fsck的nr_main_blks,main_area_bitmap_sz和main_area_bitmap进行一个初始化,nr_main_blks初始化为f2fs文件系统的main area的block的数量,然后是main_area_bitmap_sz初...

2018-11-26 21:32:51 2742

原创 f2fs系列文章gc

    这篇文章将讲述f2fs的gc,其主要的步骤应该是分为两步,首先select一个合适的section,然后将section中的数据全部迁移。     f2fs_gc:这个函数主要有两个函数调用gc线程和f2fs_balance_fs。首先检查super_block是否设置MS_ACTIVE,也就是super_block处于活动状态(目前不知道什么个状态),如果设置了就不做gc了。然后...

2018-11-26 21:32:30 2421 2

原创 算法导论——红黑树

红黑树是二叉搜索树的一种特例,它对每个节点增加了一个颜色的属性,通过增加以下的条件使得这颗二叉树更加平衡:1.每个节点或是红色的,或是黑色的。2.根节点是黑色的。3.每个叶节点是黑色的。4.如果一个节点是红色的,那么它的两个子节点都是黑色的。5.对每个节点,从该节点到其所有后代节点的简单路径上,均包含相同数目的黑色节点。红黑树的插入和删除如果按照二叉树的处理,那么它的性质可能被破坏,那...

2018-11-15 20:23:26 548

原创 算法导论——二叉搜索树

二叉搜索树是以一个二叉树来组织的,树的每个节点都是由键值value,父节点parent,左子节点left_child,右子节点right_child组成的,而且二叉搜索树的节点间满足以下的关系:假设x是二叉搜索树中的一个节点,如果y是x左子树中的一个节点,那么y的value是比x的value小;如果y是x右子树中的一个节点,那么y的value不比x的value小。二叉树支持的操作有:遍历、查找...

2018-11-13 16:18:10 285

原创 计数排序

之前的排序算法都是基于比较的基础上进行排序的。计数排序是假设输入的元素的每一个都是在[0,k]之前的一个整数。排序的基本思想就是对每个输入的元素,统计小于这个元素的数量,下面是具体的C++的实现:首先将统计的数组全部置零,然后根据输入来统计每个输入的相同的元素出现的次数,接着根据这个个数我们算出每种相同的元素应该放置的范围,那么元素值s应该放置的范围就是[counting_array[s - ...

2018-11-12 17:32:37 157

原创 快速排序

快速排序跟归并排序是一样的,采用的是分治的思想。其实现是每次将数组分为两个部分,一部分小于某个值,一部分大于某个值。当这样一直拆分下去,最后归并就得到一个排序好的数组。下面来看一下C++实现,partition函数是将一个数组的一部分,拆分为两半的过程,选取了数组这部分的最后一个元素,然后将小于这个元素的移到这部分靠前部分,大于这个值的移到靠后部分,最后有一个这个值的位置,这样就确定了这个值的...

2018-11-12 16:55:59 140

原创 优先队列

堆这样的数据结构经常用到优先队列中,下面关于优先队列还是以最大优先队列作为例子,一个放最大优先队列应该支持一下的操作:1.INSERT(S,x),把元素x插入集合S中。2.MAXIMUM(S),返回S中具有最大键值的元素。3.EXTRACT-MAX(S):去掉并返回S中的具有最大键值的元素、4.INCREASE-KEY(S,x,k):将元素x的键值增加到k,这里k不小于x。看一...

2018-11-12 16:20:00 532

原创 算法导论——堆排序

首先讲一下堆这个数据结构的特征:堆是一个数组,可以看成是一个近似的完全二叉树,一个索引从零的数组,其父节点与子节点的索引存在下面的关系:int parent(int child){ return (child - 1) / 2;}int left_child(int parent){ return parent * 2 + 1;}int right_child(i...

2018-11-09 20:46:50 292

原创 算法导论——矩阵相乘(一)

矩阵的相乘,这个计算方法就直接看下面的源码实现:void mul_array(int a_array[][ARRAY_SIZE], int b_array[][ARRAY_SIZE], int c_array[][ARRAY_SIZE], int size){ for(int i = 0; i < size; i++){ for(int j = 0; j &l...

2018-11-09 16:14:10 670

原创 算法导论——最大子数组

问题描述:给定一个数组,总数组中找出一个子数组使得这个子数组中的元素的和最大。思路:将数组进行分解成两个子数组,那么数组的最大子数组可能有三种情况。第一,完全位于左子数组中;第二,完全位于右子数组中;第三,跨越两个数组。然后取这三种子数组的最大值的子数组就是数组的最大子数组了。最后涉及到分解的截止条件,当子数组中的元素只有一个的时候,那么这个子数组本身就是最大子数组了。下面是C++的实现...

2018-11-09 14:41:44 1968

原创 算法导论——归并排序

归并排序的步骤分为三个:将问题分解为更小的问题,然后解决小问题,将小问题合并为大问题的解。针对归并排序的主要思想是:将一个需要排序的数组一分为二,然后将这两部分进行单独排序,然后将这两个排好序的子数组合然后按照顺序合并为大数组。还有一个就是边界问题,将数组无限的分下去知道最后的子数组只剩一个元素的时候也就是终止的时候,因为一个元素的数组,我们认为它就是排好序的。下面是C++的实现代码:归并...

2018-11-09 10:37:50 340

原创 UNIX进程运行时间

Unix里面的获取时间的方式主要由sys/times里面的函数times来获取。times函数会填充一个数据成员是时间的一个数据结构,然后返回墙上时钟时间。要注意的是,返回的这个时间是相对于过去某个时刻的,所以不能使用其绝对值直接作为其墙上时间。其正确的用法应该是:如果想知道某段代码中的进程运行的墙上时间,那么在这个代码段的前后分别调用times函数,然后返回值相减就可以得到这段代码运行的滴答数。...

2018-11-05 17:29:17 444

原创 C语言——非本地跳转

C语言的本地跳转是指goto语句,但是这个语句最大局限就是只能实现函数内部的跳转。所以非本地跳转就是解决这个问题。非本地跳转是由setjmp和longjmp来完成的。setjmp函数的原型是int setjmp(jmp_buf env),longjmp函数的原型是void long_jmp(jmp_buf env, int value)。这两个函数都是包含在头文件setjmp.h中。setjm...

2018-11-02 20:27:43 1307 2

原创 C语言——命令行参数

可以通过main函数带上两个参数来获取命令行的参数。argc:命令行参数的个数。argv:由命令行参数组成的字符串数组。#include <stdio.h>int main(int argc, char *argv[]){ int i; for(i = 0; i < argc; i++) { printf("argv[%d]:%s\n", i, a...

2018-11-02 16:30:46 2320 1

原创 C++成员初始化列表

C++规定,对象的成员变量的初始化动作发生在进入构造函数本体之前。所以,类的构造函数的成员初始化列表就是这个进入构造函数本体之前进行类的对象的初始化,列表里面也是调用对象的构造函数完成的。...

2018-10-29 11:20:02 210

原创 redis设计与实现——简单动态字符串

Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。在 Redis 里面, C 字符串只会作为字符串字面量(string literal), 用在一些无须对字符串值进行修改的地方, 比如打印日志。...

2018-10-12 15:27:42 181

原创 C++构造函数

C++中可以给类提供很多重载的构造函数,首先,如果没有构造函数,将有一个默认的无参的构造函数1.默认的构造函数class Person{ public: const std::string & getName() const; const int getAge() const; void display() const;...

2018-10-12 11:26:57 523

空空如也

空空如也

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

TA关注的人

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