当前位置: 首页 > news >正文

Linux 文件(3)

文章目录

  • 1. Linux下一切皆文件
  • 2. 文件缓冲区
    • 2.1 缓冲区是什么
    • 2.2 缓冲区的刷新策略
    • 2.3 为什么要有缓冲区
    • 2.4 一个理解缓冲区刷新的例子
  • 3. 标准错误

1. Linux下一切皆文件

在刚开始学习Linux的时候,我们就说Linux下一切皆文件——键盘是文件,显示器是文件,网卡是文件,硬盘也是文件。
可这到底该如何理解呢?为什么Linux下一切皆文件呢?

从操作系统的角度而言,操作系统必须要管理好各种硬件资源,所以必须先描述,再组织,而Linux下一切皆文件,所以描述硬件,同样使用struct file来进行描述。

而硬件又是如何被访问的呢?我们用户想要访问硬件,一定是通过进程进行访问的,而硬件在操作系统中以struct file的形式被描述,一切皆文件,进程访问硬件,其实就是在访问文件。

然而,有一个问题必须要考虑:不同的硬件必然具有不同的读写方式,都使用struct file进行封装,又如何区别不同的硬件之间的读写方式呢?

Linux中,使用函数指针来实现。在struct file结构体中,有一个这样的成员变量:

在这里插入图片描述

这是一个指针变量,指向一个结构体,这个结构体中包含的是硬件的操作方法集,即各种函数指针,指向读操作的函数,写操作的函数,重定位的函数等等

所以,虽然不同的硬件都是用struct file进行描述,但是依然能够通过不同的读写方式去操作不同的硬件。OS在为各个硬件创建struct file时,就自动为不同的硬件分配了其所对应的操作方法集。

所以,在进程的角度,只需要直接对文件进行操作,在进程看来,都是struct file,而不用去区分具体硬件之间的不同。

这就是Linux下一切皆文件的核心。站在进程的角度,一切都是struct file,一切都可以通过同一套文件操作接口进行操作,而不用去区分实际差别。

实际上,在进程角度的struct file,是Linux中所设计的虚拟文件系统,即VFS,Linux中封装了这么一层软件层后,开发者通过进程,只需要一套文件操作接口,就可以调度Linux中的大部分资源,这就是Linux内核设计的高明之处,是多态思想的重要体现

2. 文件缓冲区

Linux下在打开文件时,为相应文件创建struct file,而在struct file有三个核心点:文件属性,文件内核缓冲区和文件操作方法集。

文件内核缓冲区是什么呢?之前我们说,我们使用系统调用接口read或者write,不是直接从文件读或向文件写,而是向文件的内核缓冲区写,从文件的内核缓冲区读。那么接下来,我们就重点来谈一谈缓冲区这个概念。

2.1 缓冲区是什么

缓冲区本质上就是一段内存空间。
缓冲区通常会有三种:用户级缓冲区,语言级缓冲区和内核文件缓冲区。
用户级缓冲区,就是指开发者自己开辟并用于存储数据的一段空间;语言级缓冲区,是指各种编程语言在为我们封装文件时,内部所提供的缓冲区。

对于语言级缓冲区,我们以C语言为例。
C语言中,封装了FILE这个结构体,C语言的相关文件操作接口,都要设计到FILE。而在FILE中,除了会涉及到文件描述符,即fileno外,还会有一个输入缓冲区和一个输出缓冲区char* in_buffer 和 char* out_buffer。这两个缓冲区,就是语言级别的缓冲区。

实际上,我们使用C语言的相关文件接口进行读和写时,都是从语言级的缓冲区中读写,而不涉及到文件内核缓冲区。

我们以写文件为例。我们使用printf向标准输出中写,首先是将用户级缓冲区中的内容,写到语言级缓冲区中,而每一个缓冲区都会具有一定的刷新策略,当满足相应条件时,语言级缓冲区就会通过系统调用write,将其中的内容刷新到文件内核缓冲区中。就进程而言,将内容写到文件内核缓冲区后,即可认为成功写入,因为文件内核缓冲区的刷新,主要由操作系统管理(当然开发者也可以通过fsync系统调用刷新)

在这里插入图片描述

