1、线程的本质
线程就是一个进程内部的控制序列
是CPU进行执行调度的基本单元。(调度一段代码的执行是通过线程完成的)
一个进程中至少有一个线程(所以进程与线程的数量关系是 一对一 或 一对多)
2、为什么把线程称为LWP
LWP——轻量级进程,在Linux下进程是资源分配的基本单位,线程是进行资源调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有线程共用同一个虚拟地址空间,所以称线程为轻量级的进程
3、什么是多线程?什么是多进程?
假设有一个工厂老板改变自己的厂子规模
多进程:
多建几个厂:但是资源消耗大,更稳定(shell、网络服务器)
多线程:
在一家厂里多拉几条生产线:资源消耗小,但健壮性不如多进程
在比如说:有一个任务序列,里面需要执行ABC三个操作
多进程:多进程就是把多个任务分成多个程序,一个进程执行一个,每个进程都有其自己的虚拟地址空间,然后映射到其对应的任务上。
多线程:把一个任务分成多个模块,一个pcb调度其中一个模块
4、进程与线程的区别
本质层面的理解区别:
进程是系统资源分配的基本单位(每运行一个程序,操作系统就要分配一次程序运行所需资源)
线程是资源调度的基本单位,在linux下是通过pcb实现的,一个进程中可以有多个pcb,
因此也被称为轻量级进程
多进程与多线程在多任务处理的优缺点
多进程:健壮、稳定
多线程:
1、线程通信之间更加灵活(共享虚拟地址空间)
2、创建和销毁成本更低(线程之间很多资源都是共享的,所以创建一个线程并不需要分配太多资源)
3、同进程的线程间调度成本更低(cpu上加载的块表信息,页表指针等都不需要替换)
使用场景:对于程序的安全性要求大于性能和资源要求的选择多进程(shell),其他则多线程。
安全性(每个进程都有其独立的虚拟地址空间,有独立资源,具有独立性)
5、线程的独有与共享
多个线程在同一个进程中运行不会发生混乱
1)每个线程调度执行的就是一个函数
2)将所有可能产生混乱的内容单独整一份
线程之间共享信息:
虚拟地址空间、堆区共用、文件描述表、信号处理方式、工作路径、用户ID、组ID
线程之间独有信息:
标识符、栈区、上下文数据、信号屏蔽字、errno……
以栈混乱为例:假如只有一个栈,同一个进程的不同线程执行不同的功能时,线程1执行memcpy,线程2执行printf,接着线程1完成功能将要退出了,进行出栈操作,却把别的线程的功能函数给出栈了,这就发生了栈混乱,所以为了避免我们给每个进程都分配了其自己的栈,这样就不会相互之间产生栈混乱。