Win 32 多线程程序设计学习笔记之一:基本概念

来源:互联网 发布:发乎于情止乎于礼 编辑:程序博客网 时间:2024/06/05 03:39

1.从win32角度看,进程含有内存和资源。被进程拥有的内存,理论上可以高达2GB。资源则包括核心对象(如file handles和线程),USER资源(如对话框和字符串),GDI资源(如Devives Context和brushes)。


2.进程本身并不能够执行,它只是提供一个安置内存和线程的地方。


3.Matt Pietrek在Windows 95 System Programming SECRETS一书中的解释是:“进程就是一大堆对象的所有权的集合”,也就是说,进程拥有对象。进程可以拥有内存(更精确地说是拥有memory context),可以拥有file handles,可以拥有线程,也可以拥有一大串dll模块(被载入这一进程的地址空间中)。


4.每一个进程都关系到内存。内存可以大致分为3种类型:

code,Data,Stack


5.Code是程序的可执行部分,一定是只读性质。这是CPU唯一允许执行的内存。可执行Windows NT的两种芯片:Intel芯片和RISC芯片都有这项限制。


6.Data是你的程序中的所有变量(不包括函数中的局部变量),可以区分为全局变量和静态变量两种。当然线程也可以使用malloc()或new动态配置内存。


7.Stack是你调用函数时所用的堆栈空间,其中有局部变量。每个线程产生时配有一个堆栈。如果不需要,操作系统会将它动态扩充。


8.进程和内存并没有真正”做“什么事情。一旦cpu开始执行程序代码,你就有一个“线程”。在同一时间同一进程,你可以拥有一大把线程,执行同一段代码。定义一个线程,需要的数据并不多。线程在“任何时刻下的状态”被定义在进程的某块内存中,以及CPU寄存器中。其他重要的数据,如变量以及应用程序的调用堆栈,存储在进程中的那些可被其他线程共享的内存中。


9.线程相比于进程而言线程廉价,启动比较快,退出也比较快,对系统资源的冲击比较小,而且,线程彼此分享了大部分核心对象(如file handles)的拥有权。


10.Unix产生一个进程所需的额外负担(overhead)比在win32中低的多。然而,win32产生一个线程,代价又更廉价的多。一个单cpu的Windos NT机器上拥有500个线程并不是太过分的事情,而大部分Unix如果有500个进程就会有严重的效率问题,甚至几十其中大部分没有活动(non-active)。


11.在抢先式多任务系统中,当硬件计时器认为某个线程已经执行很久了,就会发生一个中断(interrupt),于是CPU取得目前这个线程的当前状态,也就是把所有寄存器中的内容拷贝到堆栈中,再把它从堆栈中拷贝到一个CONTEXT结构(这样便存储了线程的状态)中,以备以后再用。


12.要切换不同的线程,操作系统应先切换该线程所隶属之进程的内存,然后再恢复改线程放在CONTEXT结构中的寄存器值。这个过程被称作context switch。也就是换一套memory context--page directory和page tables。


13.不同线程间如果需要通讯,唯有依赖特别的设计,使之拥有共享内存(shared memory)。如果两个线程属于同一进程,他们将共享所有的内存。


14.一个操作(operation)如果能够不受中断地完成,我们称之为atomic operation。检查标记和设立标记必须是一个atomic operation,如果它被中断,就会产生一个race condition。检查标记和设立标记的动作非常平常,所以被实现于很多CPU硬件中,名为Test和Set指令。实际上只有操作系统会使用Test和Set指令。操作系统提供比较高阶的机制,让你的程序用以取代Test和Set。



原创粉丝点击