轻量级进程(LWP)和线程

2024-09-01 00:12
文章标签 线程 进程 轻量级 lwp

本文主要是介绍轻量级进程(LWP)和线程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程是CPU调度的基本单位
进程是承担系统资源的基本实体(进程是资源分配的基本单位)

线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配

任何一个线程都可以创建或撤销另一个线程

多进程里,子进程可复制父进程的所有堆和栈的数据;而线程会与同进程的其他线程共享数据,但拥有自己的栈空间

进程中的多个线程共享同一地址空间,因此Text Segment、Data Segement 都是共享的,如果定义一个函数,在各线程中都可以调用,如果定义一个全局变量,在各线程中都可以访问到
线程独有的数据
线程ID 一组寄存器(有独立的硬件上下文-动态切换) errno 信号屏蔽字 调度优先级
线程除了地址空间之外,还共享
文件描述符表 每种信号的处理方式(SIG_IGN,SIG_DFL或者自定义的信号处理函数) 当前工作目录 用户id和组id

单个进程如果出现除零,野指针问题导致线程崩溃,程序也会随着崩溃
线程是进程的执行分支,线程出异常,就类似进程出异常,进而触发信号机制,终止进程,该进程内的所有线程也就随之退出

程序是静态的,不涉及进程,进程是程序运行时的实体,是一次程序的运行

1.多线程和多进程的区别
①.多线程共享同一进程的资源,而多进程具有独立的地址空间和资源。因此,创建和切换线程比切换进程更加轻量级,减小了开销,因为线程之间共享了进程中的大部分资源,因此共享的数据不需要重新创建或销毁,因此消耗上低于进程,反之也就是速度快于进程
②.通信和同步:在多线程中,由于共享同一地址空间,因此通信更加方便,全局数据以及函数传参都可以实现,而进程间则需要系统调用来完成每个进程都拥有独立的内存空间,需要使用IPC机制来进行进程间通信
③.数据隔离:多线程共享同一进程的数据空间,在访问和修改数据时需要考虑同步和互斥,而多进程具有独立的地址空间,数据隔离较好,一个进程的错误不会直接影响到其他进程
④.可扩展性:由于共享资源和上下文切换等因素限制,多线程在某些情况下无法有效利用多核处理器,并行度受限,而多进程能够充分利用不同核心处理器,并行执行任务
⑤.编码复杂性:相对于单线程或单进程编码,同时使用多线程或者多进程需要考虑并发控制、数据共享与同步等问题,增加了编码的复杂性和调试难度

2.什么是LWP
LWP是轻量级进程,在Linux下进程是资源分配的基本单位,线程是cpu调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化

3.请简述LWP与pthread_create创建的线程之间的关系
pthread_create是一个库函数,功能是在用户态创建一个用户线程,而这个线程的运行调度是基于一个轻量级进程实现的。
4.简述轻量级进程ID与进程ID之间的区别
因为Linux下的轻量级进程是一个pcb,每个轻量级进程都有一个自己的轻量级进程ID(pcb中的pid),而同一个程序中的轻量级进程组成线程组,拥有一个共同的线程组ID
在这里插入图片描述
Linux下的轻量级进程是一个PCB,每个轻量级进程都有一个自己的轻量级进程ID(PCB中的pid,也就是LWP),而同一个程序中的轻量级进程组成线程组,拥有一个共同的线程组ID
同时每一个线程又有一个tid,这个tid指向用户层的tcb,在加载到共享区的线程库中,每一个线程都有它对应的tcb结构
每个进程中都有一个LWP与线程组ID相等的线程,这个线程被称为主线程,因此当一个进程中只有一个线程时,通过LWP和进程pid来找到调度该线程是等价的的。
pthread_create是一个库函数,功能是在用户态创建一个用户线程,而这个线程的运行调度是基于一个轻量级进程实现的。
对于线程的创建,我们是通过原生线程库给我们提供的应用层接口来实现的,我们要先把原生线程库加载到共享内存当中,然后在这个共享内存中创建线程,而每一个线程都在共享内存中对应一个起始地址,这里的pthread_create的第一个参数就是这里的tid,也就是一个共享内存地址。
在这里插入图片描述

这篇关于轻量级进程(LWP)和线程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125391

相关文章

[Linux]:进程(下)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 进程终止 1.1 进程退出的场景 进程退出只有以下三种情况: 代码运行完毕,结果正确。代码运行完毕,结果不正确。代码异常终止(进程崩溃)。 1.2 进程退出码 在编程中,我们通常认为main函数是代码的入口,但实际上它只是用户级

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

java 进程 返回值

实现 Callable 接口 与 Runnable 相比,Callable 可以有返回值,返回值通过 FutureTask 进行封装。 public class MyCallable implements Callable<Integer> {public Integer call() {return 123;}} public static void main(String[] args

C#关闭指定时间段的Excel进程的方法

private DateTime beforeTime;            //Excel启动之前时间          private DateTime afterTime;               //Excel启动之后时间          //举例          beforeTime = DateTime.Now;          Excel.Applicat

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi

java线程深度解析(五)——并发模型(生产者-消费者)

http://blog.csdn.net/Daybreak1209/article/details/51378055 三、生产者-消费者模式     在经典的多线程模式中,生产者-消费者为多线程间协作提供了良好的解决方案。基本原理是两类线程,即若干个生产者和若干个消费者,生产者负责提交用户请求任务(到内存缓冲区),消费者线程负责处理任务(从内存缓冲区中取任务进行处理),两类线程之

java线程深度解析(四)——并发模型(Master-Worker)

http://blog.csdn.net/daybreak1209/article/details/51372929 二、Master-worker ——分而治之      Master-worker常用的并行模式之一,核心思想是由两个进程协作工作,master负责接收和分配任务,worker负责处理任务,并把处理结果返回给Master进程,由Master进行汇总,返回给客

java线程深度解析(二)——线程互斥技术与线程间通信

http://blog.csdn.net/daybreak1209/article/details/51307679      在java多线程——线程同步问题中,对于多线程下程序启动时出现的线程安全问题的背景和初步解决方案已经有了详细的介绍。本文将再度深入解析对线程代码块和方法的同步控制和多线程间通信的实例。 一、再现多线程下安全问题 先看开启两条线程,分别按序打印字符串的

java线程深度解析(一)——java new 接口?匿名内部类给你答案

http://blog.csdn.net/daybreak1209/article/details/51305477 一、内部类 1、内部类初识 一般,一个类里主要包含类的方法和属性,但在Java中还提出在类中继续定义类(内部类)的概念。 内部类的定义:类的内部定义类 先来看一个实例 [html]  view plain copy pu