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

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

最近和朋友包括一些国产数据库的研发人员交流,很多程序员认为 Oracle 已经过时,开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。

在这里插入图片描述

实际上数据库系统的发展是一个动态的过程,通常需要与用户和应用场景的实际需求相适应。这就是为什么大多数成功的通用数据库系统都经历了长期多个版本和演化阶段,在不断地改进和完善以满足不断变化的用户和应用场景的需求。

为什么很多朋友和客户都觉得 Oracle 数据库的内部设计非常复杂,那是因为很多应用场景如果你从没碰到过,你都完全想象不出来,更不可能靠几个研发人员能提前设计出来,而是 Oracle 在四十多年的实践过程中被各种各样的用户需求和应用场景不断打磨出来的。

虽然中国在部分关键科技领域取得了革命性的突破,但是美国仍然保持着全局性和关键性的优势。

实际上大型通用数据库之所以成为卡脖子的核心技术之一,就是因为数据库在中国信息技术基础设施和各行各业中扮演着关键数据存储和查询修改的核心角色,数据库系统的处理性能、可用性和可扩展性对整个国家和社会的健康运行和正常运转具有非常重要的影响,主要体现在:

在这里插入图片描述

  1. 数据量持续增长:随着时间的推移,政府、企业和组织的数据量正在不断加速增长。这包括政府机关政务系统的核心处理数据,电力、民航、高铁、船舶、车辆交通运输控制系统数据,银行、保险、证券、金融交易数据,国家安全、警务、司法系统数据,财政、民政、税务、安监系统数据、广电、卫星、通信、卫生、疾控、医院部门核心系统数据,企业自动化生产、仓储、物流系统数据等等。

    数据库必须能够有效地管理和存储这些庞大的数据集。如果数据库无法及时有效地处理这么多种类大规模数据的增删查改,轻则导致交通、生产事故和人身伤亡事故,重则危及社会基础设施运行和国家安全。

  2. 复杂查询需求:许多核心业务应用需要执行复杂的数据库查询,如连接多个表、聚合数据、执行复杂的过滤和排序。如果数据库查询引擎不足够高效或者数据库设计不合理,查询性能将受到影响,成为瓶颈。

  3. 高并发访问:政府、企业、组织的核心应用程序通常需要支持大量并发用户。例如,12306订票网站、社保网站、税务网站、电子商务网站、社交媒体平台在高峰期都面临着数以千万计甚至上亿计的用户同时访问数据库的挑战。数据库必须能够有效地处理并发访问请求,否则会导致性能卡顿或应用崩溃。

  4. 事务处理要求:数据库是事务性应用的核心。金融交易、交通指挥、库存管理、订单处理等领域的应用程序要求数据库保证事务的完整性和一致性。如果数据库无法有效地处理事务,可能导致数据错误和不一致。

  5. 数据安全性和合规性:数据安全性和合规性要求对数据库进行适当的保护和审计。加密、访问控制、审计功能等都需要在数据库中得到支持。如果数据库无法提供足够的安全性和合规性,可能会面临数据泄露和法律问题。

  6. 备份和恢复:数据库的备份和恢复是关键的数据管理任务。如果没有有效的备份和恢复策略,数据库出现故障时可能会导致数据丢失或错误,以至于应用程序长时间的宕机。

  7. 数据库设计和索引优化:数据库的设计和索引优化对于性能至关重要。不合理的数据库设计、缺乏索引或不正确的索引选择都可能导致性能问题。

  8. 新技术的应用:随着新技术的不断涌现,适配的数据库系统需要不断适应并集成这些新技术,在提供更好的性能和功能的同时满足稳定性和可靠性。

  9. 业务需求的变化:政府、企业、组织的业务需求和应用场景一直在不断变化。数据库系统必须能够灵活地适应这些新的需求和变化,灵活做出调整,否则可能会出现应用崩溃或者满足不了新的功能。

综上所述,数据库成为卡脖子技术的原因多种多样,通常是由于复杂的需求、大规模的数据、高并发访问、性能限制以及不足的数据库管理和优化策略等因素的综合影响。解决这些问题需要综合考虑数据库设计、硬件和软件配置、性能优化、容错和灾难恢复等多个方面,以确保数据库能够满足整个国家和社会不断发展的需求,是一件难度非常之大的事情,不是靠人多力量大就能解决的。

