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

堆与栈的区别

OVERVIEW

  • 栈与堆的区别
      • 一、程序内存分区中的堆与栈
        • 1.栈
        • 2.堆
        • 3.堆&栈
      • 二、数据结构中的堆与栈
        • 1.栈
        • 2.堆
      • 三、堆的深入
        • 1.堆插入
        • 2.堆删除:
        • 3.堆建立:
        • 4.堆排序:
        • 5.堆实现优先队列:
        • 6.堆与栈的相关练习

栈与堆的区别


自整理,以下为主要参考文章:

  • 堆与栈的对比:一文读懂堆与栈的区别_堆和栈的区别_恋喵大鲤鱼的博客-CSDN博客
  • 堆与栈的理解:什么是堆? 什么是栈? - 知乎 (zhihu.com)
  • 用堆实现优先队列:用堆实现优先级队列(Priority Queue)_优先队列用堆实现_t_wu的博客-CSDN博客
  • 用堆实现优先队列:什么是优先队列 - 知乎 (zhihu.com)
  • 深入底层:内存中的堆和栈到底是什么 | 洛斯里克的大书库 (kimihe.com)
  • Python版本:Codify (wzy-codify.com)

在理解堆与栈概念时需要放到具体的场景下,因为不同场景下堆与栈代表不同的含义:

  1. 场景1:程序内存布局场景下,堆与栈表示两种内存管理方式。
  2. 场景2:数据结构场景下,堆与栈表示两种常用的数据结构。

一、程序内存分区中的堆与栈

堆与栈的空间都是分配在内存上,

在这里插入图片描述

1.栈

  1. 其中函数中定义的局部变量按照先后定义的顺序依次压入栈中,也就是说相邻变量的地址之间不会存在其它变量。
  2. 栈的内存地址生长方向与堆相反,由高到低,所以后定义的变量地址低于先定义的变量。
  3. 栈中存储的数据的生命周期随着函数的执行完成而结束。

2.堆

  1. 但需要注意的是,后申请的内存空间并不一定在先申请的内存空间的后面,原因是先申请的内存空间一旦被释放,后申请的内存空间则会利用先前被释放的内存,从而导致先后分配的内存空间在地址上不存在先后关系。
  2. 堆的内存地址生长方向与栈相反,由低到高
  3. 堆中存储的数据若未释放,则其生命周期等同于程序的生命周期。

注:关于堆上内存空间的分配过程,首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确地释放本内存空间。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表。

3.堆&栈

堆与栈实际上是操作系统对进程占用的内存空间的两种管理方式,主要有如下几种区别:

不同点
1.管理方式不同栈由操作系统自动分配释放,无需手动控制;堆的申请和释放工作由开发者控制,容易产生内存泄漏;
2.空间大小不同每个进程拥有的栈大小要远远小于堆大小理论上进程可申请的堆大小为虚拟内存大小,进程栈的大小 64bits 的 Windows 默认 1MB,64bits 的 Linux 默认 10MB;
3.生长方向不同堆的生长方向向上,内存地址由低到高;栈的生长方向向下,内存地址由高到低
4.分配方式不同堆都是动态分配的,没有静态分配的堆栈有 2 种分配方式:静态分配和动态分配。静态分配是由操作系统完成的,比如局部变量的分配。动态分配由alloca()函数分配,但是栈的动态分配和堆是不同的,它的动态分配是由操作系统进行释放,无需手动实现。
5.分配效率不同栈由操作系统自动分配,会在硬件层级对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高堆则是由C/C++提供的库函数或运算符来完成申请与管理,实现机制较为复杂,频繁的内存申请容易产生内存碎片。显然,堆的效率比栈要低得多
6.存放内容不同栈存放的内容有,函数返回地址、相关参数、局部变量和寄存器内容等。当主函数调用另外一个函数的时候,要对当前函数执行断点进行保存,这需要使用栈来实现。
首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。
出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。
堆,一般情况堆顶使用一个字节的空间来存放堆的大小,而堆中具体存放内容是由程序员来填充的。
7.产生内存碎片栈与数据结构中的栈原理相同,在弹出一个元素之前上个元素已经弹出了,不会产生内存碎片而不停的调用malloc/new、free/delete则会产生很多的内存碎片。
8.线程安全栈内存是为线程留出的临时空间,每一个线程都有其固定的栈空间,栈空间存储的数据只能被当前线程访问(线程安全)堆内存大小不固定、空间由开发者动态分配可以动态扩容,堆内存可以被一个进程内的所有线程访问(线程不安全),
9.访问权限不同函数之间的栈数据不能够共享,在启动线程的时候实际上是启动函数,其具有自己的栈,线程之间的栈数据时不能够共享的堆属于在进程上的堆,只要在进程上application内,所有的线程都可以访问堆上的数据。堆在不同的语言下管理释放的方式不同:垃圾回收机制、free、