2.2 缓冲区的刷新策略

就语言级别的缓冲区而言,写入时的刷新策略主要有二种:

  • 行缓冲。在写入内容时遇到换行符即做刷新。否则,缓冲区写满再刷新。
  • 全缓冲。直到缓冲区写满后,缓冲区才做刷新。

另外,在进程退出时,也会刷新语言级别的缓冲区;当然,我们也可以使用fflush主动刷新语言级缓冲区。

就文件内核缓冲区而言,写入时的刷新策略也主要是行缓冲和全缓冲,但是文件内核缓冲区主要由操作系统进行管理,刷新策略实际会更加复杂,会涉及到一些动态刷新等。

另外,在文件关闭时,文件内核缓冲区也会被刷新;当然,我们也可以使用fsync系统调用,主动刷新文件内核缓冲区。

对于显示器文件而言,相关缓冲区一般是行缓冲;对于普通文件而言,相关缓冲区一般是全缓冲。

2.3 为什么要有缓冲区

为什么要有语言级别的缓冲区?
如果没有语言级别的缓冲区,直接从用户缓冲区向文件内核缓冲区中写,会频繁使用系统调用write,而系统调用的使用成本是很高的,消耗太大,会降低编程语言的运行效率,因此必须要有语言级别的缓冲区。

那为什么要有文件内核缓冲区呢?
如果没有文件内核缓冲区,即无法做到多次输入,一次刷新,就会频繁地进行磁盘级I/O,而磁盘级I/O的效率是很低的,那么这样,整个程序的运行效率也会下降。

总而言之,缓冲区的存在,是为了提高进程运行的效率,避免无意义的消耗。

2.4 一个理解缓冲区刷新的例子

在这里插入图片描述
来看上述代码重定向前与重定向后运行结果的不同:

在这里插入图片描述
为什么重定向前后的输出结果会不同呢?这就涉及到缓冲区刷新策略不同的问题了。

对于write而言,是直接向文件描述符为1的文件内核缓冲区中写;而对于printf,虽然默认也是向标准输出中写,但是它首先会将内容写到C语言自身设计的语言级缓冲区中。

未重定向前,write和printf都是最终写入到标准输出中,即显示器文件,而标准输出所对应的语言级缓冲区和文件内核缓冲区都是以行缓冲的形式进行刷新,所以 printf 输出的字符串,会被立刻由用户级缓冲区刷新到文件内核缓冲区,再刷新到显示器文件中;而write输出的字符串,则直接由文件内核缓冲区刷新到显示器文件中。多进程的创建并不影响整个过程。

重定向后,文件描述符1不再对应标准输出文件,而是对应普通文件,因此语言级缓冲区和文件内核缓冲区的刷新策略都变为全缓冲。多进程的创建对于直接写入到内核缓冲区中的write没有影响(从进程的角度,认为写入到内核缓冲区后,即完成写入),但对于写入语言级缓冲区的printf,此时就有影响了。

由于不再是行缓冲,因此printf写入语言缓冲区后,不会立刻刷新。而当创建多进程后,父子进程之间共享代码和数据,而当进程结束时,语言级缓冲区会被刷新,由于子进程会先于父进程结束,而刷新会对语言缓冲区做出更改,为了确保父子进程间的独立性,就会发生写时拷贝,这样子进程就不再与父进程共享同一个语言缓冲区,这也就意味着,子进程结束,刷新语言缓冲区后,父进程语言缓冲区中的内容并没有被刷新,这也就是为什么上述将打印内容重定向到文件后,会出现两个hello printf 的原因,本质还是因为发生了写时拷贝。

3. 标准错误

下面,我们来简单聊聊标准错误。

标准输入一般对应键盘文件,刷新策略为行缓冲;而标准输出和标准错误一般对应显示器文件,标准输出为行缓冲,标准错误则通常无缓冲,输出即刷新。

既然标准输出和标准错误都对应显示器文件,那为什么要专门区分它们呢?

区分标准输出(fd为1)和标准错误(fd为2),最主要还是为了区分输出流和错误流,即区分正确输出和错误输出。

我们来看下面的一个示例:

在这里插入图片描述
我们在命令行中,使用输出重定向来区分标准输出和标准错误。

