Linux 的memblock 内存管理器

最近接触到了linux 在启动阶段的内存管理器memblock, 它是bootmem 的后续者。 本来想自己写一篇关于memblock的文章的, 但看到了这篇文章, 就把它翻译过来了:https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-1.html# 。

简介

内存管理是操作系统最复杂的子系统之一(而我认为不需要加之一)。 在 kernel 入口前的最后准备 一节中, 我们在start_kernel 之前停了下来。 你可能还记得我们在启动阶段创建早期的page tables,identity page tables 和 fixmap page tables。复杂的内存管理还没有工作。 当start_kernel 开始运行时, 我们将看到向更复杂的数据结构和技术的转变。为了更好地了解内核的初始化过程, 我们需要对这些技术有一个清晰的理解。 本章首先从memblock开始, 详细介绍Linux 内存管理的框架及其API。

Memblcok

在自举阶段, 通用的内存管理器还没有建立起来的时候, memblock 是管理内存区域的方法之一。 原先它叫做 Logical Memory Block, 经过了Yinghai Lu 的补丁之后, 它被命名为memblock。 由于linux x86_64 内核使用该技术, 我们已经在 kernel 入口前的最后准备 中遇到过它了。 现在我们更仔细地考察它是如何实现的。

我们先从memblock 相关的数据结构开始 。 它们定义在头文件 include/linux/memblock.h 里:

第一个结构是 memblock:

struct memblock {bool bottom_up;phys_addr_t current_limit;struct memblock_type memory;   --> array of memblock_regionstruct memblock_type reserved; --> array of memblock_region
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAPstruct memblock_type physmem;
#endif
};

该结构包含5个成员: bootom_up 为 true 的时候表明自底向上分配内存。 current_limit 是 memory block 的限制尺寸。 接下来的三个成员表示memory block的类型, 它们可以是: memory, reserved 和 physical memory(当CONFIG_HAVE_MEMBLOCK_PHYS_MAP 使能时)。 然后我们看另一个数据结构 - memblock_type:

struct memblock_type {unsigned long cnt;unsigned long max;phys_addr_t total_size;struct memblock_region *regions;
};

该结构提供关于内存类型的信息。 它包含成员描述memory region 在当前memory block里的个数和尺寸, 以及指向memblock_region 的指针。 而memblock_region 结构描述一块内存区域:

struct memblock_region {phys_addr_t base;phys_addr_t size;unsigned long flags;
#ifdef CONFIG_HAVE_MEMBLOCK_NODE_MAPint nid;
#endif
};

它提供了内存区域的基地址和大小, 还有一个标志域, 可能的值有:

enum {MEMBLOCK_NONE    = 0x0,    /* No special request */MEMBLOCK_HOTPLUG    = 0x1,    /* hotpluggable region */MEMBLOCK_MIRROR    = 0x2,    /* mirrored region */MEMBLOCK_NOMAP    = 0x4,    /* don't add to kernel direct mapping */
};

如果CONFIG_HAVE_MEMBLOCK_NODE_MAP定义了, 还有一个 numa 节点选择项 nid。

我们可以用下图表示以上三个数据结构的关系:

+---------------------------+   +---------------------------+
|         memblock          |   |                           |
|  _______________________  |   |                           |
| |        memory         | |   |       Array of the        |
| |      memblock_type    |-|-->|      memblock_region      |
| |_______________________| |   |                           |
|                           |   +---------------------------+
|  _______________________  |   +---------------------------+
| |       reserved        | |   |                           |
| |      memblock_type    |-|-->|       Array of the        |
| |_______________________| |   |      memblock_region      |
|                           |   |                           |
+---------------------------+   +---------------------------+

Memblock 的初始化

memblock 所有的API都定义在头文件 include/linux/memblock.h里, 而它们的实现都在文件 mm/memblock.c 里。 在该文件的开始处, 我们看到 memblock 结构的初始化:

struct memblock memblock __initdata_memblock = {.memory.regions        = memblock_memory_init_regions,.memory.cnt            = 1,.memory.max            = INIT_MEMBLOCK_REGIONS,.reserved.regions    = memblock_reserved_init_regions,.reserved.cnt        = 1,.reserved.max        = INIT_MEMBLOCK_REGIONS,#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP.physmem.regions    = memblock_physmem_init_regions,.physmem.cnt        = 1,.physmem.max        = INIT_PHYSMEM_REGIONS,
#endif.bottom_up            = false,.current_limit        = MEMBLOCK_ALLOC_ANYWHERE,
};

此处的变量 memblock 与数据结构同名。首先注意到 __initdata_memblock 的定义是:

#ifdef CONFIG_ARCH_DISCARD_MEMBLOCK#define __init_memblock __meminit#define __initdata_memblock __meminitdata
#else#define __init_memblock#define __initdata_memblock
#endif

它取决于 CONFIG_ARCH_DISCARD_MEMBLOCK 。 如果该设置使能了, 则memblock 的代码和数据会放到 .init section 里去,它们占用的内存在内核完成启动后被释放。 然后我们考察memblock 的成员 memblock_type memory, memblock_type reserved 和 memblock_type physmem 的初始化, 我们只对memblock_type.regions 的初始化过程感兴趣。 注意到每个 memblock_type.regions 被赋值为一个 memblock_regions 数组:

static struct memblock_region memblock_memory_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
static struct memblock_region memblock_reserved_init_regions[INIT_MEMBLOCK_REGIONS] __initdata_memblock;
#ifdef CONFIG_HAVE_MEMBLOCK_PHYS_MAP
static struct memblock_region memblock_physmem_init_regions[INIT_PHYSMEM_REGIONS] __initdata_memblock;
#endif

每个数组包含128个memory regions。 因为 INIT_MEMBLOCK_REGIONS 默认定义为 128:

#define INIT_MEMBLOCK_REGIONS   128

而且所有的数组也有 __initdata_memblock 宏,说明它们能在内核启动结束后被释放。

memblock 的最后两个成员 bottom_up 被设置为false, 而当前的memblock 的上限为:

#define MEMBLOCK_ALLOC_ANYWHERE (~(phys_addr_t)0)

即 0xffffffffffffffff 。

这样memblock的初始化就完成了,接下来我们看memblock API。

Memblock API

为了更好地理解 memblock 是怎样实现和工作的,我们先看一下它的使用。 在Linux 内核里有好些地方使用memblock。 比如, 以 arch/x86/kernel/e820.c 里的 memblock_x86_fill 为例, 该函数遍历e820提供的内存块,调用memblock_add 函数,把内核要保留的memory region 加到memblock里去。 该函数接收一个物理基地址和memory region 的大小作为参数, 它其实并不做什么, 仅调用

memblock_add_range(&memblock.memory, base, size, MAX_NUMNODES, 0);

我们传进 memblock type - memory, 物理基地址和尺寸, 和最大的node 数目: 如果 CONFIG_NODES_SHIFT 设置了, 则为1;如果了,则为 1 << CONFIG_NODES_SHIFT 。 memblock_add_range 函数把一个新的memory region 加到memory block里。 它先检查给定memory region 的大小,如果为0则返回。 然后它检查相应的memblock_type 里是否有memory region, 如果没有,我们就用给定的参数填充一个新的 memory_region 并返回(我们在 First touch of the linux kernel memory manager framework 里已经看到过). 如果 memblock_type 不为空, 我们开始往给定的memblock_type 里加一块memory region。 首先, 我们获取结束地址:

phys_addr_t end = base + memblock_cap_size(base, &size);

memblock_cap_size 调整 size 使得 base + size 不会溢出。 它的实现很简单:

static inline phys_addr_t memblock_cap_size(phys_addr_t base, phys_addr_t *size)
{return *size = min(*size, (phys_addr_t)ULLONG_MAX - base);
}

它返回 size 和 UULONG_MAX - base 两者中的最小值。

然后我们获得了新memory region 的结束地址。 memblock_add_range 检查与已经加进的memory region 的重叠和合并的条件。 插入新的memory region 包含两步:

  • 把不重叠部分作为单独的region加进去
  • 合并相邻的region

