:《windows核心编程》之线程、线程同步,线程与进程的关系,线程与作业的关系

来源:互联网 发布:唐山小白帽事件 知乎 编辑:程序博客网 时间:2024/06/05 22:58

关于线程

学习windows编程,编写高性能的程序,不得不去弄清楚线程内核实现,我们知道,每一个程序,哪怕是最最简单的程序(我们日常编写的),都有一个主进程,而在主进程内部,起码有一个主线程,进程是惰性的,它不执行任何代码,只保存进程上下文的一些必要的信息,也就是说,进程是线程的容器,而具体执行代码的是进程内部的线程,线程也有自己的上下文,操作系统同样也要创建内核对象对线程进行有效地管理.,这个内核对象也是一个小型的数据结构,包含线程的统计信息和线程执行时必要的一些参数和局部变量,在进程内部创建线程时,进程会分配地址空间和必要的内存空间给线程使用,任何该进程的内部的线程都一样,都共享进程中的所有存储空间,对象,所以,线程中通信就格外变得方便,这也正是建议windows核心编程建议创建线程替代进程的原因之一(如果可能的话),关于其他的原因,则是因为线程运行时的开销要比进程运行时的开销要小得多。

 

我们可以利用windows API: createthread(...)创建自己的线程,只要将线程执行代码放在一个函数中,再将这个函数的地址(函数名)赋个createthread的一个参数就可以了。关于线程中的更多细节,这里不谈。可以参考《windows核心编程》。

 

 

关于线程同步

上面说到线程间通信很方便,因为所有线程共享所属进程的地址空间,而且存储空间也在进程栈上分配,正因为如此,在没有为每个线程指定特定不同的优先级的情况下,windows操作系统会在空闲的时候随机调用进程中的某个线程,这个机制是公平的(《windows核心编程》)(当然,尽管你为每个线程都指定不同的优先级,也不一定按照优先级先后调用线程,分配时间片,加上优先级,只是告诉系统,在空闲的时候尽量调用这些优先级高的线程),系统会在随机的情形下去为某个线程分配执行(你无法预料在某个时刻哪个线程会执行),所以,如果在线程们访问进程中的某个数据时,就会出现随机性(该数据不知道什么时候会被哪个线程访问),这样,就出现数据紊乱,windows支持原子访问(在某一时刻只有一个线程访问指定数据区),在用户模式下可以用锁机制,在内核模式下可以使用信号量对象,事件对象,互斥量对象,关键段等。(关于更多信息可以参考《windows核心编程》)

关于进程和线程的关系

其实在前面的章节中已经多次提到,进程是惰性的,它不执行任何代码,那么,到底由谁来执行?

答案是由进程中的线程来解决执行,进程是线程的容器,线程在进程的地址空间中执行代码,修改数据,一个进程可以有多个子线程,线程可以继承父线程的内核对象句柄,从而达到数据的共享

线程和作业的关系

windows有作业机制,作业其实是施加在进程和线程上的一个限制层,我们可以讲自己的进程(或线程)(一个或者多个进程(线程))放在一个作业中,然后对作业进行操作,就可以对作业内部的所有进程(线程)施加某种限制

 

 

 

 

 

 

原创粉丝点击