在这里插入图片描述
这样,我们就区分出了标准输出和标准错误。
在上述代码中,值得一提的是,如果不指明具体进行重定向的文件描述符,默认是将1号文件描述符,即标准输出进行重定向。

如果不想区分标准输出和标准错误,而想将这两者全部重定向到某个文件中,我们可以在命令行中进行如下操作:

在这里插入图片描述
在上述命令行中,我们先将stdout重定向到log.txt中,再将stderr重定向到文件描述符1多对应的文件中,也就是log.txt中。

至于为什么log.txt中,数字的顺序与我们程序的逻辑不太符合,这个不用太在意,因为这个涉及到文件内核缓冲区更加复杂的刷新机制。

相关文章:

Linux 文件(3)

文章目录 1. Linux下一切皆文件2. 文件缓冲区2.1 缓冲区是什么2.2 缓冲区的刷新策略2.3 为什么要有缓冲区2.4 一个理解缓冲区刷新的例子 3. 标准错误 1. Linux下一切皆文件 在刚开始学习Linux的时候,我们就说Linux下一切皆文件——键盘是文件,显示器是文…...

Java异步编程利器:CompletableFuture 深度解析与实战

精心整理了最新的面试资料和简历模板,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 一、CompletableFuture 概述 CompletableFuture是Java 8引入的异步编程工具类,实现了Future和CompletionStage接口,支持链式调用、组…...

如何支持Enhanced RTMP H.265(HEVC)

在实时音视频传输中,H.264长期占据主流,但随着视频质量要求的不断提高和带宽压力的加大,H.265(HEVC)作为下一代视频编码标准逐渐崭露头角。 在这种背景下,我们顺应行业发展趋势,成功集成了对Enh…...

Idea 查找引用jar包依赖来源的Maven pom坐标

目录 问题引入 实现解决 问题引入: 在查看拉取的项目,维护自己项目、或者迁移原有项目时,会遇到不知道代码中引用到的依赖从哪里引用到的。 所以利用Idea,从import语句到Maven项目结构树中查找,最终找到pom文件里的…...

Linux操作系统之进程(二):进程状态

目录 前言 一、补充知识点 1、并行与并发 2、时间片 3、 等待的本质 4、挂起 二. 进程的基本状态 三、代码演示 1、R与S 2、T 3、Z 四、孤儿进程 总结: 前言 在操作系统中,进程是程序执行的基本单位。每个进程都有自己的状态,这些…...

web.py使用时报错AttributeError: No template named image_window

