Java并发编程:用户态、内核态、cache line和CPU缓存一致性协议

文章目录

  • 一、介绍
  • 二、java中那些操作使用了内核态
  • 三、cache line的概念
  • 四、CPU缓存一致性协议

一、介绍

用户态和内核态是操作系统的两种运行状态,它们分别对应于不同的权限级别和访问能力。

  • 用户态(User Mode):这是应用程序运行的环境。在用户态下,应用程序可以访问系统资源,如文件、网络等,但其访问能力受到限制。具体来说,用户态下的CPU只能受限地访问内存,并且不允许直接访问外围设备,如网卡、硬盘等。此外,用户态下的CPU不允许独占,即CPU可以被其他程序获取。为了使应用程序能够访问到内核管理的资源(如CPU、内存、I/O等),用户态必须通过系统调用来请求内核提供服务。
  • 内核态(Kernel Mode):这是操作系统内核运行的环境。在内核态下,代码拥有更高的权限,可以直接访问系统硬件资源。内核态下的代码负责管理系统资源,如进程调度、内存管理、设备驱动等。具体来说,处于内核态的CPU可以访问任意的数据,包括外围设备,并且可以从一个程序切换到另一个程序,且占用CPU时不会发生抢占情况。

用户态和内核态的划分主要是出于访问能力的限制和安全性的考量。计算机中有一些比较危险的操作,如设置时钟、内存清理等,这些都需要在内核态下完成。如果允许用户态的程序随意进行这些危险操作,极容易导致系统崩溃。因此,用户态和内核态的划分确保了系统的稳定性和安全性。

在操作系统执行用户程序时,CPU会为程序分配一段独立的内存空间作为用户态,并将程序的代码和数据加载到这段内存空间中。同时,CPU会为程序创建一个进程控制块(PCB),用于记录程序的运行状态、内存使用情况、文件描述符等信息。而在执行系统调用时,操作系统会为当前进程创建一个新的内核栈,并将当前进程的上下文切换到内核态。

请注意,频繁的用户态和内核态之间的切换会严重影响系统性能。因此,在设计和实现操作系统时,需要权衡性能和安全性之间的关系,以找到最佳的平衡点。

二、java中那些操作使用了内核态

在Java中,由于Java是一种跨平台的语言,并且主要通过Java虚拟机(JVM)运行,因此大部分Java代码本身并不直接运行在内核态。然而,当Java程序需要访问底层系统资源或执行某些特权操作时,它可能会通过JNI(Java Native Interface)或其他机制调用本地代码(通常是C、C++等编写的),这些本地代码可能会运行在内核态。

以下是一些Java中可能使用内核态的示例操作:

  • 系统调用:Java程序可以通过JNI或其他机制调用本地代码来执行系统调用,这些系统调用通常运行在内核态。系统调用是用户态程序请求内核态服务的一种方式,例如打开文件、读取文件、创建进程等。
  • 硬件访问:虽然Java本身并不直接提供硬件访问的接口,但通过JNI调用本地代码,Java程序可以间接地访问硬件资源。这些硬件访问操作通常需要在内核态下执行,以确保对硬件的安全和正确的控制。
  • 网络I/O:Java中的网络I/O操作(如Socket编程)通常通过JVM提供的网络库来实现。这些网络库可能会调用本地代码来执行网络I/O操作,这些操作可能涉及到对底层网络硬件的访问和控制,因此可能需要运行在内核态。
  • 文件I/O:虽然Java提供了丰富的文件I/O接口,但这些接口的实现通常依赖于底层操作系统的文件系统。当Java程序执行文件I/O操作时,它可能会通过JNI调用本地代码来执行底层文件系统的操作,这些操作可能需要运行在内核态。
  • 多线程管理:Java中的多线程管理是通过JVM的线程管理器来实现的。在某些情况下,线程管理器可能需要调用本地代码来执行一些特权操作,如设置线程优先级、创建线程等。这些操作可能需要运行在内核态。

