NIO原理浅析(一)

news2024/11/17 1:47:20

IO简介

摘抄了下维基百科对IO的定义,Input/Output,输入和输出,通常指数据在存储器或者其他周边设备之间的输出和输入,输入是系统接收到信号或者数据,输出则是从系统发送的信号或数据。

Java IO 读写原理

Java中文件IO是Java层面上的应用开发,Socket是linux底层开发,都属于输入Input和输出Output的处理,简称IO读写。在原理上和处理流过程一致,区别仅仅是参数的不同。

对程序进行IO操作,基本上会用到read&write两大系统调用。可能不同的操作系统,名称不一样,功能却是一样的。

read系统调用,是将数据从内核缓冲区中复制到进程缓冲区,而write系统调用,是将数据从进程缓冲区复制到内核缓冲区。这两个系统调用,都不会负责数据在内核缓冲区和磁盘之间的交换。底层的读写,是由操作系统kernel内核完成的。

关于用户进程缓冲区和内核缓冲区的概念,可以参考一下这篇文档, 这边简述一下这两个概念:

  1. 用户进程缓冲区

用户进程通过调用访问系统资源的时候,需要切换到内核态,切换到内核态一般需要进行进程上下文的切换,这种切换需要消耗大量的时间, 用户缓冲区的目的是为了减少系统调用的次数,从而降低操作系统在用户态和核心态切换耗费的时间。

  1. 内核进程缓冲区

当一个用户进程要从磁盘读取数据时,内核一般不会直接读取磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。

等到数据已经读取到内核缓冲区时,把内核缓冲区中的数据读取到用户进程中,才会通知进程。

read是把数据从内核缓冲区复制到进程缓冲区。write是把进程缓冲区复制到内核缓冲区。write并不一定导致内核的写动作,比如os可能会把内核缓冲区的数据积累到一定量后,再一次写入。这也就是为什么断电有时会导致数据丢失。所以说内核缓冲区,是为了在OS级别,提高磁盘IO效率,优化磁盘写操作。

下图描述了每个进程4G地址空间的分配情况,具体内容请参考Linux 内核空间与用户空间
在这里插入图片描述

我们画个简图描述一下操作系统进行IO读写的过程是如何的
在这里插入图片描述

1、运行的java程序可能需要从磁盘中读取一些文件信息

2、调用java语言的api发起这次请求

3、api底层从用户缓冲区中去读取数据

4、如果用户缓冲区中有值,直接读取数据,如果没有缓存,则会发起系统read&write,去检查内核缓冲区是否有值

5、内核缓冲区没有值,业务进程就会挂起等待

6、内核缓冲区会去IO设备里面去读取数据,直到有数据能被读取

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

shell邮件发送脚本

先上整体代码 text.sh #!/bin/bash# 设置收件人邮箱 to"123456qq.com"# 设置发件人邮箱 from"21331qq.com"# 设置邮件主题 subject"Test Email"# 设置邮件内容 body"This is a test email."# 发送邮件 echo "${body}" | m…

运动耳机啥样的好用、最适合运动用的耳机推荐

在进行运动时,倾听音乐实际上是一种放松大脑、放松身体的小技巧。毕竟运动是一个耗费体力最多的活动,整个过程也往往令人感到乏味。如果有音乐作伴,你的运动就会变得更加轻松愉快。那么,哪种耳机适合运动呢?我正好对此…

气传导蓝牙耳机哪款好?好用的气传导耳机爆款推荐

​普通入耳式耳机戴久了容易诱发局部炎症。为了防止这些问题,不入耳耳机才是更好选择,不会滋生细菌、不会闷耳,那么,市面上都有哪些好用的气传导耳机呢?下面我为大伙带来最值得入手的气传导耳机,一起来看看…

【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Ja…

初始Netty

文章目录 目录 文章目录 前言 一、netty 总结 前言 认识netty 一、netty Netty是一个基于Java的高性能网络应用框架,用于快速开发可扩展的网络服务器和客户端。它提供了易于使用的抽象API,使开发人员能够轻松地构建各种网络应用程序,包括…

U盘被分成了4个盘要怎么合并

原来是做为系统盘的,然后有一大概小半年没用,今天一看它自己分成了四个盘。 并且我一插入电脑就提示我格式化 其实根本不需要任何工具,操作前最好把U盘数据备份一下 首先把你的U盘插在电脑上 方法一 U盘被分成四个分区的原因有以下几种可…

Spring Cloud Alibaba-实现服务调用的负载均衡

