开发者学堂课程【物联网开发- Linux 高级程序设计全套视频:线程的概念】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/660/detail/11057
线程的概念
内容介绍:
一、线程的概念
二、线程和进程的比较
三、 多线程的用处
一、线程的概念
1.回顾:
之前我们通过多进程实现多任务,每个进程都拥有自己的数据段、代码段和堆栈段,并且这些资源的地址空间是独立的,这就造成进程在进行创建、切换、撤销操作时需要较大的系统开销。
创建一个线程就要给该进程分配数据段、代码段和堆栈段,而且要复制进程的地址空间。
2.线程的演化:
线程是另外一种实现多任务的方法,可以通过多线程来实现多任务。为了减少系统开销,从进程中演化出了线程。
3.线程与进程的关系:
(1)线程存在于进程中,共享进程的资源。在一个进程中可以创建多个线程,实现多任务,多个线程共享该进程的资源
(2)线程是进程中的独立控制流,由环境包括寄存器组和程序计数器和一系列的执行指令组成。
如何理解:
有一个车间,车间中有一些资源,并且车间中有一条默认的生产线,可以生产出一件物品。
这个车间中默认有一条流水线,也可以有多条流水线,流水线越多代表相同时间生产出的物品越多。所以将生产线看作进程,这个进程中拥有资源和流水线。
将流水线看作线程,默认每个生产线中有一条流水线,也就是默认每条进程中有一条线程。
综上,可以将进程看作是由一个线程和一些资源组成,将默认的流水线看作是主线程,在该车间内还可以建多条流水线,多条流水线共享该车间中的资源,多条流水线在共享资源时更方便而且减小了搭建车间的开销,也就是减小了系统开销,并且每条生产线可以做独立的事情,生产不同的物品
4.进程的组成:
每个进程有一个地址空间和一个控制线程。(由若干个独立的控制流和一些资源构成)
以前没有创建线程的时候,从 main 函数开始执行,一直执行到 main 函数的结尾。
其实可以将 main 看作一个主线程,主流水线。以前的一个进程可以看作由一个主线程(main 函数)加一些资源构成。
二、线程和进程的比较
1.调度:
线程是 CPU 调度和分派的基本单位。单核的 CPU 上运行的操作系统如果是多任务和分时操作系统,则是通过时间片轮转。
2.拥有资源:
进程是系统中程序执行和资源分配的基本单位。运行一个程序必须先创建一个进程,线程是依赖进程存在的,线程共享进程的资源。
线程自己一般不拥有资源除了必不可少的程序计数器,一组寄存器和栈,但它可以去访问共所属进程的资源,如进程代码段,数据段以及系统资源(已打开的文件,I/O 设备等)
可以将一个进程看作一个生产车间,车间中有多条流水线,每条流水线可以认为是是一个线程,多条流水线并发的向下执行,进程中还有一些资源给线程共享,进程中默认的 main 函数就是主流水线,也就是主线程。
3.系统开销:
同一个进程中的多个线程可共享同一地址空间,因此它们之间的同步和通信的实现也变得比较容易。
假设进程 A 中有一个全局变量,多个线程都可以用,但是进程 B 不能访问,所以多进程不能访问同一段空间,要想访问同一段空间,可以共享内存,但是共享内存操作没有线程访问同一个全局变量方便,还要创建共享内存映射等等,并且访问时效率不如在一个进程中高。
在进程切换时候,涉及到整个当前进程 CPU 环境的保存以及新被调度运行的进程的 CPU 环境的设置;而线程切换只需要保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作,从而能更有效地使用系统资源和提高系统的吞吐量。
用多进程实现多任务时,其保存环境和恢复环境所需时间比多线程实现多任务的更长,所以多进程实现多任务的效率更低
4.并发性:
不仅进程间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行。可以用多线程实现多任务,但是有时候需要用多进程实现多任务,比如要在进程中启动一个新的程序,此时必须创建一个进程去启动
三、多线程的用处
1.使用多线程的目的主要有以下几点:
(1)多任务程序的设计
一个程序可能要处理不同应用,要处理多种任务,如果开发不同的进程来处理,系统开销很大,数据共享,程序结构都不方便,这时可使用多线程编程方法。
与并发程序设计的区别:多任务程序的设计是每个任务做一件事,并发程序设计是多个任务做一件事,每个任务做一个步骤。
(2)并发程序设计
一个任务可能分成不同的步骤去完成,这些不同的步骤之间可能是松散耦合,可能通过线程的互斥,同步并发完成。这样可以为不同的任务步骤建立线程。
松散耦合:第一步产生的结果可能对第二步有影响
(3)网络程序设计
为提高网络的利用效率,我们可能使用多线程,对每个连接用一个线程去处理。
比如百度服务器,每次在百度是搜索时会建立一个链接,百度服务器要创建一个任务为该链接服务,如果用多进程实现多任务,则百度服务器开销过大,并且一个操作系统中创建进程的个数是有上限的,所以百度服务器是用多线程实现多任务的
(4)数据共享
同一个进程中的不同线程共享进程的数据空间,方便不同线程间的数据共享。
(5)在多CPU系统中,实现真正的并行。
2.多线程的优点:
系统开销小,共享数据方便,可以实现多任务
3.多线程的缺点:
启动程序时必须有进程,虽然多线程实现多任务,多个线程在同一个进程中共享全局变量,但是也会造成麻烦,当多个线程访问同一个公共资源时会出现冲突的情况。