编辑
2024-02-01
Java
00
请注意,本文编写于 464 天前,最后修改于 464 天前,其中某些信息可能已经过时。

今天不经意间开始思考线程模型相关的知识,思考起Java的线程模型,接触了一年多的线程,虽说并没有经历过多线程引发的大问题...没解决过重大事故,但我自认为对线程和linux内核的调度还是很深的...

接下来进入正题,我们在都知道,线程模型有用户线程和内核线程,Go的Goroutine就属于用户级线程,根据定义,用户线程调度由用户实现的调度器管理内核线程则是linux内核管理,根据不同的调度规则,有以下几个模型

  • 多对一
  • 多对多
  • 一对一

分别是用户线程对应得内核线程数,Goroutine采用的是M

调度模型,相当于是可以切换上下文的task扔到线程池执行,除了协程外,其实线程也可以多对多调度,此话怎讲呢?

在早期的家用计算机里面,计算机只有进程一种概念,很多系统还没有线程,资源分配和调度都是按进程来的,虽然进程和线程的概念早就在论文中出现,但实际1994年左右,windows刚支持多线程,linux第一个版本也不支持多线程,1996年Linux2.0开始支持多线程,同年,JDK1.0正式发布,所以刚开始Java是不支持线程的...而是一种用户级线程,其中有些平台的是一对一调度,一个用户线程映射到一个内核线程执行,有的平台是多对多模型,不管怎么说都得用户态的调度器去做,但是1998年JDK1.2发布,时机到了...之后Java的线程就变成了直接开一个线程..具体就是pthread_create...clone调用等,然后把代码扔给内核线程执行

这就是Java线程调度相关的东西几乎淹没尘埃了,因为已经不归他管了,之负责简单的glibc封装而已,还有抽象....

又是一次考古.....

本文作者:yowayimono

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!