需要注意的是,虽然这些操作可能会涉及到内核态的执行,但Java程序员通常不需要直接关心这些细节。JVM和相关的库会负责处理这些底层细节,并提供给Java程序员一个简单、安全的编程接口。在大多数情况下,Java程序员只需要关注他们的业务逻辑和算法实现即可。

三、cache line的概念

Cache Line(缓存行)是CPU Cache中的最小缓存单位,它通常是由若干个连续排列的字节组成的区域,该区域作为一个整体成组访问主存。目前主流的CPU Cache的Cache Line大小通常是64个字节。

在这里插入图片描述

CPU从内存读取数据时实际上是按块读取的,这就是Cache Line。当CPU要读取一个数据时,它会读取该数据所在的整个Cache Line到CPU Cache中,如果接下来要读取的数据也在这个Cache Line中,那么CPU就可以直接从Cache中读取,而不需要再去访问内存,这样可以大大提高CPU的访问速度。

此外,Cache Line的设计也是基于局部性原理的。当一个指令或数据被访问过之后,与它相邻地址的数据有很大概率也会被访问,因此将更多可能被访问的数据存入缓存,可以提高缓存命中率。

Cache Line又分为多种类型,包括直接映射缓存、多路组相连缓存和全相连缓存等。直接映射缓存会将一个内存地址固定映射到某一行的Cache Line,而多路组相连缓存和全相连缓存则具有更复杂的映射关系。

总的来说,Cache Line是CPU缓存设计中的一个重要概念,它对于提高CPU的访问速度和程序性能具有重要的作用。

Cache Line在代码中的应用:

package chatpter11;

import java.util.concurrent.CountDownLatch;

/**
 * @author: xiaoshicheng
 * @date: 2024/5/11 9:38
 **/
public class TestCacheLine {
    public static long COUNT = 1_0000_0000L;
    private static class T {
        private long p1,p2,p3,p4,p5,p6,p7;
        public long x = 0l;
        private long p8,p9,p10,p12,p13,p14,p15;
    }

    public static T[] arr = new T[2];
    static {
        arr[0] = new T();
        arr[1] = new T();
    }

    public static void main(String[] args) throws InterruptedException {
        CountDownLatch countDownLatch = new CountDownLatch(2);
        Thread t1 = new Thread(() -> {
            for (long i = 0; i < COUNT; i++) {
                arr[0].x = i;
            }
            countDownLatch.countDown();
        });

        Thread t2 = new Thread(() -> {
            for (long i = 0; i < COUNT; i++) {
                arr[1].x = i;
            }
            countDownLatch.countDown();
        });
        final long start = System.nanoTime();
        t1.start();
        t2.start();
        countDownLatch.await();
        System.out.println((System.nanoTime() - start) / 100_0000);
    }

 }

执行结果:

46

Process finished with exit code 0

四、CPU缓存一致性协议

CPU缓存一致性协议是指在多核CPU系统中,多个CPU的缓存副本应该保持一致,以保证数据的正确性和一致性。

在多核CPU系统中,每个CPU都有自己的缓存,用于提高数据访问的速度和效率。然而,由于数据的复制和缓存,不同CPU之间的缓存副本可能会出现数据不一致的情况。为了解决这个问题,CPU缓存一致性协议提出了一些机制和协议,以确保多个CPU之间的缓存副本能够保持一致。

其中,MESI协议是一种常用的CPU缓存一致性协议。它定义了缓存行的四种状态:

  • Modified(被修改):该缓存行只被缓存在该CPU的缓存中,并且是被修改过的,因此它与主存中的数据是不一致的。
  • Exclusive(独享):独享状态的缓存行只被缓存在该CPU的缓存中,它是未被修改过的,是与主存中的数据一致的。
  • Shared(共享):共享状态意味着该缓存行可能被多个CPU进行缓存,并且各个缓存中的数据与主存中的数据是一致的。
  • Invalid(无效):该缓存行中的数据无效,需要从主存中重新读取。

当CPU要修改内存中的数据时,它会向其他CPU发送消息,通知它们该数据已经被修改。其他CPU收到消息后会将自己缓存中对应的数据标记为无效状态,确保下次访问时从主存中重新读取数据,从而保证数据的一致性。

