程序员的自我修养 摘录 1 众人拾柴火焰高

线程基础

现代软件系统中,线程也是一个十分重要的概念.特别是随着CPU频率增长开始出现停滞,而开始向多核方向发展.多线程,作为实现软件并发执行的一个重要的方法,也开始具有越来越重要的地位.

线程(Thread) 有时也被称为轻量级进程(Lighting Process,LWP),是程序执行流的最小单位.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.通常意义上,一个进程由一个到多个线程组成,各个线程之间共享程序的内存空间(包括代码段,数据段,堆等)及一些进程级的资源(如打开文件和信号).一个经典的线程与进程的关系图如下
在这里插入图片描述
多线程比单线程的优势在于

  • 某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行.多线程执行可以有效利用等待的时间.典型的例子是等待网络响应
  • 某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序与用户间的交互就会中断.多线程可以让一个线程负责交互,另一个线程负责计算
  • 程序逻辑本身就要求并发操作,例如一个多端下载软件(如bittorrent)
  • 多CPU或多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面发挥出计算机的全部计算能力
  • 相对于多进程应用,多线程在数据共享方面效率高很多

线程的访问权限

线程的访问非常自由,它可以访问进程内存中的所有数据,甚至包括其他线程的堆栈,但实际上线程也拥有自己的私有存储空间,包括以下几方面

  • 栈(尽管并非完全无法被其他线程访问,但一般情况下仍然可认为是私有的数据)
  • 线程局部存储(Thread Local Storage,TLS).线程局部存储是某些操作系统为线程单独提供的私有空间,但通常只具有很有限的容量.
  • 寄存器(包括PC寄存器),寄存器是执行流的基本数据,因此为线程私有.

从C程序员视角看,数据在线程之间是否私有如下表
在这里插入图片描述

线程调度与优先级

无论是在多处理器的计算机上还是在单处理器的计算机上,线程总是’并发’的执行
当线程数量小于等于处理器数量时(并且操作系统支持多处理器),线程的并发是真正的并发,不同线程运行在不同的处理器上,彼此之间互不相干.但对于线程数量大于处理器数量的情况,线程的并发会受到一些阻碍.因为此时至少有一个处理器会运行多个线程.

而单处理器对应多线程的情况下,并发是一种模拟出来的状态.操作系统会让这些线程程序轮流执行,每次仅执行一小段时间(通常是几十到几百毫秒),这样看起来像是在同时执行
线程调度中,线程通常拥有至少三种状态

  • 运行
  • 就绪
  • 等待

当时间片用尽的时候,该进程进入就绪状态.如果在时间片用尽之前进程就开始等待某事件,那么它将进入等待状态.每当一个线程离开运行状态时,调度系统就会选择一个其他的就绪线程继续执行.在一个处于等待状态的线程所等待的事件发生之后,该线程就进入就绪态.可见下图

在这里插入图片描述
目前的调用方式

  • 优先级调度
  • 轮转法

windows可通过API设置线优先级
而Linux下则使用pthread库来实现

一般来说,CPU亲IO密集型的线程,因为它们占用很少的CPU时间,IO密集型线程总比CPU密集型线程容易得到优先级的提升.

windows中的进程和线程的实现如同教科书一般标准,windows内核由明确的线程和进程的概念.在windowsAPI中,可以使用明确的API创建进程和线程,但对于Linux中,线程并不是一个通用的概念

Linux对多线程的支持颇为贫乏,事实上,在Linux内核中并不存在真正意义上的线程概念.Linux将所有的执行实体(无论是线程还是进程)都称为任务(task),每一个任务概念上类似与一个单线程的进程,具有内存空间,执行实体,文件资源等.不过,在linux下不同的任务之间可以选择共享内存空间.因而实际意义上,共享了同一个内存空间的多个任务构成了一个进程,这些任务也就成了这个进程里的线程.
在这里插入图片描述
fork产生新任务的速度非常快,因为fork并不复制原任务的内存空间,而是和原任务一起共享一个写时复制(Copy on Write,COW)的内存空间.
所谓写时复制,指的是两个任务可以同时自由地读取内存,但任意一个任务试图对内存进行修改时,内存就会复制一份给修改方单独使用,以免影响其他的任务使用.
fork只能产生本任务的镜像,因此必须执行exec配合才能启动别的新任务需要exec来执行新的可执行文件.
而要产生新线程,可以使用clone,则可以使用clone
clone的函数原型如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值