什么是线程?
在回答这个问题之前先得要回答进程,

传统操作系统上进程是 pcb,操作系统通过pcb控制程序运行;但是在 linux 下线程使用 pcb 实现调度,linux下 pcb 是线程,也叫轻量级进程,同一个进程中的线程共同使用一个虚拟地址空间,进程也就变成了线程组;
线程从概念上讲,程序里的执行路线,或者说是 “一个进程内部的控制序列” 一切进程至少都有一个执行线程;
线程在进程内部运行,本质是在进程地址空间内运行;
在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化,透过进程虚拟地址空间,可以看到进程的大部分资源合理分配给每个执行流,就形成了线程执行流
进程和线程的区别?
线程是 CPU 调度基本单位 进程是资源分配单位

进程是 CPU 资源分配的基本单位 —— 资源是分配给线程组的;进程偏向于资源的管理(管理内存,打开的文件…);
线程是 CPU 调度的基本的单位 —— cpu 调度通过 pcb 来调度程序的运行;而线程偏向于调度的执行(调度和进程类似,强占式调度)
在 linux 中把线程叫轻量级进程(LWP), linux 下pcb 是线程 进程是线程组
在window 中进程和线程的关系就不可以说轻量级

线程(优点) VS 进程
线程之间共享一块虚拟地址空间,进程的虚拟地址空间不共享,

创建、销毁一个线程要比进程花费的代价更小,因为在创建的时候不会创见虚拟地址空间,和进程共享一块虚拟地址空间;
线程间的切换工作量小,切换调度的开销小
线程占用的资源更小
线程(缺点) VS 进程
健壮性降低:一个线程异常终止,会导致进程异常终止,也就是说线程之间是缺乏保护的;
编程 / 调试难度变大:(a)对线程的可靠性要求更高(b)线程安全问题
线程之间的共用资源
虚拟地址空间:由于共享地址空间,那么代码段、数据段也同样是共享的
文件描述符表
信号处理方式
当前工作路径
用户id 、组 id

线程之间独立不共用的资源
栈(函数调用栈,局部变量等)
上下文信息(CPU中的寄存器)
errno(每个线程有自己的errno)
线程标识符
信号屏蔽字

【参考】https://blog.csdn.net/u014558484/article/details/52550678/
多线程/多进程的应用场景
CPU密集型
https://blog.csdn.net/youanyyou/article/details/78990156
IO密集型

通过网络进程输入输出
响应UI界面(界面显示和数据计算要多线程完成,防止由于数据计算太久导致界面卡死)
多线程和多进程使用场景
线程控制相关函数不是系统调用
库函数-》posix 线程库 pthread

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

结束线程
让线程入口函数执行结束,从线程函数中return ;但是在主线程中不能使用return 因为那样就相当于调用exit
调用 pthread_exit () 终止当前线程,参数是 void* 表示线程结束返回的结果
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与其他进程共享所有(或大部分)它的逻辑地址空间和系统资源;
与线程相比:LWP有它自己的进程标识符,优先级,状态,以及栈和局部存储区,并和其他进程有着父子关系;这是和类Unix操作系统的系统调用vfork()生成的进程一样的。
线程既可由应用程序管理,又可由内核管理,而 LWP 只能由内核管理并像普通进程一样被调度;

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

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

处理器竞争:单纯的用户线程是建立在用户空间,其对内核是透明的,因此其所属进程单独参与处理器的竞争,而进程的所有线程参与竞争该进程的资源。
使用资源:与所属进程共享进程地址空间和系统资源。
调度:由在用户空间实现的线程库,在所属进程内进行调度
轻量级进程 VS 用户态线程

LWP虽然本质上属于用户线程,但LWP线程库是建立在内核之上的,LWP的许多操作都要进行系统调用,因此效率不高。
而用户线程指的是完全建立在用户空间的线程库,用户线程的建立,同步,销毁,调度完全在用户空间完成,不需要内核的帮助。因此这种线程的操作是极其快速的且低消耗的
【参考文献】https://blog.csdn.net/gatieme/article/details/51481863
--------------------- 
作者:M-aaron 
来源:CSDN 
原文:https://blog.csdn.net/qq_43763344/article/details/91388328 
版权声明:本文为博主原创文章,转载请附上博文链接!

