- 博客(18)
- 收藏
- 关注
原创 《操作系统》_第一讲_什么是操作系统
屏幕上输出hello是如何实现的呢?首先假定我们计算机的内存地址300处保存着h的ascii码0x68,显存的地址是777。cup发送指令给内存,这条指令告诉内存,将数据发送到地址777处。接下来上电,执行这条指令,总线工作以及合作,就把0x68放到显示器了。其他字符依次执行。这样hello就出现在屏幕上了。操作系统如果执行所有的指令都直接在硬件上工作,那么麻烦程度可想而知,操作系统就是用来连接应用软件和计算机硬件的。应用软件通过操作系统来使用计算机硬件,输出hello时,操作系统会使用计算机硬件实
2020-11-08 10:24:04
247
原创 《算法:C语言实现》_第一部分_用快速合并算法实现解决连通性问题
上一篇文章讲到,快速查找算法只适合开销不大的连通性问题上,现在对此进行改进。每次合并遍历全部数组效率太低,能不能不要每次遍历数组全部值,优化为每次只遍历数组的部分值,复杂度因此就会降低。快速合并的补算法它与快速查找算法都基于同一个数据结构——通过对象名引用数组元素,但数组元素表达的含义不同,具有更复杂的抽象结构。这里运用到了树结构,在连通性的关系中,p->k & q->k = p->q可将k是为根节点,p和q是为子节点,p和q有共同的根结点k,故p和q连通。数据结构
2020-11-07 22:38:46
305
原创 《算法:C语言实现》_第一部分_连通性问题解决算法
解决连通问题算法快速-查找算法的一种简单实现。快速-查找算法结构该算法的基础是一个整型数组,当且仅当第p个元素和第q个相等时,p和q是连通的。初始时,数组中的第i个元素的值为i,0<=i<N。为实现p与q的合并操作,我们遍历数组,把所有名为p的元素值改为q(或者将名为q的元素改为p)。代码结构从标准输入读取小于N的非负整数对序列(对p-q表示“把对象p连接到q”),并且输出还未连通的输入对。数组id,每个元素表示一个对象,有以下性质,当且仅当p和q是连通的,id[p]和id[q]相
2020-11-05 22:52:41
250
原创 《算法:C语言实现》_第一部分 基础知识_引言
算法与数据结构大多数算法关注的是计算机中涉及的数据的组织方法。用这种方法建立的对象称为数据结构。它们都是计算机科学研究的核心。简单算法可以导致非常复杂的数据结构,反之,复杂算法可以利用简单数据结构以便理解算法。算法在大规模问题中更能凸显重要性对于大规模问题(或者需要求解大量小规模的问题的应用),我们的动机就是设计时间和空间都尽可能高效的方法。一个设计良好的算法会使程序快上数百万倍。学习算法目的学习求解重要任务的合理算法,仔细关注这些方法之间可比较的性能。不应该利用不清楚会消耗什么资源的算法,了
2020-11-04 23:32:28
202
原创 《Redis设计与实现》_第四章_重点回顾
重点回顾1.字典被广泛用于实现Redis的各种功能,其中包括数据库和哈希键。2.Redis中的字典使用哈希表作为底层实现,每个字典带有两个哈希表,另一个仅在rehash时使用。3.当字典被用作数据库的底层实现,或者哈希键的底层实现时,Redis使用Murmur Hash2算法来计算键的哈希值。4.在对哈希表进行扩展或者收缩时,程序将现有哈希表包含的所有键值对rehash到新哈希表里,并且这个rehash不是一次性完成的,而是渐进式地完成的。...
2020-11-04 22:32:19
129
原创 《Redis设计与实现》_第四章_渐进式rehash
渐进式rehash前面文章讲到,扩展或收缩哈希表需要将ht[0]里面的所有键值对rehash到ht[1]里面,但是,这个rehash动作并不是一次性、集中式完成的,而是分多次渐进式完成的。为什么要分多次渐进式完成?这就和哈希表里面保存的键值对的数量有关了,如果ht[0]里面只保存了4个键值对,那么,服务器可以瞬间将这些键值对rehash到ht[1]中;但是如果ht[0]中保存了四百万、四千万甚至四亿个键值对,一次性将这些键值对全部rehash到ht[1]中,很可能会导致服务器停止服务。因此为了避免r
2020-11-03 23:25:06
183
原创 《Redis设计与实现》_第四章_rehash
rehash哈希表保存的键值对会逐渐增多或减少,我们需要让哈希表的负载因子(load factor)维持在一个合理的范围之内,当哈希表保存的键值对数量太多或太少时,程序需要对哈希表的大小进行相应的扩展或收缩。扩展和收缩通过rehash(重新散列)操作来完成,Redis对字典的哈希表执行rehash步骤:1.为字典的ht[1]哈希表分配空间,这个哈希表的空间大小取决于要执行的操作,以及ht[0]当前包含的键值对数量(即ht[0].used的值)拓展:ht[1]大小为第一个大于等于ht[0].used
2020-10-30 23:01:02
289
原创 《Redis设计与实现》_第四章_解决键冲突
解决键冲突冲突原因:两个或以上数量的键被分配到哈希表数组的同一个索引上。解决办法:通过哈希表节点中的next指针使被分配到同一个索引上的节点连接起来。示例:现在在这个哈希表数组的索引2位置上添加一个键值对k2和v2。可以看到新添加的键值对k2和v2添加到了键值对k1和v1前边,这样做是为了使查找最后一个添加的节点的复杂度为O(1),以便下次添加新的键值对。...
2020-10-29 23:40:08
175
原创 《Redis设计与实现》_第四章_哈希算法
哈希算法要想把一个新的键值对添加到字典里,程序首先需要根据键值对的键计算出哈希值和索引值。然后根据索引值将包含新键值对的哈希表节点放到哈希表数组的指定索引上面。Redis计算哈希值和索引值的方法#计算哈希值字典设置的哈希函数——hashFunction(key);,它是dictType结构中保存的函数。所以在计算时,调用dict结构中的type指针指向的hashFunction函数。hash = dict->type->hashFunction(key);#计算索引值使用哈希表
2020-10-29 22:59:15
390
原创 《Redis设计与实现》_第四章_字典的实现
Redis的字典用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,每个哈希表节点保存了字典中的一个键值对。顺序:哈希表——哈希表节点——字典的实现。哈希表Redis字典使用的哈希表由dict.h/dictht结构定义:typedef struct dictht{ dictEntry **table;//哈希表数组 unsigned long size;//哈希表大小 unsigned long sizemask;//哈希表大小掩码,用于计算索引值,总是等于size-1 unsign
2020-10-28 23:29:37
151
原创 《Redis设计与实现》_第四章_字典简介
字典定义字典,又称为符号表(symbol table)、关联数组(associative array)或映射(map),是用于保存键值对的抽象数据结构。字典中的键值对字典中的每个键都是独有的,程序可以在字典中根据键查找与之关联的值(用键查值),通过键来更新值,通过键删除整个键值对等。Redis中的字典实现字典是一种常用数据结构在高级编程语言中一般会内置,Redis使用的C没有内置这种数据结构,故构建了自己的字典实现。字典在Redis中的应用Redis的数据库是使用字典来作为底层实现的,对数据库
2020-10-28 22:25:17
125
原创 《Redis设计与实现》_第三章_重点回顾
重点回顾1.链表被广泛应用于实现Redis的各种功能,如列表键、发布与订阅、慢查询、监视器等。(了解链表的用途)2.每个链表节点由一个listNode结构来表示,每个节点都有一个指向前置节点和后置节点的指针,是双端链表。3.每个链表用一个list结构来表示,这个结构有头指针,尾指针,长度计数器等。4.Redis是无环链表,其链表的头指针和尾指针都指向NULL。5.通过为链表设置不同的类型特定函数,Redis的链表可以用于保存各种不同类型的值。第5点实在是没有理解为什么通过设置不同类型的特定函数,
2020-10-27 23:29:29
115
原创 《Redis设计与实现》_第三章_遗留问题dup、free、match。
list结构中三个函数的含义在list结构中有三个函数,在阅读时我并没有理解。typedef strcut list{ listNode *head; listNode *tail; unsigned long len; void *(*dup)(void *ptr); void (*free)(void *ptr); int (*match)(void *ptr,void *key);}list;void *(*dup)(void *ptr);这是一个返回值为void ,参数为
2020-10-27 23:15:49
665
1
原创 《Redis设计与实现》_第三章_链表在Redis中的应用
链表优点1.链表提供高效的节点重排能力2.顺序访问节点方式3.通过增删节点来调整链表长度Redis实现链表Redis构建了自己的链表实现。在Redis中的应用示例:列表键的底层实现之一就是链表。列表键包含数量较多元素时,或者包含的元素都是比较长的字符串时,Redis会用链表来作为列表键的底层实现。如integers列表键包含了1-1024共1024个整数。...
2020-10-27 22:31:49
166
原创 《Redis设计与实现》_第二章_回顾与总结
总结SDS API重点*Redis只会用C字符串作为字面量,大多数清空下Redis用SDS(简单动态字符串)作为字符串表示。SDS优点1.常数复杂度获取字符串长度O(1)。2.杜绝缓冲区溢出。3.减少修改字符串长度所需的内存重分配次数。4.二进制安全。5.兼容部分C字符串函数。...
2020-10-26 22:43:05
127
原创 《Redis设计与实现》_第二章_二进制安全及兼容
二进制安全C字符串必须符合某种编码(如ASCII),且出末尾外不能包含空字符(’\0’)。由于这些限制,C字符串只能保存文本数据,不能保存二进制数据(二进制数据中不能包含’\0’对应的二进制数据,那么保存时就有可能会出错)。所以这不是二进制安全的。示例:str=“0123456789\00123456789”C字符串会认为str的长度为10,因为\0在C字符串中具有特殊意义,在识别到‘\0’后就会结束。而在Redis中,str的长度为21。因为SDS中的API都是二进制安全的,所有SDS API都
2020-10-26 22:33:06
140
原创 《redis设计与实现》_第二章_内存重分配
遗留问题上一小节说到,sdscat函数不仅对SDS进行了拼接而且还为SDS分配了13字节的未使用空间,而拼接后的字符串恰好为13字节。这里涉及到了修改字符串的内存重分配的问题。修改字符串的内存重分配次数前提:C字符串长度为n则需要n+1个字符长的数组。因为此前提,在每次修改C字符串时就需要对这个数组进行一次内存重分配操作。为什么要进行内存重分配?1.如在拼接字符串时,如果数组空间不足,则会导致缓冲区溢出,在执行拼接之前,先进行内存重分配,则可以避免此问题。2.如在截断字符串时,如果直接截断,则
2020-10-25 23:50:11
186
原创 《redis设计与实现》_第二章_两种字符串C和SDS、区别、获取字符串长度及缓冲区溢出
《redis设计与实现》-- 第二章知识内容redis中涉及到的两种字符串c语言传统字符串即以空格结尾的字符数组,简称c字符串。SDS(simple dynamic string)——简单动态字符串SDS是redis的默认字符串表示。redis也会用到c字符串,但是只会作为字符串字面量,用在一些不用修改的字符串上面。eg:redisLog(REDIS_WARING,"Redis is now ready to exit, bye bye ...");这里,“ …”中的内容即是字符串字面量
2020-10-25 12:16:00
291
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人