在使用python的web.py框架做前后端时遇到问题。 问题代码主要如下,当加上main(iamge_name)这行代码后就会报错。报错信息包含两个:第一是找不到image_window模板;第二是gbk无法解码... class ImageWindow:def GET(self, image_name):main(i…...

2025年度消费新潜力白皮书470+份汇总解读|附PDF下载

原文链接:https://tecdat.cn/?p42178 过去一年,消费市场在政策驱动与技术迭代中呈现结构性变革。社零总额达487,895亿元,实物商品网零额占比27%,线上渠道成为增长引擎。本报告从食品饮料、美妆护肤、家电数码、服饰户外四大核心领…...

全平台开源电子书阅读器推荐,支持多端同步+AI朗读!支持epub/mobi/azw3/pdf常见电子书格式!

Readest是一款好用的免费阅读工具,界面干净不花哨,特别适合喜欢专心读书的朋友。这个软件是经典阅读软件Foliate的全新升级版本,用最新技术开发,能在手机、电脑(包括苹果和Windows系统)以及网页上顺畅使用。…...

创建Workforce

创建你的Workforce 3.3.1 简单实践 1. 创建 Workforce 实例 想要使用 Workforce,首先需要创建一个 Workforce 实例。下面是最简单的示例: from camel.agents import ChatAgent from camel.models import ModelFactory from camel.types import Model…...

关于光谱相机的灵敏度

一、‌灵敏度的核心定义‌ ‌光谱灵敏度(单色灵敏度)‌ 描述光谱相机对单色辐射光的响应能力,即探测器对特定波长入射光的输出信号强度与入射光功率的比值。 例如,若在680nm波长下的光谱灵敏度较高,则表示该相机对此…...

【Redis】二、Redis常用数据类型命令学习

目录 一、String 1. SET、GET:设置与读取键值对: 2. DEL:删除键 3. INCR、DECR:自增 / 自减(常用于计数器) 4. APPEND:内容追加 5. EXPIRE:设置过期时间 / 查看剩余时间&#x…...

HarmonyOS基础组件:Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能,这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说,功能比较丰富,扩展性高,减…...

RT_Thread——快速入门

文章目录 一、RT-Thread 目录结构二、核心文件三、移植时涉及的文件3.1 CPU 部分3.2 BSP 部分 四、内存管理五、启动流程及main函数5.1 启动流程5.2 关键函数速览5.3 main 函数示例 六、数据类型和编程规范6.1 数据类型6.2 函数名6.3 结构体定义6.4 注释规范 七、使用模拟器运行…...

Java 参数值传递机制

一个很经典的问题: java的方法入参 是值传递还是地址传递? 答案是:值传递。 今天排查一个生产问题,数据库链接资源没有关闭。 大致代码逻辑如下: try{Preparestatement ps null;String sql "select * from tableA wher…...

Redis 的 key 的过期策略是怎么实现的

在 Redis 中,有一个 expire 命令,用来设置某个 key 的过期时间,当超过这个时间后,这个 key 就被删除了,我们也就获取不到了,但是 Redis 是如何做到对于每一个设置了过期时间的 key 都能按时删除的呢&#x…...

ROG NUC 2025 :狂暴而冷静的小猛兽

在今年1 月的 CES 展会上,华硕首次披露了ROG NUC 2025,就以突破性紧凑设计桌面级超强性能配置,引发全球科技媒体和游戏爱好者的热议。蛰伏数月,蓄力进化! 华硕自承接英特尔NUC产品线以来,就一直致力于重塑迷…...

origin绘图之【如何将多条重叠、高度重叠的点线图、折线图分开】

在使用 Origin 进行数据可视化时,尤其是在绘制多组数据的折线图或点线图时,我们经常会遇到这样的问题:多条曲线重叠严重,难以区分,导致图形信息密集、可读性差,影响图表的传达效果。 那么,我们该…...

2025第一届轩辕杯--Crypto--WriteUp

2025第一届轩辕杯–Crypto–WriteUp Crypto easyrsa task e 65537 n 1000000000000000000000000000156000000000000000000000000005643 c 418535905348643941073541505434424306523376401168593325605206exp from Crypto.Util.number import inverse, long_to_bytese …...

人工智能范式:技术革命下的认知重构

当生成式AI能够自主创作内容、设计解决方案甚至编写程序时,我们正在见证的不仅是工具革新,更是一场认知范式的根本转变。人工智能范式正在重塑人类理解世界、解决问题和创造价值的基本方式——这种转变将重新定义未来十年的职业逻辑与知识体系。 一、范…...

python训练营打卡第30天

模块和库的导入 知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 一、导入官方库 1.标准导入:导入整个库 import mathprint(&quo…...

第29天-python实现mysql数据增删改查

想用Python和Tkinter实现一个MySQL数据库的增删改查应用。首先,我需要确定用户的需求是什么。他们可能想要一个图形界面,方便操作数据库,而不需要直接写SQL语句。用户可能对Python和Tkinter有一定了解,但对如何整合数据库操作可能不太熟悉。 首先,我应该考虑如何设计界面。…...

2025.05.21华为暑期实习机考真题解析第三题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. GPU资源租赁优化 问题描述 A先生是一家云计算服务商的资源调度负责人,负责管理公司的GPU资源租赁业务。公司拥有多个高性能GPU核心,并按时间段出租给不同客户使用。每个客户有…...

Datawhale 5月llm-universe 第4次笔记

第四章 构建RAG应用 envs 在 Conda 中,envs 目录是用来存放虚拟环境的地方。 也就是说,你在运行: onda create -n llm-universe python3.10 时,Conda 就会在这个路径下创建一个新的文件夹: makefile D:\Users\…...

滑窗问题实验LC2653(一次遍历维持窗口元素保持排序)

在只有一次遍历(即滑窗每向右移动一步只处理新增元素和删除旧元素)的前提下,要维持当前窗口内元素的全局“可排序”结构 问题背景:LeetCode 2653 - 滑动子数组的美丽值 题目要求在大小为 k 的滑动窗口中,找到第 x 小…...

PHP学习笔记(八)

返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值,但可以通过返回一个数组来得到类似的效果 函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&: 可变函数 PHP支持可变函数的概念。意味…...

【react18】在styled-components中引入图片报错

在styled-components项目中,遇到背景图片显示不出来的问题。图片的确是引入正确,但是webpack解析路径是有问题的 效果展示 以下这两种写法都不行,无法生效 export const HeaderNavLeft styled.h1width: 176px;height: 69px;background: ur…...

693SJBH基于.NET的题库管理系统

计算机与信息学院 本科毕业论文(设计)开题报告 论文中文题目 基于asp.net的题库管理系统设计与实现 论文英文题目 Asp.net based database management system design and Implementation 学生姓名 专业班级 XXXXXX专业08 班 ⒈选题的背景和意…...

centos系统redis-dump安装

1. ​Ruby 环境​ Redis-dump 是一个 Ruby 工具,需先安装 Ruby 和 RubyGems。 安装依赖​: sudo yum install -y curl gpg2 gcc-c patch readline readline-devel zlib zlib-devel libyaml-devel libffi-devel openssl-devel make bzip2 autoconf aut…...

如何利用 Conda 安装 Pytorch 教程 ?

如何利用 Conda 安装 Pytorch 教程 ? 总共分为六步走: (1)第一步:验证conda 环境是否安装好? 1) conda -V2) conda --version(2)第二步:查看现有环境 conda env list…...

FPGA降低功耗研究

FPGA降低功耗研究 首先要明白一点:我们的核心目标是在维持性能的前提下,通过工艺、架构、设计方法学和系统级策略的协同优化,降低动态功耗、静态功耗和短路功耗。 本篇文章则是聚焦于 FPGA 设计阶段 的功耗优化,主要从 RTL 代码设…...

软考 系统架构设计师系列知识点之杂项集萃(67)

接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(66) 第108题 RISC(精简指令系统计算机)的特点不包括()。 A. 指令长度固定,指令种类尽量少 B. 寻址方式尽量丰富&#xff…...

第十节第三部分:常见API:传统时间:Date日期类、SimpleDateFormat

Date日期类常用方法 时间格式常用符号 Date日期类总结 为什么用SimpleDateFormat SimpleDateFormat常见方法 SimpleDateFormat解析字符串时间成为日期对象 SimpleDateFormat总结 代码: 代码一:Date日期类 package com.itheima.Time;import java.util.D…...

Python学习Day1:安装

Python的安装 1.安装python 打开python的官网,我们下载3.6.8版本Python Release Python 3.6.8 | Python.org 根据自己的电脑来下载对应的python版本 如图所示: 我已经下载完成,就是这样, 安装页面的第一排是自动安装&#xf…...

Java安全-Servlet内存马

内存马简介 内存马是指将恶意代码注入到内存中,达到无文件落地的效果,使得被攻击方难以察觉。由于是无文件的形式,可以绕过部分基于文件检测的杀软。而 Servlet 内存马是基于 Java Servlet 技术,动态将恶意代码注入到 Tomcat 内存…...

Mariadb cpu 93% 问题

最近项目遇到cpu平均使用率93% 一、登录数据库服务查看具体情况 可以看到服务器负载很高,,mariadb CPU使用已达到接近380.4% (因为是8核,所以会有超过100%的情况)。如下图: 二、排查是否有耗时较长sql 在…...

LeetCode222_完全二叉树的结点个数

LeetCode222_完全二叉树的结点个数 标签:#位运算 #树 #二分查找 #二叉树Ⅰ. 题目Ⅱ. 示例 0. 个人方法 标签:#位运算 #树 #二分查找 #二叉树 Ⅰ. 题目 给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。 完全二叉树 的定义如下&…...

linux 查看java的安装路径

一、验证Java安装状态 java -version正常安装会显示版本信息: openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)二、检查环境变量配置 若已配置JAVA_HOME&#…...