线程和进程之间的联系----基本概念相关推荐

  1. 线程与进程之间的共享资源

    线程和进程之间的共享资源方式 进程之间的共享资源的方式 1.消息队列 2.共享内存 3.管道(有名管道.无名管道) 4.信号 5.套接字 同一个进程的不同线程之间可以共享的资源 1.堆,由于堆是在进程 ...

  2. 以爬虫为例,单线程,协程,线程,进程之间性能的比较,原来协程可以这么快?

    前言 因为刚刚学习到了协程,然后之前也对爬虫有一定的了解,所以打算结合之前学的线程和进程,和协程进行对比,看看它的性能到底有多高,在测试完成后,结果还是不错的!下面就直接上代码了,因为代码逻辑都比较简 ...

  3. 1线程概念:线程和进程之间的关系,线程间可共享资源,线程间非共享资源,线程的优缺点

     1线程概念 1.1什么是线程 1.1.2线程和进程的关系 1.轻量级进程(light-weightprocess),也有PCB,创建线程使用底层函数和进程一样,都是clone. 2.从内核里看进 ...

  4. 线程与进程之间的关系和区别

    线程共享的环境包括:进程代码段,进程的公有数据(利用这些数据,线程很容易实现相互间的通讯),进程打开的文件描述符,信号的处理器进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥 ...

  5. linux通过管道的进程通信,linux 线程或进程之间通过管道通信(pipe)

    线程间通信: #include // printf #include // exit #include // pipe #include // strlen #include // pthread_c ...

  6. 操作系统的线程和进程的区别_进程,线程,协程,有何区别?

    进程 ​ cpu是计算机的核心,主要处理计算机的计算任务.操作系统是计算机的管理员,它负责任务的调度,资源的管理和分配,统一管理计算机的硬件资源.应用程序则是具有某种功能的程序,应用程序运行于操作系统 ...

  7. 为什么要有线程?线程和进程的关系是怎样的?

    为什么引入线程呢?   引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ这个进程可以同时视频.文字聊天.传 ...

  8. 通俗易懂的 Java 线程和进程区别

    1. 什么是线程和进程 1.1. 何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的.系统运行一个程序即是一个进程从创建,运行到消亡的过程. 在 Java 中,当我们启动 ...

  9. 线程的挂起是错误的概念实际是线程的阻塞,挂起只针对进程,将进程挂起会将进程从内存空间交换到磁盘空间的过程

    线程的挂起是错误的概念实际是线程的阻塞 线程的主要状态有运行态,就绪态和阻塞态.挂起态对线程没有什么意义,这是由于此类状态是一个进程级的概念.特别地,如果一个进程被换出,由于它的所有线程都该进程的地址 ...

最新文章

  1. php文章列表样式,css列表样式有哪些?css设置列表样式的方法
  2. Java嵌套类(Nested Classes)总结
  3. 异步复位,同步释放的理解
  4. CodeForces 282E Sausage Maximization(trie+xor)
  5. webpack 入门总结和实践(按需异步加载,css单独打包,生成多个入口文件)
  6. 使用Spyder控制台(console)执行带参数脚本和带参数的debug模式
  7. java switch命令_Java switch-case语句用法
  8. 阶段3 2.Spring_03.Spring的 IOC 和 DI_12 注入集合数据
  9. [开源项目]_[C++ CSDN博客下载-CSDN博客导出-CSDN博客备份工具]
  10. 基于YOLOv5的汽车座椅缺陷检测
  11. LINUX无法定位软件包
  12. Linux之DNS域名解析
  13. 实现jul 日志重定向到 slf4j
  14. python贪吃蛇游戏手把手教学 第一课
  15. Minecraft Mod 开发:0-前言
  16. java+poodle漏洞修复_如何修复 POODLE SSLv3 安全漏洞 (CVE-2014-3566)
  17. N-Tiers开发方式(ASP/ASP.NET、VB6/VB.NET呼叫使用COM+组件)
  18. 局域网找不到其它电脑
  19. 人生苦短,使用百度云SDK,编写python代码调用接口的车牌识别
  20. 开局一张图帮你充分理解哈希表(散列表)

热门文章

  1. C++技能的4种方法
  2. STL之vector,数组线性容器array,list容器,算法find,find_if,bind1st,仿函数
  3. Java获取系统文件类型图标并显示在JSP上
  4. sata接口测试软件,方便用户,技嘉放出6系列主板SATA接口检测软件
  5. OpenCV学习笔记之改变图像的对比度和亮度
  6. 用faster-rcnn训练自己的数据集(VOC2007格式,python版)
  7. 本人对于netty框架的一些理解,怎么与网站上的websock建立连接
  8. antd递归渲染左侧菜单
  9. 0110-如何给Kerberos环境下的CDH集群添加Gateway节点
  10. 从运维的角度理解Iaas、Paas、Saas云计算