从以上可以看到,

  • 堆由于大量malloc()/free()或new/delete的使用,容易造成大量的内存碎片,并且可能引发用户态和核心态的切换,效率较低。
  • 栈在程序中应用较为广泛,最常见的是函数的调用过程由栈来实现,函数返回地址、EBP、实参和局部变量都采用栈的方式存放。虽然栈有众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,主要还是用堆。
  • 无论是堆还是栈,在内存使用时都要防止非法越界,越界导致的非法内存访问可能会摧毁程序的堆、栈数据,轻则导致程序运行处于不确定状态,获取不到预期结果,重则导致程序异常崩溃,这些都是我们编程时与内存打交道时应该注意的问题。

二、数据结构中的堆与栈

1.栈

栈:栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除操作。具有FILO先进后出的特性。

2.堆

堆:堆是一种常用的树形结构,是一种特殊的完全二叉树,满足所有节点的值不大于或不小于其父节点的值的完全二叉树被称之为堆。

堆这一特性称为堆序性,因此在一个堆中根节点是最大 or 最小的节点。如果根节点最小称之为小根堆,根节点最大称之为大根堆。堆的左右孩子没有大小的顺序。

在这里插入图片描述

  • 堆的存储一般都用数组来存储堆,
  • i节点的父节点下标就为(i–1)/2
  • 它的左右子节点下标分别为 2∗i+12∗i+2

堆可以用来排序,也可以用来实现优先级队列,而优先级队列是搜索的基础。

三、堆的深入

1.堆插入

每次插入都是将新数据放在数组最后,如果新构成的二叉树不满足堆的性质,需要对堆进行调整使其满足堆的性质(上浮操作)

// 新加入i节点,其父节点为(i-1)/2
// 参数:a:数组,i:新插入元素在数组中的下标  
void minHeapFixUp(int a[], int i) {  int j, temp;temp = a[i];  j = (i-1)/2;      //父节点  while (j >= 0 && i != 0) {  if (a[j] <= temp) break;//如果父节点不大于新插入的元素,停止寻找a[i]=a[j];//把较大的子节点往下移动,替换它的子节点  i = j;  j = (i-1)/2;  }  a[i] = temp;  
}  

因此,插入数据到最小堆时:

// 在最小堆中加入新的数据data  
// a:数组,index:插入的下标,
void minHeapAddNumber(int a[], int index, int data) {  a[index] = data;  minHeapFixUp(a, index);  
}

2.堆删除:

删除一个元素总是发生在堆顶,因为堆顶的元素是最小的(小顶堆中)。数组中最后一个元素用来填补空缺位置,然后对顶部元素进行下沉,如果左右孩子有比自己小的,则选择选择最小的那个进行交换。重复进行下沉操作,以满足堆的条件。

按照堆删除的说明,堆中每次都只能删除第0个数据。为了便于重建堆,实际的操作是将数组最后一个数据与根节点交换,然后再从根节点开始进行一次从上向下的调整。

