Linux日常之进程内存篇
基本概念
内核:运行于硬件之上,是操作系统的核心,运行于内存中
进程:计算机中运行的所有程序,并由内核统一管理,这些进程组成了用户空间
用户进程:如图形界面的进程,服务器进程,命令行进程这类用户层级的进程
内核在内核模式中运行,能直接访问处理器和内存,不能容错;而用户进程运行于用户模式中,一个进程崩溃不会影响整个系统的运行
线程:比进程更加细粒度的概念,一般所提到的进程都是单线程,多线程的进程的启动会比多进程要更快,主线程会类似fork
出来其他的子线程,
而且可以方便地相互通信以及共享IO和系统资源
内核对进程和内存的管理
- 进程:内核决定哪一个进程可以使用CPU
- 内存:内核管理所有内存,为进程分配内存,包括进程间的共享内存以及空闲内存
理解内核对进程的管理
对单核CPU来说,每一个进程都是轮流使用CPU,CPU会对每一个到来的进程计时,到时即暂停,接着切换至内核模式,内核会记录下CPU和内存的状态, 用于恢复被停止的进程,内核执行上一时间段的任务如磁盘读写,然后选择已就绪的进程来执行,内核为新进程准备CPU和内存(也可以是为了之前暂停的进程), 内核将时间段告诉CPU,内核将CPU切换回用户模式,然后进程继续使用CPU进行计算
CPU的使用权在进程之间切换的过程叫做上下文切换,内核运行于上下文切换的间隙时间中
系统调用
fork(): 内核创建进程副本
exec(): 内核使用exec(program)
中的program来替换当前的进程
需要内核帮忙的进程都使用先fork
然后exec(..)
的方式来请求内核
进程的追踪
常用命令:
进程信息:top
和 ps
进程与文件的信息: lsof
追踪系统调用: strace
追踪共享库调用: ltrace
追踪线程
$ ps m
或者 top
下按 H
测量CPU时间
$ top -p pid1
命令文件执行CPU计时
$ /usr/bin/time command
平均负载
$ uptime
表明CPU的繁忙程度,通常web服务器的平均负载较高,进程的启动快,结束也快
平均负载高但是响应慢的话通常是内存性能受到较大的影响,内存不足时会有很多的进程在准备状态,但是没有足够的内存供要执行的进程使用
内存的状态可以使用: free
命令查看
理解CPU,内核与内存的关系
CPU通过MMU(内存管理单元)将进程访问的虚拟地址转换为实际的内存地址,内核辅助MMU将进程使用的内存划分为更小的区域,成为页面,多个页面使用 页面表(内核维护的一个数据结构)进行管理,MMU可以通过这个页面表将虚拟地址映射到实际的内存地址,页面的分配是按需分配,按需的过程大致是开始时指令会被加载到 页面,如果这个进程的下一个指令被执行的时候之前已加载的内存页面不存在,那么内核就会加载指令需要的内存页面,再让程序恢复执行,如果进程需要更多的内存,也同样需要 内核先去获得更多的内存然后再进行分配
内存页面中的错误
- 轻微内存页面错误:如果需要的内存页面在主内存中但是MMU无法找到,通常是进程想要更多的内存但是MMU中的空间有限时发生
- 严重内存页面错误:如果需要的页面在主内存中不存在的话,那么内核就会尝试从磁盘等存储媒介中加载,多数的错误会影响系统性能,在第一次从磁盘中加载代码或者 是内存不足时极可能出现
查看方式:
$ /usr/bin/time
对CPU和内存进行监控
$ vmstat n // 每n秒刷新一次数据
IO监控
- 全局
$ iostat
- 对进程
$ iotop