|
|
51CTO旗下网站
|
|
移动端

madvise

《iOS和macOS性能优化:Cocoa、Cocoa Touch、Objective-C和Swift》第7章内存:陷阱和优化技巧,本章将围绕这个话题来进行讨论。除此之外,我们将展示一些陷阱,尤其是在Objective-C 代码中经常出现的问题。本节为大家介绍madvise。

作者:李俊阳 等译来源:电子工业出版社|2018-07-17 17:55

madvise

尽管页面迁移并不会影响程序的语义,但在数据的处理之前,页面迁移可以让某个映射文件进行局部I/O 操作,从而大幅提高性能。实现这一效果的另一种方法是使用madvise 系统调用,它允许通过特定的地址空间片段来向系统提供未来计划的相关提示(“建议”)。

MADV_WILLNEED 是可供选择的提示之一。它的效果是,对所有当前不在内存中的数据进行页面调度,也就是类似于页面迁移器的作用,不过更加简单。一旦不再需要使用某块内存,就可以使用MADV_DONTNEED 来通知系统,这将使符合条件的页面提前被清除掉。如果只是需要按顺序访问内容的话,那么MADV_SEQENTIAL 会让系统执行预读操作,从而减少开销。

回到本章“架构注意事项”一节中的讨论,整体采用内存映射方法,并在特定位置使用MADV_SEQUENTIAL,使得程序在使用简单的调用并返回架构风格的同时,还能够享受到数据流架构风格所带来的性能优势,这种做法将提供额外的灵活性,无须打破限制就可以突破这种风格。

MADV_FREE 与MADV_DONTNEED 类似,只是它意味着不会关心内存中的内容,也就是说系统可以随意将其移除。(使用MADV_DONTNEED 的脏内存同样需要页面调出。)Snow Leopard 中更新的malloc 函数会将MADV_FREE 应用到已释放的堆内存中,从而避免将不再包含有用数据的内存交换到硬盘中。

大量使用madvise 时需要谨慎,因为不同的madvise 选项可能会对内存占用和性能产生巨大的影响。要注意两个要点:第一,所有与madvise 相关的建议仅供参考,内核并没有义务去遵循这些建议(在Leopard 之前,大多数的选项实际上都会被忽略掉);其次,这些选项往往都是全局性的,因此在处理共享映射时,很可能会对其他进程正在使用的内存产生干扰。

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

Java程序设计专家门诊

精选目前国内外最流行的程序设计语言——Java作为本书的选题,并以丰富的内容来解决读者学习该语言时可能遇到的各种问题。以专业的论坛为基...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