linux 性能优化-内存优化

CPU 管理一样,内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应 用程序的指令、数据、缓存等。

1.内存原理

1.1.内存映射

1.1.1.日常生活常说的内存是什么?

  • 我的笔记本电脑内存就是 8GB 的
  • 这个内存其实是物理内存
  • 物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)

1.1.2.虚拟地址空间

Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。 这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。

虚拟地址空间内部

  • 虚拟地址空间的内部又被分为内核空间和用户空间两部分
  • 不同字长(单个 CPU 指令可以处理数据的最大长度)的处理器,地址空间的范围也不同

比如最常见的 32 位和 64 位,如下所示:

  • 32 位系统的内核空间占用 1G,位于最高处,剩下的 3G 是用户空间
  • 而 64 位系统的内核空间和用户空间都是 128T,分别占据整个内存空间的最高和最低处,剩下的中间部分是未定义的

1.1.3.进程的用户态和内核态

进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程地址空间都包含了内核空间,但这些内核空间,其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存

1.1.4.内存映射

既然每个进程都有一个这么大的地址空间,那么所有进程的虚拟内存加起来,自然要比实际的物理内存大得多。

所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。

内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张页

表,记录虚拟地址物理地址的映射关系,如下图所示:

  • 页表实际上存储在 CPU 的内存管理单元 MMU 中
  • 正常情况下,处理器就可以直接通过硬件,找出要访问的内存
  • 在页表的映射下,进程就可以通过虚拟地址来访问物理内存

1.2.虚拟内存空间分布

以 32 位系统为例,如下图所示:

通过这张图你可以看到,用户空间内存,从低到高分别是五种不同的内存段。

  • 只读段,包括代码和常量等;
  • 数据段,包括全局变量等;
  • 堆,包括动态分配的内存,从低地址开始向上增长;
  • 文件映射段,包括动态库、共享内存等,从高地址开始向下增长;
  • 栈,包括局部变量和函数调用的上下文等。栈的大小是固定的,一般是 8MB

在这五个内存段中,堆和文件映射段的内存是动态分配的。

1.3 SWAP运行原理

Swap 是把一块磁盘空间或者一个本地文件,当成内存来使用。它包括换出换入两个过程。

  • 换出,就是把进程暂时不用的内存数据存储到磁盘中,并释放这些数据占用的内存。
  • 换入,则是在进程再次访问这些内存的时候,把它们从磁盘读到内存中来。

一个很典型的场景就是,即使内存不足时,有些应用程序也并不想被 OOM 杀死,而是希望能缓一段时间,等待人工介入,或者等系统自动释放其他进程的内存,再分配给它。除此之外,我们常见的笔记本电脑的休眠和快速开机的功能,也基于 Swap 。休眠时,把系统的内存存入磁盘,这样等到再次开机时,只要从磁盘中加载内存就可以这样就省去了很多应用程序的初始化过程,加快了开机速度。话说回来,既然 Swap 是为了回收内存,那么** Linux**到底在什么时候需要回收内存呢?前面一直在说内存资源紧张,又该怎么来衡量内存是不是紧张呢?

一个最容易想到的场景就是,有新的大块内存分配请求,但是剩余内存不足。这个时候系统就需要回收一部分内

存,进而尽可能地满足新内存请求。这个过程通常被称为 直接内存回收 。

除了直接内存回收,还有一个专门的内核线程用来 定期回收内存 ,也就是 kswapd0。为了衡量内存的使用情况,

kswapd0 定义了三个内存阈值(watermark,也称为水位),分别是页最小阈值(pages_min)、页低阈值

(pages_low)和页高阈值(pages_high)。剩余内存,则使用 pages_free 表示

kswapd0 定期扫描内存的使用情况,并根据剩余内存落在这三个阈值的空间位置,进行内存的回收操作。

  • 剩余内存小于页最小阈值,说明进程可用内存都耗尽了,只有内核才可以分配内存
  • 剩余内存落在页最小阈值页低阈值中间,说明内存压力比较大,剩余内存不多了。这时 kswapd0 会执行内

