📄 15.1.2 线程.txt
字号:
15.1.2 线程
1.线程组成
线程由两个部分组成 :
(1)
线程的内核对象。操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地
方。
( 2)线程技 (stack )。它用于维护线程在执行代码时需要的所有函数参数和局部变量。
当创建线程时,系统创建一个线程内核对象。该线程内核对象不是线程本身,而是操作系统用来管
理线程的较小的数据结构。可以将线程内核对象视为由关于线程的统计信息组成的一个小型数据结
构。
线程总是在某个进程环境中创建的。系统从进程的地址空间中分配内存,供线程的枝使用。新线程
运行的进程环境与创建线程的环境相同。因此,新线程可以访问进程的内核对象的所有句柄、进程
中的所有内存和在这个相同的进程中的所有其他线程的堆钱。这使得单个进程中的多个线程确实能
够非常容易地互相通信。
线程只有一个内核对象和一个枝,保留的记录很少,因此所需要的内存也很少。由于线程需要的开
销比进程少,因此在编程中经常采用多线程来解决编程问题,而尽量避免创建新的进程。
2.线程运行
操作系统为每一个运行线程安排一定的 CPU时间时间片。系统通过一种循环的方式为线程提供时间
片,线程在自己的时间内运行,因时间片相当短,因此给用户的感觉就
好像多个线程是同时运行的一样。在生活中,如果我们把一根点燃的香快速地从眼前划过,看到的
将是一条线。实际上这条线是由许多点组成的,由于人眼具有视觉残留效应,因而我们的感觉好像
就是一条线。如果将这根香很慢地从眼前划过,我们就能够看到一个一个的点。同样地,因为线程
执行的时间片非常短,所以在多个线程之间会频繁地发生切换,给我们的感觉好像就是这些线程在
同时运行一样。如果计算机拥有多个 CPU,线程就能真正意义上同时运行了。
3.单线程程序与多线程程序
图 15.5是单线程程序和多线程程序的图解示意图。对单线程程序来说,在进程的地址空间中只有一
个线程在运行,例如,一位病人去医院看病,需要动手术,医院为他安排了一位医生为他动手术,
那么这位医生就是主线程,由这个主线程完成动手术这一任务。
图 15.5单线程程序和多线程程序示意图
多线程程序,在进程地址空间中有多个线程,其中有一个是主线程,例如在上述例子中,医院为了
保证这位病人的手术能够成功,为医生配备了几位护士,医生作为主线程,护士作为所创建的线程,
由这多个线程同时完成为病人动手术这一任务。医生负责主刀,一位护士负责为医生递送动手术用
的器具,一位护士负责为医生擦汗,他们共同完成为病人动手术这一任务,当然,效率就比较高,
病人生存的希望也就比较大了。这就是多线程程序的好处。
既然在单 CPU的条件下,某一时刻只能有一个线程在运行。那为什么还要编写多钱程程序呢?读者应
注意,我们所编写的多线程程序,每一个线程可以独立地完成一个任务。当该程序移植到多 CPU的
平台上时,其中的多个线程就可以真正并发地同时运行了。那我们是否可以用多进程程序来取代多
线程程序呢?当然这也是可以的,但是还是应该尽量采用多线程程序,有两个原因:一是对进程的创
建来说,系统要为进程分配私有的 4GB的虚拟地址空间,当然它所占用的资源就比较多,而对多线
程程序来说,多个线程是共享同一个进程的地址空间,所以占用的资源较少。另一个理由是当进程
间切换时,需要交换整个地址空间,而线程之间的切换只是执行环境的改变,因此效率比较高。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -