首页 > 系统相关 > 什么是线程?为什么需要线程?线程和进程的区别?

什么是线程?为什么需要线程?线程和进程的区别?

时间:2023-08-13 15:34:18浏览次数:36  
标签:执行 区别 PCB 线程 进程 多线程 CPU

一.线程是什么?

1.1.为什么需要线程

       在执行多个任务时,多进程就已经可以实现并发编程的效果了,可是却有一个明显的缺点。  


缺点:进程的创建都需要大量的资源(例如:PCB、硬盘资源等),因此开销就变大了;而且创建时需要大量的资源,也是需要更多的时间,因此导致速度变慢了。


解决方法:为了解决进程的缺点,于是提出了可以 共享 两字,先创建一个进程并且分配好资源,后续创建的进程创建时只需要分配一个简单PCB,然后 共享 第一个进程的文件描述表、内存硬盘等资源,从而使开销减小、速度更快。而后续的进程便是轻量级进程----线程


举例说明:四个人去餐厅吃饭,如果四个人在四张桌子上吃饭每张桌子3个菜,开销为:四个桌子、12个盘子。时间:炒12个菜以及洗12个碗的速度。但是如果四个人在同一张桌子吃饭,并且把菜合在一起,那么开销为:1个桌子、3个盘子。时间:炒3个菜以及洗3个碗的速度。


1.2线程的概念

       线程(thread)是操作系统能够进行运算调度的最小单位。线程被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为 轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程称为线程。


特点:


线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。

线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB组成。寄存器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。

通常在一个进程中可以包含若干个线程,它们可以利用进程所拥有的资源。

额外补充:在windows里不是PCB而是TCB,但是linux中依然采用的是PCB。


在linux中:一个PCB对应一个线程,而进程有多个线程(不是无上限的线程),因此多个PCB对应一个进程。


1.3线程和进程的区别

简单回忆一下进程的特点:


进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控制块PCB中。以表示该进程拥有这些资源或正在使用它们。

进程也是抢占处理机的调度单位,它拥有一个完整的虚拟地址空间。当进程发生调度时,不同的进程拥有不同的虚拟地址空间,而同一进程内的不同线程共享同一地址空间。

因此线程和进程的主要区别有:


地址空间和其它资源(如打开文件):进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

通信:进程间通信IPC,线程间可以直接读写进程数据段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性。

调度和切换:线程上下文切换比进程上下文切换要快得多。

在多线程OS中,线程不是一个可执行的实体。

结:进程是操作系统进行资源分配的基本单位,线程是操作系统进行调度的基本单位。


二.线程的生命周期

       线程的生命周期分为了5个阶段,创建—>就绪—>运行—>死亡,运行的中途可能会有阻塞。


 什么是线程?为什么需要线程?线程和进程的区别?_多线程


新建阶段:创建一个线程的对象,此时线程处于新建状态。

就绪阶段:线程对象调用start方法后,线程进入线程队列等待CPU时间片,具备了运行的条件。

运行阶段:当就绪的线程被调度且获得CPU资源时,进入运行状态,系统自动决定CPU分配,并执行获得CPU执行权的线程。

阻塞状态:在某些特殊情况下,如被挂起或执行输入输出操作时,线程会进入阻塞状态,让出CPU并临时中断自己的执行。

死亡阶段:线程完成了全部工作、被提前强制终止或出现异常导致线程结束,线程执行结束,它的寄存器上下文以及堆栈内容等将被释放。

注: 以上的各种情况,是可以通过Java来实现的,各种阶段都有其对应的方法执行。


       一般情况下,父线程与子线程相互不影响,即子线程结束,父线程不一定结束;父线程结束,子线程不一定结束;父线程异常,子线程不一定异常;子线程异常,父线程不一定异常。但当设置守护线程等特殊操作时,父线程与子线程会发生相互影响。


三.认识多线程

       我们主要学习的是多线程,多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在一个程序中,这些独立运行的程序片段叫作“线程”,利用它编程的概念就叫作“多线程处理”。可以通过Java实现。


1.多线程的特点:


每一个线程都是独立执行流

多个线程之间都是并发执行  

2.Java创建多线程的方式:


继承Thread类

实现Runnable接口

使用lambda

使用线程池

使用Callable

注:方法1,2,5可以搭配匿名内部类实现


3.Java当中观察线程 方法:


jdk文件夹--->bin文件夹--->jconsole调试工具