day32 python解释性库PDPbox

目录 一、初识PDPbox官方文档 二、准备鸢尾花数据集和训练模型 三、使用PDPbox进行解释性分析 1. 导入类并实例化对象 2. 调用plot方法绘制图形 3. 探索返回值的意义 四、总结与感悟 作为一名正在学习机器学习的学生,今天要学习一个非常有趣的库——PDPbox&am…...

LVLM-AFAH论文精读

Basic Information 标题:Your Large Vision-Language Model Only Needs A Few Attention Heads For Visual Grounding作者:Seil Kang, Jinyeong Kim, Junhyeok Kim, Seong Jae Hwang机构:Yonsei Universit…...

蓝桥杯3503 更小的数

问题描述 小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从 0 到 n−1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。 小蓝想要将选出的子…...

5.21本日总结

一、英语 复习list4list26 二、数学 学完14讲,1000题13讲写完 三、408 学习计网5.3剩余内容 四、总结 高数本月结束知识点学习,15讲知识点与14讲的题目同步进行。408剩余两本书要加快学习进度。 五、明日计划 英语:复习lsit5list25 …...

【25软考网工】第七章(3) UOS Linux防火墙配置和Web应用服务配置

博客主页:christine-rr-CSDN博客 ​​​专栏主页:软考中级网络工程师笔记 ​​​​ 大家好,我是christine-rr !目前《软考中级网络工程师》专栏已经更新三十多篇文章了,每篇笔记都包含详细的知识点,希望能帮助到你&am…...

