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

Linux——初识操作系统(Operator System)

前言大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。

一、冯偌伊曼体系

图一:

在初识操作系统之前,我们需要对计算机的硬件组成做一定的了解。本篇优先对数据信号做初步分析,暂时不考虑控制信号(操作系统是前人花了几十年时间研究出来的,不是短短几句话就能说清楚的)。

需要了解的几个概念(博主我而言):

👉:输入设备     -> 键盘、鼠标、扫描仪、写板、磁盘、网卡

👉:中央处理器(CPU) -> 运算器和控制器等

👉:输出单元     -> 显示器、打印机、网卡、磁盘

磁盘 -> 外存   存储器 -> 内存

问:为什么程序必须要先加载到内存中?为什么不直接交付给运算器处理,再有运算器交付给输出设备?

答:先说明后者,确实可以这么做,但是成本会很大,因为输入输出设备和cpu之间的输入输出速度不匹配,因此需要花更大的代价去匹配。

再说明前者,为了能使计算机家用,就得解决成本问题,存储器(内存)的出现使得输入输出设备和cpu之间的运算关系相匹配,让计算机以更低廉的价格走向普通用户。

总结

1、硬件上的结构决定了软件该如何编写。

2、不同计算机之间的通信可以抽象成两个冯·偌伊曼结构体系之间的通信

二、操作系统(Operator System)

操作系统包括:

内核:进程管理、内存管理、文件管理、驱动管理

其他程序

操作系统设计的目的

•  对下,与硬件交互,管理所有的软硬件资源
对上,为用户程序(应用程序)提供⼀个良好的执行环境

shell:命令解释器(command interpreter)

👉:将使用者的命令翻译给核心处理

👉:将核心的处理结果翻译给使用者

注:其中bash是命令解释器之一,每当用户登录服务器时,操作系统会给每一个用户分配bash

概念补充说明

我们所写的程序最终形成可执行程序后,都要通过系统调用接口去访问操作系统内部,再经过驱动程序,最终输出到对应的硬件上。比如打印一个"hello world"需经过系统调用接口,访问操作系统,操作系统进行驱动管理,再经驱动程序,最终打印到硬件上(显示器)。

:操作系统是如何对底层硬件进行控制的?

:首先可以明确一点的是,操作系统并非直接对底层硬件进行控制,而是先对底层硬件的属性进行描述,例如可以创建一个结构体将数据存储起来,再定义一个高效的数据结构结构体存储到数据结构中(组织起来)进行管理,这样操作系统就能够通过对数据结构的增删查改间接控制底层硬件,就好比校长不需要跟学生见面,只需知道一个学生的所有信息,就可以对学生进行管理。

简言之:操作系统用结构体描述硬件属性/信息,再用高效的数据结构将结构体存储(组织)起来。

三、进程

前面提到操作系统分为:进程管理、内存管理、文件管理、驱动管理;本篇先谈进程管理

进程的概念:

课本上说:进程是一个程序的执行实例或是正在执行的程序等

实际上:进程 = 内核数据结构对象 + 自己的代码和数据;

更准确的说:进程 = PCB(task_struct) + 自己的代码和数据;

注:PCB中有内存指针能够帮助找到对应的代码和数据

PCB:进程控制块

前面我们提到,操作系统用结构体描述硬件属性/信息,再用高效的数据结构将结构体存储(组织)起来。而进程信息就被存放再一个叫做进程控制块的数据结构当中,可以理解为进程属性的集合。Linux操作系统下的PCB是:task_struct(描述进程的结构体)

注1:当一个进程启动时,该进程的所有信息会存储在进程控制块的数据结构中,同时对应的代码还会拷贝到内存当中,因此有:进程 = PCB + 自己的代码和数据。

注2:操作系统对硬件的管理与进程相似,开机时,操作系统对硬件属性(信息)进行描述并存储到PCB中组织起来进行管理调用

有关进程的指令

getpid():获取当前进程pid

getppid():获取当前进程父进程的pid

ps axj :查看系统中所有进程

ps axj | grep 进程名:查找特定进程

ps axj | grep -v  进程名:查找特定进程,并避免显示grep中的重名进程

