我们知道,不管是在繁忙的服务器还是比较空闲的pc机上,系统都不只是运行一个进程,在linux上,当用户输入命令,在程序被载入内存执行之后我们称之为进程。

   计算机的核心组件,cpu和内存,cpu由运算器和控制器组成,cpu只能从内存读入数据进行计算,那么在linux系统上,当用户输入一个命令,这条命令所对应的程序代码就会被装载进内存,然后由cpu执行,正是因为同时有多个进程需要执行而cpu只有一颗的情况下,在众多进程之间完成切换就显得比较重要。

   我们知道,cpu提供的计算能力是按照时间的流逝来计算的,所以对于进程来说,进程的执行我们就可以简单的理解成为是进程获得了一定的cpu时间,进程在cpu上运行的时候,例如cat /etc/fstab命令的执行,cat这个程序需要读取/etc/fstab这个文件的文件内容后将其输出到stdout,由于/etc/fstab文件是存储在硬盘上的,能够直接操作硬件的只有内核,那么cat程序就需要通过内核向上输出的系统调用向内核发起请求,由内核去将/etc/fstab文件的内容从硬盘读取至内存,再由cat程序输出,那么在内核读取文件这一段时间,cat这个进程需等待内核输出,不然无法继续运行,在这种情况下为了避免cpu的计算能力浪费,这个进程就会转入不可中断睡眠状态,切换其他进程到cpu上去运行。还有,当一个进程正在cpu上执行的时候,如果分配给该进程的cpu时钟周期已经耗尽,这个进程也应该退出,切换其他进程运行。

   不管是上述哪种情况,在下次这些进程继续被调度至cpu上运行的时候,必须从上次切换出去的地方继续开始,这也就意味着进程切换在讲一个未执行完毕的进程切换出去的时候,必须要保存该进程的相关状态信息,我们称之为保存现场,也就是将该进程在cpu上执行的相关信息比如cpu寄存器中的内容保存至内存中,当再次调度该进程执行的时候,内核同样也需要将这些信息再放回原来的位置,这个过程称之为恢复现场

   内核(也就是系统软件)也是需要在cpu上去执行的,那也就意味着内核也需要占用内存资源,因为内核的主要功能就是管理硬件资源,在内存上内核占据的空间称之为内核空间,而应用程序所占据的空间就称之为用户空间,在用户空间运行着很多的进程,当然进程管理是需要内核去实现的,那么内核就需要知道当前系统上有哪些进程以及这些进程的相关状态属性信息,所以内核就需要为每一个进程都维护一个表结构,里面需要放置进程的pid,执行状态的相关信息,这个结构我们称之为task-struct,所以正是因为内核维护了这么一个表结构,所以才能实现进程的调度,保存现场以及恢复现场。不管是保存现场还是恢复现场,在内核将进程的状态信息从cpu寄存器保存在内存或者再恢复原位,这些都是需要消耗时间的,所以,过多的进程切换会大幅度的降低系统性能(apache的prefork模型就会因此成为系统的瓶颈

  每一个应用程序的运行都需要内存资源,那么如何有效的管理内存资源,如果在应用程序运行的时候就分配给其资源,那么一段时间之后,内存上就很容易的产生很多碎片,并且很可能因为一个程序的bug覆盖了其他进程的内存空间,导致进程无法正常运行。所以,linux管理内存的机制使用了虚拟内存或者说是线性内存的概念,大致意思就是,系统上的用户空间的每一个进程都不会意识到其他进程的存在,而只有自己和内核,假如在32位的系统上,它就会认为自己的内存空间为4G(其中1G内核),进程之间彼此是独立的,那么最终每一个进程的相关数据还是要放在同一个物理内存,那么在虚拟内存和线性内存之间的转换对内核来说就显得尤为重要,为了避免浪费资源,将物理内存分为一个个固定大小的页框,然后将这些页框也虚拟内存的页面一一对应,从而达到目的,记录这个转换关系的结构我们可以将其理解为task-struct的一个子结构。我们知道,在程序运行的时候程序可能会加载动态库,wKiom1YgsW7Cp4unAAK3qeSiDT8668.jpg

  如图的Memory Mapping Segment段,这段可能是没有必要载入多次的,所以记录内存的方法就分为两种,vsz表示虚拟内存区域(就是站在一个单独的应用程序的角度看其所占据的内存空间),RSS表示常驻内存,就是真实物理内存上其所占据的内存空间大小。  

   在程序编写的时候,如果没有使用并行编程的方法,那么进程是只能在一个cpu上运行的,如果使用了并行变成,那么这个程序在执行的时候就会有多个执行流,每一个执行流都可以在一个cpu上执行,这样就可以显著的提高系统性能,这个执行流的概念我们就可以将其简单的理解成为线程,以mysql为例,mysql的高性能就是因为多个线程并行执行,所以mysql服务器一般对硬件要求比较高,但是mysql一个线程只能在一个cpu上执行

 本文只帮助理解一些相关概念,理解一些进程管理相关命令,所以描述的比较浅薄