调整时先在左右儿子节点中找最小的,如果父节点不大于这个最小的子节点说明不需要调整了,反之将最小的子节点换到父节点的位置。此时父节点实际上并不需要换到最小子节点的位置,因为这不是父节点的最终位置。但逻辑上父节点替换了最小的子节点,然后再考虑父节点对后面的节点的影响。堆元素的删除导致的堆调整,其整个过程就是将根节点进行“下沉”处理。

// minHeapFixDown 小顶堆结点下沉操作。
// a 为数组,len 为结点总数;从 index 结点开始调整,index 从 0 开始计算 index 其子结点为 2*index+1, 2*index+2;len/2-1 为最后一个非叶子结点。
void minHeapFixDown(int a[],int len,int index) {// index 为叶子节点不用调整。if(index>(len/2-1)) return;int tmp=a[index];lastIndex=index;// 当下沉到叶子节点时,就不用调整了。while(index<=len/2-1) {// 如果左子节点小于待调整节点if(a[2*index+1]<tmp) {lastIndex = 2*index+1;}//如果存在右子节点且小于左子节点和待调整节点if(2*index+2<len && a[2*index+2]<a[2*index+1]&& a[2*index+2]<tmp) {lastIndex=2*index+2;}//如果左右子节点有一个小于待调整节点,选择最小子节点进行上浮if(lastIndex!=index) {a[index]=a[lastIndex];index=lastIndex;} else break;             // 否则待调整节点不用下沉调整}// 将待调整节点放到最后的位置。a[lastIndex]=tmp;
}

根据堆删除的下沉思想,可以有不同版本的代码实现,以上是和孙凛同学一起讨论出的一个版本,在这里感谢他的参与,读者可另行给出。个人体会,这里建议大家根据对堆调整过程的理解,写出自己的代码,切勿看示例代码去理解算法,而是理解算法思想写出代码,否则很快就会忘记。

3.堆建立:

注:有了堆的插入和删除后,再考虑下如何对一个数据进行堆化操作。

