Principe University Algorithm Course And Blogs
数据结构、算法的学习之路,后续发展成随笔记录
英文文章翻译以及不错的文章记录
beego 小部分源码,主要为 log 模块和 tool 模块
leaf框架的源码分析,基于本身的游戏项目进行一定程度的分析
轻量简易版的A*算法golang实现
mysql mongodb redis
1.目前我知道 http.Request.Body 可以获取上传之后的文件具体内容,并且它是一个 io.ReadCloser 类型
2.再问一下 http.Request.Body 是服务器这边全部接收到了内容之后才能读取到吗?
3.http.Request.ContentLength 是如何得到的,是服务器这边全部接收到了内容之后算的?还是客户端那边带过来的
答:
如果文件很大,分片上传即可,在客户端分片,最后在服务器端组合成原文件,可以看看某些 CDN api 的实现,比如阿里云 CDN 等都有分片上传的实现.因为大文件直接上传时,碰到网络中断后就要重新开始, 那就要吐血了.
http.Request.ContentLength 是客户端实现的,有兴趣,就翻翻源码.
http.Request.Body 无需全部接收到了内容之后才能读取,但读取过程是阻塞的.
上传文件即是将文件编码为 multipart/form-data 后再放到 http.body 里进行上传,当 http.body 过大时,底层的 tcp 会分段进行传输.因此上传一个大文件,用 for 和小的 buffer 进行循环读取即可验证该过程.而且我说的"读取过程是阻塞的"是指客户端在传输过程中突然停止,服务端没数据可读时也会阻塞住.
Golang 运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc
算法,全称Thread-CachingMalloc
。
核心思想就是把内存分为多级管理,从而降低锁的粒度。
它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,
当内存池不足时才会向全局内存池申请,以避免不同线程对全局内存池的频繁竞争。
Go 在程序启动的时候,会先向操作系统申请一块内存(注意这时还只是一段虚拟的地址空间,并不会真正地分配内存),切成小块后自己进行管理。
- spans 区域
- bitmap 区域
- arena 区域
- mspan
- mcache
- mcentral
- mheap
内存池,垃圾回收。
- 动态分配内存大小
- 每条线程都会有自己的本地的内存,然后还有一个全局的分配链
- 两级内存管理结构,MHeap 和 MCache
MHeap 用于分配大对象,每次分配都是若干连续的页,也就是若干个 4KB 的大小。使用的数据结构是 MHeap 和 MSpan,用 BestFit 算法做分配, 用位示图做回收。
MCache 用于管理的基本单位是不同类型的固定大小的对象,更像是一个对象池而不是内存池,用引用计数做回收。
Go 语言实战笔记(二十七)| Go unsafe Pointer
Go 语言经典库使用分析(八)| 变量数据结构调试利器 go-spew