了解多线程(1)

  1. 线程概念
    1.1多线程问题中是有多个执行流的,多个线程可能在同一时间都可能做的事情
    eg:有一个食品加工厂里面有一个生产线,现在想要扩大生产规模,有什么办法?
    (1)在工厂中再开一个生产线-------也就相当于重新开了个线程
    (2)再开一个工厂,里面有个生产线-------也就相当于重新创建一个进程
    1.2线程就是执行流,代码都是线程来执行的;在一个程序里的一个执行路线就叫做线程;线程就是一个进程内部的控制序列。
    1.3在linux中没有线程的概念,只有轻量级进程LWP的概念,通俗的线程的概念其实是在C库当中的概念,也就是说轻量级进程也就是线程。

  2. 线程的分类
    线程分为主线程和工作线程,一个进程当中可以有若干个工作线程,但只有一个主线程
    2.1.主线程
    pid_t pid 轻量级进程id
    pid_t tgid 轻量级进程组id
    其中pid和tgid是相同的,而tgid和进程号是相同的
    2.2.工作线程
    pid_t pid 轻量级进程id
    pid _t tgid 轻量级进程组id
    其中pid和tgid一定不相同,而tgid和进程号是相同的
    2.3.因此,主线程和工作线程中的轻量级进程组id(tgid)和当前进程的进程号是相同的,也就是说每一个线程的tgid都和当前进程的进程号相同;pid是用来区分主线程和工作线程的。

  3. 多线程如何避免栈混乱的问题?
    其实是在共享区中为每个线程都开辟独立的空间,里面有调用栈、线程号、errno、信号屏蔽字、调用优先级、寄存器
    在这里插入图片描述

  4. 线程的独有和共享
    线程独有的:调用栈 线程号 errno 信号屏蔽器 调度优先级 寄存器
    线程共享进程数据,如果定义了一个函数,在各个线程当中都可以调用,如果定义了一个全局变量,在各个线程之中都可以访问到,各线程还共享以下进程资源和环境:文件描述表 信号处理方式 当前工作目录 用户id和组id

  5. 线程的优缺点
    (1)优点
    创建一个线程的代价要比创建一个进程小的多(创建一个线程就是创建了一个task_struct结构体,指向进程虚拟地址空间)
    与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多
    线程占用的资源比进程少很多(没有进程虚拟空间)
    能充分利用多处理器的可并行数量
    在等待慢速I/O操作结束的同时,程序可以执行其他的计算任务(一个线程在读,另一个线程在管道中阻塞掉了,但不影响读的那个)
    计算密集型应用,为了能在多处理器系统上运行,将计算分解到多个线程中实现
    I/O密集型应用,为了提高性能,将I/O操作重叠,线程可以同时等待不同的I/O操作
    (2)缺点
    性能损失(如果计算机密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的同步和调度开销,而可用的资源不变)
    健壮性降低(鲁棒性)
    缺乏访问控制(线程是抢占式执行的,并行的跑,但是要考虑时序的问题,只有一个线程可以获得资源)
    编程难度提高

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

  7. 线程与进程
    操作系统分配资源的基本单位是进程,操作系统调度的基本单位是线程

猜你喜欢

转载自blog.csdn.net/weixin_43807876/article/details/109748625