以数组存储元素时具有对应的树表示形式,但树有可能并不满足堆的性质,需要重新排列元素才能建立堆化的树。

  1. 单结点的二叉树是堆(无需调整树中的叶子结点)
  2. 在完全二叉树中所有以叶子结点为根的子树是堆(无需调整)
  3. 堆的调整只需要从最后一个非叶子结点开始即可
  4. 需要依次将以序号为n/2、n/2-1、…1的结点为根的子树均调整为堆即可(筛选需从第n/2个元素开始

在这里插入图片描述

在这里插入图片描述

将初始无序序列调整成小根堆(筛选过程),可以利用以算法实现:

// makeMinHeap 建立最小堆。
// a:数组,n:数组长度。
void makeMinHeap(int a[], int n) {for (int i = n/2-1; i >= 0; i--) {minHeapFixDown(a, i, n);}
}

4.堆排序:

思路是每次都把堆顶的元素和堆尾的元素交换,然后把除了堆尾的那个元素组成的堆进行堆化(就是把堆顶的元素进行下沉),不断重复直至堆为空为止。

堆排序(Heapsort)是堆的一个经典应用,有了上面对堆的了解,不难实现堆排序。由于堆也是用数组来存储的,故对数组进行堆化后,第一次将A[0]与A[n - 1]交换,再对A[0…n-2]重新恢复堆。第二次将A[0]与A[n – 2]交换,再对A[0…n - 3]重新恢复堆,重复这样的操作直到A[0]与A[1]交换。由于每次都是将最小的数据并入到后面的有序区间,故操作完成后整个数组就有序了。有点类似于直接选择排序。

因此,完成堆排序并没有用到前面说明的插入操作,只用到了建堆和节点向下调整的操作,堆排序的操作如下:

// array:待排序数组,len:数组长度
void heapSort(int array[],int len) {// 建堆makeMinHeap(array,len); // 最后一个叶子节点和根节点交换,并进行堆调整,交换次数为len-1次for(int i=len-1;i>0;--i) {//最后一个叶子节点交换array[i]=array[i]+array[0];array[0]=array[i]-array[0];array[i]=array[i]-array[0];// 堆调整minHeapFixDown(array, 0, len-i-1);  }
}
  1. 稳定性:堆排序是不稳定排序。
  2. 堆排序性能分析。由于每次重新恢复堆的时间复杂度为O(logN),共N-1次堆调整操作,再加上前面建立堆时N/2次向下调整,每次调整时间复杂度也为O(logN)。两次操作时间复杂度相加还是O(NlogN),故堆排序的时间复杂度为O(NlogN)
  3. 最坏情况:如果待排序数组是有序的,仍然需要O(NlogN)复杂度的比较操作,只是少了移动的操作;
  4. 最好情况:如果待排序数组是逆序的,不仅需要O(NlogN)复杂度的比较操作,而且需要O(NlogN)复杂度的交换操作,总的时间复杂度还是O(NlogN)。
  5. 因此,堆排序和快速排序在效率上是差不多的,但是堆排序一般优于快速排序的重要一点是数据的初始分布情况对堆排序的效率没有大的影响。

5.堆实现优先队列:

待完善

6.堆与栈的相关练习

  1. Leetcode232.用栈实现队列:https://leetcode.cn/problems/implement-queue-using-stacks/description/
  2. Leetcode225.用队列实现栈:https://leetcode.cn/problems/implement-stack-using-queues/
  3. 剑指offer09.用两个栈实现队列:https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/
  4. Leetcode1441.用栈构建数组:https://leetcode.cn/problems/build-an-array-with-stack-operations/

相关文章:

堆与栈的区别

OVERVIEW 栈与堆的区别一、程序内存分区中的堆与栈1.栈2.堆3.堆&栈 二、数据结构中的堆与栈1.栈2.堆 三、堆的深入1.堆插入2.堆删除&#xff1a;3.堆建立&#xff1a;4.堆排序&#xff1a;5.堆实现优先队列&#xff1a;6.堆与栈的相关练习 栈与堆的区别 自整理&#xff0c;…...

OpenWrt kernel install分析(2)

一. 前言 接下来分析make -C image compile install TARGET_BUILD。 二. Makefile分析 1. 命令首先运行target/linux/mediatek/image/Makefile,该文件内容如下&#xff1a; target/linux/mediatek/image/Makefile: include $(TOPDIR)/rules.mk include $(INCLUDE_DIR)/image.…...

【计算机网络】传输层协议——TCP(下)

文章目录 1. 三次握手三次握手的本质是建立链接&#xff0c;什么是链接&#xff1f;整体过程三次握手过程中报文丢失问题为什么2次握手不可以&#xff1f;为什么要三次握手&#xff1f; 2. 四次挥手整体过程为什么要等待2MSL 3. 流量控制4. 滑动窗口共识滑动窗口的一般情况理解…...

Vue前端页面打印

前端依赖10-插件"print-js": “^1.6.0” 一&#xff1a;简介 print-js 是一个 Vue.js 插件&#xff0c;用于在 Vue.js 项目中实现打印功能。它依赖于 print-js 库&#xff0c;所以需要安装这个库。 能实现以下功能&#xff1a; PDF打印&#xff08;默认&#xff…...

Visual Studio将C#项目编译成EXE可执行程序

经常看文章时会收获不少实用工具&#xff0c;有的在github上是编译好的&#xff0c;有的则是未编译的项目文件。所以经常会使用Visual Studio编译项目文件成exe可执行程序&#xff0c;以下为编译的流程。 第一步&#xff0c;从github上下载项目文件&#xff0c;举个例子&#…...

git把某一次commit修改过的文件打包导出(git)

1、使用命令把修改的文件打包导出:打包某次commit: git diff-tree -r --no-commit-id --name-only f4710c4a32975904b00609f3145c709f31392140 | xargs tar -rf xxx_1.1.tar 2、使用命令把某次节点后的文件导出: window 下: git diff f4710c4a32975904b00609f3145c709f31392…...

Vue3 Ajax(axios)异步

文章目录 Vue3 Ajax(axios)异步1. 基础1.1 安装Ajax1.2 使用方法1.3 浏览器支持情况 2. GET方法2.1 参数传递2.2 实例 3. POST方法4. 执行多个并发请求5. axios API5.1 传递配置创建请求5.2 请求方法的别名5.3 并发5.4 创建实例5.5 实例方法5.6 请求配置项5.7 响应结构5.8 配置…...

idea2023全量方法debug

为什么要全量debug 刚上手项目或者研读开源项目源码的时候&#xff0c;我们对项目的结构&#xff0c;尤其是功能链路非常陌生&#xff0c;想要debug根本不知道断点打在哪&#xff0c;光靠文件名类名或者方法名去猜也不是个事。这时候只要配置一下全量debug模式&#xff0c;就能…...

Docker镜像解析获取Dockerfile文件

01、概述 当涉及到容器镜像的安全时&#xff0c;特别是在出现镜像投毒引发的安全事件时&#xff0c;追溯镜像的来源和解析Dockerfile文件是应急事件处理的关键步骤。在这篇博客中&#xff0c;我们将探讨如何从镜像解析获取Dockerfile文件&#xff0c;这对容器安全至关重要。 02…...

使用maven命令打jar包

参考&#xff1a;https://blog.csdn.net/qq_27525611/article/details/123487255 https://blog.csdn.net/qq_35860138/article/details/82701919 小伙伴给我的项目自己尝试命令行打包遇到的坑&#xff0c;简单记录下 // 打包&#xff08;1.8环境下打的&#xff0c;17会报错&…...

【多线程】死锁 详解

死锁 一. 死锁是什么二. 死锁的场景1. 一个线程一把锁2. 两个线程两把锁3. N 个线程 M 把锁 三. 死锁产生的四个必要条件四. 如何避免死锁 一. 死锁是什么 死锁是这样一种情形&#xff1a; 多个线程同时被阻塞&#xff0c;因为每个进程都在等其他线程释放某些资源&#xff0c;…...

成考[专升本政治]科目必背知识点

1. 马克思主义哲学研究的对象是&#xff1a;关于自然、社会、思维发展的一般规律。 2. 对待马克思主义的科学态度是&#xff1a;坚持和发展。 3. 物质的唯一特性是客观实在性。这里的客观实在是指&#xff1a;不以人的意志为转移。 4. 在实际工作中&#xff0c;要注意掌握…...

spring boot 使用AOP+自定义注解+反射实现操作日志记录修改前数据和修改后对比数据,并保存至日志表

一、添加aop starter依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>二&#xff1a;自定义字段翻译注解。&#xff08;修改功能时&#xff0c;需要显示如…...

【深度学习】Pytorch 系列教程(二):PyTorch数据结构:1、Tensor(张量): GPU加速(GPU Acceleration)

目录 一、前言 二、实验环境 三、PyTorch数据结构 0、分类 1、张量&#xff08;Tensor&#xff09; 1. 维度&#xff08;Dimensions&#xff09; 2. 数据类型&#xff08;Data Types&#xff09; 3. GPU加速&#xff08;GPU Acceleration&#xff09; 一、前言 ChatGP…...

多线程|多进程|高并发网络编程

一.多进程并发服务器 多进程并发服务器是一种经典的服务器架构&#xff0c;它通过创建多个子进程来处理客户端连接&#xff0c;从而实现并发处理多个客户端请求的能力。 概念&#xff1a; 服务器启动时&#xff0c;创建主进程&#xff0c;并绑定监听端口。当有客户端连接请求…...

云计算——ACA学习 云计算分类

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 写在前面 前期回顾 本期介绍 一.云计算分类 1.公有云…...

3 分钟,带你了解低代码开发

一、低代码平台存在的意义 传统软件开发交付链中&#xff0c;需求经过3次传递&#xff0c;用户→业务→架构师→开发&#xff0c;每一层传递都可能使需求失真&#xff0c;导致最终交付的功能返工。 业务的变化促使软件开发过程不断更新、迭代和演进&#xff0c;而低代码开发即是…...

小白学Unity03-太空漫游游戏脚本,控制飞船移动旋转

首先搭建好太阳系以及飞机的场景 需要用到3个脚本 1.控制飞机移动旋转 2.控制摄像机LookAt朝向飞机和差值平滑跟踪飞机 3.控制各个星球自转以及围绕太阳旋转&#xff08;rotate()和RotateAround()&#xff09; 1.控制飞机移动旋转的脚本 using System.Collections; using…...

接口自动化测试推荐用什么框架?

在推荐接口自动化测试框架时&#xff0c;需要考虑多个因素&#xff0c;包括项目需求、技术栈、团队经验和个人偏好。 以下是几个常用的接口自动化测试框架供你参考&#xff1a; Postman&#xff1a; Postman是一个功能强大且易于上手的接口测试工具&#xff0c;它提供了许多…...

防火墙 FireWall

这里写自定义目录标题 一、概述二、防火墙分类三、防火墙性能四、硬件防火墙定义五、硬件防火墙作用&#xff08;拓扑图 ups&#xff09;六、硬件防火墙品牌七、软件防火墙八、iptables一、iptables是什么&#xff1f;二、netfilter/iptables功能三、iptables概念四、iptables中…...

【Linix-Day12-线程同步和线程安全】

线程同步 和 线程安全 线程同步 除了信号量和互斥锁&#xff08;互斥锁和条件变量上次介绍过&#xff09;&#xff0c;还有两种方式同步 1.读写锁 当同时对一块内存读写时&#xff0c;会出现下列问题&#xff0c;故而引入读写锁 接口介绍&#xff1a; 1.int pthread_rwloc…...

C++中使用嵌套循环遍历多维数组

C中使用嵌套循环遍历多维数组 一维数组&#xff1a;数组元素可以看做是一行数据。 二维数组&#xff1a;更像是一个表格&#xff0c;既有行数据又有列数据。 C没有提供二维数组类型&#xff0c;但用户可以创建每个元素本身都是数组的数组。例如&#xff0c;假设要存储 5 个城…...

linux入门---命名管道

如何创建命名管道 使用mkfifo函数就可以在程序里面创建管道文件&#xff0c;该函数的声明如下&#xff1a; 该函数需要两个参数&#xff0c;第一个参数表示要在哪个路径下创建管道文件并且这个路径得待上管道文件的名字&#xff0c;因为每个文件都有对应的权限&#xff0c;所…...

SpringBoot2.0入门(详细文档)

文章目录 Springboot是什么Springboot2.x依赖环境和版本新特性说明为什么学习Springboot从springboot优点来看从未来发展的趋势来看 开发环境Spring Boot开发环境搭建和项目启动jdk 的配置Spring Boot 工程的构建maven配置IDEA 快速构建maven 创建工程常用注解 完整代码 Spring…...

Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私

1. 引言 Aztec的架构&#xff0c;不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。 Aztec专注于实现&#xff1a; 成为理解和需要智能合约隐私的开发者的终极解决方案。 Aztec为开发者提供构建隐私优先app所需的网…...

【Vue】详细介绍Vue项目的目录结构及各个核心文件的示例代码

Vue.js并没有严格的文件和目录结构要求&#xff0c;但一般情况下&#xff0c;我们的Vue项目目录结构如下&#xff1a; ├── node_modules/ # 项目依赖的 node 模块 ├── public/ # 公共资源目录 │ ├── favicon.ico # 网页图标 │ └──…...

【人大金仓】迁移MySql数据库到人大金仓,出现sys_config表重复

需要迁移的数据库中有张表名称为sys_config&#xff0c;查询的时候查询结果不符合我们的预期&#xff0c;经咨询金仓售后人员后得知和系统表重名… 解决问题方法如下&#xff1a; alter database [数据库名] set search_path to "$user", [模式名,&#xff08;可选&…...

linux内核进程间通信IPC----消息队列

消息队列&#xff1a;提供一种从一个进程向另一个进程发送一个数据块的方法。与FIFO相比&#xff0c;消息队列的优势在于&#xff0c;它独立于发送和接收进程而存在。 1.链表式结构组织&#xff0c;存放于内核。 2.通过队列标识来引用。 3.通过一个数据类型来索引指定的数据。 …...

PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)

实现原理 进入那些状态不正常的小程序会被重定向至一个Url&#xff0c;使用抓包软件抓取这个Url&#xff0c;剔除不必要参数&#xff0c;使用cURl函数请求网页获得HTML内容&#xff0c;根据内容解析出当前APPID的小程序的状态。 代码 <?php// 编码header(Content-type:ap…...

ubuntu在线直接升级

前几天VMware上安装了ubuntu&#xff0c;当时的内核版本支持(ipguard,加密软件)&#xff0c;后来ubuntu自动升级了linux内核&#xff0c;导致加入软件不支持&#xff0c;无法访问加密文件了。后来加密软件商更新了软件&#xff0c;但还是赶不上linux内核更新速度&#xff0c;还…...

东莞学校网站建设/酒泉网站seo

轻量搜索 一个 GET 是相当简单的&#xff0c;可以直接得到指定的文档。 现在尝试点儿稍微高级的功能&#xff0c;比如一个简单的搜索&#xff01; 第一个尝试的几乎是最简单的搜索了。我们使用下列请求来搜索所有雇员&#xff1a; GET /megacorp/employee/_search可以看到&a…...

wordpress餐饮主题/家庭优化大师下载

SHELL语句主要包含三种:for循环语句、while循环语句、unitl循环语句。 这里分别使用这三种循环或者结合使用来实现九九乘法表。详细如下: 使用for循环实现: #!/bin/bash#for loop for (( i1;i<9;i )) dofor (( j1;j<i;j ))dolet "tempi*j"echo -n "$i*$j…...