存回收,直到剩余内存大于高阈值为止

  • 剩余内存落在页低阈值和页高阈值中间,说明内存有一定压力,但还可以满足新内存请求。
  • 剩余内存大于页高阈值,说明剩余内存比较多,没有内存压力。

/proc/sys/vm/min_free_kbytes 来间接设置。min_free_kbytes 设置了页最小阈值,而其他两个阈值,都是根据页最

小阈值计算生成的,计算方法如下 :

pages_low = pages_min*5/4
pages_high = pages_min*3/2

2.内存性能统计信息

2.1.系统内存使用量

2.2.1内存的使用情况

显示系统内存情况

[root@centos7-2 ~]# free
total used free shared buff/cache available
Mem: 999720 550508 283544 6844 165668 279124
Swap: 2097148 0 2097148

所有数值默认都是以字节(kb)为单位

  • 第一行 Mem:物理内存
  • 第二行 Swap:交换分区

你可以看到,free 输出的是一个表格,其中的数值都默认以字节为单位。表格总共有两行 六列,这两行分别是物理

内存 Mem 和交换分区 Swap 的使用情况,而六列中,每列数据 的含义分别为:

  • 第一列,total 是总内存大小;
  • 第二列,used 是已使用内存的大小,包含了共享内存;
  • 第三列,free 是未使用内存的大小;
  • 第四列,shared 是共享内存的大小;
  • 第五列,buw /cache 是缓存和缓冲区的大小;
  • 最后一列,available 是新进程可用内存的大小。

2.2.free命令参数

简写完成写法作用
-b–bytes所有数值单位是bytes
-k–kibi所有数值单位是kb
-m–mebi所有数值单位是mb
-g–gibi所有数值单位是gb
-h–human人性化输出
-W–wide将buff和cache拆分为单独的两个列显示
-C–count统计次数,默认是1次
-l–lohi显示详细的低内存和高内存统计信息
-S–seconds每次统计数据间隔时间
-t–total添加一行显示数据总和
–help
帮助文档
-V–version版本号

举例:

每隔 2s 输出一次统计信息,总共输出 2 次,并且人性化输出所有数值

[root@centos7-2 ~]# free -h -c 2 -s 2
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
total used free shared buff/cache available
Mem: 976M 537M 276M 6.7M 161M 272M
Swap: 2.0G 0B 2.0G
[root@centos7-2 ~]#

2.3.top指令

[root@centos7-2 ~]# top
top - 11:49:39 up 50 min, 1 user, load average: 0.12, 0.08, 0.06
Tasks: 104 total, 2 running, 102 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.2 us, 0.2 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 999720 total, 283960 free, 549672 used, 166088 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 279848 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1554 root 20 0 157836 2180 1540 R 0.3 0.2 0:00.05 top
1 root 20 0 125248 3716 2508 S 0.0 0.4 0:02.84 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.02 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
6 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/u256:0
7 root rt 0 0 0 0 S 0.0 0.0 0:00.03 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 R 0.0 0.0 0:00.97 rcu_sched
10 root rt 0 0 0 0 S 0.0 0.0 0:00.07 watchdog/0
11 root rt 0 0 0 0 S 0.0 0.0 0:00.02 watchdog/1
12 root rt 0 0 0 0 S 0.0 0.0 0:00.01 migration/1
13 root 20 0 0 0 0 S 0.0 0.0 0:00.04 ksoftirqd/1
15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0H
17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md

image.png
第一行:输出系统任务队列信息
image.png

  • 11:49:39:系统当前时间
  • up 50 min:系统开机后到现在的总运行时间
  • 1 user:当前登录用户数
  • load average: 0.12, 0.08, 0.06:系统负载,系统运行队列的平均利用率,可认为是可运行进程的平均数;三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值