在当前环境下,多学习成熟的 Oracle 是国产数据库发展的一条捷径,Oracle 四十多年在全球多个国家和企业的大规模应用所获得的经验是十分值得我们现阶段去学习的。

今天我们来看看ORACLE Redo Log Buffer 重做日志缓冲区机制的设计。

重做日志缓冲区(Redo Log Buffer)虽然是Oracle数据库SGA(System Global Area)中最小的一个内存结构,但却是一个非常关键的组件,其结构和用途都非常重要。

它的主要功能是记录用户进程执行的SQL语句对数据库内存块缓冲区的数据所做的更改操作,这些更改被称为重做日志条目。

在需要数据库恢复的情况下,这些条目包含了重建由INSERT、UPDATE、DELETE、CREATE、DROP或ALTER等操作所做的更改所需的多组信息。

重做日志缓冲区是一个循环使用的内存缓冲区,当它写满时,新的重做日志条目将从缓冲区的起始位置开始写入,覆盖旧的数据。

在Oracle数据库中,重做日志条目(Redo Log Entries)是由用户进程生成的,

用户进程包括了执行SQL语句的进程,如执行INSERT、UPDATE、DELETE等数据操作语句的会话。

当用户进程执行这些SQL语句时,它们会生成相应的重做日志条目,这些条目记录了执行的数据操作、事务信息等。

用户进程生成的重做日志条目用于保证数据的一致性和持久性。

当用户进程生成重做日志条目后,它们首先被存储在重做日志缓冲区中,然后由LGWR(Log Writer)进程负责将重做日志缓冲区中的数据定期写入磁盘上的联机重做日志组(Online Redo Log),这个过程确保了操作事务过程中数据的持久性和一致性,即使数据库发生故障,也可以通过重做日志文件来恢复数据。

LGWR 按顺序将数据块写入磁盘,而 DBWR 则将数据块分散写入磁盘。分散写入往往比顺序写入慢得多。由于 LGWR 使用户能够避免等待 DBWR 完成其缓慢写入,因此数据库通过这种设计提供了更高效的处理性能。

为了更清晰地理解用户在修改一行数据时数据库对 Redo Log 相关的一系列操作,我们来看下一步步的过程分析:

Redo Log Buffer

  1. 用户端发出一条更新的SQL语句,这个SQL语句通常是某个事务的一部分,并且Oracle为该事务分配了唯一的事务号。

  2. 服务器进程负责执行这个SQL语句。在执行之前,服务器进程需要将需要的数据、索引以及还原数据读入内存,并锁定将要更新的行。

  3. 在执行更新操作之前,服务器进程会尝试获得一个重做复制闩锁(Redo Copy Latch)。这个闩锁的作用是确保对重做日志缓冲区的串行访问,以避免多个服务器进程同时更改数据,可能会发生的数据争用,并且导致性能的降低。如果没有空余的闩锁(Latch)可用,其他服务器进程将无法访问重做日志缓冲区,直到 Redo Log Buffer 写入完成,释放闩锁。

在这里插入图片描述

可以按如下方式查看系统的 Redo Copy Latch 当前状态。

SQL> col name for a13;
SQL> select name, gets, misses, immediate_gets, wait_time2  from v$latch_children3  where name='redo copy';

查询重做复制闩锁

  1. 一旦获得了重做复制闩锁(Redo Copy Latch),服务器进程会再次尝试获得一个重做分配闩锁(Redo Allocation Latch),这个闩锁用于获取重做日志缓冲区中的预留空间,以便写入重做日志条目。一旦获取了重做分配闩锁并成功分配了重做日志缓冲区中的空间后,它会立即释放这个闩锁。

“Redo Allocation Latch”(重做分配闩锁)是Oracle数据库中的一种内部锁机制,用于协调和管理对重做日志缓冲区的分配操作。这个锁的主要作用是确保多个服务器进程(user processes)在向重做日志缓冲区写入新的重做日志条目时能够互斥地分配和使用缓冲区中的空间,以避免数据竞争和混乱。

具体来说,当一个服务器进程需要在重做日志缓冲区中分配一定的空间来存储新的重做日志条目时,它会尝试获取"Redo Allocation Latch",以获得分配的控制权。一旦成功获取了这个锁,服务器进程就可以安全地将新的重做日志条目写入缓冲区,并确保不会与其他进程的操作冲突。

重要的是,一旦分配操作完成,服务器进程通常会立即释放"Redo Allocation Latch",以便其他进程也可以获取并使用重做日志缓冲区中的空间。这种机制允许多个并发进程在数据库中进行写操作,同时维护了数据的一致性和完整性。

“Redo Allocation Latch”(重做分配闩锁)可以通过以下方式查看:

SQL> select count(*) from v$latch_children where name='redo allocation';

查询重做分配闩锁

  1. 接下来,服务器进程使用获得的重做复制闩锁,将重做项写入重做日志缓冲区。重做项包括了更新数据的原始值、操作类型、事务号等信息。完成写入后,服务器进程释放重做日志复制闩锁。

  2. 与此同时,服务器进程还会将还原信息写入与该事务相关的还原段。这个还原段在用户使用ROLLBACK指令进行回滚操作时会被使用。

  3. 最后,服务器进程完成对数据的更新,将需要的原始值和对数据所做的修改写入数据库高速缓冲区。这些数据被标记为脏数据,因为此时内存中的数据与磁盘中的数据不一致了。

在理解了重做日志缓冲区的工作原理和上述过程后,我们可以进一步分析LGWR(Log Writer)进程何时将重做日志缓冲区中的重做数据写入重做日志文件。

深刻理解这些操作对于优化重做日志缓冲区的性能非常重要。

LGWR 进程会在以下任何一种情况发生时把缓冲区数据刷新(Flush)写入磁盘:

  • 1、每3秒钟一次;
  • 2、发生提交(COMMIT)或者回滚(ROLLBACK)请求时;
  • 3、要求LGWR切换日志文件(Redo Log File)时;(alter system switch logfile;)
  • 4、重做缓冲区(Redo_Log_Buffer)用满1/3,或者缓存重做日志数据达到 1MB 时;

由于上面的这些原因,如果重做日志缓冲区的大小超过几十MB,对大部分系统来说就没什么意义了。

除非是一个拥有大量并发事务的大型系统,或许较大的重做日志缓冲区才会对它有利,因为LGWR这个负责将重做日志缓冲区刷新输出到磁盘的进程,在将日志从缓冲区输出到磁盘时,其他会话也可能需要同时向缓冲区中填入新的数据。

一般而言,如果有一个事务长时间运行并生成大量重做日志,这种情况下采用大于常规的日志缓冲区是有好处的,因为在LGWR 将重做日志缓冲区里的数据刷新输出到磁盘的同时,这种长事务也会不断地向缓冲区里写入数据。事务越大、越长,大日志缓冲区的好处就越显著。

重做日志缓冲区的默认大小由 LOG_BUFFER 参数控制,并随不同操作系统、数据库版本和其他参数设置会有很大变化。

可以通过以下语句查询当前数据库 LOG_BUFFER 配置的大小约为 7MB 左右。(SGA为 8GB )。

SQL> show parameter log_bufferNAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
log_buffer			     big integer 7312K

或者查询 SGA

SQL> SHOW SGATotal System Global Area 8589930576 bytes
Fixed Size		    8945744 bytes
Variable Size		 1476395008 bytes
Database Buffers	 7096762368 bytes
Redo Buffers		    7827456 bytes  		//  LOG_BUFFER当前配置

当LGWR(Log Writer)将重做日志缓冲区中的重做条目写入重做日志文件或磁盘时,用户进程可以继续在内存中写入磁盘的条目上复制新的重做条目。这是因为在Oracle的重做日志机制中,重做日志缓冲区是一个循环的结构,新的重做条目可能会覆盖已经安全写入磁盘的较旧条目。

这个机制确保了内存中的重做日志缓冲区保持了最新的更改。即使在LGWR将条目写入磁盘的同时,用户进程生成的新的重做条目也有可能覆盖已经写入磁盘的旧条目。

重做日志缓冲区”的说明

这种设计保证了数据库在需要恢复时,可以使用重做日志文件重新应用用户进程最近的更改。

LGWR(Log Writer)的主要任务之一是确保重做日志缓冲区中始终有足够的空间来容纳新生成的重做条目,即使这个缓冲区经常被访问。如果重做日志缓冲区的空间不足,LGWR会在需要时将重做日志条目写入磁盘,以释放空间供新的条目写入。这种情况下,LGWR会不断地将重做记录刷新到磁盘,以确保缓冲区保持足够的空间。

数据库初始化参数 Log_Buffer 定义了重做日志缓冲区的大小,默认值是 DB_BLOCK_SIZE 的四倍。通常,较大的 Log_Buffer 值会减少重做日志文件 I/O,尤其是在事务较长或事务数多的情况下。

在高事务负载的生产数据库中有一个重要的优化策略是增加重做日志缓冲区的大小(Log_Buffer 的值设置得足够大)。如果重做日志缓冲区足够大,那么它更有可能在不频繁刷新到磁盘的情况下容纳新的重做记录。这不仅提高了性能,还减少了频繁的重做日志文件I/O操作,因为写入磁盘通常比写入内存更耗时。

重做日志组是循环使用的,当前的重做日志文件已满并覆盖以前的文件时,如果数据库处于归档模式,归档进程(ARCH)会自动将被覆盖的重做日志文件的内容复制到归档日志文件中。

要优化数据库性能,需要考虑以下几个因素:

1. 适当设置 Log_Buffer 参数的大小,以减少重做日志文件I/O操作,特别是在高事务负载情况下。
2. 确保重做日志文件的大小和数量足够,以容纳数据库的活动,避免频繁的重做日志切换。
3. 监控数据库的性能指标,如等待事件,特别是与重做相关的性能问题,如"log buffer space"等待事件,以及通过适当的配置来解决这些问题。

还有一种优化方法就是启用"私有重做并行模式"(Private Redo Parallelism)或"零拷贝重做"(Zero Copy Redo)功能。

通过启用Oracle数据库内部参数 "_LOG_PRIVATE_PARALLELSIM"参数控制数据库引擎启用或禁用零拷贝重做优化功能。当该参数被设置为TRUE时,数据库引擎会尝试使用零拷贝技术来提高重做日志操作的性能。
"零拷贝重做"

零拷贝重做优化功能可以将Shared Pool分割为多个部分,为每个服务器进程创建一个独立的专用空间,并在每个专用空间创建重做更改向量(Redo Change Vector)的数据结构,用于存储每个服务器进程重做日志的更改。

然后,LGWR进程可以直接将这个**重做更改向量(Redo Change Vector)写入磁盘上的重做日志文件,而无需将它复制到重做日志缓冲区。**这种优化可以提高性能并减少不必要的资源开销。

然而,“零拷贝重做”(Zero Copy Redo)功能的实际可行性取决于每个数据库的特定的运行环境和实际生产需求。在考虑应用这些策略时,需要仔细评估数据库的工作负载、硬件资源和数据库管理员的经验,并在非生产环境中进行详细地测试和评估,以确保它们对数据库的性能产生正面影响而不会引入不必要的风险。

重做日志缓冲区在Oracle数据库中扮演着关键的角色,用于记录和保护数据更改,同时也需要仔细配置和监视以确保数据库的高性能和可靠性。理解它的结构和用途对于数据库管理和性能优化至关重要。

在这里插入图片描述
最后想说,在基础核心软件研发领域,绝对不能孤立自己,关起门来造轮子,往往是自嗨,除了感动自己,更多的是走错了方向,方向错了,越努力只会离目标越远。如果不积极与其他国家的研发者交流合作,眼界通常受限,思维容易僵化。

在数据库领域,虚心请教和学习发达国家的成熟软件是非常关键的一部分。尤其是要借鉴欧美国家在软件领域的先进经验。这些国家在软件研发方面拥有丰富的经验和资源,他们的方法、技术、产品常常是业界的佼佼者。因此,与他们保持联系,向他们请教、学习他们的最佳实践,可以帮助我们在核心软件研发中不断进步。

与欧美国家的专家和团队保持合作关系,参与国际性的开源项目或国际标准制定,也是一种增长见识、提升软件开发水平的有效途径。通过与他们共同工作,可以深入了解国际软件领域的最新趋势和发展方向,从而更好地满足国内用户和市场的需求。

总之,基础核心软件研发需要开放的思维和广泛的合作。与他人共同学习、探讨问题,特别是借鉴欧美国家的先进经验,将有助于提高我们的软件研发水平,最终解决“卡脖子”的问题。

相关文章:

ORACLE Redo Log Buffer 重做日志缓冲区机制的设计

最近和朋友包括一些国产数据库的研发人员交流,很多程序员认为 Oracle 已经过时,开源数据库或者他们研发的国产数据库才代表数据库发展的未来。甚至在很多交流会议上拿出自家产品的某一个功能点和 Oracle 对比就觉得已经遥遥领先。 实际上数据库系统的发展…...

PWN Test_your_nc Write UP

目录 PWN 00 解题过程 总结归纳 PWN 01 解题过程 总结归纳 PWN 02 解题过程 总结归纳 PWN 03 解题过程 总结归纳 PWN 04 解题过程 总结归纳 CTF PWN 开始! 冲就完了 PWN 00 解题过程 ssh远程链连接 ssh ctfshowpwn.challenge.ctf.show -p28151 输…...

Centos7配置firewalld防火墙规则

这里写自定义目录标题 欢迎使用Markdown编辑器一、简单介绍二、特点和功能2.1、区域(Zone)2.2、运行时和永久配置2.3、服务和端口2.4、动态更新2.5、连接跟踪2.6、D-Bus接口 三、设置规则3.1、启动防火墙服务3.2、新建防火墙规则的服务,添加端…...

【新版】系统架构设计师 - 未来信息综合技术

个人总结,仅供参考,欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…...

CAD二次开发LineSegment2d

在C#的CAD二次开发中,LineSegment2d 是AutoCAD的.NET API中的一个类,用于表示二维空间中的线段。它包含了起点和终点的坐标信息,并提供了一些方法用于进行线段之间的计算和判断。 LineSegment2d 类具有以下常用属性和方法: Star…...

Linux shell编程学习笔记5:变量命名规则、变量类型、使用变量时要注意的事项

跟其他的高级开发语言一样,Linux Shell编程中使用的数据也需要保存在变量中。 Shell使用变量来控制其行为,并且可以通过更改变量值来更改Shell和其他程序的行为。 我们先来了解一下变量命令的规则、变量类型和使用变量时要注意的事项。 一、变量命名规…...

如何把word的页眉页脚改为图片

前言 亲戚A: 听说你是计算机专业? 沐风晓月: 是啊 亲戚A: 那正好,来看看我这个页眉怎么改成图片 沐风晓月: 一万匹马奔腾而过 亲戚B: 听说你是英语专业? 沐风晓月: 是啊…...

spring6-实现简易版IOC容器

手写简易版IOC容器 1、回顾Java反射2、实现Spring的IoC 我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。 1、回顾Java反射 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所…...

Feign接口调用GET请求@RequestParam传参丢失

文章目录 问题现象排查解决GET加注解解决使用POST方式解决 时间戳传参失败 问题现象 项目使用的是Spring Cloud微服务,服务间调用使用的是Feign在一次服务调用时,发现GET传参丢失,没有传递过去任何参数加了RequestParam注解,发现…...

LeetCode每日一题 | 309.买卖股票的最佳时机含冷冻期

题目链接&#xff1a; 309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 算法图解&#xff1a; 解题代码&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int n prices.size();vector&…...

HTML的学习 Day02(列表、表格、表单)

文章目录 一、列表列表主要分为以下三种类型&#xff1a;1. 无序列表&#xff08;Unordered List&#xff09;&#xff1a;2. 有序列表&#xff08;Ordered List&#xff09;&#xff1a;将有序列表的数字改为字母或自定义内容li.../li 列表项标签中value属性&#xff0c;制定列…...

Android shape记录

之前一直觉得dataPath很好用&#xff0c;可以画各种矢量图。今天发现用shape画图也不错&#xff0c;记录一下自己用shape画的图。 一般使用shape就是定义形状、stroke边、solid内部、corners圆角等&#xff0c;代码 <?xml version "1.0" encoding "utf-8&q…...

WSL2和ubuntu的安装过程

目录 1.WSL2的安装 2.Ubuntu的安装 3.安装完成后的打开方式 1.WSL2的安装 按下WINX键&#xff0c;选择Windows PowerShell (管理员) 1.1执行以下命令&#xff0c;该命令的作用是&#xff1a;启用适用于 Linux 的 Windows 子系统 dism.exe /online /enable-feature /featur…...