1. 什么是负载均衡 通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上进行执行。 根据负载均衡发生位置的不同,一般分为服务端负载均衡和客户端负载均衡。 服务端负…

一篇文章带你学好--->Git(超详细)

Git的详解与使用,一篇文章带你学习好git, ,Git是当前比较流行的版本控制工具 ,它具有分布式的功能 ,有助于我们在团队开发中提高开发效率 注意:敲黑板!!! 带领你去使用git 配有图文解释 超详细 …

英文论文 | 学术写作 | 避免机翻 | 科研人

因为自己之前完成了几篇英文论文,最近在大修一篇,所以对英文论文写作这块有一些感悟,想跟大家分享下,肯定会有不恰当的地方,也希望大家能够在评论区指出,共同进步~ 1 直接写英文,避免…

673. 最长递增子序列的个数

673. 最长递增子序列的个数 原题链接:完成情况:解题思路:方法一:动态规划方法二:贪心 前缀和 二分查找 参考代码:__673最长递增子序列的个数__动态规划__673最长递增子序列的个数__贪心_前缀和_二分查找…

如何在测试和预发环境下调试支付宝微信小程序的h5

微信 开发者工具调试 1、使用开发者工具打开 2、点击蜘蛛形状的小图标,就会出现调试页面 支付宝 真机调试 下载 1、工具下载:蚂蚁开发者工具(支付宝小程序开发者工具): 蚂蚁开发者工具官方下载_蚂蚁开发者工具最…

港联证券|指数或进入磨底阶段 短期关注环保、煤炭等板块

磨底历来都不是一天能达到的,比方2018年的政策底到商场底,半途也阅历两个多月时间。当下政策底出现之后至今也有近一个月时间,并且下跌量能不断缩短,心情面也降至冰点,种种迹象阐明离真正商场底的构成已经不远了。此时…

【Java】树结构SQL数据的如何去实现搜索

这里写自定义目录标题 需要实现的效果前端需要的json格式:一定是一个完整的树结构错误错误的返回格式错误的返回格式实现的效果 正确正确的返回格式正确的展示画面 后端逻辑分析代码总览 数据库表结构 需要实现的效果 前端需要的json格式:一定是一个完整…

LinkedList的顶级理解

目录 1.LinkedList的介绍 LinkedList的结构 2.LinkedList的模拟实现 2.1创建双链表 2.2头插法 2.3尾插法 2.4任意位置插入 2.5查找关键字 2.6链表长度 2.7遍历链表 2.8删除第一次出现关键字为key的节点 2.9删除所有值为key的节点 2.10清空链表 2.11完整代码 3.…

PowerJob容器的使用(创建一个外置动态加载的任务)

1.使用容器的模板生成功能 2. 解压导入到IDEA中,下载依赖,添加处理器 3. 打包成jar 4. 上传项目到容器 5. 启动容器--部署jar 6. 复制一份上篇文章写的测试单机执行的任务实例,把执行配置修改从外置(动态加载) &…

scratch计算圆的面积和周长 2023年5月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch计算圆的面积和周长 一、题目要求 1、准备工作 2、功能实现 二、案例分析

vue 简单实验 自定义组件 传参数 props

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"todo-list-app"><todo-item v-bind:todo"todo1"></todo-item> </div> <script> const ListR…

IIS短文件泄漏漏洞修改

升级netFramework至4.0以上版本 2.关闭Web服务扩展- ASP.NET&#xff08;不使用的可以关闭&#xff09; 3.CMD关闭NTFS 8.3文件格式的支持&#xff08;1代表关闭&#xff0c;0代表开启&#xff09; 不同系统关闭命令稍有区别&#xff0c;该功能默认是开启的&#xff0c;对于大多…

Rust之自动化测试(一):如何编写测试

开发环境 Windows 10Rust 1.71.1 VS Code 1.81.1 项目工程 这里继续沿用上次工程rust-demo 编写自动化测试 Edsger W. Dijkstra在他1972年的文章《谦逊的程序员》中说&#xff0c;“程序测试可以是一种非常有效的方法来显示错误的存在&#xff0c;但它对于显示它们的不存在…

用python从零开始做一个最简单的小说爬虫带GUI界面(2/3)

目录 前一章博客 前言 主函数的代码实现 逐行代码解析 获取链接 获取标题 获取网页源代码 获取各个文章的链接 函数的代码 导入库文件 获取文章的标题 获取文章的源代码 提取文章目录的各个文章的链接 总代码 下一章内容 前一章博客 用python从零开始做一个最简单…