第二行:任务进程信息
image.png

  • total:系统全部进程的数量
  • running:运行状态的进程数量
  • sleeping:睡眠状态的进程数量
  • stoped:停止状态的进程数量
  • zombie:僵尸进程数量

第三行:CPU信息
image.png

  • us:用户空间占用CPU百分比
  • sy:内核空间占用CPU百分比
  • ni:已调整优先级的用户进程的CPU百分比
  • id:空闲CPU百分比,越低说明CPU使用率越高
  • wa:等待IO完成的CPU百分比
  • hi:处理硬件中断的占用CPU百分比
  • si:处理软中断占用CPU百分比
  • st:虚拟机占用CPU百分比

第四行:物理内存信息
image.png
以下内存单位均为**MB **

  • total:物理内存总量
  • free:空闲内存总量
  • used:使用中内存总量
  • buw /cache:用于内核缓存的内存量

第五行:交换区内存信息
image.png

  • total:交换区总量
  • free:空闲交换区总量
  • used:使用的交换区总量
  • avail Mem:可用交换区总量

**注:**如果used不断在变化, 说明内核在不断进行内存和swap的数据交换,说明内存真的不够用了

进行信息区
image.png

  • PID:进程号
  • USER:运行进程的用户
  • PR:优先级
  • NI:nice值。负值表示高优先级,正值表示低优先级
  • **VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。 **
  • **RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享 内存。 **
  • **SHR 是共享内存的大小,比如与其他进程共同使用的共享内存、加载的动态链接库以及 程序的代码段等。 **
  • S:进程状态 (R运行状态 S睡眠状态 D不可中断状态 T跟踪/停止 Z僵尸进程)
  • %CPU:CPU 使用率
  • **%MEM:进程使用武力内存占系统总内存的百分比 **
  • TIME+:上次启动后至今的总运行时间
  • COMMAND:命令名or命令行

在查看 top 输出时,你还要注意两点。
第一,虚拟内存通常并不会全部分配物理内存。从上面的输出,你可以发现每个进程的虚 拟内存都比常驻内存大得多

第二,共享内存SHR并不一定是共享的,比方说,程序的代码段、非共享的动态链接库,也都算在 SHR里。当然SHR也包括了进程间真正共享的内存。所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果。

2.4.缓存与缓冲区命中率

缓存是BufferCache两部分的总和BufferCache 的设计目的,是为了提升系统的 I/O 性能。它们利用内存充当起慢速磁盘与快速 CPU 之间的桥梁,可以加速 I/O 的访问速度。BufferCache 分别缓存的是对磁盘和文件系统的读写数据。

[root@centos7-2 ~]# free
			total used 	free 	 shared buff/cache available
Mem: 999720 542500 291348  6876  165872      290028
Swap: 2097148 0    2097148

字面意思,Buffer是缓存区,Cache 是缓存,两者都是数据在内存中的临时存储

2.4.1.Buffer 和 Cache 的区别

Buffer:内核缓冲区用到的内存,对应的是 /proc/meminfo 中的Buffer值;
Cache: 内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 **Cached **与 Slab之和;
Buffer

  • 对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右)
  • 内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等

Cached

  • 从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据
  • 下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

2.4.2.proc 文件系统

  • /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc中查询内核的运行状态和配置选项,查询进程的运行状态、统计数据等,也可以通过/proc来修改内核的配置
  • proc 文件系统同时也是很多性能工具的最终数据来源

2.4.3.缓冲命中率

缓存命中率,是指直接通过缓存获取数据的请求次数,占所有数据请求次数的百分比。

命中率越高,表示使用缓存带来的收益越高,应用程序的性能也就越好。

下面是查看系统缓存命中情况的工具:

  • cachestat 提供了整个操作系统缓存的读写命中情况。
  • cachetop 提供了每个进程的缓存命中情况。
$ cachestat 1 3
TOTAL MISSES HITS DIRTIES BUFFERS_MB CACHED_MB
	2 		0 		2 		1 			17 					279
	2 		0 		2 		1 			17 					279
	2 		0 		2 		1 			17 					279
  • TOTAL:表示总的 I/O 次数;
  • MISSES:表示缓存未命中的次数;
  • HITS:表示缓存命中的次数;
  • DIRTIES:表示新增到缓存中的脏页数;
  • BUFFERS_MB:表示 Buffers 的大小,以 MB 为单位;
  • CACHED_MB:表示 Cache 的大小,以 MB 为单位。
$ cachetop
11:58:50 Buffers MB: 258 / Cached MB: 347 / Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
13029 root python 1 0 0 100.0% 0.0%

它的输出跟 top 类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。具体到每一个指标,这里的 HITSMISSESDIRTIES ,跟 cachestat 里的含义一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。

3.性能分析

首先,你最容易想到的是 系统内存使用情况 ,比如已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量等。

  • 已用内存和剩余内存很容易理解,就是已经使用和还未使用的内存;
  • 共享内存是通过tmpfs(内存的文件系统 )实现的所以它的大小也就是 tmpfs 使用的内存大小。tmpfs 其实也是一种特殊的缓存;
  • 可用内存是新进程可以使用的最大内存,它包括剩余内存和可回收缓存;
  • 缓存包括两部分,一部分是磁盘读取文件的页缓存,用来缓存从磁盘读取的数据,可以加快以后再次访问的速度。另一部分,则是 Slab 分配器中的可回收内存;
  • 缓冲区是对原始磁盘块的临时存储,用来缓存将要写入磁盘的数据。这样内核就可以把分散的写集中起来,统一优化磁盘写入。

第二类很容易想到的,应该是 进程内存使用情况,比如进程的虚拟内存、常驻内存、共享内存以及Swap 内存等。

  • 虚拟内存,包括了进程代码段、数据段、共享内存、已经申请的堆内存和已经换出的内存等。这里要注意,已经申请的内存,即使还没有分配物理内存,也算作虚拟内存;
  • 常驻内存是进程实际使用的物理内存,不过,它不包括 Swap 和共享内存;
  • 共享内存,既包括与其他进程共同使用的真实的共享内存,还包括了加载的动态链接库以及程序的代码段等;
  • Swap 内存,是指通过 Swap 换出到磁盘的内存。

第三类 缺页异常 ,系统调用内存分配请求后,并不会立刻为其分配物理内存,而是在请求首次访问时,通过缺页异常来分配。缺页异常又分为下面两种场景。

  • 可以直接从物理内存中分配时,被称为次缺页异常。
  • 需要磁盘I/O介入(比如 Swap)时,被称为主缺页异常。

第四类重要指标就是** Swap的使用情况** ,比如 Swap 的已用空间、剩余空间、换入速度和换出速度等。

  • 已用空间和剩余空间很好理解,就是字面上的意思,已经使用和没有使用的内存空间。
  • 换入和换出速度,则表示每秒钟换入和换出内存的大小。

4.调优工具

4.1.根据内存指标

在这里插入图片描述

4.2.性能工具

在这里插入图片描述

5.内存调优策略

常见的优化思路有这么几种。

  1. 最好禁止 Swap。如果必须开启 Swap,降低 swappiness 的值,减少内存回收时 Swap 的使用倾向。
  2. 减少内存的动态分配。比如可以使用内存池、**大页(HugePage)**等。
  3. 尽量使用缓存和缓冲区来访问数据。比如可以使用堆栈明确声明内存空间,来存储需要缓存的数据;或者用Redis 这类的外部缓存组件,优化数据的访问。
  4. 使用 cgroups 等方式限制进程的内存使用情况。这样可以确保系统内存不会被异常进程耗尽。
  5. 通过 /proc/pid/oom_adj ,调整核心应用的 oom_score。这样,可以保证即使内存紧张,核心应用也不会被 OOM杀死。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/261552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【分享】Word技巧之锁定部分区域

在编辑Word文档过程中,如果部分内容已经确定好,但又担心不小心做了改动,我们可以将这部分内容锁定起来,使之无法编辑更改,不清楚的小伙伴一起来看看如何设置吧。 首先,打开Word文档后,用鼠标选…

Opencv 入门三(视频滑动条窗口)

视频滑动条窗口源码如下&#xff1a; #include "opencv2\highgui\highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <fstream> using namespace std; int g_slider_position 0; // 滑动条的位置 …

Vue3-24-组件-异步组件的介绍

什么是异步组件 个人理解 &#xff1a;异步组件 就是在用到这个组件的时候再进行加载&#xff0c;而不是 一上来就全部加载完成。即用即取的一个思想。异步组件中使用到的方法 &#xff1a; defineAsyncComponent () 方法 &#xff1a; 返回一个Promise 对象; 我们在开发过程中…

Java 线程管理中的锁

Monitor 概念 Java 对象头 Mark Word: Monitor (锁) Monitor 被翻译为监视器或管程 每个 Java 对象都可以关联一个 Monitor 对象&#xff0c;如果使用 synchronized 给对象上锁&#xff08;重量级&#xff09;之后&#xff0c;该对象头的Mark Word 中就被设置指向 Monitor 对…

uniapp整合echarts(目前性能最优、渲染最快方案)

本文echarts示例如上图,可扫码体验渲染速度及loading效果,下文附带本小程序uniapp相关代码 实现代码 <template><view class="source

python flask+vue实现前后端图片上传

python flaskvue实现前后端图片上传 vue代码如下&#xff1a; <template><div><input type"file" change"handleFileChange"/><button click"uploadFile">上传</button><br><img :src"imageUrl&…

深度相机—TOF、RGB双目、结构光原理及优势对比

烟台致瑞图像视觉技术2021-03-18 15:14 目前的深度相机根据其工作原理可以分为三种&#xff1a;TOF、RGB双目、结构光。 一、TOF TOF是Time of flight的简写&#xff0c;直译为飞行时间的意思。所谓飞行时间法3D成像&#xff0c;是通过给目标连续发送光脉冲&#xff0c;然后…

sourcetree 无效的源路径 细节提示:系统找不到指定的文件

工具–>选项–>git 直接下拉到底 点击红框&#xff0c;重新下载一个内嵌git就可以了 我感觉是因为改变了原有git安装路径的问题

2023 英特尔On技术创新大会直播 |探索视觉AI的无限可能

2023 英特尔On技术创新大会直播 | 探索视觉AI的无限可能 前言一未来的 AI&#xff1a;释放视觉 AI 真正潜力二AI技术突破、视觉Al挑战及前沿研究创新三全尺度视觉学习全尺度视觉学习示例1.GridConv 实现三维人体姿态估计更高准确率2.KW 预训练及迁移模型性能3.无数据增强稠密对…

大数据时代,如何基于机密虚拟化技术构建数据安全的“基石”

云布道师 2023 年 10 月 31 日-11 月 2 日&#xff0c;2023 云栖大会在中国杭州云栖小镇举行&#xff0c;阿里云弹性计算产品专家唐湘华、阿里云高级安全专家刘煜堃、蚂蚁集团高级技术专家肖俊贤三位嘉宾在【云服务器 & 计算服务】专场中共同带来题为《大数据时代&#xf…

使用MybatisPlus置空某些指定字段

当前的MybatisPlus默认会对空实体内的字段不置空&#xff0c;所以才引出了此种方法&#xff0c;很方便简单&#xff1a; 使用 Wrappers.lambdaUpdate方法就可以解决&#xff0c;方法的源码如下&#xff1a;条件为entity内的值&#xff0c;使用lambdaUpdate去set空的值 举个例子…