自己可以做类似拓者的网站吗/全网关键词云怎么查

前端-HTML网页的组成创建HTML快捷键HTML文档类型说明HTML常用标签HTML标签说明HTML标签使用细节字体标签字符实体标签标题超链接标签无序列表有序列表图像标签表格标签跨行跨列标签表单标签基本使用Input标签综合案例表单格式化表单提交注意事项div标签p标签span标签HTML文件不…...

专门做正品的网站有哪些/郑州官网网络营销外包

DateTime dt DateTime.Now; //当前时间 string Year dt.Year.ToString(); //当前年份string lastYear dt.AddYears(-1).Year.ToString();//上年年份 string CreateTime DateTime.Now.ToString();//创建时间转载于:https://www.cnblogs.com/liwenty/p/9222820.html...

学校安全教育网站建设/自己代理一款手游需要多少钱

我们来看看在图像处理领域如何使用卷积神经网络来对图片进行分类。 1 让计算机做图片分类&#xff1a; 图片分类就是输入一张图片&#xff0c;输出该图片对应的类别&#xff08;狗&#xff0c;猫&#xff0c;船&#xff0c;鸟&#xff09;&#xff0c;或者说输出该图片属于哪种…...

惠州网站建设外包/关键词首页排名代发

问题&#xff1a; 在邮件系统中写新邮件或者回复邮件时&#xff0c;我们一般会在主界面上直接编辑邮件内容&#xff0c;如果邮件还没有编辑完成&#xff0c;我们却需要查看其他邮件&#xff0c;这时就要开启一个新窗口保留未编辑完的邮件内容。 解决方案&#xff1a; Code//1.h…...