您的位置:首页 > 其它

熬之滴水成石:最想深入了解的内容--windows内核机制(4)

2013-11-12 09:55 316 查看
56--关于进程和线程(1)

这两个东东应该是在编码生涯里用到最多了,我们知道进程其实包括了许多内容。最为核心的其实就是一个环境,这个环境就是进程依托的生存环境这里面包括了地址空间、句柄表等。每个进程都会有一个自己的线程,或者也可以拥有多个线程。我们知道进程在创建的时候,实际上就创建了一个线程。当进程自己的最后一个线程被over掉时那么就意味着这个进程也到了结束的时候了。线程实际上可以理解是一些方法,被放到一个栈里面,这个栈可以记录执行的历史。在windows中是一个多进程并行的系统环境,但处理器的调度则是线程来管理的。在面向对象设计的windowsOS中,进程是有父子关系,进程在许多属性不明确的时候,均继承父进程。不过这样的继承跟面向对象的设计还是不一样的,这样的父子关系仅仅只是相互记住了一个ID号而已。进程和线程的实现机制都是属于微内核的内容,而管理进程和线程则是在用户层的实现的。这种机制充分体现了面向对象的思想,机制和策略相分离。

我们来看看进程是怎么来的吧!进程的创建实际上是在PspCreateProcess的方法中完成的,这个过程通常是创建了一个进程对象,然后再初始化进程的状态,这里面其实就是创建了属于该进程的地址空间。而线程的创建则是在PspCreateThread完成的,也是先创建一个线程对象然后再初始化其域,这主要是维护线程与进程之间的关系。当然这里面涉及到一些复杂的情况,像windows子系统创建线程就远远比这个复杂些。windows子系统的进程就是大名鼎鼎的csrss.exe。它创造线程也许有些是在系统中的DLL完成的,通常要有内存区对象,然后再调用这些内核中的函数来创建进程。调用的过程也比较复杂,当线程开始执行的时候,总是从某个预定函数开始,这个函数还会从内核模式切换到用户模式,执行基本的进程初始化任务,包括加载必要的链接库,并执行每个库的初始化工作。当初始化完成后,最终控制权会进入用户指定的线程启动的入口。当然线程在windowsOS中是抢占式的调用方式,按照约定OS会赋予线程一个基本的优先级和动态优先级,我们在编码线程时是肯定会遇到这个参数的。这个参数从0到31逐渐加强,实际上只要线程被唤醒时这个线程的优先级是会一点点的增强的。优先级的增强也意味着处理器会尽早的处理该线程。线程实际上在执行中只有2种状态,被执行,被等待!执行时表示该线程符合了条件,反则不被符合。当然最为复杂的情况还是有多个线程队列的时候,CPU如何权衡多个队列之间的关系这里面的调度算法也是比较复杂的。对了,还有一个以前在课本上学到的概念:迁程。迁程的概念实际上相当于用户线程,它对于内核是不可见的。实际上我对它根本没使用过,很多时候都只是一种理论上的认识,没有真正实践过!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: