ext2 && simple filesystem实现
ext2组成:block:一个扇区512字节,block出现提高了读写性能 文件系统维护数据块,磁盘维护逻辑块, IO管理器将数据块翻译成逻辑块地址LBA inode:索引节点,优化存储 在inode中存储了inode号、文件类型、权限、文件所有者、大小、时间戳等元数据信息,最重要的是还存储了指向属于该文件block的指针 文件系统创建完成后所有的inode号都已经分配好并记录到inode table中了,只不过被使用的inode号所在的行还有文件属性的元数据信息和block位置信息,而未被使用的inode号只有一个inode号而已而没有其他信息而已。 bmap:标识空闲block,写优化 inode表:通过将存储inode的block组合起来形成一张表 imap:标识空闲inode 块组:减小map大小,提高map扫描效率 磁盘分区,逻辑分组 块组在文件系统创建就划分好了,固定了以上组合 引导块:分区第一个块,1024字节,只有装了os的主分区和逻辑分区才有,VBR和EBR MBR上的boot...
网络
TCP/IP协议族 ARP:IP地址和物理地址的转换 12Type 0x800:ipopt 1:request 2:reply 3: 4: arp -a查看arpcache ICMP:测试网络,实际上是IP协议的一部分,由每一个IP协议模块实现,包含8位type、8位code、16RCR和32位content 一般type只用到 Destination Unreachable Message 123456789Type 3Code 0 = net unreachable; 1 = host unreachable; 2 = protocol unreachable; 3 = port unreachable; 4 = fragmentation needed and DF set; 5 = source route failed.content unused Redirect Message 1234567Type 5Code 0 = Redirect datagrams for the Network. 1 = Redirect...
c++新特性
变长模板c语言支持函数变参,通过va_list, va_start, va_arg, va_end系列函数获取参数,但是函数并不知道到参数的具体类型,va_arg获取参数的原理是按照类型去通过指针去参数列表取得的,只适合用于POD类型 c++实现了变参模板,即同时传递变量和类型;模板参数包和函数参数包可以将多个参数打包看作一个参数,然后在模板推导时通过包扩展将其解包。 12template<typename... Args>class Template : privateB<A...> 如何才能利用模板参数包及包扩展,使得模板能够接受任意多 的模板参数,且均能实例化出有效的对象呢? 通过递归的方法,参套包含,并且指定边界条件 123template<typename... T> class tuple;template<typename Head, typename... Tail> class tuple<Head, Tail...> : private tuple<Tail...> {...
c++
new 所得block in VC动态分配所得内存块 in VC 分别debug mod 和 release debug 两个cookie + 32 + 4,如果数组 +4,VC下内存块16字节对齐 + 本身内存对齐大小 宏使用#define和#undef限制宏作用域,不要加;,否则会被当作程序体;宏展开只是在预处理阶段单纯的文本替换,例如类型别名时并不具有类型定义说明的功能,一些常见宏使用如__LINE__ __FUNCTION__ __FILE__等 #if #ifdef条件判断,例如#ifdef __cplusplus extern "c"{ #endif 宏定义执行体通过 do{}while(0)保证执行体里一定都被执行一次,比如在if后使用宏等,当参数为表达式时给每个参数加上(),例如#define mul(a, b) a*b add(1+2,3+4)即出现歧义 使用#将参数转换为字符 #define str(x) #x 使用##表示连接两个参数#define cont(a,b)...
raft学习与实现
贴一个raft可视化网站,方便直观学习:Raft Consensus Algorithm CAP:**CAP:**一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。 BASE原则是CAP原则的折中,C,A,P三个都要,但是不保证每个原则的实现都是100% BA:基本可用(Basically Available) S:软状态(Soft State) E:最终一致性(Eventual Consistency) CAP原则是三选二; 选择策略: 当一套系统在发生故障后,客户端的任何请求都被卡死或者超时,但是,系统的每个节点总是会返回一致的数据,则这套系统就是 CP 系统,经典的比如 Zookeeper。 如果一套系统发生分区故障后,客户端依然可以访问系统,为了高可用,每个节点只能用本地数据,导致读取数据不一致,那么这套系统就是 AP 系统,经典的比如...
基于epoll支持异步IO读写的协程库
协程用户级线程 线程运行的时候主要依靠寄存器和栈空间,而协程正是由用户自己维护寄存器和栈空间地址 线程调度由操作系统来进行切换,需要系统调用陷入内核和上下文切换,而协程的调度只需要改变寄存器的值 对称协程与非对称协程: 对称协程协程之间可以直接相互调度和切换 非对称协程被调度协程只能将控制权返回给调度协程 非对称协程需要一个协程调度器类似池的概念,比较适合IO密集型;而对称协程适合计算密集型 协程实现三种方式: ucontex 通过是同ucontex函数族实现协程,struct ucontext中,设置uc_link指向恢复的上下文,uc_stack指向改协程使用的栈 getcontext()初始化,填充当前上下文 makecontext()设置协程执行函数,设置上下文 swapcontext()上下文切换,当前上下文保存到oucp,切换到ucp setcontext()慎用,直接跳到指定上下文,当前上下文就没有了 12345678910111213#include <ucontext.h>typedef struct ucontext { ...
regex
正则表达式字符匹配 普通字符:普通字符按照字面意义进行匹配,例如匹配字母 “a” 将匹配到文本中的 “a” 字符。 元字符:元字符具有特殊的含义,例如 \d 匹配任意数字字符,\w 匹配任意字母数字字符,. 匹配任意字符(除了换行符)等。 量词 *:匹配前面的模式零次或多次。 +:匹配前面的模式一次或多次。 ?:匹配前面的模式零次或一次。 {n}:匹配前面的模式恰好 n 次。 {n,}:匹配前面的模式至少 n 次。 {n,m}:匹配前面的模式至少 n 次且不超过 m 次。 字符类 [ ]:匹配括号内的任意一个字符。例如,[abc] 匹配字符 “a”、”b” 或 “c”。 [^ ]:匹配除了括号内的字符以外的任意一个字符。例如,[^abc] 匹配除了字符 “a”、”b” 或 “c” 以外的任意字符。 边界匹配 ^:匹配字符串的开头。 $:匹配字符串的结尾。 \b:匹配单词边界。\bab\b匹配ab开头和结尾单词,… ab …. \B:匹配非单词边界。\Bab\B 上面的其他情况 分组和捕获 (...
stl
__type_traits机制允许针对不同的型别属性,在编译时期完成函数派送 iterator_traits负责萃取迭代器特性,而__type_traits负责萃取型别特性——》 这里型别指no-trival 一个简单的判断标准是class内含指针成员,并且对它进行内存动态配置 12345__type_traits<T::has_trivial_default_constructor__type_traits<T::has_trivial_copy_constructor__type_traits<T::has_trivial_assignment_operator__type_traits<T::has_trivial_destructor__type_traits<T::is_POD_type //Plain Old Data 我们希望通过以上型别返回结果进行函数派送,而编译器只有面对class object形式的参数才会做参数推导 因此应该传回 12strcut __true_type {};struct...
co-net
LOG级别12345678910111213typedefenum { EMERG = 0, FATAL = 0, ALERT = 100, CRIT = 200, ERROR = 300, WARN = 400, NOTICE = 500, INFO = 600, DEBUG = 700, NOTSET = 800 }PriorityLevel; Pattern 12345678910111213void log4cpp::PatternLayout::setConversionPattern (conststd::string& conversionPattern) throw(ConfigureFailure) [virtual]/*其中参数类型为std::string,类似于C语言中的printf,使用格式化字符串来描述输出格式,其具体含义如下:* u %c category;* u %d...
linux编程基础
linux常见目录: /bin: /usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。 /boot:放置linux系统启动时用到的一些文件,如Linux的内核文件:/boot/vmlinuz,系统引导管理器:/boot/grub。 /dev:存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱 mount /dev/cdrom /mnt。 /etc:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有...