看完这些,小姐姐不会说你不懂线程了

在现实生活中,底层劳动人民往往容易被忽视,在大场合交际的一般是老板,但是没有了真正劳动者,是无法正常运转公司的。操作系统也是如此。文章最后有福利。

一、概念

上一篇我们简单了解了进程。进程是资源调度的最小单位,但并不是真正干活的人,真正在调度机上运行而是线程。线程是进程中执行运算的最小单位,也是执行处理机调度的基本单位。好比说一个进程是一家公司,公司的老板是第一个线程,手下的员工也是线程,他们共享着公司的资源,在对外的时候,我们一般会以公司为最小单位参加各类融资活动。不同公司的交涉往往没有公司内部交流来的畅快。

二、组成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4HkCClTG-1621178576935)(http://note.youdao.com/yws/res/13491/WEBRESOURCE263f77d8d4741bc658082acbc817d8bc)]

线程的组成主要是主要由几部分构成:

  • (1)线程标志符
  • (2)描述处理器工作情况的一些寄存器的内容
  • (3)两个栈指针,一个指向核心栈,一个指向用户栈
  • (4)一个私有存储区,存放现场保护信息与其他与该线程相关的统计信息等

线程的组成主要存放的都是一些关键的东西。由于进程已经携带了不少的内容,所以线程需要携带的内容往往和运行的现场有关。

三、实现方式

线程主要分为两类实现,一种是用户级线程,一种是核心级线程。

3.1.1 用户级线程

在这种方式下,整个管理线程 的线程库放在用户空间,管理线程的工作全部由应用程序完成,核心对线程一无所知,只对常规进程实施管理。
成为老板管不到的员工,拥有的自由度是相对来说比较高的。毕竟有时候,公司并不需要抓人抓的太紧,给员工一定的自我发挥空间,往往可以获得想像不到的惊喜。

3.1.2 优点
  • 线程切换速度很快,无需进行系统调度
    • 不需要经过很长的工作流就可以干活,如果员工每次做事都要上级同意,那么切换效率固然低下
  • 调度算法可以是应用程序专用的
    • 可以不按照老板的工作模式工作,按实际情况按需调整,搞出适合自己的工作节奏
  • 用户级线程可以运行在任何的操作系统上,包括不支持线程机制的操作系统
    • 换一家公司,照样可以正常干活,即跨平台性很强
3.1.3 缺点
  • 系统调用的阻塞问题,当一个线程执行系统调用时,不仅它自己会被阻塞,同一个进程内的所有线程都会被阻塞
    • 虽然可以自由度高的生活,遇到一些涉及到公司级别的事情,会把所有员工都卡住
  • 在单纯用户级线程方式中,多线程应用程序不具有多处理器的优点
    • 这句话我感觉是存在问题的,目前的多核技术已经实现了单进程的多线程并行技术(例如 go 的协程),问了一些大佬,这应该是早期操作系统未解决的初期问题,在此记录强调
3.2.1 核心级线程

这种方式下,核心知道线程的存在,并对它们实施管理。

3.2.2 优点
  • 在多处理器系统中,核心可以同时调度一个进程的多个线程,真正实现并行操作
  • 如果一个进程的某个线程阻塞了,核心可以调用同一个进程的另一个线程
  • 核心线程本身也可以是多线程的
3.2.3 缺点
  • 控制转移开销大,成本高一个数量级
  • 调度算法由核心确定,应用程序无法影响线程的切换

四、状态

主要分为四种状态,和进程类似

  • 运行态
    • 线程正在CPU上执行程序,真正处于活动状态
  • 就绪态
    • 线程具备运行条件,一旦分配到 CPU,立马开工
  • 阻塞态
    • 等待某个事件发生,在此之前,即使分到 CPU,也无法开工
  • 终止状态
    • 当一个线程完成任务后,它占用的寄存器和栈等私有资源会被系统进行回收,然后分配给其他线程

我感觉我抄了一篇进程的状态说明,神特码像

五、多线程优势

  • (1)使并行的实体获得共享同一地址和所有可用数据的能力
  • (2)易于切换,代价低
  • (3)可以改善系统的性能

多线程相比于多进程,具有很多的优势,你可以想想,假设一个进程是一个团队,你觉得跨团队交流协作方便,还是团队内部协作方便。
想到这里,我之前用 PHP 简单实现了一个多进程调度器,性能很差,机器完全扛不住太多的进程。但是如果用多线程来实现,相比于多进程,完全不是在一个级别的。

六、线程和进程的关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DtcLQ9df-1621178576937)(http://note.youdao.com/yws/res/13539/WEBRESOURCE23326eb49a57617dcebb752b3f3bb568)]

我们从图中可以发现,每个线程是独占一份寄存器和栈的,但是共同拥有进程内的资源,如 PCB 、程序、数据。
在此可以总结出以下的关系

  • 一个进程可以有多个线程,但至少有一个线程,而一个线程只能在一个进程的地址空间内活动
    • 一家店可以没有员工,但是至少有一个老板吧,同一个正式员工可不能同时在多家公司签劳动合同
  • 资源分配给进程,同一个进程的所有现场共享该进程的所有资源
    • 同一家理发店的员工共享理发店的资源,如空间、椅子、毛巾
  • 处理机分配给线程,即真正在处理机运行的是线程
    • 真正在干活的是人,不是店
  • 线程在执行过程中需要协作同步,不同进程的线程间要利用消息通信的办法实现同步
    • 同家店的聊天喊一声就好了,不同家店的还需要利用电话啥的(进程通信的多种方式,共享内存、消息队列啥的)

附上线程知识导图和完整的进程知识导图
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MClink

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值