系统相关
首页 > 系统相关> > 线程和进程之间的联系----基本概念

线程和进程之间的联系----基本概念

作者:互联网

什么是线程?

在回答这个问题之前先得要回答进程,

进程和线程的区别?

线程是 CPU 调度基本单位 进程是资源分配单位

在 linux 中把线程叫轻量级进程(LWP), linux 下pcb 是线程 进程是线程组
在window 中进程和线程的关系就不可以说轻量级

线程(优点) VS 进程

线程之间共享一块虚拟地址空间,进程的虚拟地址空间不共享,

  1. 创建、销毁一个线程要比进程花费的代价更小,因为在创建的时候不会创见虚拟地址空间,和进程共享一块虚拟地址空间;
  2. 线程间的切换工作量小,切换调度的开销小
  3. 线程占用的资源更小

线程(缺点) VS 进程

  1. 健壮性降低:一个线程异常终止,会导致进程异常终止,也就是说线程之间是缺乏保护的;
  2. 编程 / 调试难度变大:(a)对线程的可靠性要求更高(b)线程安全问题

线程之间的共用资源

  1. 虚拟地址空间:由于共享地址空间,那么代码段、数据段也同样是共享的
  2. 文件描述符表
  3. 信号处理方式
  4. 当前工作路径
  5. 用户id 、组 id

线程之间独立不共用的资源

  1. 栈(函数调用栈,局部变量等)
  2. 上下文信息(CPU中的寄存器)
  3. errno(每个线程有自己的errno)
  4. 线程标识符
  5. 信号屏蔽字

    【参考】https://blog.csdn.net/u014558484/article/details/52550678/

多线程/多进程的应用场景

CPU密集型
https://blog.csdn.net/youanyyou/article/details/78990156
IO密集型

  1. 通过网络进程输入输出
  2. 响应UI界面(界面显示和数据计算要多线程完成,防止由于数据计算太久导致界面卡死)

多线程和多进程使用场景


线程控制相关函数不是系统调用

库函数-》posix 线程库 pthread

ps -eLf 查看所有的线程:站在内核角度给pcb加了一个编号
获取自己的线程id pthread_self():站在POSIX线程库的角度

结束线程

  1. 让线程入口函数执行结束,从线程函数中return ;但是在主线程中不能使用return 因为那样就相当于调用exit
  2. 调用 pthread_exit () 终止当前线程,参数是 void* 表示线程结束返回的结果
  3. pthread_cancle (tid) 结束当前进程中的任何一个线程(不推介使用)应为该函数不具有原子性

事物要求具有原子性,打个比方就是:做一件事要么做完,要么就不做,不可以做一半;而这个函数并不具有原性
需要注意的是:pthread_exit 或者 return 返回的指针所指向的内存单元必须是全局的或者是用 malloc 分配的,不能在线程函数的栈上分配,因为当其它线程得到这个返回指针时线程函数已经退出了。

等待线程

为什么要有线程等待:(1)已经退出的线程,其空间没有被释放,仍然在进程的地址空间内。(2)创建新的线程不会复用刚才退出线程的地址空间。
目的和进程类型,防止出现类型与僵尸进程的内存泄露的情况
pthread_join (tid,NULL);阻塞函数,等待对应线程结束,然后再继续执行代码

线程分离

类似于忽略 SIG_CHLD 信号;
pthread_detach 当线程被分离之后就不需要pthread_join 显示回收了
默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法释放资源,从而造成系统泄漏。如果不关心线程的返回值,join是一种负担,这个时候,我们可以告诉系统,当线程退出时,自动释放线程资源。


以下仅供了解

线程、用户态线程、轻量级进程、进程

内核线程

相当于内核可以处理一件特定事情,如:处理异步事件 异步IO (同步和异步区别) 时特别有用 ;内核线程唯一 使用的资源就是内核栈和上下文切换时保存寄存器的空间。支持多线程的内核叫做多线程内核(Multi-Threads kernel )。

轻量级进程

(LWP) 由内核支持的用户线程,每一个轻量级进程都与一个特定的内核线程关联 内核线程只能由内核管理并像普通进程一样被调度

轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。在这种实现的操作系统中,LWP就是用户线程。

由于每个LWP都与一个特定的内核线程关联,因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。
轻量级进程具有局限性 首先,大多数LWP的操作,如建立、析构以及同步,都需要进行系统调用。系统调用的代价相对较高:需要在用户态和内核态中切换。其次,每个LWP都需要有一个内核线程支持,因此LWP要消耗内核资源(内核线程的栈空间)。因此一个系统不能支持大量的LWP。

在计算机操作系统中,轻量级进程(LWP)是一种实现多任务的方法。

线程既可由应用程序管理,又可由内核管理,而 LWP 只能由内核管理并像普通进程一样被调度

Linux内核是支持LWP的典型例子。
在大多数系统中,LWP与普通进程的区别也在于它只有一个最小的执行上下文和调度程序所需的统计信息,而这也是它之所以被称为轻量级的原因;一般来说,一个进程代表程序的一个实例,而LWP代表程序的执行线程(其实,在内核不支持线程的时候,LWP可以很方便地提供线程的实现)。因为一个执行线程不像进程那样需要那么多状态信息,所以LWP也不带有这样的信息;LWP的一个重要作用是提供了一个用户级线程实现的中间系统:LWP可以通过系统调用获得内核提供的服务,因此,当一个用户级线程运行时,只需要将它连接到一个LWP上便可以具有内核支持线程的所有属性。缺点:而因为LWP之间共享它们的大部分资源,所以它在某些应用程序就不适用了;这个时候就要使用多个普通的进程了。例如,为了避免内存泄漏和实现特权分隔使用多个进程也使得应用程序在出现进程池内的进程崩溃或被攻击的情况下变得更加健壮。

用户线程

完全建立在用户空间的线程库,用户线程的创建、调度、同步和销毁全由库函数在用户空间完成,不需要内核的帮助。因此这种线程是极其低消耗和高效的。

轻量级进程 VS 用户态线程

【参考文献】https://blog.csdn.net/gatieme/article/details/51481863

标签:LWP,调度,用户,线程,内核,进程,基本概念
来源: https://blog.csdn.net/qq_43763344/article/details/91388328