免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: Godbach
打印 上一主题 下一主题

[实践] 它山之石,可以攻玉--从内核中学到了什么(获奖名单已公布-2014-4-21) [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
81 [报告]
发表于 2014-03-20 09:11 |只看该作者
发现吵起来了于是从头到尾挨着翻了一遍。。。  结果没吵几楼嘛。。。
我太坏了。。。 匿了。。。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
82 [报告]
发表于 2014-03-20 09:55 |只看该作者
回复 81# OwnWaterloo

唯恐天下不乱?


   

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
83 [报告]
发表于 2014-03-20 10:25 |只看该作者
回复 82# Godbach

其实从吵架里也可以学到东西的。。。 当然也还是得分人。。。
看到是这两人吵起来就急急忙忙的把所有楼都翻完了。。。 生怕看漏了点什么。。。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
84 [报告]
发表于 2014-03-20 10:28 |只看该作者
来凑个热闹。。。 其实刚才一直在写。。。

1. 内核的哪些数据结构以及 API 被用到或者移植到了和内核没有直接关系的工作中

最开始并不理解linux或bsd的数据结构的必要性。
它们确实同时解决了通用性(与元素类型无关)和效率(不需要void*本身以及可能的一次额外分配)。
但我直到现在都觉得这是以易用性作为代价换来的。

直到自己要实现一个内存分配器的时候。。。
因为需要内存有执行权限于是只能从VirtualAlloc或mmap入手。
于是就出现了一个先有鸡还是先有蛋的问题 —— 要管理VirtualAlloc/mmap得到的内存本身就需要一些数据结构,而这些数据结构的内存又该从何而来?
其实这个时候还可以退回到malloc/new/vector来管理这些有执行权限的内存。或者干脆退回到HeapAlloc什么的而不管非Windows了。。。

"modern C++ desgin"和《STL源码剖析》里介绍过为许多小的但大小固定的对象实现内存池的方法。要点是将一大块内存划分为固定的小块,并在没有分配的时候就将未占用的块作为链表。
不过管理这些大块内存时依然用的是std:: vector。 如果在这之上更进一步,在管理的内存中再保留一些空间就得到管理它们的数据结构需要的内存,于是可以避免使用malloc/new/vector了。
实现完后会过头终于把linux和bsd的数据结构独特的地方(intrusive?)想清楚了。。。

2. 分享一下曾经解决了燃眉之急的某个内核新特性

估计都不是新特性,不过确实解决了问题。
问题本身是要从一个内核空间的特定位置上读取16个字节。因为那里存放的是cpu的唯一标识符。
不知道应该怎么做。。。 于是只好写内核模块。。。
写好了后终于可以读了,然后想怎么暴露到用户空间。。。
首先尝试的是/sys (module_param...)。 这个简单。。。 基本算是完成任务了。。。
而/proc文件系统对应的api,不管是老的还是新的都不敢用。。。
最后用的是 call_usermodehelper_setup 产生一个进程并将读取到的唯一标识符作为参数传递。然后让模块加载失败。。。 避免一个初学者写的模块一直挂着。。。

这期间还研究过kmem和kexec(为了另一个问题),不过都没有成功。。。

3. 介绍一下个人曾经研究过的某个内核特性

也就是上面那些了。因为工作需要只好硬着头皮去弄。。。 有一个感觉还靠谱的解决办法后也没有时间进一步深入了解。。。

评分

参与人数 1可用积分 +8 收起 理由
Godbach + 8 这是干货,感谢分享。

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
85 [报告]
发表于 2014-03-20 10:31 |只看该作者
回复 83# OwnWaterloo

理越辩越明。


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
86 [报告]
发表于 2014-03-20 10:32 |只看该作者
回复 84# OwnWaterloo


干货,赞一个。

多谢分享。

   

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
87 [报告]
发表于 2014-03-20 10:58 |只看该作者
回复 86# Godbach

这实在是不敢当。。。 因为平时不怎么接触这些,于是了解都很有限。
而一旦遇到问题就捉急了。。。 那种"虽然代码是写好了运行也没发现明显问题却因为是临时抱佛脚的产物"而不敢用的心情。。。 太纠结了。。。
于是在这里抒发现丑了。。。

论坛徽章:
2
亥猪
日期:2014-03-19 16:36:35午马
日期:2014-11-23 23:48:46
88 [报告]
发表于 2014-03-20 20:38 |只看该作者
本帖最后由 gvim 于 2014-03-20 20:40 编辑

回复 84# OwnWaterloo

来来一起撸撸。。。
说到内存管理,个人觉得postgresql的还比较有意思。
虽然设计关注点不一样,很多底层比如freelist这种通用思想也和内核有共通之初。
pgsql是数据库,它的环境相比较内核来说,杂乱的分配是必须的,因为中间各种数据要内存,子查询要内存,事务要内存,IO出来的元组需要内存,网络需要内存,然后还要回滚,要优化,等等等等,相比较而言web服务器的内存使用场景算简单的,复杂性个人评估在各种系统级应用中天字第一。OLTP环境里一个SQL语句不少时候也能在上k行的量。pg7, 02年之前,内存老泄,排查十分困难,分配路径太杂。
和内核不同的是它不需要兼顾公平和通用。我个人理解为分级递归管理。用几个数据结构来形成一颗树或一个森林来管理,每个节点做为一个context,不同的内存申请在不同的处理阶段在不同的context中进行,每个context可以有自己的init/alloc/free函数系,每一次的内存操作都在对应的context中,当然也可以用一套函数系(好处是可以很方便的自定义memory management algorithm)。这里也有freelist,block这些典型的mem管理元素的出现来管理碎片,链条。到释放的时候,就很规整,按级别,按顺序,可以递归整体,可以释放孩子。
网上扒的一个context示意图,管中窥豹,管理的复杂度可见一斑。

kk.png (21.29 KB, 下载次数: 48)

网上抓的

网上抓的

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
89 [报告]
发表于 2014-03-21 09:43 |只看该作者
回复 88# gvim

强撸灰飞烟灭啊

   

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
90 [报告]
发表于 2014-03-21 21:08 |只看该作者
回复 88# gvim

是不是粒度很粗的那种?
从一个很大的块上面拿,每次其实只负责移动一个指针,大块不够了就继续找另一个大块。
回收的时候并不是每次分配对应一个回收, 而是直接回收某些块? 当然用户自己要保证使用场景适合这种大量分配许多生命周期差不多的内存。

学名叫region-based memory management?
实际例子有CvMemStorage(OpenCV), apr_pool_t等。
印象中sqlite好像也是这么干的,好像也叫memory context什么的。。。 但没找到出处。。。 可能是我记错了。。。

postgres正在用啊。。。 但不是研究它的源代码而是网站要用啊。。。 开发网站需要一堆乱七八糟的知识和技术搞得人头昏涨。。。
又是因为工!作!需!要! 去看了看它使用ident认证那部分代码, 而其他的完全撸不动了。。。 灰飞烟灭。。。 灰飞烟灭。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP