输入url到页面显示过程的优化
浏览器架构
线程:操作系统能够进行运算调度的最小单位。
进程:操作系统最核心的就是进程,他是操作系统进行资源分配和调度的基本单位。
一个进程就是一个程序的运行实例。启动一个程序的时候,操作系统会为该程序创建一块内存,用来存放代码、运行中的数据和一个执行任务的主线程,把这样的一个运行环境叫进程。
线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。
进程和线程之间的关系4个特点。
- 进程中任意线程执行出错,都会导致整个进程崩溃
- 线程之间共享进程中的数据
- 当一个进程关闭后,操作系统会回收进程占用的内存
- 进程之间内容相互隔离(通过IPC机制进行通信)
现代浏览器为多进程架构,打开一个页面,浏览器至少会打开四个进程 -- 浏览器主进程、渲染进程、GPU进程、网络进程。
- 浏览器进程:主要负责界面显示、用户交互、子进程管理,同时提供存储等功能。
- 渲染进程:核心任务是将 HTML、CSS 和 JavaScript 转换为用户可以与之交互的网页,排版引擎Blink和JavaScript引擎V8都是运行在该进程中,默认情况下,Chrome会为每个Tab标签创建一个渲染进程。出于安全考虑,渲染进程都是运行在沙箱模式下。
- GPU进程:实现3D CSS效果,UI界面绘制。
- 网络进程。主要负责页面的网络资源加载。
- 插件进程。主要是负责插件的运行,因插件易崩溃,所以需要通过插件进程来隔离,以保证插件进程崩溃不会对浏览器和页面造成影响。
地址栏键入URL后会发生什么?
- 构建请求:浏览器准备发起网络请求,构建请求行等
- 查找缓存:若命中强缓存,直接拦截请求,从本地获取资源
#URL解析
先进行url解析,提取出协议,端口,域名,路径等信息
判断你输入的是一个合法的URL
还是一个待搜索的关键词,并且根据你输入的内容进行对应操作
#DNS查询
获取到了域名对应的目标服务器IP
地址
DNS(Domain Name System)是互联网中用于将域名转换为对应 IP 地址的分布式数据库系统。当客户端需要解析域名时,它会发送 DNS 查询请求到 DNS 服务器,并获取对应的 IP 地址。DNS 查询过程可以分为递归查询和迭代查询两种方式。### 递归查询1. **客户端发起请求**:当客户端需要解析域名时,它会发送一个 DNS 查询请求到本地 DNS 服务器。2. **本地 DNS 服务器查询**:本地 DNS 服务器首先检查自己的缓存中是否有该域名对应的 IP 地址。如果有,它会直接返回给客户端。3. **迭代查询**:如果本地 DNS 服务器的缓存中没有该域名对应的 IP 地址,它会向根域名服务器发送一个 DNS 查询请求。根域名服务器会告诉本地 DNS 服务器负责该顶级域的权威 DNS 服务器的地址。4. **查询顶级域 DNS 服务器**:本地 DNS 服务器再向负责该顶级域的权威 DNS 服务器发送一个 DNS 查询请求。顶级域 DNS 服务器会告诉本地 DNS 服务器负责该二级域的权威 DNS 服务器的地址。5. **查询权威 DNS 服务器**:本地 DNS 服务器继续向负责该二级域的权威 DNS 服务器发送 DNS 查询请求,直到最终获取到域名对应的 IP 地址。本地 DNS 服务器将 IP 地址返回给客户端,并将 IP 地址缓存起来,以便下次查询时使用。### 迭代查询1. **客户端发起请求**:客户端发送一个 DNS 查询请求到 DNS 服务器。2. **DNS 服务器查询**:DNS 服务器首先检查自己的缓存中是否有该域名对应的 IP 地址。如果有,它会直接返回给客户端。3. **迭代查询**:如果 DNS 服务器的缓存中没有该域名对应的 IP 地址,它会向根域名服务器发送一个 DNS 查询请求。根域名服务器会告诉 DNS 服务器负责该顶级域的权威 DNS 服务器的地址。4. **查询顶级域 DNS 服务器**:DNS 服务器再向负责该顶级域的权威 DNS 服务器发送一个 DNS 查询请求。顶级域 DNS 服务器会告诉 DNS 服务器负责该二级域的权威 DNS 服务器的地址。5. **查询权威 DNS 服务器**:DNS 服务器继续向负责该二级域的权威 DNS 服务器发送 DNS 查询请求,直到最终获取到域名对应的 IP 地址。然后,DNS 服务器将 IP 地址返回给客户端。=======递归查询和迭代查询的主要区别在于,递归查询是由 DNS 服务器代为向其他 DNS 服务器查询,直到找到域名对应的 IP 地址并返回给客户端;而迭代查询是由 DNS 服务器一步步地指导客户端自行向其他 DNS 服务器查询,直到最终找到域名对应的 IP 地址。
实际上,DNS 解析过程中既有递归查询,也有迭代查询,这两种查询方式是相辅相成的。1. **递归查询**:在 DNS 解析过程中,客户端向本地 DNS 服务器发起递归查询请求。本地 DNS 服务器会负责向其他 DNS 服务器发送递归查询请求,直到找到域名对应的 IP 地址,并将结果返回给客户端。递归查询的特点是 DNS 服务器会负责完成整个查询过程,直到找到结果并返回给客户端。2. **迭代查询**:在 DNS 解析过程中,当本地 DNS 服务器无法直接返回结果时,它会向其他 DNS 服务器发送迭代查询请求,获取更多的信息。这些迭代查询请求会依次向根域名服务器、顶级域 DNS 服务器和权威 DNS 服务器发送,直到最终找到结果。迭代查询的特点是 DNS 服务器向客户端提供其他 DNS 服务器的地址,然后客户端会继续向这些 DNS 服务器发送查询请求,直到找到结果。因此,DNS 解析过程中通常会同时使用递归查询和迭代查询,以确保客户端能够快速准确地获取到域名对应的 IP 地址。
#TCP连接
在确定目标服务器服务器的IP
地址后,则经历三次握手建立TCP
连接
#发送 http 请求
当建立tcp
连接之后,就可以在这基础上进行通信,浏览器发送 http
请求到目标服务器
请求的内容包括:
- 请求行
- 请求头
- 请求主体
#响应请求
当服务器接收到浏览器的请求之后,就会进行逻辑操作,处理完成之后返回一个HTTP
响应消息,包括:
- 状态行
- 响应头
- 响应正文
在服务器响应之后,由于现在http
默认开始长连接keep-alive
,当页面关闭之后,tcp
链接则会经过四次挥手完成断开
#页面渲染
当浏览器接收到服务器响应的资源后,首先会对资源进行解析:
- 查看响应头的信息,根据不同的指示做对应处理,比如重定向(301,302),存储cookie(如果响应头中包含 Set-Cookie 字段,表示服务器希望浏览器存储 cookie,浏览器会根据这些字段存储 cookie 信息。),解压gzip(Content-Encoding :gzip),缓存资源等等
- 查看响应头的 Content-Type的值,根据不同的资源类型采用不同的解析方式
(Content-Type 是响应头中的一个字段,它指示了响应内容的类型。浏览器会根据 Content-Type 的值来确定响应的内容类型,然后采用不同的解析方式对响应内容进行处理。例如:
- 如果 Content-Type 表示响应内容是 HTML 文档(如
text/html
),浏览器会将其解析为 DOM 结构,并进行页面渲染。 - 如果 Content-Type 表示响应内容是 JavaScript 脚本(如
application/javascript
),浏览器会执行这段 JavaScript 代码。 - 如果 Content-Type 表示响应内容是 CSS 样式表(如
text/css
),浏览器会解析这段 CSS 代码,并应用于页面渲染。 - 如果 Content-Type 表示响应内容是图片、音频或视频等媒体资源(如
image/jpeg
、audio/mp3
、video/mp4
等),浏览器会直接将其展示给用户或者交给相应的插件进行处理。)
渲染流程:HTML、CSS和JavaScript,是如何变成页面的?
关于页面的渲染过程如下:dom css render 布局绘制显示
- 解析HTML,构建 DOM 树
- 解析 CSS ,生成 CSS 规则树 样式计算
- 合并 DOM 树和 CSS 规则,生成 render 树,(在这个阶段,浏览器会根据 DOM 树中的每个可见节点和样式计算得到的具体样式来构建渲染树,忽略掉不可见的元素或不影响渲染的节点(比如
<script>
、<meta>
等)。这个渲染树将用于后续的布局和绘制。) - 布局 render 树( Layout / reflow ),负责各元素尺寸、位置的计算
- 绘制 render 树( paint ),绘制页面像素信息
- 浏览器会将各层的信息发送给 GPU,GPU 会将各层合成,显示在屏幕上
-
构建DOM树:浏览器无法直接理解和使用HTML,所以需要将HTML转换为浏览器能够理解的结构——DOM树
-
样式计算:
- 把CSS转换为浏览器能够理解的结构 -- styleSheets
- 转换样式表中的属性值,使其标准化,比如将颜色‘red’转化成渲染引擎可以理解的rgb值
- 浏览器会将DOM树和CSS规则树合并,计算每个元素的具体样式信息,即进行样式计算。这个过程中,浏览器会计算出每个DOM节点的最终样式信息,包括继承的样式和自身的样式。
-
布局阶段:有了DOM树和样式,还不足以显示页面,接下来就需要计算出DOM树中可见元素的几何位置,这个计算过程叫做布局。
- 创建布局树:构建一颗元素布局树,比如去掉head等没有实际元素的标签,去掉display为none的元素等
-
分层:页面中有很多复杂的效果,如一些复杂的3D变换、页面滚动,或者使用z-indexing做z轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树。所以浏览器的页面实际上被分成了很多图层,这些图层叠加后合成了最终的页面
-
图层绘制:将布局树中的元素转换成屏幕上的像素信息。
-
栅格化操作:通常一个页面可能很大,但是用户只能看到其中的一部分,这个部分叫做视口。在有些情况下,有的图层可以很大,比如有的页面要滚动好久才能滚动到底部,但是通过视口,用户只能看到页面的很小一部分,所以在这种情况下,要绘制出所有图层内容的话,就会产生太大的开销,而且也没有必要。基于这个原因,合成线程会将图层划分为图块,这些图块的大小通常是256x256或者512x512。然后合成线程会按照视口附近的图块来优先生成位图,实际生成位图的操作是由栅格化来执行的。所谓栅格化,是指将图块转换为位图。而图块是栅格化执行的最小单位。
-
合成和显示:所有图块都栅格化完成后,合成线程将指令提交给浏览器进程,浏览器进程根据指令将页面内容绘制到内存中,最后从内存中取出图像显示到屏幕上。
从发起URL请求开始,到首次显示页面的内容,在视觉上经历三个阶段。可能会有阻塞的地方,怎么解决
页面渲染过程中可能出现阻塞的主要环节包括:
- 等请求发出去之后,到提交数据阶段,这时页面展示出来的还是之前页面的内容。
- 提交数据之后渲染进程会创建一个空白页面,这段时间称为解析白屏,并等待CSS文件和JavaScript文件的加载完成,生成CSS规则树和dom树,然后合成布局树,最后还要经过一系列的步骤准备首次渲染。
- 第三个阶段,等首次渲染完成之后,就开始进入完整页面的生成阶段了,然后页面会一点点被绘制出来。
影响第一个阶段的因素主要是网络或者是服务器处理。
第二个阶段主要问题是白屏时间,如果白屏时间过久,就会影响到用户体验。为了缩短白屏时间,需要挨个分析这个阶段的主要任务,包括了解析HTML、下载CSS、下载Js、生成CSSOM、执行JavaScript、生成布局树、绘制页面一系列操作。通常情况下的瓶颈主要体现在下载CSS文件、下载JavaScript文件和执行JavaScript。
1. HTML解析:浏览器解析HTML文档构建DOM树时,如果遇到`<script>`标签,会立即暂停解析,等待脚本执行完毕。这是因为脚本可能会修改DOM,所以浏览器需要等待脚本执行完成后再继续解析。
2. CSS解析:CSSOM(CSS对象模型)的构建也可能阻塞渲染,因为浏览器需要确保页面的样式在脚本执行之前就已经确定。
3. JavaScript执行:JavaScript的执行会阻塞DOM的构建,因为脚本可能会操作DOM元素。
所以要想缩短白屏时长,可以有以下策略:
- 将关键CSS直接内联到HTML中(style标签),可以加快首次渲染的速度(行内>内部>外部)。对于非关键CSS,可以通过媒体查询或JavaScript异步加载。这样只有在特定的场景下才会加载特定的CSS文件。
-
<!-- 异步加载非关键CSS --><script>var link = document.createElement('link');link.rel = 'stylesheet';link.href = 'non-critical.css';document.head.appendChild(link);</script> </head>
- 异步加载脚本:使用
async
或defer
属性将JavaScript脚本异步加载,可以使得脚本不会阻塞页面的渲染,从而减少白屏时间。 async:异步加载脚本,脚本加载完成后,会立即执行,与在页面中出现的顺序无关; defer:浏览器立即加载,但是延迟执行,需要在DOMContentLoaded事件之前执行,与出现顺序有关,dom加载完毕后按出现顺序依次执行。 -
使用CDN加速:将页面资源分发到全球各地的CDN(内容分发网络),可以加速资源的加载速度,减少白屏时间。CDN可以使用户从距离较近的服务器获取资源,从而提高访问速度。
- 使用预加载和预渲染技术:可以使用预加载(preload)和预渲染(prerender)等技术,提前加载页面所需的资源或者预渲染页面内容,以减少白屏时间。预加载可以在页面加载过程中提前加载关键资源,而预渲染可以在后台加载整个页面内容,使得用户访问页面时可以立即展示完整内容。
- HTTP/2通过引入多路复用、头部压缩、服务器推送等技术,优化了网络资源的利用效率,减少了网络连接的延迟,提高了页面加载速度
- 代码分割和懒加载:可以使用代码分割将代码分成多个小块,然后按需加载。对于不影响首屏渲染的组件或功能,可以使用懒加载技术延迟加载。Webpack提供了一种称为“动态导入”的语法,可以实现代码分割。
// 使用动态导入语法,将代码按需分割成多个小块
import('./module').then(module => {// 在需要的时候加载模块module.doSomething();
});
Webpack会将动态导入的代码块分割成单独的文件,并在需要的时候按需加载。
在React中,可以使用React.lazy和Suspense组件来实现懒加载。
import React, { Suspense } from 'react';const LazyComponent = React.lazy(() => import('./LazyComponent'));function MyComponent() {return (<div><Suspense fallback={<div>Loading...</div>}><LazyComponent /></Suspense></div>);
}
当 MyComponent 被渲染时,它会先显示 fallback 属性指定的加载中提示,
然后在 LazyComponent 加载完成后显示真正的内容。
- 客户端缓存:浏览器可以通过缓存响应内容来减少对服务器的请求。通过设置合适的缓存控制头(如
Cache-Control
和Expires
),可以告诉浏览器何时可以使用缓存以及缓存的有效期。对于那些不经常变化的静态资源,可以使用强缓存来尽快地加载页面内容,减少白屏时间;而对于那些可能会频繁更新的动态内容,可以使用协商缓存来确保客户端可以获取到最新的资源。在Express中,你可以在路由处理函数中设置缓存控制头,通过res.setHeader
方法实现。
代码优化
比如下面的代码,实现了一个斐波那契数列,也就是说,在实现的这个数列中,每一个数的值是前面两个数的值之和。可以使用简单的递归算法实现斐波那契数列后,在页面显示计算结果。
function fib(n){ if(n<=1) return 1 return fib(n-1)+fib(n-2) } let count = ref(fib(38))
使用performance:
打开调试窗口中的 Performance 面板,使用录制功能后,便可得到下面的火焰图。通过这个火焰图,可以清晰地定位出这个项目中,整体而言耗时最长的 fib 函数,并且能看到这个函数被递归执行了无数次。到这里,不难意识到这段代码有性能问题。不过,定位到问题出现的地方之后,代码性能的优化就变得方向明确了。
用户体验优化
1.比如用户加载大量图片的同时,如果本身图片清晰度较高,那直接加载的话,页面会有很多图一直是白框。所以可以预先解析出图片的一个模糊版本,加载图片的时候,先加载这个模糊的图作为占位符,然后再去加载清晰的版本。虽然额外加载了图片文件,但是用户在体验上得到了提升。
2.类似的场景还有很多,比如用户上传文件的时候,如果文件过大,那么上传可能就会很耗时。而且一旦上传的过程中发生了网络中断,那上传就前功尽弃了。为了提高用户的体验,可以选择断点续传,也就是把文件切分成小块后,挨个上传。这样即使中间上传中断,但下次再上传时,只上传缺失的那些部分就可以了。可以看到,断点上传虽然在性能上,会造成网络请求变多的问题,但也极大地提高了用户上传的体验。
3.还有很多组件库也会提供骨架图的组件,能够在页面还没有解析完成之前,先渲染一个页面的骨架和 loading 的状态,这样用户在页面加载的等待期就不至于一直白屏
性能监测报告
解释一下 FCP、TTI 和 LCP 这几个关键指标的含义。
首先是 First Contentful Paint,通常简写为 FCP,它表示的是页面上呈现第一个 DOM 元素的时间。在此之前,页面都是白屏的状态;
然后是 Time to interactive,通常简写为 TTI,也就是页面可以开始交互的时间;
还有和用户体验相关的 Largest Contentful Paint,通常简写为 LCP,这是页面视口上最大的图片或者文本块渲染的时间,在这个时间,用户能看到渲染基本完成后的首页,这也是用户体验里非常重要的一个指标。
可以通过代码中的 performance 对象去动态获取性能指标数据,并且统一发送给后端,实现网页性能的监控。性能监控也是大型项目必备的监控系统之一,可以获取到用户电脑上项目运行的状态。下图展示了 performance 中所有的性能指标,可以通过这些指标计算出需要统计的性能结果。
const timing = window.performance && window.performance.timing
const navigation = window.performance && window.performance.navigation// DNS 解析:
const dns = timing.domainLookupEnd - timing.domainLookupStart// 总体网络交互耗时:
const network = timing.responseEnd - timing.navigationStart// 渲染处理:
const processing = (timing.domComplete || timing.domLoading) - timing.domLoading// 可交互:
const active = timing.domInteractive - timing.navigationStart
在上面的代码中,通过 Performance API 获取了 DNS 解析、网络、渲染和可交互的时间消耗。有了这些指标后,就可以随时对用户端的性能进行检测,做到提前发现问题,提高项目的稳定性。
相关文章:
输入url到页面显示过程的优化
浏览器架构 线程:操作系统能够进行运算调度的最小单位。 进程:操作系统最核心的就是进程,他是操作系统进行资源分配和调度的基本单位。 一个进程就是一个程序的运行实例。启动一个程序的时候,操作系统会为该程序创建一块内存&a…...
Linux(centos7)部署hive
前提环境: 已部署完hadoop(HDFS 、MapReduce 、YARN) 1、安装元数据服务MySQL 切换root用户 # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysqL-2022 # 安装Mysql yum库 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm # yu…...
LeetCode | 数组 | 双指针法 | 27. 移除元素【C++】
题目链接 1. 题目描述 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑…...
【Apache Doris】周FAQ集锦:第 2 期
【Apache Doris】周FAQ集锦:第 2 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目! 在这个栏目中,每周将筛选社区反馈的热门问题和话题,重点回答并进行深入探讨。旨在为广大用户和…...
jQuery(二)
文章目录 1.jQuery操作节点1.查找节点,修改属性1.基本介绍2.切换图片案例 2.创建节点1.基本介绍2.内部插入3.外部插入4.小结1.插入方法说明2.两种插入方法的区别 5.插入元素实例6.移动元素实例 3.删除节点1.基本介绍2.代码实例 4.复制节点1.基本介绍2.代码实例 5.替…...
MIT6.828 实验环境安装教程
Thanks:mit6.828环境搭建 - 人云我不亦云的文章 - 知乎 https://zhuanlan.zhihu.com/p/489921553 sudo make && make install install -d -m 0755 "/share/qemu" install: 无法创建目录 “/share”: 权限不够 make: *** [Makefile:382:…...
一文彻底搞清 Iterator(遍历器)概念及用法
目录 一、由来及意义 二、具体实现流程 三、具有默认 Iterator 接口的数据结构 四、调用 Iterator 接口的场合 五、总结 一、由来及意义 Javascript中表示“集合”的数据结构,主要是 Array、Object、Map、Set 这四种数据集合,除此之外,…...
稀疏矩阵的三元组表表示法及其转置
1. 什么是稀疏矩阵 稀疏矩阵是指矩阵中大多数元素为零的矩阵。 从直观上讲,当元素个数低于总元素的30%时,这样的矩阵被称为稀疏矩阵。 由于该种矩阵的特点,我们在存储这种矩阵时,如果直接采用二维数组,就会十分浪费…...
docker安装rabbitMQ,并且创建账号
# 创建docker容器启动,挂到后台运行 docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management # 打开防火墙 sudo firewall-cmd --zonepublic --add-port5672/tcp --permanent sudo firewall-cmd --zonepublic --add-port15672/tcp --permanent s…...
wireshark解析grpc/protobuf的方法
1,wireshark需要安装3.20以上 下载地址:https://www.wireshark.org/ 2,如果版本不对,需要卸载,卸载方法: sudo rm -rf /Applications/Wireshark.app sudo rm -rf $HOME/.config/wireshark sudo rm -rf /…...
软件测试用例(2)
具体的设计方法 -- 黑盒测试 因果图 因果图是一种简化的逻辑图, 能直观地表明程序的输入条件(原因)和输出动作(结果)之间的相互关系. 因果图法是借助图形来设计测试用例的一种系统方法, 特别适用于被测试程序具有多种输入条件, 程序的输出又依赖于输入条件的各种情况. 因果图…...
集群式无人机仿真环境和数据集
仿真环境和数据集 Quick StartAcknowledgementsSwarmSim Quick Start Compiling tests passed on 20.04 with ros installed. You can just execute the following commands one by one. # Download the Simulator and run it wget https://cloud.tsinghua.edu.cn/library/34…...
IPSec VPN
IP Security,IP安全 1、特点 L3的VPN 缺:不支持组播、配置复杂、延迟增加、资源消耗较多 优:具备访问控制、密码学四个维度、抗重放打击 2、组件 ①安全协议 1)验证头技术(AH) IP协议号51 提供数据完整性检查,身份验证,抗重放攻击 无法做数据的机密性 AH的完…...
docker部署nacos,单例模式(standalone),使用内置的derby数据库,简易安装
文章目录 前言安装创建文件夹docker指令安装docker指令安装-瘦身版 制作docker-compose.yaml文件查看页面 前言 nacos作为主流的服务发现中心和配置中心,广泛应用于springcloud框架中,现在就让我们一起简易的部署一个单例模式的nacos,版本可…...
systemd监听服务配置文件更新自动重启服务
背景&需求 需要频繁更改一个服务的配置文件进行测试 实现 配置服务的systemd文件 vim /lib/systemd/system/xxx.service [Unit] Descriptionxxx daemon, A rule-based proxy in Go.[Service] Typesimple ExecStart/opt/xxx/xxx-d /etc/xxx/ Restartalways[Install] Wan…...
【yy讲解PostCSS是如何安装和使用】
🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…...
YOLO电动车检测识别数据集:12617张图像,yolo标注完整
YOLO电动车检测识别数据集:12617张图像,电动车一类,yolo标注完整,部分图像应用增强。 适用于CV项目,毕设,科研,实验等 需要此数据集或其他任何数据集请私信...
从汇编看函数调用
文章目录 函数调用流程栈相关寄存器及的作用简介寄存器功能指令功能 栈函数的括号{}正括号反括号 参数传递传值,变量不可改传指针,变量可改C 传引用 函数调用实例 函数调用流程 目标:函数调用前后栈保持不变 保存main函数的寄存器上下文移…...
node.js的错误处理
当我打开一个不存在的文件时,错误如下: 在读取文件里面写入console.log(err),在控制台中可以看到我的错误代码类型:文件不存在的错误代码 ENOENT。见更多错误代码---打开node.js官方API文档Error 错误 | N…...
shell的编写
文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码: 1.框架 我们知道shell是一直存在的,所以首先我们第一步就是要搭建一个框架,使其一直存在。 那么也很简单,一个while循环就可以完…...
css心跳动画
图标引入 <img class"icon" src"heart.svg" alt"" srcset""> CSS代码 <style>.icon {animation:bpm 1s linear,pulse 0.75s 1s linear infinite;}keyframes pulse {from,75%,to {transform: scale(1);}25% {transform:…...
在 Amazon Timestream 上通过时序数据机器学习进行预测分析
由于不断变化的需求和现代化基础设施的动态性质,为大型应用程序规划容量可能会非常困难。例如,传统的反应式方法依赖于某些 DevOps 指标(如 CPU 和内存)的静态阈值,而这些指标在这样的环境中并不足以解决问题。在这篇文…...
【智能排班系统】快速消费线程池
文章目录 线程池介绍线程池核心参数核心线程数(Core Pool Size)最大线程数(Maximum Pool Size)队列(Queue)线程空闲超时时间(KeepAliveTime)拒绝策略(RejectedExecutionH…...
C语言——内存函数
前言: C语言中除了字符串函数和字符函数外,还有一些函数可以直接对内存进行操作,这些函数被称为内存函数,这些函数与字符串函数都属于<string.h>这个头文件中。 一.memcpy()函数 memcpy是C语言中的…...
ideaSSM图书借阅管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目
一、源码特点 SSM 图书借阅管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码 和数据库,系统主…...
普联一面4.2面试记录
普联一面4.2面试记录 文章目录 普联一面4.2面试记录1.jdk和jre的区别2.java的容器有哪些3.list set map的区别4.get和post的区别5.哪个更安全6.java哪些集合类是线程安全的7.创建线程有哪几种方式8.线程的状态有哪几种9.线程的run和start的区别10.什么是java序列化11.redis的优…...
SQLite的架构(十一)
返回:SQLite—系列文章目录 上一篇:SQLite下一代查询规划器(十) 下一篇:SQLite—系列文章目录 介绍 本文档介绍SQLite库的架构。 这里的信息对那些想要了解或 修改SQLite的内部工作原理。 接口SQL 命令处理器虚拟机B-树…...
Vue2电商前台项目(一):项目前的初始化及搭建
一、项目初始化 创建项目:sudo vue create app 1.项目配置 (1)浏览器自动打开 在package.json文件中,serve后面加上 --open "scripts": {"serve": "vue-cli-service serve --open","buil…...
4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令
4.6 offset指令,jmp short指令,far,dword ptr各种跳转指令 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括的讲,转移指令就是可以控制CPU执行内存中某处代码的指令 1. 转移指令 1.1 8086CPU的转移行为有以…...
【WEEK5】 【DAY5】DML语言【中文版】
2024.3.29 Friday 目录 3.DML语言3.1.外键(了解)3.1.1.概念3.1.2.作用3.1.3.添加(书写)外键的几种方法3.1.3.1.创建表时直接在主动引用的表里写(被引用的表的被引用的部分)3.1.3.2.先创建表后修改表以添加…...
wordpress微擎/日照seo公司
在 ECMAScript 规范中,共定义了 7 种数据类型,分为 基本类型 和 引用类型 两大类,如下所示: 基本类型:String、Number、Boolean、Symbol、Undefined、Null 引用类型:Object 基本类型也称为简单类型&#x…...
郑州网站设计 郑州网站开发/建个网站费用多少
属于性价比比较高的扫地机器人了。① 外观方面:造型非常简洁,毕竟出自小米扫地机器人团队之手,设计理念都很符合小米,机身周围设计了很大一部分的碰撞缓冲器,对机身和更好的感应障碍物碰撞有很大作用,机身面…...
郑州市重点项目建设办公室网站/软文网站推广法
NBearLite是NBearV4的几个核心组件之一,也是目前NBearV3中ORM部分的查询语法的核心。NBearLite本身并不是一个完整的ORM解决方案,配合目前Teddy正常开发的NBearMapping组件使用(某个中间组件过渡),组成一套完整强大的O…...
男鞋 东莞网站建设/加盟培训机构
Python的PyQt框架的使用-常用控件篇一、前言二 、QLineEdit 文本框三 、QPushButton按钮控件四、QRadioButton 单选按钮一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Python的PyQt框架的常用控件。如果文章对你有帮助、欢迎…...
建一个b2c网站要多少钱/百度怎么推广自己的店铺
环境 ubuntu16.04 Opencv3.4.5 Qt5.7.1 简述 在 ubuntu 中 做有关 opencv 的项目时,害怕搭建环境,因为搭建环境会花去很多时间和精力,这里自己总结了一种可以省去一些配置环境的时间和精力。 前提是第一次将 opencv 编译好,以…...
怎么免费把自己在dreamweaver做的网站放到网上去/百度联系方式人工客服
2020年1月1日 今日小区的天空,还不错~...