Python数据分析基础

Python数据分析入门 介绍 在这个教程中,我们将学习如何使用Python来进行基本的数据分析。 安装必要的库 为了开始,你需要安装以下Python库: NumPyPandasMatplotlib 示例代码 import numpy as np import pandas as pd import matplotli…...

spring cloud config更新配置

在开发微服务时,往往需要有开发环境、测试环境和生产环境,手动修改配置环境是一件很麻烦的事情,因此,这里使用spring cloud config管理配置环境。要使用spring cloud config,需要先在GitHub搭建一个仓库。 一、仓库搭…...

小米汽车二期工厂下月将竣工,产能提升助力市场拓展

在新能源汽车市场竞争日益激烈的当下,小米汽车传来重要进展消息。据多方信息显示,小米汽车二期工厂下月即将竣工,这一关键节点的到来,有望为小米汽车的产能提升与市场布局带来重大突破。​ 小米汽车二期工厂位于北京亦庄&#xff…...

【单片机】如何产生负电压?

以下是对知乎文章《单片机中常用的负电压是这样产生的!》的解析与总结,结合电路原理、应用场景及讨论要点展开: 一、负电压产生的核心原理 负电压本质是相对于参考地(GND)的电势差为负值,需通过电源或储能…...

Mcu_Bsdiff_Upgrade

系统架构 概述 MCU BSDiff 升级系统通过使用二进制差分技术,提供了一种在资源受限的微控制器上进行高效固件更新的机制。系统不传输和存储完整的固件映像,而是只处理固件版本之间的差异,从而显著缩小更新包并降低带宽要求。 该架构遵循一个…...

阿里云ecs 8核 16G 内存 装有redis6 分配了3G内存,和2个tomcat 每个tomcat 4G 服务器反应迟钝,如何确认不是redis的问题

我们经常用redis 但遇到tomcat timeout的时候,如何确认不是redis的问题。 不能因为这个再去搞个redis 压力测试。有没有更省劲的方法来确认不是redis的问题 以下是针对 阿里云 ECS(8核16G,Redis 6分配3G内存,2个Tomcat各分配4G&a…...

机器学习-KNN算法

1.机器学习概述(全部流程) 获取数据:from sklearn.datasets import load_wine 数据处理(数据集划分、标准化):from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler 特征工程:from s…...

【数据结构 · 初阶】- 快速排序

目录 一. Hoare 版本 1. 单趟 2. 整体 3. 时间复杂度 4. 优化(抢救一下) 4.1 随机选 key 4.2 三数取中 二. 挖坑法 格式优化 三. 前后指针(最好) 四. 小区间优化 五. 改非递归 快速排序是 Hoare 提出的一种基于二叉树…...