第一章,一些基本概念

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)多个线程作同一件事:容易出问题; 作不同的事,也会有资源竞争。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值