除了MESI协议外,还有其他一些CPU缓存一致性协议,如MOESI协议等。这些协议都旨在解决多核CPU系统中缓存数据一致性的问题,确保系统的正确性和稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/621838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

volatile详解、原理

文章目录 一、Volatile的定义和作用1.1 Volatile简介1.2 Volatile作用 二、并发编程中的三个问题&#xff1a;可见性、原子性、有序性二、Java内存模型&#xff08;JMM&#xff09;三、volatile变量的特性3.1 线程可见性3.2 禁止重排序禁止重排序原理禁止重排序举例 3.3 volati…

知乎知+广告推广该如何做?怎么收费?

知乎作为一个汇聚高质量用户群体的知识分享平台&#xff0c;成为了众多品牌和产品推广的优选之地。特别是知乎的“知”广告推广服务&#xff0c;以其精准定向、内容原生的特点&#xff0c;深受广告主青睐。 一、知乎知广告推广基础 1. 什么是知乎知&#xff1f; 知是知乎官方…

Java入门基础学习笔记11——关键字和标识符

1、关键字 关键字是java中已经被赋予特定意义的&#xff0c;有特殊作用的一些单词&#xff0c;不可以把这些单词作为标识符来使用。 注意&#xff1a;关键字是java用了的&#xff0c;我们就不能用来作为&#xff1a;类名、变量名、否则会报错。 标识符&#xff1a; 标识符就是…

RAG应用中的路由模式

依据的用户查询意图在 RAG 应用程序使用“路由控制模式”可以帮助我们创建更强大的 RAG 应用程序。我们通常希望用户能够访问的数据可以来自各种来源,如报告、文档、图片、数据库和第三方系统。 对于基于业务的 RAG 应用程序,我们可能还希望用户能够与其它业务系统进行交互,…

Linux 中 alarm 函数详解

目录 简介函数原型函数参数返回值使用示例设置 3 秒闹钟修改闹钟与取消闹钟设置 1 秒周期定时器 更多内容 简介 alarm 函数的功能是设置一个闹钟&#xff08;定时器&#xff09;&#xff0c;当闹钟时间到时&#xff0c;内核会向当前进程发送一个 SIGALRM 信号。 打开 Linux 终…

汇昌联信电商:拼多多新手怎么做店铺的免费流量会慢慢起来?

在拼多多上开店&#xff0c;新手们往往面临着如何吸引免费流量的挑战。毕竟&#xff0c;流量是店铺生存和发展的血脉&#xff0c;没有流量&#xff0c;就没有销量&#xff0c;店铺也就失去了生命力。那么&#xff0c;作为拼多多新手&#xff0c;如何做才能让店铺的免费流量慢慢…

Python Socket

一、服务端 from socket import *def print_hi(name):print(fHi, {name})# 允许所有ip连接IP 0.0.0.0# 端口PORT 8003# 定义一次从socket缓冲区读入512个字节数据BUFFER_LEN 512# 实例化socket对象 listenSocket 用来监听的socketlistenSocket socket(AF_INET, SOCK_STREA…

有哪些网络兼职适合大学生参与?揭秘几个简单又实用的兼职机会

有哪些网络兼职适合大学生参与&#xff1f;揭秘几个简单又实用的兼职机会 对于大学生而言&#xff0c;除了专注于学业&#xff0c;利用空余时间参与一些网络兼职&#xff0c;不仅能锻炼个人技能&#xff0c;还能为未来的职业生涯积累宝贵的经验。想象一下&#xff0c;步入社会…

基于SSM的“基于协同过滤的在线通用旅游平台网站”的设计与实现(源码+数据库+文档)

基于SSM的“基于协同过滤的在线通用旅游平台网站”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统主界面 景点信息界面 后台界面 部分源码…

SSH 免密登录,设置好仍然需要密码登录解决方法

