进程相关(1)

进程与写时复制

进程就是正在运行的程序

 我们的系统上可以同时运行那么多的进程是由谁进行管理的呢?是由内核进行管理的,进程管理是内核一个必要和重要的功能,此外还有网络管理,TCP/IP协议栈是集成在内核当中的,为什么要集成在内核当中?网络通信是一个很多程序都会用到的功能而且需要与硬件打交道,如果把TCP/IP协议栈放到用户空间的话效率太低。

为什么要创建子进程?在讨论进程管理之前我们要明确为什么要创建一个子进程,当一个进程面对一个比较复杂的任务的时候就会在原来进程基础上创建一个新的进程,把这个复杂的程序委托子进程完成,当子进程把委托给给它的的任务完成之后会把结果返回到父进程。

进程是如何创建的?内核并不负责进程的创建,内核在cpu上运行起来掌管了一切之后,意味着内核空间启动,开始创建第一个进程init(初始化进程),init启动完成之后意味着用户空间创建完成,init负责创建用户空间的进程的管理,当我们创建一个进程的时候是init按照自己的样子进行创建的或者按照父进程创建的。内核就相当于上帝而init进程就相当于上帝派下来管理人间事物的使者,使者大人负责创建进程和回收进程这类的杂事,当然使者大人也不是万能的,它也需要产生一个又一个进程帮助它完成任务,还有对于向内核申请资源的大事使者大人也不敢压下,还是会向内核报告,因为对于分配资源这种事,也只有内核才能完成,其他任何人都没有这个能力,在linux当中,内核就是上帝。

父进程创建子进程时请init程序批准,并向内核申请资源(cpu和内存的使用),子进程创建之初是与父进程共用一个用户空间的,当子进程自己独立之后要使用新的内存空间和数据进或者需要去修改自己的数据的时候父进程不允许的,因为一旦修改了你进程就没办法用了,然后把父进程的数据复制一份到子进程的用户空间单独单独修改,这也就是写时复制。

资源分配和进程销毁

对cpu的分配 ,进程有那么多个,但是cpu只有一个,怎样进行分配呢?通过对cpu进行切片分时,一个进程使用一小会儿,比如说是5毫秒,五毫秒到了之后 不管这个进程有没有完成都要退下让下一个进程上去运行。但是如果有进程占着cpu不愿意下去呢?这是不可能会发生的情况,内核掌握一切,运行五毫秒之后不管怎样都会一脚把这个进程踢下去的。把当前的进程踢下去之后下次再运行的时候肯定要是沿着上一次的没有运行完成的地方继续运行,但是在什么地方保存着进程当前的状态呢?进程的运行状态保存在cpu的寄存器当中,当进程从cpu上退下之后其实是把进程的状态保存到内核的任务结构体当中,当又轮到该进程使用cpu的时候可以快速读取内存当中此进程的状态,然后沿着上一次执行的痕迹继续向下运行。保存状态的过程的称做保存现场,恢复状态的过程称做恢复现场,在内核当中保存的进程状态信息的容器叫做“任务结构体(内核用来存储进程状态的固定格式)”在用户空间是可以通过命令查看到些任务结构体的。如果好多个任务结构体放在一块就组成了一个链表。进程是白发人送黑发人的,父进程需要完成一个复杂任务时才创建子进程,完成任务之后返回结果,子进程完成之后由父进程进行销毁, 子进程在执行任务的时候父进程处在等待状态,父子关系保存到任务结构体当中,其优先级也保存到任务结构体当中,如果父进程没有来得及销毁子进程父进程就挂了的话也没有问题,因为有“上帝的使者”的存在,上帝的使者可以销毁这个进程。

进程是有优先级的.这个世界没有绝对的公平,在计算机的世界也是一样的,也是有优先级的。举个例子:比如一个ping请求到达主机,cpu就必须立刻做出回应,如果这个ping请求没有任务特权的话(不能立刻得到回应),当cpu有空闲时间来处理这个ping请求时,可以这个ping请求早就请求超时了,所以ping请求的优先级是比较小的,比较小就意味着优先级越高,能够被cpu优先执行。再比如:主机忽然断电了,还好我们的主机还有备用电源,当然也会有相应的进程,当这个进程查看到有断电情况会立刻做出决断,这种进程的优先级也是比较高的。

