总结linux下的线程

什么是线程?

看一张简略的示意图

这里写图片描述

线程概念:
之前我们学习了进程,说进程是系统资源分配的基本单位,也是调度的基本单位,但是在发展中,出现了线程的概念,linux在POSIX标准中引入了线程库(用户线程库)。需要牢记的重点是线程是比进程粒度更细的执行流 liunx下没有真正的线程。
1.线程是系统调度的基本单位,而进程是系统资源分配的基本单位。
2.上图的意思是:线程是进程的一个执行分支,在进程的内部运行:在进程的地址空间里面运行,进程中的每个线程共享进程状态和资源。实际上每个线程看到的都是部分的代码和数据,每个线程都做好自己的事情。
3.单线程:每个进程中只有一个线程在执行的传统方法(只有单个执行流)(实际上我们之间写的都算是单进程单线程胡或者多进程单线程);
多线程:操作系统在单个进程内支持多个并发执行路径的能力。
4.在linux下,没有给线程另外设计数据结构,实际上都是复用进程的PCB来模拟线程(然后给线程一些私有的东西),也就是说linux下的线程是用进程模拟的,创建和销毁相比于进程要容易,所以把线程叫做轻量级进程,而拿已有的去模拟实现没有的,是一种很好的设计。

线程和进程的区别和联系:
1.同一个进程和多个线程共享同一个地址空间,数据段代码段都是共享的,定义一个函数每一个线程都能访问,定义一个全局变量,各线程都能访问到。
2.线程中哪些东西是公有的:进程中的线程共享进程中的文件描述符、信号处理方式、当前的工作目录、各种id。
哪些是私有的:线程自己的id、线程执行状态、上下文(包括各种寄存器的值、程序计数器和栈指针)、私有栈、errno变量、信号屏蔽字、调度优先级。
问题:为什么线程需要有私有自己的上下文信息:因为线程和进程一样需要调度,需要运转起来。为什么需要有私有栈:为了保证线程与线程之间在运行的时候数据是互相独立的。
3.线程是调度基本单位,进程是资源分配基本单位。
4.上面实际上说过:linux下线程是进程模拟的,复用进程的PCB。
5.线程也有自己的运行状态:阻塞,就绪,运行。(那么一个线程的运行状态的改变是否会影响同一个进程中的其他线程的运行状态的改变,這个问题我们之后讨论)

有关线程的注意点:
1.由于线程共享进程数据,当一个线程更改内存中的某些数据的时候,其他线程都能看到修改后的结果,如果一个线程以读取的方式打开一个文件,那么其他的线程也能够从文件中读取数据。
2.前面说道线程的状态:阻塞就绪运行,一个线程的状态改变会不会影响它所在的进程的状态,会不会影响它所在的进程其他线程的状态?目前我了解两点:一个线程的阻塞不会影响其他线程和所在进程,一个线程的退出也不会对其他人造成影响,一个线程终止,进程退出,所有线程终止,一个线程被挂起没有意义(操作系统精髓与设计原理里面这么说,但是在linux内部线程也是可以被挂起放入等待队列里面的),要挂起就挂起进程,所有线程都会被挂起(因为要腾一个进程的内存)
3.对于多线程处理多任务:只有在两个任务的处理过程互不依赖的情况下,两个任务才可以交叉执行。

运用线程有什么优势:
1.一个进程在某一个时刻只能做一件事情(一个执行流),有了多线程控制之后,我们可以把程序设计成在某个时刻同时执行多个独立的任务。
2.线程的创建和销毁成本比进程要低很多。
3.多线程能共享同一份数据和文件描述符,在不需要内核介入的情况下实现数据的联系,但是进程之间实现数据的交互却需要通过复杂的机制(例如进程间通信),需要内核的介入,
4.简化程序设计,改善响应时间。(一个线程的阻塞并不会影响其他正在执行的线程)
5.同一进程内线程间的切换比进程间的切换所花费的时间要少很多。

暂时就总结这么多,后面还会继续更新对于进程和线程的总结
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值