ETLCloud与简道云结合,实现企业信息同步

ETLCloud介绍 ETLCloud是一个集离线数据集成ETL、ELT、CDC实时数据集成、编排调度、数据服务API为一体的数据集成平台(DataOps)&#xff0c;一站式满足企业的各种最为复杂的数据集成场景。提供私有化部署能力和云原生架构&#xff0c;满足企业不同发展阶段的业务需求。 提供开放…

【蓝桥杯一对一保奖辅导】国奖学姐蓝桥杯经验分享

目录 写在前面有关报名费如何准备&#xff1f;看书 /练习 /分类 /总结比赛技巧与指导 写在前面 蓝桥杯对于计算机专业相关的同学来说是非常值得参加的。 蓝桥杯相对于ACM比赛而言获奖难度较小&#xff0c;只要掌握技巧&#xff0c;拿到 省一甚至国奖是比较容易的&#xff0c;但…

每日一题,二维平面

给你 二维 平面上两个 由直线构成且边与坐标轴平行/垂直 的矩形&#xff0c;请你计算并返回两个矩形覆盖的总面积。 每个矩形由其 左下 顶点和 右上 顶点坐标表示&#xff1a; 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。 第二个矩形由其左下顶点 (bx1, …

LVM系统逻辑卷

1.lvm的来源 我们在工作中经常遇到服务器存储数据的分区磁盘空间不够的情况&#xff0c;尤其是当我们的业务是视频的时候&#xff0c;大批量用户上传和下载视频&#xff0c;磁盘空间需要不停的调整。如果我们作为运维每天的工作就是加硬盘是不是有点扯&#xff0c;而且换硬盘的…

伦敦金交易内地与香港有何区别

伦敦金交易是国际银行间市场层面的现货黄黄金交易&#xff0c;亚洲市场的交易中心在中国香港&#xff0c;现在不管是香港本地还是内地的投资者&#xff0c;都可以在网上开户&#xff0c;通过香港的平台参与伦敦金交易&#xff0c;所得到的服务是同等的、公平的、与国际市场接轨…

【小黑嵌入式系统第十一课】μC/OS-III程序设计基础(一)——任务设计、任务管理(创建基本状态内部任务)、任务调度、系统函数

上一课&#xff1a; 【小黑嵌入式系统第十课】μC/OS-III概况——实时操作系统的特点、基本概念&#xff08;内核&任务&中断&#xff09;、与硬件的关系&实现 文章目录 一、任务设计1.1 任务概述1.2 任务的类型1.2.1 单次执行类任务&#xff08;运行至完成型&#…

Py之tensorflow-addons:tensorflow-addons的简介、安装、使用方法之详细攻略

Py之tensorflow-addons&#xff1a;tensorflow-addons的简介、安装、使用方法之详细攻略 目录 tensorflow-addons的简介 tensorflow-addons的安装 tensorflow-addons的使用方法 1、使用 TensorFlow Addons 中的功能&#xff1a; tensorflow-addons的简介 TensorFlow Addon…

Istio 社区周报(第一期):2023.12.11 - 12.17

欢迎来到 Istio 社区周报 Istio 社区朋友们&#xff0c;你们好&#xff01; 我很高兴呈现第一期 Istio 社区周报。作为 Istio 社区的一员&#xff0c;每周我将为您带来 Istio 的最新发展、有见地的社区讨论、专业提示和重要安全新闻内容。 祝你阅读愉快&#xff0c;并在下一期中…

【RK3288 Android6 T8, 突然无声音问题排查】

【RK3288 Android6 T8&#xff0c; 突然无声音问题排查】 问题背景: T8 android6 6.0.10在测试过程中突然出现弹窗音量进度条&#xff0c;然后小铃铛图标被禁用&#xff0c;意为静音&#xff0c;退出app后&#xff0c;打开设置的音量设置&#xff0c;发现notification的音量被…
最新文章