ls /proc: 当前正在运行的进程

ls/proc/pid -dl :查找对应进程的位置,注:进程结束就找不到了

chdir("/相应路径"):更改当前进程的路径

fork():创建子进程

有关bash:命令解释器(本质也是一个子进程)

👉:每当用户登录服务器时,操作系统会给每一个用户分配bash

👉:ls pwd mkdir touch都是进程,且所有的父进程都是bash

补充1有关进程和作业/程序

👉:一个程序/作业可以有多个进程,因此说进程和程序一一对应是错误的。

👉:程序是静态的,进程是动态的

补充2有关抢占式多任务处理中

如果进程被抢占,那么所有cpu寄存器的内容、页表指针、程序计数器都将被保存下来。而全局变量、程序内的数据不一定(因为当前变量和数据不一定在使用)

四、进程状态

学前须知

👉:一个CPU一般只有一个调度队列,调度队列中存放着运行着的进程

👉:PCB是一个双链表数据结构

👉:Linux内核中,PCB节点既可以是数据结构A的成员,又可以是数据结构B的成员(稍后论述)

进程状态

1、R 运行状态(running):只要进程在调度队列中,就处在运行状态

2、S 浅睡眠状态(sleeping):也叫阻塞,是操作系统等待外部设备或者资源就绪,外部设备包含:键盘、显示器、网卡、磁盘、摄像头、话筒等,当这些外部设备被占用无法使用时,就会处于阻塞状态,系统会等待其准备就绪。再比如一串代码中的 scanf(),系统会等待键盘输入。

3、D 深睡眠状态(disk sleeping):也是一种阻塞,和浅睡眠阻塞类似,区别在于浅睡眠阻塞操作系统能够让其强制停止,而深睡眠状态不行。

补充1:阻塞状态

阻塞状态是将处于调度队列中的PCB移到等待队列中,在等待队列完成相应的任务后,再调回调度队列,本质是对数据结构的增删查改。处于阻塞的进程可以有很多,想想现实生活中,你开了很多程序,它们都等待你去输入,此时会占用内存。

补充2:阻塞挂起

当系统内存比较吃紧,会把处于等待队列中的PCB的代码和数据唤出到外设(磁盘)上,内存此时只有PCB,当需要使用时,再会把PCB对应的代码和数据换回到内存中,变成一个完整的进程。

补充3:运行挂起

当系统内存相当吃紧,会把调度队列中,处于末端的进程按阻塞挂起的方式进行处理

补充4:Linux内核节点的定义

通过以上叙述,可以发现,PCB既是调度队列中的节点、又是等待队列中的节点,但PCB本身又是一个双链表节点。

问:他是如何存储到不同数据结构当中的?

:相较于之前学习的数据结构(通过节点指针直接指向下一个节点的地址)而言,Linux中的节点,是将节点定义为PCB中的成员之一,而节点中的节点指针指向的是下一个PCB中的节点的地址,而并非PCB本身的地址。

图一:原先的数据结构(节点指针指向下一个节点的地址)

图二:Linux中的PCB(节点指针指向的是下一个PCB中的节点地址)

问:那么操作系统如何访问PCB中其他成员变量呢?

答:通过指针偏移量来获取PCB中的其他成员。

于是有了上述认识后,就可以明白一个PCB,可以满足任何数据结构,只要通过相应的方法进行遍历和访问即可。

4、T 停止状态(stop):当系统认为进程有问题,会暂停进程让用户查看

5、t 追踪状态(tracing stop):debug时,遇到断点时,进程被暂停会处于该状态

6、Z 僵尸状态(zombie):一个子进程先于父进程退出,但是他的父进程没有接收到子进程的退出信息,这个子进程就会处于僵尸状态

有关僵尸状态的补充

👉:如果父进程一直不管子进程,不回收,不获取子进程的退出信息,那么子进程一直处于僵尸状态,会导致内存泄露的问题

👉:普通进程退出时,内存泄露的问题就会消失,这种影响不大。但对于常驻内存的进程,比如操作系统、杀毒软件等,这些进程如果存在内存泄露的问题,那么就会比较麻烦,这也就是为什么有些系统会越用越卡。

