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++新特性
智能指针智能管理堆内存的指针,能够在析构时自动释放内存 unique_ptr:独享对象所有权的智能指针,禁用拷贝构造和赋值函数,但可以通过右值引用进行拷贝,原来的对象指针变为nullptr share_ptr:共享对象所有权的智能指针,通过过share_count计数实现拷贝,当析构时计数为0才真正删除所指内存 weak_ptr:share_ptr的弱引用,使用时必须转换为share_ptr,解决环状引用 环状引用:当a析构时A的计数为1,b析构时B的计数为1,造成内存泄漏 12345678910111213class B;class A{public: shared_ptr<B> pb;};class B{public: shared_ptr<A> pa;}shared_ptr<A> a(new A);shared_ptr<B> b(new B);a->pb = b;b->pa =...
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:**一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。 选择: 当一套系统在发生分区故障后,客户端的任何请求都被卡死或者超时,但是,系统的每个节点总是会返回一致的数据,则这套系统就是 CP 系统,经典的比如 Zookeeper。 如果一套系统发生分区故障后,客户端依然可以访问系统,但是获取的数据有的是新的数据,有的还是老数据,那么这套系统就是 AP 系统,经典的比如 Eureka。 raft笔记相比于Paxos,一个易于理解的共识算法(共识即实现复制状态机:),并将其分解为以下三个子问题,主要有两钟RPC:Vote RPC和AppendEntries RPC 领导者选举leader follow candicate 每个follow只有一张选票,先来先得原则 follow什么时候会投票:requestVote...
基于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:系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有...