1、为什么要多线程,很基础哈
2、windows系列关于多线程的历史
(1)cooperative,合作型:进程之间要主动合作,某进程不释放cpu,其他进程就没得用。
preemptive,抢先型:由操作系统强迫分配cpu,进程不用管了。
(2)dos,单任务
windows1/2/3,多任务但是是合作型
windows NT和 windows95开始,使用Win32API,实现了抢先式多任务、多线程。
3、多线程:
word95,在一个程序中使用了多个线程,但线程之间类似cooperative,要小心的合作使用cpu,并且要承担“保存和恢复线程状态”的任务,而支持多线程的操作系统会代替程序员作这些工作。
4、win32基础
(1)进程:
拥有资源和内存的单位。其中资源包括线程和文档等核心对象的handle,一些窗口资源,和一些GDI资源的handle.
进程本身不执行,真正执行的是每个进程都会启动的一个主线程
(2)内存
分三种类型:code/data/stack
data:包括全局变量和静态变量、以及动态分配的内存空间(从heap上分配吧)
stack:调用函数时保存状态的吧,局部变量都存在stack中。每个线程产生时会单独分配一个stack。
(在第二章的一个例子中,启动线程使用的数据,说来自data,动态分配了一块,把指针传入,是最好的方式)
(3)线程
线程的随身行李:即线程在“任何时刻的状态”,很少,怀疑包括线程自己的函数调用堆栈,保存在进程的某块内存和CPU的寄存器中。结合context switch的内容看,当前线程的状态保存在寄存器中,需要switch线程时,借进程堆栈中转下,最后保存在内存中叫CONTEXT的一个结构里。
5、为什么用多线程而不用多进程:代价小
6、context switching
(1)内容:
硬件计时器发出中断
保存线程状态:寄存器-》stack-》CONTEXT结构
两个线程属于不同进程的话,先切换进程的内存环境(page directory和page table)
从新进程的CONTEXT结构中恢复新线程的状态。
(2)效率:每秒在300到1000次左右(97年),对于streamcallback每25mm执行一次的要求,应该不成问题。
(3)多cpu很牛逼,不需要context switching
7、race condition
(1)举例:编辑同一个文件、操作同一个链表
(2)共性:在编辑和保存之间,改next指针和head指针之间,线程被强制打断
8、atomic operation
(1)高级语言的某个操作在低阶执行时不一定是atomic operation
(2)检查标记与设立标记必须由操作系统保证其atomic性
9、为后面章节的铺垫
(1)线程间的通讯很棘手
(2)多个线程作同一件事:容易出问题; 作不同的事,也会有资源竞争。