加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_池州站长网 (https://www.0566zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

王道操作系统学习笔记(三)线程

发布时间:2022-10-14 11:02:18 所属栏目:Unix 来源:
导读:  为什么需要线程

  理解这个首先要先理解为什么引入进程。引入进程可以使各个程序之间并发执行,比如说一边上QQ一边听音乐。进程是程序的一次执行,然而程序内部的所有功能显然不能顺序执行。为此引入线程的
  为什么需要线程
 
  理解这个首先要先理解为什么引入进程。引入进程可以使各个程序之间并发执行,比如说一边上QQ一边听音乐。进程是程序的一次执行,然而程序内部的所有功能显然不能顺序执行。为此引入线程的概念,来增加进程内部的并发度。
 
  由此我们也能够理解:线程是CPU的调度单位。因为它的出现就是为了将进程进行更细粒度的执行单元划分。
 
  由此我们也能够理解:进程是系统资源的分配单位。因为引入线程之后,进程只作为除了CPU之外系统资源的分配单元(如打印机,内存空间)。线程只占了CPU,剩下还是以进程为单位划分。
 
  线程好处

  引入线程之后,并发带来的系统开销减小,才使得并发有了实际的使用价值。所以当我们说java并发的时候,说的是多线程,而不是多进程。
 
  线程属性
 
  线程的实现方式
 
  用户级线程(User-Level Thread,ULT)
 
  所有线程管理工作由应用程序负责,线程切换可以在用户态下即可完成。从用户看来是有多个 线程,但是在操作系统看来,意识不到多线程的存在。
 
  通俗理解:
 
  操作系统是一个老管家。理解这个概念很重要
 
  线程的切换对象和时机都是由用户来控制的(传统概念里CPU是抢占不可控的)。比如说nginx会自己记住当时的上下文,然后去处理下一个请求。当非阻塞api返回后,nginx能够找到对应的上下文,继续处理。(课本上说如果一个线程阻塞就会导致整个进程阻塞,然而事实上有非阻塞+多路复用的技术来解决这个缺陷了)
 
  优点:用户线程切换往往比系统线程要快,原理在于通过操作系统切换时需要在用户态和内核态之间来回切换,而且每次都是在整个操作系统所有线程上选,还需要符合调度算法来保证均衡,如果切换到其他进程就涉及到页表之类的处理,而用户线程纯在用户态下,最轻量级的只需要改一下栈指针就行了,也不需要调度均衡(可以由程序设计保证,由程序自己决定什么时候切换,这种也叫做协程)。这样就有希望达到更高的性能。
 
  这种用户态线程主要使用场景就是IO。实际上需要切换的场景,无非是sleep、IO wait和等待同步状态(锁、semaphore或者condition variable)。这些东西,但凡正常一点的用户态线程库都会自己再实现一遍unix线程切换,主要是把异步接口包成同步的(类似于调同步借口——异步实现——sleep——调度器取到异步结果后排队——排队到了拉起,所以这些个阻塞操作每个都是切换点),然后挂钩子或者就扔出个接口,然后在所有用户态线程都在sleep的时候去跑IO等待的wait(加塞在调度管理里)。所以但凡有用的用户态线程库,至少得做这三样东西,于是你的看似同步IO调用就会实际用libaio/epoll类似的做实现,而sleep/锁类则会变为调度器内的处理。除非用户非要拿非库内实现去做长阻塞,不然怎么也不会出现你所提到的一个阻塞全部用户态线程看戏的情况
 

(编辑:我爱制作网_池州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章