👉:僵尸进程已经退出了,因此不会再次被kill杀死,也不会自动退出。

7、孤儿进程:父进程先退出,子进程还在,那么子进程就会被1号进程(init/systemd)领养,被领养的子进程就成为孤儿进程

有关孤儿进程的补充

👉:被1号进程领养的进程一般会变成后台进程,ctrl+c 无法终止该进程,只能通过kill -9 pid终止

👉:之所以存在领养,是为了避免没有父进程的子进程退出后变成僵尸进程的状态。

五、进程优先级

优先级的概念

进程得到CPU资源的先后顺序

学前须知

👉:为什么存在优先级?

        答:因为目标资源稀缺,导致要通过优先级来确认谁先谁后的问题。举一个简单的例子,学校食堂的打饭窗口有限,那么谁到食堂的同学优先级更高,而后到的优先级更低。

👉:现代操作系统是基于时间片分时操作系统,每一个进程都有一定的执行时间,优先级可能会变化,但是变化的幅度不能太大,因为分数操作系统的优先级需要考虑公平性。

        注另一种操作系统为实时操作系统,该系统常用在工业(汽车)领域。举一个例子,在一般情况下,分时操作系统是大家和和睦睦的按优先级的顺序一个一个执行下去(也会存在插队情况,这个稍后讨论)。但是对于实时操作系统而言,有一些进程是需要强制变为最高优先级率先执行,例如自动驾驶的刹车系统,倘若前面有障碍物,那么这时刹车进程的优先级一定是最高的,如果是分时操作系统,那么就完蛋了。

Linux中常见的信息

UID:执行者的身份

        注1:当一个文件被创建时,系统会记录它的UID,当用户去执行文件中相应进程时,也会记录UID,系统会通过比对二者的UID是否相等来判断用户是否拥有该权限。

        注2:我们在linux中的每一个操作,其实都是进程,我们与操作系统的交互都是通过进程来的,操作系统不认人,只认UID。

PID:该进程的代号

PPID:该进程是由哪个进程衍生而来的,即父进程

PRI:该进程可被执行的优先级,值越小,优先级越高,默认进程的优先级都是:80

NI:该进程的nice值,用于修正进程的优先级,NI∈[-20,19]。

        注1:进程真实的优先级 = PRI(默认) + NI

        注2:如果进程优先级设定不合理,会导致优先级低的进程长时间得不到CPU资源,进而导致“进程饥饿”

★★并发:多个进程在一个CPU下采用进程切换的方式,在一段时间内,让多个进程都得以推进。

        举一个电学生能懂的例子:呼吸灯

        呼吸灯从视觉上看是灯逐渐由亮变暗的过程,但本质上是控制灯的亮暗的持续时间,一开始亮的时间久,灭的时间短→亮的时间短,灭的时间久,从而在视觉上达成呼吸灯的效果以欺骗人的眼睛。

        而CPU通过高频切换不同进程,利用人的听觉视觉差,来达成多个进程同时推进的目的。

        对比两个例子,不难发现,呼吸灯中,灯确实灭了,但是灭的时间太短,人眼分辨不出;CPU中的进程确实停了,但是停的时间太短,以至于人的听觉和视觉都分辨不出。

六、进程切换

学前须知

👉:一旦一个进程占有CPU,因为时间片的存在,并不会把自己的代码运行完。

👉:CPU中,存在很多寄存器,用来处理各种信息,不同寄存器会保存当前进程的临时数据

👉寄存器是CPU内部的临时空间

👉:寄存器 != 寄存器里的数据,寄存器是空间,空间只有一个;而数据是内容,内容是可以改变的。

★★进程切换(简化版)这个过程由调度器完成

假设现在有两个进程A、B,进程A正在运行中,进程B尚未执行。

:现将运行进程B,那么调度器该怎么做?(只考虑两个进程间,更复杂的稍后说)

