线程的概念|学习笔记

简介: 快速学习线程的概念

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频线程的概念】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/11057


线程的概念

 

内容介绍:

一、线程的概念

二、线程和进程的比较

三、 多线程的用处

 

一、线程的概念

1.回顾:

之前我们通过多进程实现多任务,每个进程都拥有自己的数据段、代码段和堆栈段,并且这些资源的地址空间是独立的,这就造成进程在进行创建、切换、撤销操作时需要较大的系统开销。

创建一个线程就要给该进程分配数据段、代码段和堆栈段,而且要复制进程的地址空间。

2.线程的演化:

线程是另外一种实现多任务的方法,可以通过多线程来实现多任务。为了减少系统开销,从进程中演化出了线程。

3.线程与进程的关系:

(1)线程存在于进程中,共享进程的资源。在一个进程中可以创建多个线程,实现多任务,多个线程共享该进程的资源

(2)线程是进程中的独立控制流,由环境包括寄存器组和程序计数器和一系列的执行指令组成。

如何理解:

有一个车间,车间中有一些资源,并且车间中有一条默认的生产线,可以生产出一件物品。

这个车间中默认有一条流水线,也可以有多条流水线,流水线越多代表相同时间生产出的物品越多。所以将生产线看作进程,这个进程中拥有资源和流水线。

将流水线看作线程,默认每个生产线中有一条流水线,也就是默认每条进程中有一条线程。

综上,可以将进程看作是由一个线程和一些资源组成,将默认的流水线看作是主线程,在该车间内还可以建多条流水线,多条流水线共享该车间中的资源,多条流水线在共享资源时更方便而且减小了搭建车间的开销,也就是减小了系统开销,并且每条生产线可以做独立的事情,生产不同的物品

4.进程的组成:

每个进程有一个地址空间和一个控制线程。(由若干个独立的控制流和一些资源构成)

image.gif以前没有创建线程的时候,从 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.多线程的缺点:

启动程序时必须有进程,虽然多线程实现多任务,多个线程在同一个进程中共享全局变量,但是也会造成麻烦,当多个线程访问同一个公共资源时会出现冲突的情况。

 

相关文章
|
29天前
|
编解码 数据安全/隐私保护 计算机视觉
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
如何使用OpenCV进行同步和异步操作来打开海康摄像头,并提供了相关的代码示例。
63 1
Opencv学习笔记(十):同步和异步(多线程)操作打开海康摄像头
|
3月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
5月前
|
分布式计算 JavaScript 前端开发
多线程、多进程、协程的概念、区别与联系
多线程、多进程、协程的概念、区别与联系
87 1
|
5月前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
61 0
|
6月前
|
Java
Java中的多线程编程:概念、实现与挑战
【5月更文挑战第30天】本文深入探讨了Java中的多线程编程,涵盖了多线程的基本概念、实现方法以及面临的挑战。通过对Java多线程编程的全面解析,帮助读者更好地理解多线程在Java中的应用,提高程序的性能和效率。
|
29天前
FFmpeg学习笔记(二):多线程rtsp推流和ffplay拉流操作,并储存为多路avi格式的视频
这篇博客主要介绍了如何使用FFmpeg进行多线程RTSP推流和ffplay拉流操作,以及如何将视频流保存为多路AVI格式的视频文件。
144 0
|
3月前
|
调度
多线程学习笔记
这篇文章是多线程学习笔记,涵盖了线程与进程的概念、多线程实现方式、线程状态、线程同步与不安全示例、死锁问题以及生产者与消费者问题等多线程编程的关键知识点。
多线程学习笔记
|
2月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
56 0
|
3月前
|
缓存 前端开发 JavaScript
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
【8月更文挑战第11天】一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
36 0
一篇文章助你搞懂java中的线程概念!纯干货,快收藏!
|
4月前
|
Java 程序员 调度
Java中的多线程编程:概念、实现及性能优化
【5月更文挑战第85天】本文主要探讨了Java中的多线程编程,包括其基本概念、实现方式以及如何进行性能优化。首先,我们将介绍多线程的基本概念,然后详细讨论如何在Java中实现多线程,包括继承Thread类和实现Runnable接口两种方式。最后,我们将探讨一些提高多线程程序性能的策略,如使用线程池和减少同步开销等。