说明&#xff1a; ssh秘钥登录设置好了&#xff0c;但是登录的时候依然需要提供密码 查看系统安全日志&#xff0c;定位问题 sudo cat /var/log/auth.log或者 sudo cat /var/log/secure找到下面的信息 Authentication refused: bad ownership or modes...&#xff08;网上的…

STM: SpatioTemporal and Motion Encoding for Action Recognition 论文阅读

STM: SpatioTemporal and Motion Encoding for Action Recognition 论文阅读 Abstract1. Introduction2. Related Works3. Approach3.1. Channel-wise SpatioTemporal Module3.2. Channel-wise Motion Module3.3. STM Network 4. Experiments5. Conclusion 文章信息&#xff1a…

3.使用uView让tabbar更优雅

文章目录 1. 使用uView让tabbar更优雅1.1. 怎么才优雅&#xff1f;1.2. uView的tabbar合适吗&#xff1f;1.3. 引入项目过程1.3.1. 修改pages.json1.3.2. 把demo里面的pages先拷贝过来1.3.3. 引入tabbar的图片1.3.4. 运行 1.4. 我们自己的项目适配 1. 使用uView让tabbar更优雅 …

深入浅出:ConcurrentLinkedQueue源码分析与实战

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

【适用全主题】WordPress原创插件:弹窗通知插件 支持内容自定义

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 适用于所有WordPress主题的弹窗插件 一款WordPress原创插件&#xff1a;弹窗通知插件 支持内容自定义 二、效果展示 1.部分代码 代码如下&#xff08;示例&#xff09;&#xff1…

4.uniapp+vue3项目使用vuex

文章目录 1. uniappvue3项目使用vuex1.1. main.js引入store1.2. 创建store/index.js1.3. 项目中引用1.4. 开始解决实际问题1.5. vuex和storage的区别 1. uniappvue3项目使用vuex 这篇文章&#xff0c;既是使用的教程&#xff0c;也是用来解决一个实际问题&#xff1a;uView自定…

Python爬虫入门:网络世界的宝藏猎人

今天阿佑将带你踏上Python的肩膀&#xff0c;成为一名网络世界的宝藏猎人&#xff01; 文章目录 1. 引言1.1 简述Python在爬虫领域的地位1.2 阐明学习网络基础对爬虫的重要性 2. 背景介绍2.1 Python语言的流行与适用场景2.2 网络通信基础概念及其在数据抓取中的角色 3. Python基…

Java面试八股之String s = “String“;和String s = new String(“String“);有什么区别

Java中String s "String";和String s new String("String");有什么区别 字符串字面量&#xff08;"String"&#xff09;&#xff1a; 常量池&#xff1a;使用字面量方式创建字符串时&#xff0c;Java虚拟机&#xff08;JVM&#xff09;会在运…

WWW服务器搭建(1)——HTTP协议原理篇

目录 一、WWW的相关概念 1.1 WWW的定义 1.2 超文本标记语言HTML 1.3 统一资源定位符URL 1.4 超文本传输协议HTTP 二、HTTP协议工作过程 2.1 DNS解析 2.2 TCP连接过程 2.3 HTTP 请求与响应 2.4 TCP连接断开 三、HTTP请求报文格式 3.1 请求行 3.2 请求头 3.3 空行 …

全国防灾减灾日主题活动投稿我可算找对了投稿方法

作为一名社区公众人员,我深知对外信息宣传的重要性。特别是在全国防灾减灾日这样的特殊时刻,我们不仅要向居民普及防灾减灾知识,还要通过媒体将社区的活动和成果展示给更多人。然而,在投稿的过程中,我最初却遭遇了诸多挑战。 起初,我采用传统的邮箱投稿方式,将精心撰写的稿件发…

【JavaWeb】网上蛋糕商城后台-客户管理

概念 上文中已讲解和实现了后台管理系统中的订单管理功能&#xff0c;本文讲解客户信息管理功能。 客户信息列表 在后台管理系统的head.jsp头部页面中点击“客户管理”向服务器发送请求 在servlet包中创建AdminUserListServlet类接收浏览器的请求 package servlet;import m…