:在将进程A切换至进程B之前,必须将进程A存储在CPU寄存器当中的上下文数据临时保存在 x 当中(之后会叙述这个x是什么),当保存完毕后,进程A会被调度器调度到另一个队列中(这个也稍后说明)。此时寄存器中有关进程A上下文的临时数据已经无用了,调度器在调度进程B时,能够将其直接覆盖。当要重新调度进程A时,进程B与先前执行一样的操作,然后进程A必须把先前保存的数据恢复到CPU当中,这样才能继续执行上次尚未完成的任务

问题1:这个x是什么?

:PCB,当代计算机能够通过PCB去找到TSS(任务状态段)。

:TSS也是一个数据结构,专门保存上下文数据,为了避免PCB过大的问题。

问题2:怎么区分新的进程和已经调度过的队列?

:PCB中有一个标记位(bool 类型),没有运行过的程序是0,只要运行过就为1。

6.1:Linux2.6内核进程O(1)调度队列——另一个队列的问题

学前须知:一个CPU拥有一个runqueue

queue[140]

队列数组,下标就是队列的优先级,每一个队列数组中包含了多个PCB,由双链表构成。

普通优先级:100~139

实时优先级:0~99

bitmap[5]:为了能够快速查找队列。

对于32位操作系统,32*5一共对应了160个位,0~139对应了140个不同的优先级,后21个位舍弃。当我们要查找优先级为120的队列时,先通过bitmap每32位一查找,再在bitmap[4]中寻找具体属于哪个优先级。

nr_active:当前队列中有多少个进程

*active(活跃进程)和*expired(过期进程):

runqueue中会定义一个结构体,这个结构体中包含了:

1、nr_active      2、bitmap      3、queue[140] 

runqueue会创建两个结构体数组:struct rqueue_elem pro_arry[2]

*active*expired 分别指向 pro_arry[0] 和 pro_arry[1]

即:

struct rqueue_elem* active = &pro_arry[0]

struct rqueue_elem* expired = &pro_arry[1]

★★进程切换(复杂版):同样是通过调度器进行完成

调度器通过 active指针 找到相应结构体位置,再访问 nr_active 成员确认当前有多少进程,若有进程存在,再通过 bitmap[5] 快速确认下标,再索引 queue(队列数组),找到目标队列,再将(双链表)队列链表头对应的 PCB 放到 current指针 中,再把 current指针 指向的代码放到cpu中执行。因为时间片的存在,该代码不会执行完,将该进程调度至 *expired 对应的结构体中并存放在相应的 queue 当中,这样 *active 中的进程会越来越少,而*expired 中的进程会越来越多,当 *active 不再有进程时,执行 swap(&active,&expired),再次循环上述过程,直至所有进程全部执行完毕。

相关文章:

Linux——初识操作系统(Operator System)

