进程内存布局
堆(malloc)从下往上动态扩展;
栈(局部变量、返回地址。调用函数压栈,返回函数弹栈)从上往下动态分配。
进程状态
cpu调度
理论上,同一时刻单核 CPU 只能运行一个进程,但很多时候,我们可以同时运行的程序数量远大于 CPU 的核心数。这是因为,操作系统的 CPU 调度单元对 CPU 的资源做了
时间分片
,即在时间尺度上对CPU 做了划分,如15:15到15:16 执行进程 A,15:16到15:17执行进程B。
通过中断防止死循环:
如果没有中断,当用户进程执行死循环时,CPU 会被一直占用,内核是无法夺回控制权的。
通过设置时钟中断,每隔一段时间,内核就可以收回 CPU 的控制权
虚拟内存、物理内存
虚拟内存是计算机系统内存管理的一种技术,它为每个进程提供了一种“虚拟”的地址空间,
这个地址空间
对于每个进程来说看起来都是连续
的,但实际上可能被
分散地存储在物理内存和磁盘
(如交换空间或页面文件)。
虚拟内存允许系统超额分配内存,即分配的内存总量可以超过物理内存的实际容量。
虚拟内存简化了内存的管理,使得应用程序不需要关心物理内存的实际情况。
在没有mmu的单片机里(stm32),只有线程的概念。在有mmu的处理器中(rk),就会有进程,线程的概念。mmu可以实现内存空间的隔离,以达到进程要求的独立性。
异常和中断
上下文切换:
保存上下文:
保存当前任务的 CPU 寄存器(程序计数器、栈指针等寄存器状态,进程的内核栈和用户栈的信息、 内存映射信息(如页表条目),打开的文件描述符表)中的值保存到该任务的内存空间中。
进程上文是指进程被挂起时其执行状态的集合。
执行下文:
在保存完当前任务的上下文后,操作系统可以切换到另一个任务执行。将其对应的下文加载到 CPU 的寄存器(程序计数器、栈指针等寄存器状态,进程的内核栈和用户栈的信息、 内存映射信息(如页表条目),打开的文件描述符表)中。
进程下文是指将要被加载和执行的挂起进程的执行状态集合。
恢复上下文:
当操作系统再次决定要切换回之前暂停的任务时,它会从之前保存的内存空间中提取之前保存的值,并将这些值加载回到 CPU 的寄存器中。
这个过程确保了任务可以从它上次执行的状态继续执行,而不会丢失其执行的上下文信息。
缺页故障
在程序试图访问虚拟内存中的某一页但该页当前并未加载到物理内存时。
缺页故障的处理通常包括以下几个步骤:
- 中断处理:当发生缺页故障时,CPU会中断当前程序的执行,将控制权交给操作系统内核。
- 页调度:操作系统内核根据页表中的信息,将缺失的页从磁盘(虚拟内存)加载到物理内存中的空闲页框中。
- 更新页表:一旦页被加载到内存,操作系统更新页表,使得该虚拟地址再次映射到正确的物理地址。
- 恢复程序执行:操作系统将控制权返回给引起缺页故障的程序,并重新执行导致缺页故障的指令。
进程创建
写时复制机制
可以提高进程创建效率。子进程完整地复制了父进程的地址空间,此时父子进程的虚拟内存空间映射到相同的物理内存空间。
只有当
二者之一执行了写入操作
才会复制写入区域的内容,为父子进程维护不同的物理页帧。
守护进程
被守护的进程不与任何
终端
(窗口)直接关联,
在
后台运行
。
它独立于任何用户,即使
被用户kill掉
,
也能通过守护进程
重启
。
守护进程通常在系统启动时启动,并持续运行直到系统关闭,或者它们完成其任务并自行终止,其父进程是操作系统,无法kill。
守护进程通常不需要标准输入、输出和错误文件描述符,因为它们不与终端交互。关
闭
文件描述符
可以避免资源泄露。
可通过 tail -F /var/log/syslog 命令来查看日志文件