力扣第150题 逆波兰表达式求值 stack c++

题目 150. 逆波兰表达式求值 中等 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意&#xff1a; 有效的算符为 、-、* 和 / 。每个操作数&#xff08;运算对象&#xff09;都…...

三、飞行和射击

目录 1.飞行的实现 2.限制玩家视角 3.射击的实现 4.附录 1.飞行的实现 &#xff08;1&#xff09;在Player预制体上挂载Configuration Joint组件&#xff0c;并修改其Y Drive属性 &#xff08;2&#xff09; 修改PlayerInput.cs和PlayerController.cs以实现飞行 PlayerIn…...

GitHub与GitHubDesktop的使用

1、介绍 见天来学习使用GitHub与GitHubDesktop。 学习前先来介绍一下什么是GitHub。 GitHub是一个基于Git的代码托管平台和开发者社区。它提供了一个Web界面&#xff0c;让开发者能够轻松地托管、共享和管理他们的软件项目。 在GitHub上&#xff0c;开发者可以创建自己的代…...

AIGC 微调的方法

AIGC 的微调方法可以分为以下步骤&#xff1a; 数据准备&#xff1a;收集尽可能多的数据&#xff0c;包括输入和输出数据&#xff0c;并将其划分为训练集、验证集和测试集。 模型选择&#xff1a;选择合适的模型结构&#xff0c;例如多层感知器&#xff08;MLP&#xff09;、卷…...

gcc编译webrtc x64

gcc使用Ubuntu系统已经有的gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04) 1、下载离线版webrtc&#xff08;也可以翻墙下载webrtc&#xff09; 百度云链接: 链接: https://pan.baidu.com/s/1oHVz9bxXlW3Q6uO996c5XA 提取码: ojbs 2、下载gn https://github.com/timnieder…...

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…...

中国1km土壤特征数据集(2010年)

简介&#xff1a; 中国1km土壤特征数据集&#xff08;2010&#xff09;是基于第二次全国土壤调查的中国1:1000000比例尺土壤图和8595个土壤剖面图&#xff0c;以及美国农业部&#xff08;USDA&#xff09;中国区域土地和气候模拟标准&#xff0c;开发了一个多层土壤粒度分布数…...

计算机网络笔记 第二章 物理层

2.1 物理层概述 物理层要实现的功能 物理层接口特性 机械特性 形状和尺寸引脚数目和排列固定和锁定装置 电气特性 信号电压的范围阻抗匹配的情况传输速率距离限制 功能特性 -规定接口电缆的各条信号线的作用 过程特性 规定在信号线上传输比特流的一组操作过程&#xff0…...

使用CreateProcess崩溃:处未处理的异常: 0xC0000005: 写入位置 0x00415652 时发生访问冲突

问题代码 if (!CreateProcess(NULL,L"pela.exe",NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)){return 0;}如果CreateProcess的第二个参数字符串是常量或者是储存在堆中的就会被写保护&#xff0c;崩溃。如果字符串定义到栈或者全局变量就不存在此问题了。 正确的…...

Java 华为真题-出租车计费

需求 程序员小明打了一辆出租车去上班。出于职业敏感&#xff0c;他注意到这辆出租车的计费表有点问题&#xff0c;总是偏大。 出租车司机解释说他不喜欢数字4&#xff0c;所以改装了计费表&#xff0c;任何数字位置遇到数字4就直接跳过&#xff0c;其余功能都正常。 比如&…...

开源layui前端框架 收款码生成系统源码 多合一收款码生成源码 带50多套UI模板

Layui前端的多合一收款码在线生成系统源码_附多套前端UI模板。 卡特三合一收款码生成系统源码&#xff0c;和收款啦采用一样的原理。 内部多达50多套模板&#xff0c;前端跟付款界面都特别好看。 识别收款码之后会自动加密&#xff0c;非常安全。 一样没有后台&#xff0c;一样…...

微服务moleculer01

1.官网地址&#xff1a; Moleculer - Progressive microservices framework for Node.js 2. github代码地址&#xff1a; GitHub - moleculerjs/moleculer: :rocket: Progressive microservices framework for Node.js Moleculer是基于Node.js的一款快速、多功能的微服务框…...

