python菜鸡教程
python菜鸡教程
课程简介
费曼学习法是比较有名的一种学习方式,核心要义是通过复述概念并反馈结果来加强记忆,它是符合大脑的认知规律,从混乱走向有序的过程,从被动记忆走向主动理解并阐述。这么棒的学习方式当然要尝试尝试,通过这种方式我也尝试学学python
课程依托于大佬文字版教程廖雪峰python教程进行理解与讲述
课程链接
第一节、输入和输出
第二节、数据类型和变量
第三节、字符串和编码
第四节、使用list和tuple
第五节、条件判断和循环
第六节、使用dict和set
第七节、调用函数
9、高并发内存池-性能测试及优化
多线程环境下对比malloc测试
测试代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119#include"ConcurrentAlloc.h"// ntimes 一轮申请和释放内存的次数// rounds 轮次void BenchmarkMalloc(size_t ntimes, size_t nworks, size_t rounds){ std::vector<std::thread> vthread(nworks); std::atomic<size_t> malloc_costt ...
8、高并发内存池-细节完善
我们的内存池已经完成了申请内存和释放内存的功能但是还有几个地方没有处理完善,主要有以下几个方面:
大于256KB的内存申请
内存池的内部要脱离new
释放对象时的细节
大于256KB的内存处理
申请
在ConcurrentAlloc.h文件中,申请内存的时候要分两种情况
小于256kb走thread cache
大于256kb走page cache
123456789101112131415161718192021222324252627static void* ConcurrentAlloc(size_t size){ if (size > MAX_BYTES) { // 申请的内存大于MAX_BYTES(256kb) // 走Page Cache层申请 // 先进行对齐 size_t alignSize = SizeClass::RoundUp(size); // 然后算需要几页 size_t kpage = alignSize >> PAGE_SHITF; PageCache::GetInstance()-& ...
7、高并发内存池-释放内存
前面几个章节,详细说明了thread cache、central cache、page cache层的结构以及申请内存的逻辑。本节就是讲述回收内存的过程,大致分为下边几步:
thread cache挂的自由链表过长,将内存释放回central cache
central cache管理的span的内存块全部回来后,将span释放回page cache
page cache合并前后相邻的空闲页
ThreadCache层回收内存
当线程释放内存块时,直接将内存块挂到相应的ThreadCache的自由链表,当自由链表的长度达到thread cache层向central cache层申请内存的一个批量的大小我们就进行释放,也就是到MaxSize(慢增长记录)
这里注意,我们增加了FreeList成员_size,并提供了返回它大小的函数Size
12345678910111213141516// 释放内存void ThreadCache::Deallocate(void* obj, size_t size){ assert(obj); assert(size <= ...
obsidian纯粹版插件推荐
只是单纯的记笔记而不是想要all in one,建议别看太多教程,否则你折腾这个软件的功夫很有可能大于你记笔记的功夫(无聊玩随意),如果想要单纯的获得纯粹点的markdown记笔记往下看。
一、主题篇
适当折腾
建议直接默认即可,默认风格和github README、各种博客平台,无太多美化的个人博客风格差不多,分享时不会差太大。
二、插件篇
少折腾,这里推荐5个,能够带来最单纯简单的使用markdown的体验,大家谨记折腾软件的功夫一定不要大于记笔记的功夫
插件1、Recent Files
这个插件很实用,能看最近打开的文章
插件2、File Explorer Note Count
能显示文件夹下边有几个文件
插件3、Editing Toolbar
非常实用,将常见的markdown功能,集成为一个小工具条,类似word的上边工具栏
插件4、Advanced Tables
obsidian的markdown表格比较难打,这个是增强输入表格功能的插件,只要输入一个 | 加内容然后配合回车和tab键,就可以很方便的搞出来表格,当然它也带了工具栏
...
6、高并发内存池-PageCache
框架结构
central cache对应的桶里如果没有span对象,需要向page cache层申请一个非空的span,page cache也是哈希桶的结构,同样通过双向链表组织一个个的span对象,但是映射规则和thread cache和central cache层不同,page cache的逻辑抽象结构如下:
page cache采用直接定址法,几号桶就是挂的几页的span,pageche的span对象是按页为单位,并没有切分成小对象,central cache会申请固定页数的span,然后进行切分
具体实现
page cahe 类
page cache 这里设计span最多有128页(128 * 8 * 1024 = 1m),也可以有设计成其他大小,我们设计的thread cahche层最大申请256kb的对象,128页能切成4个,然后我们让几号桶对应几页的span,为了方便整个page cache类设计为129个桶,空出来0号桶
123// page cache桶的个数 - 这里设置为129个,0号桶不用static const size_t NPAGES = 12 ...
5、高并发内存池-CentralCache
Central Cache框架设计
当申请对象时,thread cache层对应的自由链表为空时,需要向central cache层申请内存。central cache层框架图如下:
central cache整体也是一个哈希桶结构,类似于thread cache层,但是central cache层所挂的是span的链表
span是管理大块内存的数据结构,页为单位
span里面有个自由链表,管理切割出来的小内存块
映射关系和对齐规则同thread cache
Central Cache具体结构
span结构
span是管理多个连续页大块内存的跨度结构,具体结构代码如下;
1234567891011121314struct Span{ PAGE_ID _pageId = 0; //大块内存起始页的页号 size_t _n = 0; //页的数量 Span* _next = nullptr; //双向链表的结构 Span* _prev = nullptr; size_t _useCount = 0; //切好的小块内存,被分配给thread cache的计数 voi ...
Damus下载
Damus是一款建立在去中心化网络Nostr(支持加密的端到端私人消息传递等功能)上的应用软件,其中Nostr并不是基于服务器来运行网络,相反,它是利用去中心化中继器来分发消息。中继器(Relay)是托管的服务器,所有人都可以运行中继器。获得其他用户,比如你好友的更新,需要研究询问多个中继站是否了解其他人的情况;而中继站所做的,就是接受人们的帖子并将其转发给其他人。
下载地址
苹果下载链接Damus
安卓下载链接Amethyst
网页版
注意不要把你的私钥当做公钥发出来。
换头像方式:
需要图床图片链接
回到Damus,edit profile,头像的链接粘贴save即可
使用体验
已经使用了两天,登录注册体验很不错,不需要提供任何的个人信息,(手机号、邮箱、推特、Facebook…),直接注册给你公钥和私钥,但是使用起来体验十分的差劲,可能是没有监管的原因,各种各样的广告满天飞,没有监管的去中心化社交不大行感觉
4、高并发内存池-ThreadCache
框架设计
thread cache是哈希桶的结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表,我们知道定长内存池只有一个自由链表,因为它每个内存块对象大小相等,但是我们这个内存池需要支持不同大小的内存块,所以需要多个自由链表。
具体抽象结构大致如上,每个线程都会有一个thread cache对象,这样每个线程在这里获取对象和释放对象的时候是无锁的。
申请内存
当内存申请size<=256kb时,先获取线程本地存储的thread cache对象,计算size映射的哈希桶自由链表的下标i
如果自由链表的freeLists[i] 中有对象,则直接Pop一个内存对象返回
如果freeLists[i]中没有对象,则批量从central cache中获取一定数量的对象,插入到自由链表,并返回一个对象
释放内存
当释放内存小于256kb时将内存释放回thread cache,计算size映射自由链表桶位置i,将对象Push到freeList[i]
当链表的长度过长,则回收一部分内存对象到central cache
内存碎片
外碎片问题前边已经讲过,这里只说一下内碎片的问 ...