NICE

内核把进程的优先级划分了固定的个数0-139,共140个优先级,1-99是实时优先级,数据越大优先级越高,这一部分优先级是由内核直接管理的,root也不能插手。 100-139静态优先级:数字越小,优先级越高。相同优先级排成一列,这样的话无论是有多少个进程内核只要扫描一上这个链表都知道他们的优先级了。

一个进程优先级高意味着下面两点:

   获得占用cpu更多的时间

   优先获得运行的机会

这一优先级范围内的进程root都是可以调整的。

image.png

nice是范围是-20到19,分别对应100-139,还是nice值越小优先级越高,调整nice值就相当于调整优先级,一个进程的默认优先级是0. 如果一个进程的NI从0调整到-5的话,就相当把进程的优先级就从120转换成了115,0对应120,120-5=115。普通用户只能让自己的进程的优先级值变大,变大意味着优先级降低,只有root可以随意的更改,当然也只能在100外调整。

当内核需要调用一个新的进程到cpu的时候就从此链表当中选择,当在cpu上运行完之后 会放到另一个链表当中,另一个链表的构造同这一个是一样的,当这一个链表上所有的进程都运行完了之后就向另一个链表当中选择进程去cpu运行。

对内存的分配,进程有那么多,内存也只有一个,怎样进行分配呢?我们知道用户空间的进程是不能直接与硬件打交道的,都要经过内核,内核会把内存给分成片,一片占据4K,这一片其实就是一个页框。内核把页框进行虚拟,虚拟成线性地址空间,当程序进行开发的时候,程序员假设内存有4G或者8G开发程序,其实一个程序是不能一下子把内存条都占用了,进程占用的其实是线性地址空间,这个线性地址空间是内核用来欺骗程序的,这个程序能使用多少真正的内存空间就分配给它多少空间,但是在进程看来它占用的是整个内存条,进程的存在于内核给它编织的虚拟世界当中。当真正的内存没有页框可以使用了,内核会扫描一下整个内存当中的页框,通过一个算法计算出使用最少的的页框放到swap分区,那么如果是这样做了,当真正使用这个页框的时候内核是怎样操作的呢?我们前面提过内核当中有一个进程任务结构体,这个结构体不仅保存了进程的状态还保存了进程使用了哪些线性地址空间还有对应的物理地址空间,当这个程序调用到cpu进行运行的时候,内核会通过读取这个任务结构体里面此进程对应的地址空间把页框从swap分区中重新加载到内存当中,在此过程当中会有一个异常就是缺页异常,因为内存当中的页框被调用到了swap当中了,不能马上找到这个页框,需要去硬件当中调用。

进程有没有可能摆脱内核的控制?进程是没有办法摆脱内核的控制,除非内核有漏洞,当进程由用户空间转向内核空间的时候会发生一次软中断 ,这一次中断其实就是让内核醒来的操作

IO

IO分两个步骤,硬件>内核>进程

当我们在shell当中cat一个文件时候,cat 进程会请求内核帮它从硬盘当中读取出文件,因为只有内核可以与硬件打交道,当内核从硬盘当中读取了这个文件的内容之后 再把这个内容放到cat进程当中。也就是说,进程发起调用等两段时间,第二段才是真正的IO过程。

image.png

通过上图我们可以看出IO的一些情况,当第一次我们备份/etc/目录时,所花费的时间很长,因为这一次全新的IO,cp命令向内核申请,内核把数据从内核当中调用出来到内核空间,然后再分配给进程,这是两段过程。当第二次的时候因为数据已经在内存当中还没有清除,此时的IO就成了一段而不是两段,所以速度快了很多。


猜你喜欢

转载自blog.51cto.com/13778749/2161478