iOS 进程的内存布局和生命周期

2020-04-17  本文已影响0人  水中的蓝天

本文源自本人的学习记录整理与理解,其中参考阅读了部分优秀的博客和书籍,尽量以通俗简单的语句转述。引用到的地方如有遗漏或未能一一列举原文出处还望见谅与指出,另文章内容如有不妥之处还望指教,万分感谢 !

需要了解的小小知识点

程序:

全称 计算机程序(Computer Program),是一组计算机能识别和执行的指令,又称计算机软件
是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,用某些程序设计语言编写,如:C、C++、OC等;它运行于电子计算机

进程:

是计算机中的程序关于某数据集合上的一次运行活动
是独立运行、独立分配资源和独立接受调度的基本单位
是操作系统结构的基础
在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体

一个合法的APP在iPhone上安装成功后,会有一个代表APP的图标显示在桌面,点击图标就可以打开APP愉快的玩耍!这个打开的过程就是进程的调度过程。

进程是怎么运行的呢 ?

在iOS中进程通过Progress ID(进程ID,即PID)来唯一辨识。进程还会将其和父进程的亲属关系保存在父进程ID(Parent Progress ID, PPID)中。父进程可以通过fork(或通过posix_spawn)创建子进程,并且预期子进程会消亡。子进程返回的整数由其父进程收集。

iOS进程生命周期

进程状态切换 —— 图片引用自《深入解析Mac OS X & iOS 操作系统》 .png

对进程有一个了解后,就来看看进程的内存布局

进程的内存布局.png

简单理解图中关键词

---------------Linux中进程的内存段布局---------------

上图是一张32位x86架构上运行的Linux中进程的内存段布局, 通过该图从上至下的简要分析Linux中进程的内存分布情况和各自的大致用途:

内核空间和用户空间:

用户空间内存布局

通过不断向栈中压入数据,超出其容量就会耗尽栈所对应的内存区域,
这将触发一个页故障(page fault),而被Linuxexpand_stack()处理,它会调用acct_stack_growth()来检查是否还有合适的地方用于栈的增长。
如果栈的大小低于RLIMIT_STACK(通常为8MB),那么一般情况下栈会被加长,程序继续执行,感觉不到发生了什么事情。这是一种将栈扩展到所需大小的常规机制。
如果达到了最大栈空间的大小,就会栈溢出(stack overflow),程序收到一个段错误(segmentation fault)。

注: 动态栈增长是唯一一种访问未映射内存区域而被允许的情形,其他任何对未映射内存区域的访问都会触发页错误,从而导致段错误。一些被映射的区域是只读的,因此企图写这些区域也会导致段错误。

mmap内存映射

image.png

代码段

BSS和DATA段下是代码段(TEXT),这段中存有程序的指令代码。Text段是通过只读的方式加载到内存中的,他在多个进程中是可以被安全共享的。

参考文章:

Linux进程内存布局

上一篇下一篇

猜你喜欢

热点阅读