【Linux系统】进程地址空间详解
Linux系列
文章目录
- Linux系列
- 前言
- 一、地址空间的区域划分
- 二、进程地址空间的引入
- 2.1 地址空间的概念
- 2.2 地址空间
- 2.3 进程地址空间的优点
- 三、页表
- 3.1 区域权限管理
- 3.2 惰性加载
- 总结
前言
进程地址空间是操作系统为每个运行中的进程分配的一个虚拟内存视图,它是所能访问的所有内存地址的集合。这给抽象层使得每个进程看起来都像是占用了整个计算机的内存资源,而实际上这些需您地址会v欸操作系统映射到物理内存中。本篇我将介绍进程地址空间的概念及使用这种方法带来的好处。
在学习这块之前,我们需要一些背景知识作为铺垫
一、地址空间的区域划分
在我们学习C/C++时经常会提到:哪个变量存在栈区、常量区不能被修改等一些概念,那么进程是如何来划分这些区域的呢?
下面我们通过程序打印来验证:
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int num;5 int tmp=1;6 int main()7 {8 char *str="12345";9 int *ptr=(int*)malloc(sizeof(int));10 printf("code addr:%p\n",main);11 printf("read only string addr:%p\n",str);12 printf("init global value addr:%p\n",&tmp);13 printf("uninit global value addr:%p\n",&num);14 printf("heap:%p\n",ptr);15 printf("stack add:%p\n",&str); 16 return 0;17 }
程序执行结果和我们所画一致,有了这下铺垫,我们就可以浅谈一些进程地址空间了。
当然大家也可以采用打印的方式验证,堆区、栈区的增长方向。
二、进程地址空间的引入
我们在介绍fork
的博客中有一个这样的问题没有给大家解答:
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main()5 {6 pid_t id=fork();7 if(id==0)8 {9 printf("I ma child,pid:%d,ppid:%d,id:%d,&id:%p\n",getpid(),getppid(),id,&id);10 }11 else12 {13 printf("I ma parent,pid:%d,ppid:%d,id:%d,&id:%p\n",getpid(),getppid(),id,&id); 14 }15 return 0;16 }
对于接收frok
返回值的变量id
来说,在父子进程中,同一个变量名,连地址都相同,我们打印却看到了不同的值,这是怎么做到的呢?如果我们打印出来的地址是物理地址,显然不会出现上面的现象!!我们将这个地址称为线性地址或虚拟地址。
2.1 地址空间的概念
在我们刚开时学习进程时,我们称一个加载到内存中的程序叫做进程,再到进程是PCB结构体+你的代码和数据,然后又有进程不能只简单的认为进程是PCB结构体数据+你的代码和数据还要考虑环境变量的影响,在本篇我们又要对进程重新定义了
当一个程序变为进程时,操作系统不仅会给他创建描述它的PCB
结构体对象,还会创建属于它的进程地址空间,对应的页表。
以上面父子进程的创建为例,让大家先有个框架,后面我们分开详细介绍
进程地址空间:内部存有虚拟地址(我们&获得的地址)
页表:KV
结构的映射结构
当我们的CPU
再对进程数据进行访问时,首先找到进程的PCB
结构体,通过结构体访问进场地址空间,得到数据的虚拟地址,这时CPU
通过cr3寄存器
中存储的该进程页表的地址找到,该进程的页表,使用得到的这个虚拟地址在页表中匹配,匹配成功后,通过虚拟地址映射的物理地址就可以找到想要访问的数据。这就是整个的访问流程,再结合我们上面提到的父子进程的问题接着分析:
子进程被创建是,并不是平白的在操作系统中多了一个进程,而是操作系统基本根据,父进程的PCB
结构体对象生成一份子进程的PCB
结构体对象(当然会做一些修改),将父进程的进程地址空间,拷贝一份给子进程,页表就有一点不一样了,为了好理解,我们也认为它拷了一份给子进程,这时就会出现这种现象:
这样就可以实现父子进程共用同一分代码了,现在我们就可以回答为什么,父子进程的同变量名,地址相同但是存储值不同?,或者说是写时拷贝是如何实现的?继续:
当子进程要修改数据时,首先CPU
找到子进程的PCB
结构体对象,同过PCB
结构体对象找到进程地址空间,拿到要修改数据的虚拟地址(现在可以知道两次取到的对象地址相同,是因为子进程的进程地址空间就是拷贝的父进程的当然相同),通过CPU
中cr3寄存器
存的页表地址找到对应页表,使用虚拟地址进行匹配,这时操作系统识别出你是子进程在访问父进程的数据还想要修改,操作系统就会另外给你一份空间将你要修改的值存入新的空间,并用这块新空间的物理地址,覆盖原来的物理地址,这就是写时拷贝,而我们在代码层面的取地址操作,取出的是虚拟地址,在底层他们的物理地址早就不一样了,所以对外表现出地址相同,值不相同的概念。
看到这里大家想一想,物理地址是和我们上面画的语言是连续的吗?或者是物理地址是否连续还重要吗?
上面的图,为了方便大家理解(还有就是图太大了),我将他们画成连续的了
希望大家看到这能有自己的理解,后面还会进行总结。
2.2 地址空间
为了先让大家有一个整体框架,我们在上面并没有详细介绍
什么叫做地址空间呢? 在介绍冯诺依曼体系结构中我们说过,设备间数据是传递是通过总线来完成的,今天我们就来浅谈一些这个概念:
在32为计算机中,有32位的地址和总线,每一根总线都代表高低电压(高表现为1,低表现为0),CPU
当他要访问内存中的某个地址的数据时,就会同这32根总线对内存进行充电(转化为0 1),找到对应位置的值,内存更具存储值进行放电让CPU
接受到信息
这32根总线0、1组合起来就对应2^32 个位置(最小单位位
),也就是4GB
内存,所谓的地址空间就是我们的地址总线排列组合形成的地址范围【0,2^32】。
如何理解地址空间的划分? 这好像我们高中的时间作息表一样,如:5点到6点是早读时间,6点到6:30是早餐时间,6:40到12点是上课时间等,地址也是这样将空间进行范围的划分,我们不需要管上的是什么课只需要将时间划分出来即可,也就是说我们只需要将内存区域的开始,到结束记录下来就可以了,为了方便访问,我们需要对划分的区域进行管理---------先描述再组织,创建出用于管理的结构体,表现为:
这个概念在前面的文章中一直在说
每个进程空间都是【0,4GB】我们计算机哪有那么多空间给他用啊?画饼,操作系统给每个进程都画一张4GB
的饼,所以对于每个进程来说,它只知道操作系统承诺要给他4GB
,操作系统也不管那么多,等j进程要用到4GB
时,我不给就是了。
2.3 进程地址空间的优点
1.让进程以统一的视角看待内存。
2.增加进程虚拟地址空间,可以让我们访问内存的时候,增加一个转换的过程,再这个转化过程中,系统可以对我们的寻址操作进行审查,一旦发现异常访问,直接拦截,该请求不会达到物理内存,保护物理内存。
3.因为有进程地址空间和页表的存在,将进程管理模块和内存管理模块进行解耦合!
三、页表
3.1 区域权限管理
在讲解上面部分时,我将页表简化了,下面我们来补充
我们在学习C/C++时经常说,处在常量区的数据不能被修改,那么对于物理内存来说,物理内存存在只读这个概念吗?显然这一点物理内存是办不到的。
正在运行的程序不能完成对常量的修改是应为,在虚拟内存转化为物理内存的过程中拦截了这个行为:
当CPU
要对常量数据进行修改时,找到页表后通过虚拟地址匹配成功,发现这个区域为只读权限,操作系统就会拦截这个行为。
3.2 惰性加载
大家想一下我们平时玩的游戏都大几百G,而我们的电脑运行内存是远远小于它的,那么这个游戏是如何在我们的电脑上运行的呢?操作系统对此采用惰性加载的方式,即一次向内存中加载50MB的代码数据,每当我们的CPU
去执行代码时,它就会去页表中找到对应的虚拟地址位置,然后再通过页表状态信息判断,这个代码有没有被加载到内存中,如果有就执行,如果没有就触发缺页中断,先将代码写入内存再执行,这就很完美的解决了,运行问题,当然我们也可以不提前加载50MB代码,当我们需要执行这里的代码时,就通过上面的方式先判断再加载。在我们介绍进程状态时,挂起状态就是这样做的。
总结
学完上面的我们就可以知道为什么说进程相互独立:进程的PCB
结构体是独立的、进程地址空间是独立的、页表是独立的、对进程切换时只需要切换PCB
结构体对象就可以了。
进程对数据存储位置不重视,要求虚拟地址连续就可以让进程以统一视角看待内存。
相关文章:
【Linux系统】进程地址空间详解
Linux系列 文章目录 Linux系列前言一、地址空间的区域划分二、进程地址空间的引入2.1 地址空间的概念2.2 地址空间2.3 进程地址空间的优点 三、页表3.1 区域权限管理3.2 惰性加载 总结 前言 进程地址空间是操作系统为每个运行中的进程分配的一个虚拟内存视图,它是所…...
使用Dependency Walker和Beyond Compare快速排查dll动态库损坏或被篡改的问题
目录 1、问题描述 2、用Dependency Walker工具打开qr.dll库,查看库与库的依赖关系以及接口调用情况,定位问题 3、使用Beyond Compare工具比较一下正常的msvcr100d.dll和问题msvcr100d.dll的差异 4、最后 C软件异常排查从入门到精通系列教程ÿ…...
蓝桥杯 刷题统计
问题描述 小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题? 输入格式 输入一行包含三个整数 a,b和 n. 输出格式 输出一个整数代表天数。 样…...
019-RSA
RSA 一、RSA技术原理与流程(附流程图) 密钥生成流程 graph TDA[选择大质数p/q] --> B[计算np*q]B --> C[计算 “φ(n)p-1*q-1”]C --> D[选择e与φ(n)互质]D --> E[计算d满足ed≡1 mod φ&am…...
《 C++ 点滴漫谈: 三十一 》函数重载不再复杂:C++ 高效调试与性能优化实战
摘要 本篇博客深入探讨了 C 中的函数重载及其调试技巧。首先,介绍了函数重载的基本概念及其在 C 编程中的应用,强调了如何通过函数重载提高代码的灵活性和可读性。接着,我们讨论了函数重载的常见问题,如二义性、隐式类型转换和重…...
2024年消费者权益数据分析
📅 2024年315消费者权益数据分析 数据见:https://mp.weixin.qq.com/s/eV5GoionxhGpw7PunhOVnQ 一、引言 在数字化时代,消费者维权数据对于市场监管、商家诚信和行业发展具有重要价值。本文基于 2024年315平台线上投诉数据,采用数…...
uniapp APP权限弹框
效果图 第一步 新建一个页面,设置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…...
【Weaviate】数据库:向量存储与搜索的新纪元
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Weaviate 2、Weaviate 能做什么? …...
机器学习之激活函数
什么是激活函数 激活函数是神经网络的关键组件,作用于神经元输出。神经元汇总输入并计算净输入值,激活函数将其非线性变换,生成神经元最终输出,该输出作为后续神经元输入在网络中传播。 为什么需要激活函数 引入非线性 无激活…...
ACWing:178. 第K短路 (A*算法)
178. 第K短路 - AcWing题库 ac代码: #include<iostream> #include<cstring> #include<queue> using namespace std; const int N1010; const int M20020; struct node{int d,end,d1;bool operator <(const node &x)const{return d>x.d…...
Windows 图形显示驱动开发-WDDM 3.0功能- 硬件翻转队列(一)
WDDM 3.0 之前的翻转队列模型 许多新式显示控制器支持对按顺序显示的多个帧排队的能力。 从 WDDM 2.1 开始,OS 支持将在下一个 VSync 中显示的多个未完成的翻转覆盖请求。 显示微型端口驱动程序 (KMD) 通过 DXGK_DRIVERCAPS 中的 MaxQueuedMultiPlaneOverlayFlipVS…...
本地仓库设置
将代码仓库初始化为远程仓库,主要涉及在服务器上搭建 Git 服务,并将本地代码推送到服务器上。以下是详细的步骤: 1. 选择服务器 首先,你需要一台服务器作为代码托管的远程仓库。服务器可以是本地服务器、云服务器,甚…...
openEuler系统迁移 Docker 数据目录到 /home,解决Docker 临时文件占用大问题
根据错误信息 write /var/lib/docker/tmp/...: no space left on device,问题的根源是 根分区(/)的磁盘空间不足,而非 /home 分区的问题。以下是详细解释和解决方案: 问题原因分析 Docker 临时文件占用根分区空间&…...
LoRA有哪些 参数高效微调方法?
LoRA有哪些 参数高效微调方法? 目录 LoRA有哪些 参数高效微调方法?一、**Fisher 信息矩阵(FIM)近似方差**公式原理LoRA 应用示例二、**动态梯度方差(指数加权移动平均)**公式原理LoRA 代码示例三、**分层梯度方差(结构稀疏性)**公式原理案例:文本分类任务四、**局部方…...
【Xinference rerank】学习如何在Xinference中使用重新排序模型
xinferance 官方网站 给定一个查询和一系列文档,Rerank 会根据与查询的语义相关性从最相关到最不相关对文档进行重新排序。在 Xinference 中,可以通过 Rerank 端点调用 Rerank 模型来对一系列文档进行排序。 from xinference.client import Clientclie…...
pyqt 上传文件或者文件夹打包压缩文件并添加密码并将密码和目标文件信息保存在json文件
一、完整代码实现 import sys import os import json import pyzipper from datetime import datetime from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QPushButton, QLineEdit, QLabel, QFileDialog,QMessageBox, QProgressBar) from PyQt5.…...
Java 大视界 -- Java 大数据机器学习模型的对抗攻击与防御技术研究(137)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
中间件漏洞之weblogic
目录 weblogic简介弱口令后台getshell漏洞利用修复建议 CVE-2017-10271xmldecoder反序列化漏洞漏洞利用修复建议 CVE-2018-2894任意文件上传漏洞利用修复建议 CVE-2014-4210 weblogic ssrf漏洞利用修复建议 CVE-2020-14882&14883漏洞利用修复建议 CVE-2018-2628漏洞利用修复…...
centos 安装pip时报错 Cannot find a valid baseurl for repo: centos-sclo-rh/x86_64
centos 安装pip时报错 [rootindex-es app-ai]# yum update Loaded plugins: fastestmirror Repository centos-sclo-rh is listed more than once in the configuration Determining fastest mirrors Could not retrieve mirrorlist http://mirrorlist.centos.org?archx86_64…...
Pika 技术浅析(三):扩散模型
扩散模型(Diffusion Models)是近年来在生成模型领域中取得显著进展的一种方法,尤其在图像和视频生成任务中表现出色。Pika在其视频生成过程中采用了扩散模型,通过前向扩散过程和逆向扩散过程,实现了从噪声生成高质量视频的功能。 1. 基本原理 1.1 扩散模型的核心思想 扩…...
【HarmonyOS Next之旅】DevEco Studio使用指南(三)
目录 1 -> 一体化工程迁移 1.1 -> 自动迁移 1.2 -> 手动迁移 1.2.1 -> API 10及以上历史工程迁移 1.2.2 -> API 9历史工程迁移 1 -> 一体化工程迁移 DevEco Studio从 NEXT Developer Beta1版本开始,提供开箱即用的开发体验,将SD…...
Node.js系列(1)--架构设计指南
Node.js架构设计指南 🏗️ 引言 Node.js作为一个高性能的JavaScript运行时环境,其架构设计对于构建可扩展的服务端应用至关重要。本文将深入探讨Node.js的架构设计原则、最佳实践和实现方案。 架构概述 Node.js架构主要包括以下方面: 事…...
Pytorch学习笔记
1.gather选择函数的用法 PyTorch入门笔记-gather选择函数 2.max函数的用法 Pytorch的max()与min()函数...
JAVA | 聚焦 String 的常见用法与底层内存原理
*个人主页 文章专栏 《赛博算命之梅花易数的JAVA实现》* 文章目录 *[个人主页](https://blog.csdn.net/2401_87533975?spm1011.2124.3001.5343)文章专栏《赛博算命之梅花易数的JAVA实现》* #前言:API1.定义2.已经学习过的API3.如何使用帮助文档: 一、…...
CAN总线的CC帧和FD帧之间如何仲裁
为满足CAN总线日益提高的带宽需求,博世公司于2012年推出CAN FD(具有灵活数据速率的CAN)标准,国际标准化组织(ISO)2015年通过ISO 11898-1:2015标准,正式将CAN FD纳入国际标准,以示区别…...
提升 React 应用性能:使用 React Profiler 进行性能调优
前言 在现代前端开发中,性能优化是一个不可忽视的重要环节。在 React 生态系统中,React Profiler 是一个强大的工具,它可以帮助我们检测和优化应用的性能。 本文将通过通俗易懂的语言介绍 React Profiler 的作用,并展示如何使用它…...
【QT】-toUtf8() 和 toBase64()的区别
toUtf8() 和 toBase64() 在 Qt 中是两个不同的函数,它们用于不同的目的: toUtf8():将 QString 转换为 UTF-8 编码的字节数组(QByteArray)。 toBase64():将字节数组(通常是二进制数据࿰…...
Git 面试问题,解决冲突
1.问题描述 在多人协作开发中,当多个开发者在同一文件的同一部分进行修改并提交时,Git 无法自动合并这些更改,从而产生代码冲突(Conflict)。冲突的代码会被 Git 标记出来,需要开发者手动解决。 冲突原因 多…...
天梯赛训练L1-031——L1-040
天梯赛训练L1-031——L1-040 L1-031 到底是不是太胖了 import math n int(input()) for i in range(n):h,w map(int,input().split())w / 2biaozhun (h - 100)* 0.9if math.fabs(biaozhun - w) < biaozhun * 0.1:print("You are wan mei!")elif w < biaoz…...
C语言 —— 此去经年梦浪荡魂音 - 深入理解指针(卷二)
目录 1. 数组名与地址 2. 指针访问数组 3.一维数组传参本质 4.二级指针 5. 指针数组 6. 指针数组模拟二维数组 1. 数组名与地址 我们先看下面这个代码: int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[0]; 这里我们使用 &arr[0] 的方式拿到了数…...
面试中文版示例
各位老师好,我是*** ,2010 年毕业于****大学,信息管理与信息系统专 业,获得管理学学士学位,同时学习了*****,取得国家中级物流师认证。 在校期间多次获得一、二等奖学金。作为文艺部部长,经常…...
C++多线程编程 4.condition_variable 条件变量
概念: std::condition_variable 是 C 标准库中用于实现线程间同步的类。它提供了等待和通知的机制,使得线程可以等待某个条件成立时被唤醒,或者在满足某个条件时通知其他等待的线程。 语法: #include <condition_variable&g…...
基于51单片机的12864模拟示波器proteus仿真
地址: https://pan.baidu.com/s/12SGtyqAYKOAjx6rjtTz5Nw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C51 是一款常用的 8 位单片机,由 Atmel 公司(现已被 Microchip 收…...
C++数据结构哈希表的实现(开散列实现、闭散列实现)
C哈希 1. 哈希概念 哈希作为数据结构时,是一种通过某种哈希函数使元素的存储位置与它的关键码之间建立一一映射的关系,在查找时通过该函数就能快速找到该元素,平均时间复杂度为 O ( 1 ) \rm O(1) O(1) ,且遍历结果是无序的。 …...
显著性检测分类(数据集和评估指标总结)
一:RGB显著性检测 常用数据集 其中有DUTS,ECSSD,DUT-OMRON,PASCAL-S,HKU-IS,SOD,SOC,MSRA-B (1)DUTS:DUTS-TR(训练集):10553张,DUT…...
【R语言】使用DESeq2对微生物组进行差异分析
代码展示: asv <- read.delim(paste0(input,_0.5wen.10050.asv_table.txt), row.names 1, sep \t, stringsAsFactors FALSE, check.names FALSE) group <- read.delim(paste0(group2_,input,.txt),row.names 1,sep \t) asv <- asv1 #将变量转换为因…...
什么是广播系统语言传输指数 STIPA
广播系统语言传输指数(STIPA) 是用于评估公共广播系统中语音信号传输质量的国际标准指标,主要用于衡量语音清晰度和可懂度。以下是其关键信息: 1. 定义与作用 STIPA(Speech Transmission Index for Public…...
【Json—RPC框架】:宏定义不受命名空间限制,续行符的错误使用造成的bug
为什么不受命名空间的限制? 宏处理在预处理阶段, 预处理在编译之前,编译才进行语法分析,语义分析。命名空间也只能限制这部分。 在Json-RPC框架的实现中,遇到如下问题。一开始以为是在实现日志宏的时候,有…...
解决前端文字超高度有滚动条的情况下padding失效(el-scrollbar)使用
<div class"detailsBlocksContent"><div>测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试…...
失败的面试经历(ʘ̥∧ʘ̥)
一.面向对象的三大特性 1.封装:将对象内部的属性私有化,外部对象不能够直接访问,但是可以提供一些可以使外部对象操作内部属性的方法。 2.继承:类与类之间会有一些相似之处,但也会有一些异处,使得他们与众…...
大数据学习(70)-大数据调度工具对比
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
Description of a Poisson Imagery Super Resolution Algorithm 论文阅读
Description of a Poisson Imagery Super Resolution Algorithm 1. 研究目标与意义1.1 研究目标1.2 实际意义2. 创新方法与模型2.1 核心思路2.2 关键公式与推导2.2.1 贝叶斯框架与概率模型2.2.2 MAP估计的优化目标2.2.3 超分辨率参数α2.3 对比传统方法的优势3. 实验验证与结果…...
PIP离线安装包
获得离线包 pip freeze >requirements.txt pip download -rrequirements.txt 可以看到pip开始下载依赖包列表中的所有依赖包 安装离线包 如果你希望完全从本地 .whl 文件安装依赖,而不从 PyPI 或其他外网源下载任何包,可以使用 --no-index 参数来…...
动静态库区别
目录 示例 动静态库区别 定义和链接方式 文件大小 内存使用 更新和维护 加载时间 依赖关系 适用场景 动静态库总结 示例 Linux系统中ls也是一个进程,它运行也得依赖动态库,那么学习动静态库区别是有必要的!!!…...
剑指 Offer II 076. 数组中的第 k 大的数字
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20076.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E7%AC%AC%20k%20%E5%A4%A7%E7%9A%84%E6%95%B0%E5%AD%97/README.md 剑指 Offer II 076. 数组中的第 k 大的数字 …...
容联云大模型应用入选甲子光年AI Agent产业图谱
近日,甲子光年发布《2025中国AI Agent行业研究报告》,旨在系统梳理AI Agent技术演进与产业重构路径,展示行业标杆厂商及先锋实践。 容联云凭借卓越的Copilot & Agent产品和解决方案,以及在银行、保险等领域的成熟应用验证&…...
机器学习——深入浅出理解朴素贝叶斯算法
文章目录 引言一、朴素贝叶斯定理概述1.从贝叶斯定理说起2.朴素贝叶斯的“朴素”之处3.朴素贝叶斯算法的应用 二、朴素贝叶斯算法的优缺点三、python代码实现案例1.导入库2.数据预处理3.模型训练4.模型评估5.完整代码 四、总结 引言 朴素贝叶斯算法,一个听起来充满…...
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave)
TCP/IP协议中三次握手(Three-way Handshake)与四次挥手(Four-way Wave) 一、TCP三次握手(Three-way Handshake)二、TCP四次挥手(Four-way Wave)三、常见问题解答总结为什么三次握手不…...
【CF】Day9——Codeforces Round 953 (Div. 2) BCD
B. New Bakery 题目: 思路: 被标签害了,用什么二分( 很简单的思维题,首先如果a > b,那么全选a就行了,还搞啥活动 否则就选 b - a 天来搞活动,为什么? 首先如果我…...
【AI知识管理系统】(一)AI知识库工具测评
嘿,朋友们!🧐你们有没有想过,咱们平日里那些一闪而过的知识笔记、各种碎片化的idea,记录下来之后都是怎么管理的呀? 还有啊,咱们读过的那些书,大家会不会随手写点东西记录一下呢?📝要知道,如果不写的话,很可能过不了多久就全忘得一干二净啦。 😭那多年前记下的…...