如果打不开,可以选择管理员打开


      在多线程当中,我们还会学到锁这个概念,因为有锁,所以才会有更多的操作空间,保证数据的准确性以及线程的等待执行。


总结

       线程学习是为了更好的理解多线程的操作,多线程中知识点很多,而其根本就是线程的生命周期,且加锁操作更为重要,保证数据的原子性,而加锁又会产生更多不明确的情况,因此需要耐心学习。

标签:执行,区别,PCB,线程,进程,多线程,CPU
From: https://blog.51cto.com/u_16154119/7067484

相关文章

  • 【PYQT5】创建线程,防止执行函数卡死界面
    #线程函数classWorkerThread(QThread):resultReady=pyqtSignal(object)def__init__(self,func,*args,**kwargs):super().__init__()self.func=funcself.args=argsself.kwargs=kwargsdefrun(self):se......
  • const readonly 区别
    readonly与const的区别,要使用const的理由是效率高。(1)、const是编译常量,readonly是运行常量(2)、const是修饰基础类型,readonly没有限制publicconstintCvalue=100;publicconststaticintCvalue=100; //编译异常readonly是运行是常量,第一次复制后不可改变。"不可改......
  • 数据库设计中的数据字典和平时开发中用到的字典表,有什么区别
    数据字典(DataDictionary):数据字典是数据库设计的一部分,它是一份关于数据库中各种数据元素的信息文档,包括表、列、数据类型、索引、约束、视图等等。数据字典记录了数据库结构的元数据,描述了数据的定义、用途、关系以及数据的业务含义。数据字典通常由数据库管理员(DBA)或设计者创......
  • 进程地址空间(虚拟内存)
    进程地址空间,进程虚拟内存的管理。某个进程地址空间的全部区域可以以红黑树+链表的形式存放。内核线程没有mm_struct没有进程地址空间,没有相关的内存描述符,这也是内核线程的真实含义--它们没有用户上下文。当一个进程被调度时,该进程的mm域指向的地址空间被装载到内存,PCB中的acti......
  • C#多线程环境下调用 HttpWebRequest 并发连接限制
    .net的HttpWebRequest或者 WebClient 在多线程情况下存在并发连接限制,这个限制在桌面操作系统如windowsxp,windows7下默认是2,在服务器操作系统上默认为10.如果不修改这个并发连接限制,那么客户端同时可以建立的http连接数就只有2个或10个。对于一些诸如浏览器或网络......
  • 【逗号你真的懂吗?】C++与JAVA中逗号的区别
    参考文章:这里一、先上结论C++中的逗号几乎可以说是随便使用,但是JAVA中的逗号就要注意了:JAVA中使用逗号(,)来分隔多条赋值语句时,只能在分隔方法的参数、定义变量时或用于for循环的表达式时使用,别的地方一律不能,只能将每条语句用分号(;)隔开。二、C++中的逗号逗号运算符和逗号表达式......
  • 进程管理 & (系统调用 内核同步)
    进程管理在现代操作系统中,进程提供两种虚拟机制,虚拟处理器和虚拟内存PCB描述一个正在执行的程序:打开的文件,挂起的信号,内核内部数据,处理器状态,一个或多个具有内存映射的内存地址空间及一个或多个执行线程。在2.6以前的版本中,PCB直接放在内核栈的尾端,或者放一个pcb_info间接索引......
  • Linux 共享内存mmap,进程通信
    @TOC前言进程间通信是操作系统中重要的概念之一,使得不同的进程可以相互交换数据和进行协作。其中,共享内存是一种高效的进程间通信机制,而内存映射(mmap)是实现共享内存的一种常见方法。一、存储映射I/O存储映射I/O是一个磁盘文件与存储空间中的一个缓冲区相映射。于是,当从缓冲......
  • 链表和数组的区别
    链表和数组的区别链表逻辑上相邻的元素在物理位置上不一定相邻。优点:插入、删除效率高,不需要一个连续的很大的内存缺点:查找某一个位置的元素效率低。数组优点:存取速度快缺点:1.整块连续空间,占很大内存。2.插入或删除数据效率低、不方便链表数组逻辑上相......
  • DDD与我们的传统开发又有什么区别和优势?
    DDD与传统开发相比具有以下区别和优势:领域驱动设计:DDD强调通过领域模型来描述业务领域,将业务逻辑与技术实现分离,使系统更贴近实际业务需求。传统开发往往基于数据库或技术架构进行设计,容易导致业务逻辑分散和混乱。共享知识:DDD鼓励开发团队与领域专家进行密切合作,共同建立领域模型......