1 简述什么是LWP
首先我们要明白什么是LWP,在Linux中:线程 = 线程库里的属性集 LWP(轻量级进程)
,对应的线程库线程与LWP是一一对应的!
LWP处在内核层,是轻量级进程,在Linux下进程是资源分配的基本单位,是运行的执行流。而线程是cpu调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化
2 简述LWP与pthread_create创建的线程之间的关系
首先在Linux中:线程 = 线程库里的属性集 LWP(轻量级进程)
,应的线程库线程与LWP是一一对应的!线程处在用户层,LWP处在内核层。
- pthread_create创建的线程本质上是在底层创建一个LWP然后在上层通过线程进行调用!可以说LWP是线程实现的基础
- 1 :1映射:Linux中的LWP和pthread_create创建的线程是一比一映射的!
- 线程调度:线程调度的底层其实就是内核中调度LWP!
- 资源共享:pthread线程与它们所属的进程共享资源,如地址空间、打开的文件描述符等。这与LWP的特性是一致的,因为pthread线程实际上就是LWP。
总结来说,在Linux系统中,通过pthread_create
创建的线程通常与LWP是一一对应的。pthread线程是用户层面的抽象,而LWP是内核层面的实现。pthread库提供了线程管理的接口,而LWP则是这些线程在内核中的实际执行实体。
3 简述轻量级进程ID与进程ID之间的区别
因为Linux下的轻量级进程是一个pcb,每个轻量级进程都有一个自己的轻量级进程ID(pcb中的pid),而同一个程序中的轻量级进程组成线程组,拥有一个共同的线程组ID!
- 首先需要明确的是,进程ID是操作系统中唯一的存在!轻量级进程ID是在进程中才有意义!:
- 进程ID:每个进程在操作系统中有唯一的进程ID,用于标识一个独立的进程。进程ID是全局唯一的,即在系统范围内没有两个活跃进程具有相同的进程ID。
- 轻量级进程ID(线程ID):线程ID用于标识进程中的一个线程。在一个进程中,每个线程都有一个唯一的线程ID,但这个ID只在它所属的进程内部有效。
- 作用域:
- 进程ID:具有系统级的作用域,系统中的所有进程都可以通过进程ID来识别和操作特定的进程。
- 线程ID:具有进程级的作用域,只在创建它的进程内部有效,用于在该进程内部识别和操作特定的线程。
- 资源共享:
- 进程ID:每个进程拥有独立的资源,如地址空间、文件描述符等。
- 线程ID:线程共享所属进程的资源,如地址空间、文件描述符等。
在Linux中,轻量级进程实际上就是内核线程,而通过pthread_create
创建的线程通常与这些轻量级进程有一对一的映射关系。因此,线程ID在内核层面也是通过轻量级进程ID来实现的。
4 请简述什么是线程互斥,为什么需要互斥
线程互斥指的是在多个线程间对临界资源进行争抢访问时有可能会造成数据二义,因此通过保证同一时间只有一个线程能够访问临界资源的方式实现线程对临界资源的访问安全性。
线程互斥是一种特殊场景,举个例子: 在银行中假如只有一个ATM机,银行里有很多人,如果多个人一起使用ATM机,就肯定会导致大问题!银行是进程 , 银行中的人就是线程,ATM机是临界资源!
线程中访问临界资源的场景就是线程互斥!此时访问临界资源,临界资源往往不是原子的,在执行一条语句时,实际上是在执行多条汇编指令,在执行的过程中,如果发生线程的切换,临界资源就被多个线程访问,也就是ATM机被两个人同时使用,这可能会出问题的!所以需要进行互斥,保证临界资源只能一个线程访问!
5 简述你了解的进程间通信方式
进程间通信的本质是让两个进程看到同一块资源,这样才能做到进程间的通信!
- 管道:管道分为匿名管道和命名管道(FIFO),管道的本质是文件缓冲区,让两个文件看到同一个文件。父子进程会进行写时拷贝,可以看到同一个文件。非父子进程采取命名管道,通过文件名来看到同一个文件。注意管道只能单向通信,只有一个写端,一个读端!
- 共享内存:共享内存是在内存中开辟一片内存空间,可以被多个进程来获取(类似动态库!)。内存允许多个进程访问同一块内存区域,从而实现快速的数据交换。但需要注意同步问题,以避免竞态条件和数据一致性问题。一定要有写才有读。可读可写!使用共享内存时,必须注意同步问题,以避免竞态条件和数据一致性问题。通常需要配合信号量或互斥锁等同步机制来确保数据的一致性。
6 线程与进程的关系
- 进程:进程是程序在操作系统中的一个执行实例。它包含了程序代码、数据、和资源(如文件句柄、内存)等。它是操作系统分配资源的基本单位,进程各自都有自己的内存空间,它由操作系统调度。也由于进程有独立的地址空间,所以进程间切换(上下文切换)开销较大。进程间通信(IPC)复杂,需要借助操作系统提供的机制,如管道、消息队列、共享内存等。
- 线程:线程是进程中的一个执行单元,属于轻量级进程。一个进程可以包含多个线程,它们共享进程的地址空间和资源,但是它们各自都有自己的程序计数器和栈空间,线程是属于进程的。因为共享进程中的资源,所以线程的创建和销毁比进程更快,线程间切换(上下文切换)开销小。它是CPU执行的基本单位,它由CPU 调度。线程间通信简单,因为它们共享地址空间,可以直接使用共享变量。