C++中将指针传递给函数

C中将指针传递给函数 指针是一种将内存空间传递给函数的有效方式&#xff0c;其中可包含函数完成其工作所需的数据&#xff0c;也可包含操作结果。将指针作为函数参数时&#xff0c;确保函数只能修改您希望它修改的参数很重要。例如&#xff0c;如果函数根据以指针方式传入的半…...

【51单片机编写占空比按秒渐亮与渐暗】2023-10-2

昨天刚在W10上安装CH340驱动&#xff0c;又下载到板子上LCD1602定时器时钟程序&#xff0c;为了调试&#xff0c;调用了一个LED观察控制蜂鸣器按秒响的变量&#xff0c;几经调试才发觉该开发板用的是有源蜂鸣器&#xff0c;不用IO取反操作&#xff0c;直接控制IO的高低电平即可…...

OCI 发布了容器运行时和镜像规范!

7 月 19 日是开放容器计划Open Container Initiative&#xff08;OCI&#xff09;的一个重要里程碑&#xff0c;OCI 发布了容器运行时和镜像规范的 1.0 版本&#xff0c;而 Docker 在这过去两年中一直充当着推动和引领的核心角色。 我们的目标是为社区、客户以及更广泛的容器行…...

C++学习笔记一: 变量和基本类型

本章讲解C内置的数据类型&#xff08;如&#xff1a;字符、整型、浮点数等&#xff09;和自定义数据类型的机制。下一章讲解C标准库里面定义的更加复杂的数据类型&#xff0c;比如可变长字符串和向量等。 1.基本内置类型 C内置的基本类型包括&#xff1a;算术类型和空类型。算…...

探索ClickHouse——同时支持导入导出功能的文件格式

在《探索ClickHouse——安装和测试》中&#xff0c;我们使用clickhouse直接从文件中读取数据。clickhouse支持多种格式文件的导入导出&#xff0c;本节我们对此进行分类介绍。 按常见格式区分 JSON 原始的JSON格式只支持导入&#xff0c;不支持导入。同时支持导入和导出的是…...

做鸭子的网站/网络销售平台

6.2笔试题目浪潮软件研发B卷(60分钟)注&#xff1a;对于有C和JAVA选择的试题&#xff0c;考生可以选择其中一种解答&#xff0c;请在答题卡中标明。即选择C语言试题解答&#xff0c;则解答的JAVA试题不计分&#xff1b;选择JAVA语言&#xff0c;解答的C语言试题不计分。一、填空…...

推荐一些电商平台/优化网站排名工具

本文介绍微信支付中订单查询功能的实现。 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/wxpay-order-query.html 一、订单查询 因为某一方技术的原因&#xff0c;可能导致商户在预期时间内都收不到最终支付通知&#xff0c;此时商户可以通…...

诸城哪里有做网站的/网络营销推广是做什么的

埋头苦学就会快速超神吗&#xff1f; 我觉得不一定&#xff0c;我相信世界上一切事物都有套路&#xff0c;搞清套路才是关键&#xff0c;学设计亦如此&#xff0c;总结其中套路&#xff0c;而不是学完就完。 很多人可能会认为&#xff0c;那些学习能力强的人会不会是那种埋头苦…...

免费查看招标信息的网站/跨境电商平台

2019独角兽企业重金招聘Python工程师标准>>> Now only your compiler stands between Hell and Earth. https://github.com/TTimo/doom3.gpl 转载于:https://my.oschina.net/coolwater/blog/35941...

官网 wordpress/营销网络

执行如下truncate语句删除linked server的表会有报错 truncate table Linkserver1.DB1.dbo.Table1; 报错 Cannot find the object “Table1” because it does not exist or you do not have permissions. 解决方法&#xff0c;在linked server上使用sp_executesql即可 exec L…...

相城区建设局网站/seo搜索引擎优化就业指导

系列目录 https://blog.csdn.net/jzlhll123/article/category/7671581 引用了很多网上的图片&#xff0c;具体链接未能及时保存&#xff0c;致歉。 20180625 再探binder https://blog.csdn.net/jzlhll123/article/details/80806584 在学习Binder的过程中有很多迷惑和难度。而且…...