操作系统用户态和内核态的由来以及区别

目录

微软开发的 windows 系列

unix 系列

linux 系列

虚拟线程

alibaba 自研的 dragonwell jdk

腾讯的 KonaFiber

jdk 21


目前市场上操作系统有如下几种

微软开发的 windows 系列

普通电脑上使用 windows 系列,服务器上用的 windows server 系列。

unix 系列

商业付费,与硬件绑定,对应的公司会提供售后支持。一般服务器上使用,个人电脑上用的有 macbook上自带的macos。

linux 系列

代码开源,其中 linux 是把 unix 的功能给实现了一下,但是源码与 unix 源码不同。类似于照葫芦桦画瓢。unix 早于 linux。linux 可以运行在多种硬件平台。

说白了就是 unix 挑食,是大少爷,娇贵,什么东西都要单独来,吃饭要单独开小灶,linux 不挑食,开小灶和吃大锅饭都行。

在个人电脑和服务器上都有使用,大部分是服务器上用的,个人电脑上代表是 ubuntu 的 desktop 版本。

https://learn.microsoft.com/zh-cn/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode

至于操作系统为什么要区分用户态和内核态,是由于内核的安全性高,所有与硬件的设备的交互都通过操作系统来,确切来说是 cpu,不正常的调用可能会造成操作系统崩溃,操作系统的开发者定义了一系列的 api 来方便应用程序的开发者访问计算机的资源。只是这个操作需要操作系统进行流转。操作系统的角色是一个代理者,功能是帮我们开发的程序干事的。

java 的底层 jvm 就是使用了 c++ 语言编写了一个计算机来调用操作系统提供的 api 来处理各种操作,还有 java 代码中的 native 关键字,以及进行 cas 操作的 unsafe 类。使用 java 的开发人员只是将 java 里的这些 api 进行调用从而间接调用操作系统的 api 最终调用 cpu 和其他设备。

应用程序的开发者开发的程序运行在用户态,这样就面临一个问题,程序需要访问计算机接入的设备怎么办?操作系统的开发者想到这个了,就是需要切换到内核态,如下步骤

  1. 将用户态中当前程序的运行状态进行暂存
  2. 复制对应的参数到内核态,创建内核栈
  3. 内核进行检查(因为内核对除了自己以外的不信任)
  4. 调用 cpu 进行接下来的处理
  5. 复制内核态的执行结果,切换回用户态
  6. 恢复之前的用户态现场

这只是一个程序内部处理,还没关系到向外传输数据,那就需要对应的双倍处理。

状态切换是一个重操作,在程序运行过程中能不切换就不切换。

我们开发的程序运行在用户态时以进程形式体现,每个进程在执行任务时会创建线程。

线程是 cpu 资源调度的基本单位。目前 jvm 中设计的线程与操作系统的线程是一一对应的。

针对同步锁 synchronized 有三种状态,自己之前写了一篇文章

https://blog.csdn.net/zlpzlpzyd/article/details/125559999

轻量级锁在线程争用锁的时候,如果竞争失败,会直接升级到重量级锁,这个会切换到内核态使用 操作系统层面的 mutex lock 来执行,使用 mutex lock 需要将当前线程挂起,类似于 thread 的 sleep,当前任务会进入队列等待执行。

虚拟线程

针对这种用户态和内核态切换的问题,目前市面上 java 语言通过虚拟线程来处理,有如下三种实现

https://github.com/openjdk/loom

openjdk 的子项目,用于虚拟线程处理,在程序创建的线程后添加了一个虚拟线程集合,为后面 openjdk 加入此功能或者其他 jdk 加入此功能提供了参考。

https://medium.com/javarevisited/how-to-use-java-19-virtual-threads-c16a32bad5f7

alibaba 自研的 dragonwell jdk

添加了 wisp 2功能,就是在 openjdk 基础上修改了 jvm 的源码,从底层 jvm 层面不需要修改现有的代码支持虚拟线程。

https://blog.csdn.net/zlpzlpzyd/article/details/133536261

腾讯的 KonaFiber

同 dragonwell jdk,在 api 层面实现,需要修改代码,通过参数 -XX:+/-UseKonaFiber控制打开、关闭协程功能(默认打开)

jdk 21

在 2023.09.19 正式发布。loom 项目转正,正式作为  openjdk 的一部分供 java 语言的使用者通过 api 来调用此功能。

使用了虚拟线程,这样就做到了应用程序创建的线程与虚拟线程是一对多的关系,会大大提高效率,减少操作系统的线程创建和销毁。

之前自己写的文章

https://blog.csdn.net/zlpzlpzyd/article/details/133160643

参考链接

https://blog.csdn.net/qq_34337272/article/details/133886798

https://www.zhihu.com/question/24217234

https://www.jianshu.com/p/fe04d47171dd

https://juejin.cn/post/6943142168684920840

https://juejin.cn/post/6923863670132850701

https://blog.csdn.net/qq_41709234/article/details/124320482

  • 19
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值