前言:大佬写博客给别人看,菜鸟写博客给自己看,我是菜鸟。 一、冯偌伊曼体系 图一: 在初识操作系统之前,我们需要对计算机的硬件组成做一定的了解。本篇优先对数据信号做初步分析,暂时不考虑控制信号(操作系…...

RuoYi(若依)框架的介绍与基本使用(超详细分析)

**RuoYi(若依)**是一个基于Spring Boot和Spring Cloud的企业级快速开发平台。它集成了多种常用的技术栈和中间件,旨在帮助企业快速构建稳定、高效的应用系统。以下是关于RuoYi框架的详细介绍和基本使用教程,涵盖了从环境搭建到核心…...

js:基础

js是什么 JavaScript是一种运行在客户端的编程语言,实现人机交互的效果 js只要有个浏览器就能跑 js可以做网页特效、表单验证、数据交互、服务端编程 服务端编程是前端人拿他们特有的后端语言node.js来干后端干的事情 js怎么组成 JavaScriptECMAScript(语言基…...

easyui combobox 只能选择第一个问题解决

easyui combobox 只能选择第一个问题解决 问题现象 在拆分开票的时候,弹出框上面有一个下拉框用于选择需要新增的明细行,但是每次只能选择到第一个 选择第二条数据的时候默认选择到第一个了 代码如下 /*新增发票编辑窗口*/function addTicketDialog…...

【RISC-V CPU 专栏 -- 香山处理器介绍】

文章目录 RISC-V 香山处理器介绍雁栖湖处理器南湖处理器RISC-V 香山处理器介绍 相信很多小伙伴对于“香山”都不陌生,它是一款开源RISC-V处理器核,香山的每一代架构,都是采用了湖的名字,第一代架构被命名为雁栖湖,第二代架构则叫做 “南湖”。 “雁栖湖”这款处理器的 R…...

深入理解下oracle 11g block组成

深层次说,oracle数据库的最少组成单位应该是块,一般默认情况下,oracle数据库的块大小是8kb,其中存储着我们平常所需的数据。我们在使用过程中,难免会疑问道:“oracle数据块中到底是怎样组成的,平…...

“华为杯”研究生数学建模比赛历年赛题汇总(2004-2024)

文章目录 赛题链接历年赛题2004年赛题2005年赛题2006年赛题2007年赛题2008年赛题2009年赛题2010年赛题2011年赛题2012年赛题2013年赛题2014年赛题2015年赛题2016年赛题2017年赛题2018年赛题2019年赛题2020年赛题2020年赛题2021年赛题2022年赛题2023年赛题2024年赛题 赛题链接 部…...

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具,上传PowerPoint文档,指定想翻译的目标语言,通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…...

【深度学习之一】2024最新pytorch+cuda+cudnn下载安装搭建开发环境

兵马未动,粮草先行。作为深度学习的初学者,快速搭建一个属于自己的开发环境就是头等大事,可以让我们节省许多的时间。这一期我们主要讲一讲2024年最新pytorchcudacudnn下载安装搭建开发环境,以及安装过程中可能遇到的一些问题以及…...

摄像机视频分析软件下载LiteAIServer视频智能分析平台玩手机打电话检测算法技术的实现

随着科技的不断进步,摄像机视频分析软件的发展已经为我们的生活带来了许多便捷。其中,LiteAIServer视频智能分析平台的玩手机打电话检测算法技术尤为突出,它利用先进的图像处理和人工智能技术,能够自动识别并监控视频中的玩手机或…...

HTML5和CSS3新增特性

HTML5的新特性 HTML5新增的语义化标签 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量…...

删除word中页眉里的横线

使用快捷键‌简单粗暴: 双击页眉,将光标定位在页眉的横线上,按下CtrlShiftN快捷键,页眉横线即可删除。...

列表代码思路

目录 列表添加修改删除(单删,批删) 页面>Controller>service>Dao 一.列表的jsp页面 : 一. 想要用户已经来就看到的数据使用文档就绪函数 ①文档就绪函数 : 二. 封装ajax方法 二 : 在body中间 一 : 多条件查询的文本框 二. 写列表 三.在body的下面写脚本 1.给搜…...

40分钟学 Go 语言高并发:Context包与并发控制

Context包与并发控制 学习目标 知识点掌握程度应用场景context原理深入理解实现机制并发控制和请求链路追踪超时控制掌握超时设置和处理API请求超时、任务限时控制取消信号传播理解取消机制和传播链优雅退出、资源释放context最佳实践掌握使用规范和技巧工程实践中的常见场景…...

el-row el-col显示失效问题修复

el-row el-col显示失效 问题&#xff1a; 在列表显示页面&#xff0c;头部有几个搜索框和选择框&#xff0c;由于搜索条件框太多&#xff0c;写了el-row 和el-col进行分行分列展示。测试发现并没有按照行列展示。 <el-form :inline"true" :model"paramForm…...

libphone desktop编译

linphone-desktop 在ubuntu20.04 下编译 linphone 介绍 Linphone是一款遵循GPL的开源网络视频电话系统&#xff0c;支持多种平台如Windows、Linux、Android等。它基于SIP协议&#xff0c;提供语音、视频通话及即时文本消息功能。核心功能包括SIP用户代理、音频视频Codec支持、…...

实现一个可配置的TCP设备模拟器,支持交互和解析配置

前言 诸位在做IOT开发的时候是否有遇到一个问题&#xff0c;那就是模拟一个设备来联调测试&#xff0c;虽然说现在的物联网通信主要是用mqtt通信&#xff0c;但还是有很多设备使用TCP这种协议交互&#xff0c;例如充电桩&#xff0c;还有一些工业设备&#xff0c;TCP这类报文交…...

Rust环境安装乱码解决

安装rust环境open with visual studio2022操作系统乱码问题解决 打开“设置”&#xff0c;找到“时间和语言”。 进去之后依次选择“语言”->"管理语言设置"->“更改系统区域设置” 取消勾选“Beta版:使用Unicode UTF-8 提供全球语言支持”&#xff0c;然后重…...

Zookeeper实现分布式锁、Zookeeper实现配置中心

一、Zookeeper实现分布式锁 分布式锁主要用于在分布式环境中保证数据的一致性。 包括跨进程、跨机器、跨网络导致共享资源不一致的问题。 1.Zookeeper分布式锁的代码实现 新建一个maven项目ZK-Demo,然后在pom.xml里面引入相关的依赖 <dependency><groupId>com.…...

学习日记_20241126_聚类方法(自组织映射Self-Organizing Maps, SOM)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…...

【webrtc】 mediasoup中m77的IntervalBudget及其在AlrDetector的应用

IntervalBudget 用于带宽控制和流量整形 mediasoup中m77 代码的IntervalBudget ,版本比较老IntervalBudget 在特定时间间隔内的比特预算管理,从而实现带宽控制和流量整形。 一。 pacedsender 执行周期: 下一次执行的时间的动态可变的 int64_t PacedSender::TimeUntilNextPr…...

Python学习指南 + 谷歌浏览器如何安装插件

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; Python 目录 前言 Python 官方文档的使用 谷歌浏览器中如何安装插件 前言 在学习Python时&#xff0c;我们可能会出现这样的困惑&#x…...

leetcode - LRU缓存

什么是 LRU LRU (最近最少使用算法), 最早是在操作系统中接触到的, 它是一种内存数据淘汰策略, 常用于缓存系统的淘汰策略. LRU算法基于局部性原理, 即最近被访问的数据在未来被访问的概率更高, 因此应该保留最近被访问的数据. 最近最少使用的解释 LRU (最近最少使用算法), 中…...

RabbitMQ7:消息转换器

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…...

C#(14)七大原则

前言 其实在面向对象设计里&#xff0c;程序猿们互相约定好一些原则&#xff0c;即七大原则。 面向对象的七大原则是一组指导软件设计的原则&#xff0c;旨在帮助开发人员实现松耦合、可维护和可扩展的软件系统。这些原则的设计过程和发展历史可以追溯到20世纪80年代。 单一职…...

JDBC使用连接池druid操作数据库mysql

// 创建DruidDataSource实例DruidDataSource dataSource = new DruidDataSource();String url = "jdbc:mysql://localhost:3306/demo_base?useUnicode=true&characterEncoding=utf8&useSSL=true";String username...

零碎04 MybatisPlus自定义模版生成代码

目录 背景 动手开干 需要的依赖包&#xff0c;需要注意mybatis-plus-generator的3.5版本是没有兼容历史版本的。 定义一个CodeGenerator类&#xff0c;负责生成代码和配置属性 Entity模版 背景 MybatisPlus代码生成使用默认的velocity模版解决不了定制化的需求&#xff0…...

rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要

rk3568-linux-5.10.160移植rtl8822cs wifi 模块纪要 1、将驱动添加到 kernel/drivers/net/wireless/rockchip_wlan/ 或者 kernel/drivers/net/wireless/realtek/rtlwifi/ 2、修改该目录下的makefile、kconfig 3、修改rtl8822cs/os_dep/linux/os_intfs.c&#xff0c;添加 MO…...

uniapp接入高德地图

下面代码兼容安卓APP和H5 高德地图官网&#xff1a;我的应用 | 高德控制台 &#xff0c;绑定服务选择《Web端(JS API)》 /utils/map.js 需要设置你自己的key和安全密钥 export function myAMap() {return new Promise(function(resolve, reject) {if (typeof window.onLoadM…...

如何通过高效的缓存策略无缝加速湖仓查询

引言 本文将探讨如何利用开源项目 StarRocks 的缓存策略来加速湖仓查询&#xff0c;为企业提供更快速、更灵活的数据分析能力。作为 StarRocks 社区的主要贡献者和商业化公司&#xff0c;镜舟科技深度参与 StarRocks 项目开发&#xff0c;也为企业着手构建湖仓架构提供更多参考…...

微信小程序数据请求教程:GET与POST请求详解

微信小程序数据请求教程:GET与POST请求详解 引言 在微信小程序的开发过程中,数据请求是至关重要的一部分。通过与后端服务器进行通信,小程序能够获取动态数据,实现丰富的功能。在这篇文章中,我们将深入探讨微信小程序中的数据请求,重点介绍GET和POST请求的使用方法、示…...

【Redis 】Bitmap 使用

Redis Bitmap介绍 Redis Bitmap 是一种特殊的数据类型&#xff0c;它通过字符串类型键来存储一系列连续的二进制位&#xff08;bits&#xff09;&#xff0c;每个位可以独立地表示一个布尔值&#xff08;0 或 1&#xff09;。这种数据结构非常适合用于存储和操作大量二值状态的…...

【C语言】指针与数组的例题详解:深入分析与高级用法

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;题目一详细分析与解答代码逐步解析 &#x1f4af;进一步优化和拓展1. 指针与数组的关系2. 指针运算的注意事项3. 常见的错误和陷阱4. 拓展&#xff1a;指针操作的应用场…...

CTF之密码学(密码特征分析)

一.MD5,sha1,HMAC,NTLM 1.MD5:MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1:这种加密的密文特征跟MD5差不多,只不过位数是40(sha256:64位;sha512:128位) 3.HMAC:这种算法就是在前两种加密的基础上引入了秘钥,而秘钥又只有传输双方才知道,所以基本上…...

docker compose 使用记录

作用 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务&#xff0c;然后使用一个命令即可创建并启动所有服务。 文档位置 Part 7: Use Docker Compose | Docker Docs 使用方法 1. 安装 Docker Compose sudo curl -…...

Python的3D可视化库 - vedo (3)visual子模块 点对象的可视化控制

文章目录 3 PointsVisual的方法3.1 对象属性3.1.1 顶点大小3.1.2 复制属性3.1.3 颜色设置3.1.4透明度设置 3.2 对象光效3.2.1 点的形状3.2.2 点的表面光效 3.3 尾随线和投影3.3.1 尾随线3.3.2 投影 3.4 给对象附加文字说明3.4.1 标注3.4.2 2D标注3.4.3 气泡说明3.4.4 旗标说明3…...

计算机网络易混淆知识点串记

文章目录 计算机网络易混淆知识点串记各层PDU首部:地址长度 计算机网络易混淆知识点串记 各层PDU首部: PUD首部长度 (B:字节)首部单位数据链路–帧帧首:14B帧尾部:4B——IPV420~60字节4B [通过4位二进制表示]IPV6固定首部40字节[可拓展]4BTCP20~60字节4BUDP8B字节 地址长度 …...

信息安全实验--密码学实验工具:CrypTool

1. CrypTool介绍&#x1f4ad; CrypTool 1的开源教育工具&#xff0c;用于密码学研究。通过CrypTool 1&#xff0c;可以实现加密和解密操作&#xff0c;数字签名。CrypTool1和2有很多区别的。 2. CrpyTool下载&#x1f527; 在做信息安全实验--密码学相关实验时&#xff0c;发…...

Leetcode 将有序数组转换为二叉搜索树

算法思想及代码解析&#xff1a; 这段代码的目的是将一个有序数组转换为 高度平衡的二叉搜索树&#xff08;Balanced Binary Search Tree, BST&#xff09;。以下是算法的详细解释&#xff1a; 1. 什么是高度平衡的二叉搜索树&#xff1f; 二叉搜索树&#xff1a;对于树中的每…...

VMware虚拟机安装Win7专业版详细教程(附镜像包)

目录 一、Win7镜像下载 二、配置虚拟机 三、安装Win7 四、常见问题 一、Win7镜像下载 镜像下载链接&#xff1a;https://pan.quark.cn/s/a8d3a2880101 此镜像为Win7专业版&#xff08;收藏级镜像 已自用几年&#xff09; 官方纯净系统没有附带任何其他第三方软件&#xf…...

IDEA算法的详细介绍及Python实现

目录 IDEA算法的详细介绍及Python实现引言第一部分:IDEA算法的原理与背景1.1 IDEA算法的来源与特点1.2 IDEA算法的核心步骤第二部分:IDEA算法的Python实现(面向对象设计)2.1 核心类设计2.2 代码实现2.3 使用示例第三部分:案例1 - 函数优化问题(策略模式)3.1 问题描述3.2…...

Spring Boot 开发环境搭建详解

下面安装spring boot的详细步骤&#xff0c;涵盖了从安装 JDK 和 Maven 到创建和运行一个 Spring Boot 项目的全过程。 文章目录 1. 安装 JDK步骤 1.1&#xff1a;下载 JDK步骤 1.2&#xff1a;安装 JDK步骤 1.3&#xff1a;配置环境变量 2. 安装 Maven步骤 2.1&#xff1a;下载…...

Element-Ui组件(icon组件)

一、前言 本篇文章主要是对官网的Icon组件进行总结归纳Icon 图标 | Element Plus 在现代Web应用开发中&#xff0c;图标是用户界面设计中不可或缺的一部分。它们不仅提升了用户体验&#xff0c;还使得信息的传达更加直观和高效。本文主要对Element Plus 官方提供的Icon组件进行…...

使用docker搭建hysteria2服务端

源链接&#xff1a;https://github.com/apernet/hysteria/discussions/1248 官网地址&#xff1a;https://v2.hysteria.network/zh/docs/getting-started/Installation/ 首选需要安装docker和docker compose 切换到合适的目录 cd /home创建文件夹 mkdir hysteria创建docke…...

Docker login 报证书存储错误的解决办法

文章目录 docker login 出现错误&#xff0c;提示&#xff1a;Error saving credentials: error storing credentials - err: exit status 1, out: Cannot autolaunch D-Bus without X11 $DISPLAY 环境 使用的是 Mint Linux &#xff0c;容器为 docker-ce 最新版 1 2 3 4 $…...

vxe-modal VxeUI 窗口组件弹窗多窗口模式

VxeUI 实现在 vue 中使用弹窗组件&#xff0c;弹窗多个窗口可叠加&#xff0c;实现多实例的窗口组件。 npm install vxe-pc-ui4.3.6// ...import VxeUI from vxe-pc-uiimport vxe-pc-ui/lib/style.css// ...createApp(App).use(VxeUI).mount(#app)// ...官网&#xff1a;https…...

华为昇腾 acl_pytorch

目录 sam部署教程&#xff1a; segment-anyghing地址&#xff1a; sam onnx地址&#xff1a; 报错&#xff1a; encode继续报错&#xff1a; sam部署教程&#xff1a; Ascend/ModelZoo-PyTorch - Gitee.com segment-anyghing地址&#xff1a; https://github.com/visher…...

Mybatis控制台打印SQL执行信息(执行方法、执行SQL、执行时间)

文章目录 前言一、基本功能介绍1.1本章功能效果预览图: 二、可执行源码2.1 yaml基础配置2.2 MybatisAnalyzeSQLInterceptor实现SQL拦截 前言 SQL性能监控是一个程序必要的功能&#xff0c;通常我们可以使用数据库自带的客户端工具进行SQL性能分析。然而对于一些专业度不高的人…...

Easyui 实现订单拆分开票功能

Easyui 实现订单拆分开票功能 需求 1、实现一个订单开具多分发票功能&#xff1b; 2、支持拆行&#xff1b; 3、支持拆数量&#xff1b; 流程设计 1、操作页面展示订订单头信息&#xff0c;订单明细信息 2、点击新增发票按钮弹出一个弹出框用于创建一张拆分发票&#xff0c;弹…...

docker-elasticsearch-kibana-logstash

一、安装 Elasticsearch 尝试直接拉取 Elasticsearch 镜像&#xff1a; 执行 docker pull docker.elastic.co/elasticsearch/elasticsearch&#xff0c;拉取失败&#xff0c;错误提示为 “Error response from daemon: manifest for docker.elastic.co/elasticsearch/elasticse…...