我们遍历所有已加进的 memory region 并检查与新来的region 的重叠情况:

    for (i = 0; i < type->cnt; i++) {struct memblock_region *rgn = &type->regions[i];phys_addr_t rbase = rgn->base;phys_addr_t rend = rbase + rgn->size;if (rbase >= end)break;if (rend <= base)continue;.........}

如果新的memory region 与现有的region 不重叠,则插入memblock, 这是第一步。 我们检查它能否合适memblock, 否则就调用 memblock_double_array:

while (type->cnt + nr_new > type->max)if (memblock_double_array(type, obase, size) < 0)return -ENOMEM;insert = true;goto repeat;

它把给定的region array 扩大一倍, 接着我们置 insert 为 true 并跳转到标号 repeat 。 第二步, 从repeat 处, 我们走相同的循环, 调用 memblock_insert_region 把region 插入到memory block里:

    if (base < end) {nr_new++;if (insert)memblock_insert_region(type, i, base, end - base,nid, flags);}

由于insert 已经置为true, memblock_insert_region 会被调用。 它的实现跟我们以前见过的插入空白的memblock_type几乎一样。 它先获取最后一个region:

struct memblock_region *rgn = &type->regions[idx];

并拷贝这些区域:

memmove(rgn + 1, rgn, (type->cnt - idx) * sizeof(*rgn));

然后填充memblock_region 的base, szie 等信息, 并增加memblock_type 的大小。 在结束运行前, memblock_add_range 调用 memblock_merge_regions 来合并相邻的可兼容的region。

在第二阶段, 新的region 可能与现有的region 重叠。 比如, 我们已经有了 region1:

0                    0x1000
+-----------------------+
|                       |
|                       |
|        region1        |
|                       |
|                       |
+-----------------------+

而我们想加入region2,它的base address 和size 是这样的:

0x100                 0x2000
+-----------------------+
|                       |
|                       |
|        region2        |
|                       |
|                       |
+-----------------------+

这样新 region 的基地址是:

base = min(rend, end);

在我们的例子里,就是0x1000。 然后就像以前做过的那样插入该 region :

if (base < end) {nr_new++;if (insert)memblock_insert_region(type, i, base, end - base, nid, flags);
}

此时我们仅插入重叠的部分(我们只插入高端部分, 因为低端部分已经在重叠的memory region 里了), 然后用memblock_merge_regions 把相邻部分合并起来。 它遍历给定的memblock_type, 取两个相邻的region: type->regions[i] 和 type->regions[i+1], 检查它们是否有相同的标志、属于相同的node、而且第一个region 的结束地址不等于第二个的开始地址:

while (i < type->cnt - 1) {struct memblock_region *this = &type->regions[i];struct memblock_region *next = &type->regions[i + 1];if (this->base + this->size != next->base ||memblock_get_region_node(this) !=memblock_get_region_node(next) ||this->flags != next->flags) {BUG_ON(this->base + this->size > next->base);i++;continue;}

如果以上条件都满足, 我们用第二个region的尺寸来更新第一个region的尺寸:

this->size += next->size;

然后我们把第二个region 后面的区域都往前挪一位:

memmove(next, next + 1, (type->cnt - (i + 2)) * sizeof(*next));

memmove 函数把next 后面的所有region 移到next 原来所占的位置。 最后我们减小memblock_type 的region 数量:

type->cnt--;

最后,我们得到合并成一块的memory region:

0                                             0x2000
+------------------------------------------------+
|                                                |
|                                                |
|                   region1                      |
|                                                |
|                                                |
+------------------------------------------------+

总结一下, 我们减小了memblock的region 的数量, 增加了第一块region的尺寸, 并移动第二块之后的所有region到第二块的位置, 这就是 memblock_add_range 的主要工作。

memblock_reserve 函数做跟 memblock_add 相同的工作,不过它操作的是 memblock 的 memblock_type.reserved 成员。 当然这不是全部的API。 Memblock 还提供:

  • memblock_remove - 从 memblock 中删除 memory region
  • memblock_find_in_range - 在给定范围内寻找空闲区域
  • memblock_free - 释放memblock中的memory region
  • for_each_mem_range - 遍历memblock的所有区域

获取memory region 的信息

Memblock 还提供API获取memory region 的信息, 它分为两部分:

  • get_allocated_memblock_memory_regions_info - 获取memory region 的信息
  • get_allocated_memblock_reserved_regions_info - 获取 reserved region 的信息

这些函数的实现很简单。 以get_allocated_memblock_reserved_regions_info 为例:

phys_addr_t __init_memblock get_allocated_memblock_reserved_regions_info(phys_addr_t *addr)
{if (memblock.reserved.regions == memblock_reserved_init_regions)return 0;*addr = __pa(memblock.reserved.regions);return PAGE_ALIGN(sizeof(struct memblock_region) *memblock.reserved.max);
}

首先该函数检查 memblock 是否含有 reserved memory region,如果没有,它返回0。 否则我们把reserved memory region 的物理地址写到 addr 里, 返回分配的数组的大小并且以PAGE对齐。 注意宏PAGE_ALIGN 用来对齐,它跟PAGE SIZE 相关:

#define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE)

get_allocated_memblock_memory_regions_info 的实现是一样的,只不过它使用memblock_type.memory 而不是memblock_type.reserved 。

Memblock debugging

Memblock 中有许多对 memblock_dbg 的调用。 如果你传送内核参数 memblock=debug,该函数就会被调用。 其实memblock_dbg 是扩展为printk 的宏:

#define memblock_dbg(fmt, ...) \if (memblock_debug) printk(KERN_INFO pr_fmt(fmt), ##__VA_ARGS__)

例如你在memblock_reserve 函数里看到了如下调用:

memblock_dbg("memblock_reserve: [%#016llx-%#016llx] flags %#02lx %pF\n",(unsigned long long)base,(unsigned long long)base + size - 1,flags, (void *)_RET_IP_);

你会看到这样的输出:

memblock debug

Memblock 还支持 debugfs。 如果内核运行在非 x86 的架构上, 你可以存取

  • /sys/kernel/debug/memblock/memory
  • /sys/kernel/debug/memblock/reserved
  • /sys/kernel/debug/memblock/physmem

来获取 memblock 的内容。

小结

这是Linux 内核内存管理的第一部分。 如果你有任何问题或建议,请用以下方法联系我:

  • twitter 0xAX
  • email
  • 创建一个 issue

链接

  • e820
  • numa
  • debugfs
  • First touch of the linux kernel memory manager framework
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 在OpenGL环境下, 运用Sutherland_Hodheman算法实现多边形裁剪

    #在OpenGL环境下, 运用Sutherland_Hodheman算法实现多边形裁剪 Sutherland_Hodheman算法基本思想是:简单得通过单一边或面的剪裁实现对多边形的裁剪;原多边形和每次裁剪所生成的多边形将逐次对裁剪窗口的每一条边进行裁剪。 #include<GL/glut.h> #include<iostream…...

    2024/4/16 18:07:52
  2. MySQL中外连接和内连接的区别(实战案例)

    转自:https://www.cnblogs.com/bad-robot/p/9788959.html1、数据库1.1、作者表1.2、图书表1.3、出版社表2、left joinleft join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录。2.1、sql语句select * from app01_publisher left join app01_book on app01_publ…...

    2024/5/9 15:24:16
  3. VS2005 调试器 dll msdbg2.dll 未正确安装

    关闭vs2005 最好电脑先重启一下https://download.csdn.net/download/sevensdm/8966477 下载 msdbg2.dll注意dll文件版本 右键属性-详细信息 文件版本应该是9.0.... 产品名称vs2008(不知道为啥)打开路径 C:\Program Files\Common Files\microsoft shared\VS7Debug应该有旧的…...

    2024/4/24 7:53:39
  4. c++ 使用opencv打开视频文件失败

    c++ 配置 opencv 后仍然无法打开视频文件 问题: 视频采用 opencv VideoCapture()进行加载,配置opencv 后无法打开视频文件 解决方法: 将对于版本的 ffmpeg文件存放至和 生成的.exe文件同一目录下,opencv_ffmpeg347_64.dll...

    2024/4/24 7:53:41
  5. mysql在表的某一位置增加一列的命令

    mysql在表的某一位置增加一列的命令 如果想在一个已经建好的表中添加一列,可以用诸如: alter table t1 add column addr varchar(20) not null; 这条语句会向已有的表t1中加入一列addr,这一列在表的最后一列位置。 如果我们希望添加在指定的一列,可以用: alter table t1 a…...

    2024/4/24 7:53:37
  6. Android源码编译报错:XXX already defined by YYYY

    错误提示 build/core/base_rules.mk:XXX: *** Y/Z/A: MODULE.B already defined by C/D. stop报错原因 上面这种提示的意思是说在某个变量或者模块MODULE.B已经在目录中C/D定义了,而在目录Y/Z/A中要再次被定义所以会提示错误。 总结一下,就是在上面两个目录中做了同样的事情所…...

    2024/4/24 7:53:37
  7. Unity引擎调用Win Message弹框

    Unity引擎调用Win MessageBox 第一步,下载库并复制到项目Plugins目录下 库文件:System.Windows.Forms.dll第二步脚本调用 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; // 调用声明 using MsgBoxBase = System.Win…...

    2024/4/24 7:53:36
  8. 欧拉定理的性质(线性筛)

    欧拉定理是用来阐述素数模下,指数同余的性质。欧拉定理:对于正整数N,代表小于等于N的与N互质的数的个数,记作φ(N)例φ(9)=7,因为与9互质且小于等于9的正整数有7个(1,2,4,5,6,7,8)欧拉定理还有几个引理:1.如果n为某一个素数p,则φ(p)=p-1;2.如果n为某一个素数p的幂次,…...

    2024/4/24 7:53:37
  9. 【TouchDesigner】网络通讯

    文章目录网络通讯(1)网络通讯(2) 网络通讯(1) 介绍TouchDesigner的网络通讯,第一部分会着重介绍多个TouchDesigner程序间的通讯。Touch In TOP和Touch Out TOP之间的通讯 Touch In CHOP和Touch Out CHOP之间的通讯 Touch In DAT和Touch Out DAT之间的通讯 流程创建send与…...

    2024/5/2 20:41:06
  10. wsl安装docker(废弃)

    --------------------2020/05/26更新-------------------------------没事折腾可以,不过如果需要生产实践,还是老老实实,用虚拟机模拟生产的linux环境,wsl始终是不够的。--------------------原文------------------参考:https://www.cnblogs.com/sweetsunnyflower/p/1054…...

    2024/4/24 7:53:32
  11. 从入土到入门学习超参数的调整

    最近在做第十五届全国大学生智能汽车竞赛线上选拔赛,人流密度检测这块的效果一直不好,error_rate越整越大,交流群里的大佬也看不下去了:确实,要是调整调整超参数,也不会是现在这样的成绩(流下了没技术的眼泪…) 于是,我下定决心,好好地啃啃这块硬骨头!(先把自己从土里拉出来…)…...

    2024/4/24 7:53:31
  12. 【QT】文件拖拽至窗体并打开文件

    一、逻辑思路 1、创建widget工程、添加新文件-class类,对类进行写入拖拽事件操作 2、类中dragEnterEvent函数为拖拽至窗体,此时鼠标不松开,但需要启用继续接收事件的标志,否则不能接收dropEvent事件 3、类中dropEvent函数为释放文件,此时鼠标松开 4、拖拽后展示的图片如下…...

    2024/4/24 7:53:30
  13. php读取xlsx文件(PhpSpreadsheet如何读取excel文件)

    php读取xlsx文件 安装composer require phpoffice/phpspreadsheet代码 <?phprequire ./vendor/autoload.php;$filename = aa.xlsx;# 根据文件名自动创建 适用于不知道文件后缀时xls还是xlsx的情况$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filename);# 或…...

    2024/4/16 18:08:28
  14. 注解实现CRUD

    CRUD 我们可以在工具类创建的时候实现自动提交事务!这个是在MybatisUtils工具类里面的弄的public static SqlSession getSqlSession(){return sqlSessionFactory.openSession(true);}编写接口,增加注解,之后一定要将接口配置在Mybatis-config.xml文件之中,不是将Mapper.xml…...

    2024/4/16 18:08:35
  15. Gentelella bootstrap管理模板

    bootstrap3-gentelella管理模板Gentelella 是一个可免费使用的 Bootstrap 管理界面模版,目前在 GitHub 上面有 1w+ star 和 4k+ fork,使用群体比较广泛。这个模版使用默认的 Bootstrap 3 的样式,还有一系列功能强大的 jQuery 插件和工具,用来帮助你创建管理界面模版或者后台…...

    2024/4/16 18:08:22
  16. 首席新媒体运营商学院黎想:裂变活动要避免40个坑!

    社群经济的到来,让知识付费和社群电商开始成了风潮。下面是运营深度精选做完50个社群裂变项目后。作为新媒体运营人,首席新媒体商学院创始人,资深新媒体运营人,《新媒体推广运营实战大全》 作者、知名品牌营销顾问黎想就总结的40个小经验,每条经验都是实战出来后得到的教训…...

    2024/4/15 7:02:22
  17. 初等数学题解:求平方根

    ===》点我返回目录《===数学里面有很多操作是互逆的,正向操作简单,但是逆向操作很复杂。平方的逆操作是开平方根,这个开方操作计算起来并不容易。费了我们先人很多功夫。在中学的课本中,会讲到竖式计算法。它的基本思路是这样的:比如1156是四位数,不难看出它的平方根是个…...

    2024/4/16 18:08:29
  18. ESP32引脚参考

    原文链接:ESP32引脚参考:您应该使用哪个GPIO引脚? _360doc个人图书馆总结的相当全面,ESP32简单易懂的GPIO使用注意事项。首先上图GPIO建议列表: 特别的在硬件上要注意使用外接模块时不能将GPIO12拉高,否则将导致ESP32启动异常。还有一些GPIO在启动或重置时 其状…...

    2024/4/20 8:04:17
  19. 未经授权,直接划扣资金!这些支付机构的用户要小心

    来源 | 瞭望消金(lwxj001) 作者 | 咖喱 “未经用户授权,就直接从账户划扣资金,银行都不敢这么干,这和抢劫有何区别?”瞭望消金发现,近年来,第三方支付机构常与乱扣费、强制扣费、恶意扣费等字眼捆绑在一起。 多位用户投诉,在下载贷款APP后,还未申请贷款,注册绑定的银…...

    2024/4/16 18:08:52
  20. 程序员小灰的漫画算法和知识总结,高品质强推!!!

    转载自微信号程序员小灰,不定期更新,漫画讲解好评,特来转载。漫画知识汇总 漫画:深度优先遍历 和 广度优先遍历 漫画:什么是 “图”?(修订版) 漫画:图的 “最短路径” 问题 漫画:Dijkstra 算法的优化 漫画:图的 “多源” 最短路径 漫画:有趣的 “切蛋糕“ 问题 漫画…...

    2024/4/16 18:08:16

最新文章

  1. json返回工具类|世界协调时间(UTC)

    一、问题 世界协调时间&#xff08;UTC&#xff09;是一个标准的时间参考&#xff0c;通常被用于跨越不同时区的时间标准。要将 UTC 时间转换为中国时间&#xff08;中国标准时间&#xff09;&#xff0c;你需要将时间加上8个小时&#xff0c;因为中国位于 UTC8 时区。 初中知…...

    2024/5/9 18:23:13
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 如何转行成为产品经理?

    转行NPDP也是很合适的一条发展路径&#xff0c;之后从事新产品开发相关工作~ 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理协会&#xff08;PDMA&#xff09;发起的&#xff0c;是目前国际公认的唯一的新产品开发专业认证&#xff…...

    2024/5/9 17:09:28
  4. 北航2023年考研机试题

    【问题描述】一共6个手机基站&#xff0c;具有记录手机连接基站的能力&#xff0c;6个手机基站分别为ABCDEF&#xff0c;他们具有自己的覆盖范围且任何两个基站的覆盖范围不想交&#xff0c;基站保存的手机登陆日志包括手机号&#xff08;11位&#xff0c;用字符串保存&#xf…...

    2024/5/5 8:38:20
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/9 15:10:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/9 4:20:59
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/9 7:32:17
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/9 17:11:10
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57