浅析Go协程和java线程

浅析Go协程和java线程

文章目录

  • 浅析Go协程和java线程
  • 前言
  • 一、线程的实现
    • 1、内核级别线程 (1:1)
    • 2、用户级别线程 (1:N)
    • 3、混合线程(N:N)
  • 二、go语言并发模式
    • 1.引入库
    • 2.读入数据
  • 总结


前言

一、线程的实现

线程的实现方式主要有三种:
内核线程实现、用户线程实现、用户线程加轻量级进程混合实现。
因为自己只对java的线程比较熟悉一点,所以主要针对java线程和go的协程之间进行一个对比。
线程模型主要有三种:1、内核级别线程;2、用户级别线程;3、混合线程

1、内核级别线程 (1:1)

内核级别线程就是直接由操作系统的内核(kernel)支持的线程,这种方式实现的线程主要通过内核的调度器来进行调度,由内核完成线程切换。
一般来讲程序不会直接调用系统内核线程,而是利用内核线程的一种高级接口-轻量级进程(Light Weight Process,即LWP,它也可以视为用户线程),也就是我们平时所说的线程,每一个LWP都是由一个内核线程支持,也就是先有内核线程,再有LWP。这种LWP与内核线程之间1:1的关系称为一对一线程模型,这是一种最简单的线程实现方式。
浅析Go协程和java线程_第1张图片

  • 一般直接使用API或系统调用创建的线程均为一对一的线程。一个用户使用的线程就唯一对应一个内核使用的线程。
  • 优点:用户线程具有了和内核线程一致的有点
  • 缺点:1、由于许多操作系统箱子了内核线程数量,因此一对一线程会让用户的线程数量受到限制 2、许多操作系统内核线程调度时,上下文切换的开销较大,导致用户线程的执行效率下降。

2、用户级别线程 (1:N)

这里所指的用户级线程主要是创建在用户空间的线程库上,系统内核感受不到线程的实现方式。用户线程的建立、同步、销毁等在用户态中完成,不需要内核的介入。这种进程和用户线程(UT)之间1:N的关系称为一对多线程模型。
浅析Go协程和java线程_第2张图片
浅析Go协程和java线程_第3张图片 多对一模型将多个用户线程映射到一个内核线程上,线程之间的切换由用户的代码来进行。

  • 优点:因此相对于一对一模型,多对一模型的线程切换要快速许多。(直接在用户层上切换用户线程)
  • 缺点:多对一模型一大问题是,如果其中一个用户线程阻塞,那么所有的线程将都无法执行,因为此时内核里的线程也会随之阻塞。另外,在多处理器系统上,处理器的增多线程性能也不会有明显的帮助。但同时,多对一模型得到的好处是高效的上下文切换和几乎无限制的线程数量。

3、混合线程(N:N)

这种方式相当于是第一种方式和第二种方式的混合,即有LWT,也有用户线程,这种方式中用户线程(UT)和LWT的数量比是不定的,即所谓的N:M关系,也就是所谓的多对多模型。
浅析Go协程和java线程_第4张图片
java线程实现
主要说下常用的hotspot的JVM,采用的是第一种1:1的线程模型,即:map a java thread to a native thread,也就是说java线程会和native线程有个一一映射的关系,如果看下java的Thread类就可以发现有很多的native方法,这就涉及到操作系统的线程了。

二、go语言并发模式

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

你可能感兴趣的:(Go,java)