线程是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,也就是一个共享内存地址。