龙蜥白皮书精选:Ancert——硬件兼容性验证与守护
文/硬件兼容性 SIGAncert 是龙蜥操作系统硬件兼容性测试套件,致力于验证硬件设备集成商等厂商发布的整机服务器和各种板卡外设与龙蜥操作系统 不同版本之间的兼容性,推动社区发行版在各种硬件设备上的适配,围绕龙蜥操作系统建立完善的硬件生态。01 核心技术特点 目前,Ancert 支持服务器整机和 NIC、HBA、FC、GPU、NVMe 等多种外设,以及 DPU 与龙蜥操作系统的硬件兼容性测试。主要技术特点:跨平台,支持 x86,ARM,LoongArch 等不同架构。支持各种硬件设备的探测,识别,分类,展示。RPM 包形式发布,同时支持单机、多机测试环境。一款自动化测试框架,支持自动化,并发测试等。支持 Python,Shell 等语言编写的测试用例。02 硬件兼容性测试流程龙蜥社区硬件兼容性 SIG 构建了完整的硬件设备兼容性测试申请流程,包括:验证标准,申请流程,硬件测试,结果验证,列表发布等流程。社区用户,IHVs 或者硬件设备集成商等通过安装龙蜥 OS 硬件兼容性验证工具 Ancert,对相关硬件设备执行兼容性测试,并将测试结果提交到龙蜥社区硬件兼容性列表,测试结果经过龙蜥社区硬件兼容性 SIG 审核通过之后就可以发布到龙蜥社区硬件兼容性列表上。龙蜥 OS 用户可以通过龙蜥社区硬件兼容性列表查询相关硬件设备与龙蜥 OS 某个版本的兼容性。龙蜥社区硬件兼容性 SIG 会持续发布和更新硬件兼容性列表,持续推动龙蜥 OS 硬件生态建设。更多龙蜥白皮书精选内容:【1】面向 DPU 场景的软硬协同协议栈【2】敏捷开发场景下的调度器热升级 SDK【3】跨云-边-端的只读文件系统 EROFS【4】龙蜥全面支持 Intel 第四代可扩展处理器 SPR 平台【5】面向异构计算的加速器 SDK【6】基于 SM4 算法的文件加密(fscrypt)实践【7】CentOS 迁移场景的平滑迁移方案【8】利用 io_uring 提升数据库系统性能【9】开源 RISC-V 技术支持软硬件全栈平台相关链接:硬件兼容性 SIG 主页:https://openanolis.cn/sig/HCT龙蜥社区硬件兼容性列表:https://eco.openanolis.cn/#/compatibility/hardware更多龙蜥技术特性解析可移步《龙蜥特性百科》:https://anolis.gitee.io/anolis_features/2022 龙蜥社区全景白皮书(或公众号【OpenAnolis龙蜥】回复关键字“白皮书”获取)https://openanolis.cn/openanoliswhitepaper—— 完 ——加入龙蜥社群加入微信群:添加社区助理-龙蜥社区小龙(微信:openanolis_assis),备注【龙蜥】与你同在;加入钉钉群:扫描下方钉钉群二维码。关于龙蜥龙蜥社区是立足云计算打造面向国际的 Linux 服务器操作系统开源根社区及创新平台。龙蜥操作系统(Anolis OS)是龙蜥社区推出的 Linux 发行版,拥有三大核心能力:提效降本、更加稳定、更加安全。目前,Anolis OS 8.8 已发布,更多龙蜥自研特性,支持 X86_64 、RISC-V、Arm64、LoongArch 架构,完善适配 Intel、兆芯、鲲鹏、龙芯等芯片,并提供全栈国密支持。加入我们,一起打造面向云时代的操作系统!
一次把RMAN备份速度提高6倍的工作笔记
这是我给一个使用Oracle数据库的客户做一个RMAN备份优化的工作笔记。优化前后的对比如下表:对比项优化前优化后提高1.4T全量备份时间 131分钟27秒5分钟15秒提高5.99倍读nvme磁盘的速度672MB/s4607MB/s提高6.8倍iostate中磁盘利用率80%100%提高20%进行了一下3项变更: 将同步IO改成异步IO,大大提高IO性能;修改linux内核参数shmmax和shmall,将共享内存段从35个减少到3个,碎片大大减少;配置hugepage,Oracle的共享内存管理单位从4K增加到2M,性能大幅提高;将同步IO改成异步IO查询当前数据文件的I/O方式:SQL> SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I WHERE F.FILE#=I.FILE_NO AND FILETYPE_NAME='Data File';/test-nvme/oradata/orcl/system01.dbf ASYNC_OFF/test-nvme/oradata/orcl/sysaux01.dbf ASYNC_OFF/test-nvme/oradata/orcl/undotbs01.dbf ASYNC_OFF/test-nvme/oradata/orcl/users01.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc1.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc2.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc3.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc4.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc5.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc6.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc7.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc8.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc9.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc10.dbf ASYNC_OFF/test-nvme/oradata/orcl/cccc11.dbf ASYNC_OFF启动异步IO:SQL> alter system set filesystemio_options=setall scope=spfile;System altered.SQL> STARTUP FORCE;再次查询数据文件的I/O方式:SQL> SELECT NAME,ASYNCH_IO FROM V$DATAFILE F,V$IOSTAT_FILE I WHERE F.FILE#=I.FILE_NO AND FILETYPE_NAME='Data File';/test-nvme/oradata/orcl/system01.dbf ASYNC_ON/test-nvme/oradata/orcl/sysaux01.dbf ASYNC_ON/test-nvme/oradata/orcl/undotbs01.dbf ASYNC_ON/test-nvme/oradata/orcl/users01.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc1.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc2.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc3.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc4.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc5.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc6.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc7.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc8.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc9.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc10.dbf ASYNC_ON/test-nvme/oradata/orcl/cccc11.dbf ASYNC_ON15 rows selected.发现已经改成了异步I/O。检查HugePages内存目前内存里的Hugepage为零:# cat /proc/meminfo |grep -i HugePageAnonHugePages: 2156544 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB参考MOS的文档Doc ID 361468.1进行配置后,再次查询内存里的Hugepage如下:# cat /proc/meminfo |grep -i HugePageAnonHugePages: 0 kBHugePages_Total: 97284HugePages_Free: 97284HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kB修改linux内核参数shmmax和shmall修改之前共享内存[oracle@base-test-01 ~]$ ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x00000000 114458624 oracle 640 4096 0 0x00000000 114491393 oracle 640 4096 0 0x00000000 114524163 oracle 640 4096 0 0x00000000 1212420 root 644 80 2 0x00000000 1245189 root 644 16384 2 0x00000000 1277958 root 644 280 2 0x00000000 297435143 root 600 524288 2 dest 0x00000000 114556936 oracle 640 4096 0 0x00000000 114589705 oracle 640 4096 0 0x00000000 114622474 oracle 640 4096 0 0x00000000 114655243 oracle 640 4096 0 0x00000000 114688012 oracle 640 4096 0 0x00000000 114720781 oracle 640 4096 0 0x00000000 114753550 oracle 640 4096 0 0x00000000 114786319 oracle 640 4096 0 0x00000000 114819088 oracle 640 4096 0 0x00000000 114851857 oracle 640 4096 0 0x00000000 114884626 oracle 640 4096 0 0x00000000 114917395 oracle 640 4096 0 0x00000000 114950164 oracle 640 4096 0 0x00000000 114982933 oracle 640 4096 0 0x00000000 115015702 oracle 640 4096 0 0x00000000 115048471 oracle 640 4096 0 0x00000000 115081240 oracle 640 4096 0 0x00000000 115114009 oracle 640 4096 0 0x00000000 115146778 oracle 640 4096 0 0x00000000 115179547 oracle 640 4096 0 0x00000000 115212316 oracle 640 4096 0 0x00000000 115245085 oracle 640 4096 0 0x00000000 115277854 oracle 640 4096 0 0x00000000 115310623 oracle 640 4096 0 0x00000000 115343392 oracle 640 4096 0 0x00000000 115376161 oracle 640 4096 0 0x00000000 115408930 oracle 640 4096 0 0x00000000 297762851 root 600 4194304 2 dest 0x00000000 297861156 root 600 524288 2 dest 0x00000000 115441701 oracle 640 4096 0 0x00000000 115474470 oracle 640 4096 0 0x00000000 115507239 oracle 640 4096 0 0x00000000 115540008 oracle 640 4096 0 0x42e38fd0 115572777 oracle 640 4096 0 0x00000000 127959083 root 600 832920 2 dest 修改之前linux内核参数$ cat /etc/sysctl.conf# sysctl settings are defined through files in# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.## Vendors settings live in /usr/lib/sysctl.d/.# To override a whole file, create a new file with the same in# /etc/sysctl.d/ and put new settings there. To override# only specific settings, add a file with a lexically later# name in /etc/sysctl.d/ and put new settings there.## For more information, see sysctl.conf(5) and sysctl.d(5).fs.aio-max-nr = 1048576fs.file-max = 6815744kernel.shmall = 2097152kernel.shmmax = 4294967295 kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 262144net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048576vm.swappiness=1修改之后共享内存[root@base-test-01 oracle]# ipcs -m------ Shared Memory Segments --------key shmid owner perms bytes nattch status 0x00000000 504037376 oracle 640 536870912 72 0x00000000 504070145 oracle 640 107911053312 72 0x42e38fd0 504102915 oracle 640 2097152 72 0x00000000 1212420 root 644 80 2 0x00000000 1245189 root 644 16384 2 0x00000000 1277958 root 644 280 2 0x00000000 297435143 root 600 524288 2 dest 0x00000000 508821513 root 600 832920 2 dest 0x00000000 297762851 root 600 4194304 2 dest 0x00000000 297861156 root 600 524288 2 dest # sysresv -l orcl -d onIPC Resources for ORACLE_SID "orcl" :Shared Memory:ID KEY504037376 0x00000000504070145 0x00000000504102915 0x42e38fd0修改之后linux内核参数[root@base-test-01 oracle]# sysctl -pfs.aio-max-nr = 1048576fs.file-max = 6815744kernel.shmall = 67108864kernel.shmmax = 256000000000kernel.shmmni = 4096kernel.sem = 250 32000 100 128net.ipv4.ip_local_port_range = 9000 65500net.core.rmem_default = 262144net.core.rmem_max = 4194304net.core.wmem_default = 262144net.core.wmem_max = 1048576vm.swappiness = 1前后对比,oracle的共享内存从35个减少到3个,碎片大大减少。使用validate命令进行只读验证没有优化前备份性能修改环境变量,将rman中的时间提示最小单位从天改到秒:export NLS_DATE_FORMAT=‘YYYY-MM-DD HH24:MI:SS’export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK # 或:export NLS_LANG=AMERICANrman备份RMAN> backup validate database;Starting backup at 2020-02-26 14:42:44using channel ORA_DISK_1channel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00005 name=/test-nvme/oradata/orcl/cccc1.dbfinput datafile file number=00006 name=/test-nvme/oradata/orcl/cccc2.dbfinput datafile file number=00007 name=/test-nvme/oradata/orcl/cccc3.dbfinput datafile file number=00008 name=/test-nvme/oradata/orcl/cccc4.dbfinput datafile file number=00009 name=/test-nvme/oradata/orcl/cccc5.dbfinput datafile file number=00010 name=/test-nvme/oradata/orcl/cccc6.dbfinput datafile file number=00011 name=/test-nvme/oradata/orcl/cccc7.dbfinput datafile file number=00012 name=/test-nvme/oradata/orcl/cccc8.dbfinput datafile file number=00013 name=/test-nvme/oradata/orcl/cccc9.dbfinput datafile file number=00014 name=/test-nvme/oradata/orcl/cccc10.dbfinput datafile file number=00015 name=/test-nvme/oradata/orcl/cccc11.dbfinput datafile file number=00003 name=/test-nvme/oradata/orcl/undotbs01.dbfinput datafile file number=00001 name=/test-nvme/oradata/orcl/system01.dbfinput datafile file number=00002 name=/test-nvme/oradata/orcl/sysaux01.dbfinput datafile file number=00004 name=/test-nvme/oradata/orcl/users01.dbfchannel ORA_DISK_1: backup set complete, elapsed time: 00:31:25.........RMAN>从14:42:44开始到15:14:11结束,31分钟27秒,一共1887秒。从os层查看io情况$ iostat 60 nvme0n1Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnnvme0n1 5091.10 650829.00 93.44 39049740 5606avg-cpu: %user %nice %system %iowait %steal %idle 0.84 0.00 2.11 0.75 0.00 96.30Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnnvme0n1 5483.45 701698.13 11.38 42101888 683avg-cpu: %user %nice %system %iowait %steal %idle 0.93 0.00 2.20 0.72 0.00 96.15Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtnnvme0n1 5589.93 715302.93 12.60 42918176 756[oracle@base-test-01 ~]$ iostat -x 60 nvme0n1Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.00 5255.30 0.93 672465.47 9.53 255.88 1.24 0.24 0.24 0.00 0.16 83.82avg-cpu: %user %nice %system %iowait %steal %idle 0.77 0.00 2.11 0.73 0.00 96.39Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.00 5425.92 1.08 694424.67 11.71 255.92 1.25 0.23 0.23 0.05 0.16 85.25优化后的备份性能rman备份[oracle@base-test-01 ~]$ rman target /Recovery Manager: Release 11.2.0.4.0 - Production on Wed Feb 26 18:28:40 2020Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.connected to target database: ORCL (DBID=1560763823)RMAN> backup validate database;Starting backup at 2020-02-26 18:28:47using target database control file instead of recovery catalogallocated channel: ORA_DISK_1channel ORA_DISK_1: SID=9391 device type=DISKchannel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setinput datafile file number=00005 name=/test-nvme/oradata/orcl/cccc1.dbfinput datafile file number=00006 name=/test-nvme/oradata/orcl/cccc2.dbfinput datafile file number=00007 name=/test-nvme/oradata/orcl/cccc3.dbfinput datafile file number=00008 name=/test-nvme/oradata/orcl/cccc4.dbfinput datafile file number=00009 name=/test-nvme/oradata/orcl/cccc5.dbfinput datafile file number=00010 name=/test-nvme/oradata/orcl/cccc6.dbfinput datafile file number=00011 name=/test-nvme/oradata/orcl/cccc7.dbfinput datafile file number=00012 name=/test-nvme/oradata/orcl/cccc8.dbfinput datafile file number=00013 name=/test-nvme/oradata/orcl/cccc9.dbfinput datafile file number=00014 name=/test-nvme/oradata/orcl/cccc10.dbfinput datafile file number=00015 name=/test-nvme/oradata/orcl/cccc11.dbfinput datafile file number=00003 name=/test-nvme/oradata/orcl/undotbs01.dbfinput datafile file number=00001 name=/test-nvme/oradata/orcl/system01.dbfinput datafile file number=00002 name=/test-nvme/oradata/orcl/sysaux01.dbfinput datafile file number=00004 name=/test-nvme/oradata/orcl/users01.dbfchannel ORA_DISK_1: backup set complete, elapsed time: 00:05:15List of Datafiles=================File Status Marked Corrupt Empty Blocks Blocks Examined High SCN---- ------ -------------- ------------ --------------- ----------1 OK 0 15274 97280 10829000 File Name: /test-nvme/oradata/orcl/system01.dbf Block Type Blocks Failing Blocks Processed ---------- -------------- ---------------- Data 0 65126 Index 0 13578 Other 0 3302 ......channel ORA_DISK_1: starting full datafile backup setchannel ORA_DISK_1: specifying datafile(s) in backup setincluding current control file in backup setincluding current SPFILE in backup setchannel ORA_DISK_1: backup set complete, elapsed time: 00:00:01List of Control File and SPFILE===============================File Type Status Blocks Failing Blocks Examined------------ ------ -------------- ---------------SPFILE OK 0 2 Control File OK 0 3146 Finished backup at 2020-02-26 18:34:045分钟15秒完成。从OS层看磁盘的IO性能Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.02 35998.80 0.45 4607693.07 5.99 255.99 90.92 2.53 2.53 0.41 0.03 100.00avg-cpu: %user %nice %system %iowait %steal %idle 1.74 0.00 1.23 0.00 0.00 97.03Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.00 35901.82 0.45 4595201.33 5.73 255.98 90.03 2.51 2.51 0.44 0.03 100.00avg-cpu: %user %nice %system %iowait %steal %idle 1.78 0.00 1.24 0.01 0.00 96.98Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.00 36015.75 0.52 4609726.14 5.54 255.98 88.58 2.46 2.46 0.26 0.03 100.00avg-cpu: %user %nice %system %iowait %steal %idle 1.66 0.00 1.19 0.00 0.00 97.14Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %utilnvme0n1 0.00 0.00 36069.02 0.58 4616505.08 5.75 255.98 91.41 2.53 2.53 0.23 0.03 100.00
MATLAB图像的读取和显示
直接看代码吧,注释写的很清楚了。%图像读取,参数为 路径+文件名,扩展名
%A=imread('G:\chorm浏览器\图片\snow-capped-mountain-under-blue-sky-1775862.jpg','jpg');
A=imread('G:\chorm浏览器\图片\snow-capped-mountain-under-blue-sky-1775862.jpg');
%图像写入,参数为 图像数据,文件名,格式 保存路径为当前工作文件夹
%imwrite(A,'new.bmp','bmp')
imwrite(A,'new.bmp');
%图像显示 A为对象,[10,41]为显示灰度图像的灰度范围,小于10的显示黑色,。。。。白色
%灰度值: 指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0
subplot(2,2,1);
imshow(A,[10,41]); %此处不是灰度图,显示原彩,例子见B
title('原图','Fontsize',15,'Color','b');
%图像格式转换
subplot(2,2,2);
im2bw(A,0.7); %从灰度图,rgb图创建二值图,阈值(0,1)
%二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色(二级灰度图)。
title('二值图','Fontsize',15,'Color','b');
subplot(2,2,3);
B=rgb2gray(A); %从RGB创建灰度图
%灰度图,Gray Scale Image 或是Grey Scale Image,又称灰阶图。把白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。
imshow(B);
title('灰度图','Fontsize',15,'Color','b');
subplot(2,2,4);
imshow(B,[110,170]);
title('带阈值的灰度图','Fontsize',15,'Color','b');
% im2uint8(A); %将图转化为uint类型
% im2double(A); %.......double
来看看效果:最后再看看几种常用图像格式的区别:1、TIFF格式TIFF(Tag Image File Format)是Mac中广泛使用的图像格式,它的特点是图像格式复杂、存贮信息多。正因为它存储的图像细微层次的信息非常多,图像的质量也得以提高,故而非常有利于原稿的复制。2、PSD格式PSD其实是Photoshop进行平面设计的一张"草稿图",它里面包含有各种图层、通道、遮罩等多种设计的样稿,以便于下次打开文件时可以修改上一次的设计。在Photoshop所支持的各种图像格式中,PSD的存取速度比其它格式快很多,功能也很强大。3、PNG格式PNG(Portable NetworkGraphics)是一种新兴的网络图像格式。PNG是目前保证最不失真的格式,它汲取了GIF和JPG二者的优点,存贮形式丰富,兼有GIF和JPG的色彩模式;它的另一个特点能把图像文件压缩到极限以利于网络传输, 但又能保留所有与图像品质有关的信息,因为PNG是采用无损压缩方式来减少文件的大小,这一点与牺牲图像品质以换取高压缩率的JPG有所不同;它的第三个特点是显示速度很快,只需下载1/64的图像信息就可以显示出低分辨率的预览图像。4、SWF格式利用Flash我们可以制作出一种后缀名为SWF(Shockwave Format)的动画,这种格式的动画图像能够用比较小的体积来表现丰富的多媒体形式。在图像的传输方面,不必等到文件全部下载才能观看,而是可以边下载边看,因此特别适合网络传输,特别是在传输速率不佳的情况下,也能取得较好的效果。此外,SWF动画是其于矢量技术制作的,因此不管将画面放大多少倍,画面不会因此而有任何损害。5、SVG格式它是基于XML(Extensible Markup Language),由World Wide WebConsortium(W3C)联盟进行开发的。严格来说应该是一种开放标准的矢量图形语言,可让你设计激动人心的、高分辨率的Web图形页面。 用户可以直接用代码来描绘图像,可以用任何文字处理工具打开SVG图像,通过改变部分代码来使图像具有互交功能,并可以随时插入到HTML中通过浏览器来观看。它提供了目前网络流行格式GIF和JPEG无法具备了优势:可以任意放大图形显示,但绝不会以牺牲图像质量为代价;字在SVG图像中保留可编辑和可搜寻的状态;平均来讲,SVG文件比JPEG和GIF格式的文件要小很多,因而下载也很快。可以相信,SVG的开发将会为Web提供新的图像标准。6、GIF该格式使用无损压缩来减少图片的大小,当用户要保存图片为.GIF时,可以自行决定是否保存透明区域或者转换为纯色。同时,通过多幅图片的转换,GIF格式还可以保存动画文件。但要注意的是,GIF最多只能支持256色。
带你读《存储漫谈:Ceph原理与实践-样章》——3.1.4 RBD Cache(2)
2. RWL 使用的 PMDK 技术PMDK, 全 称 Persistent Memory Development Kit, 它 是 一 套 具 有 DAX(Direct Access)访问特性的开发工具库。NVM(Non-Volatile Memory)存储能够使具备 DAX 功能的文件系统直接暴露在用户空间,用户态程序可以使用标准的文件系统 API 来操作 NVM,同样也可以使用 mmap将其直接映射到用户空间。无论使用哪种方式,对 NVM 的操作都会直接转换为对 NVM的登录(load)和存储(store),中间没有页面缓存(page cache)(这也是支持 DAX 模式的文件系统和普通文件系统之间的主要区别)。在使用文件系统时,数据的完整性一般都由文件系统来保证,而 NVM 作为一种非易失性存储,在使用 mmap 方式来读写时,如何保证数据的完整性和一致性就显得尤为重要。通常有很多种方式可以做到这一点(后文将展开讨论),比如靠上层应用程序自己的策略来保证,也可以使用第三方库来保证,PMDK(更具体点来说是 PMDK 中的 libpmemobj)就是用来完成这项工作的。在图 3-9 中箭头的位置都是 libpmemobj 库的位置。图 3-9 PMDK 架构和应用
计算机基础——计算机应用领域以及未来发展趋势
前言本章将会讲解计算机基础中的计算机应用领域以及未来发展趋势。一.计算机应用领域计算机应用是研究计算机应用于各个领域,方法,技术和系统,是计算机学科与其他学科相结合的边缘学科。1.信息管理信息管理是以数据库管理系统为基础,辅助管理者提高决策水平,改善运营策略的计算机技术,信息处理具体包括数据的采集,存储、加工、分类,排序、检索和发布等一系列工作,信息管理已广泛应用于办公自动化,企事业单位计算机辅助管理与决策、情报检素、电影电视动画设计等各行各业。科学计算是计算机最早的应用领域,是指利用计算机来完成科学研究中提出的数值计算问题。利用计算机的运算速度高,存储容量大和连续运算的能力,可以解决人工无法完成的各种科学计算问题,例如,工程设计、地震预测,气象预报、火箭发射等都需要由计算机承担庞大而复杂的计算量。2.过程控制过程控制是利用计算机实时采集数据,分析数据,按最优值迅速地对控制对象进行调节的过程,采用计算机进行过程控制,不仅可以大大提高控制的自动化水平,降低失误率,而且可以提高控制的时效性,从而改善劳动条件,例如,在工厂使用计算机实时监控每台设备的生产情况和耗损情况。因此,计算机过程控制已在机械制造,石油,化工,建筑,环保等部门得到广泛的应用。 3.计算机辅助技术计算机辅助技术有以下几种。1)计算机辅助设计计算机辅助设计(Corputer Aided Design,CAD)是利用计算机系统辅助设计人员进行工程或产品设计,以实现最佳设计效果的一种技术,采用计算机进行设计可以缩短工期、提高效率。2)计算机辅助制造计算机辅助制造(Computer Aided Marufacturing,CAM)是利用计算机系统进行产品的加工控制过程,输入的信息是零件的工艺路线信息,而输出的信息则是刀具的运动轨迹,与计算机辅助设计技术相结合可以实现设计产品生产的自动化,这种技术被称为计算机集成制造系统,这样可以大大地减少人力成本。3)计算机辅助教学计算机辅助教学(Computer Aided nstruction,CAl)是利用计算机系统进行课堂教学的过程,教学课件可以用PowerPoint或Flash等软件制作,计算机辅助教学技术不仅能减轻教师的负担,还能使教学内容生动形象,能够通过动画的形式动态演示实验原理或操作过程,以此来激发学生的学习兴趣,提高教学质量。 4.翻译1947年,美国数学家,工程师沃伦·韦弗与英国物理学家,工程师安德鲁·布思提出了用计算机进行翻译的设想,机译从此步入历史舞台,直到今天,机译走过了一条曲折而漫长的发展道路。虽然机译拥有巨大的应用需求,但是机译的译文质量长期以来一直没有保障,被列为21世纪世界十大科技难题,虽然现在许多大的互联网公司和软件公司都推出了翻译软件和服务,如百度,谷歌。金山等,但是与理想目标仍相差甚远,中国数学家,语言学家周海中教授认为,在人类尚未明了大脑是如何进行语言的模糊识别和逻辑判断的情况下,机译要想达到“信、达,雅”的程度是不可能的,这一观点也是制约译文质量的瓶颈所在。5.多媒体随着通信和计算机技术的发展,在医疗,教育,商业、银行、保险,行政管理,军事,工业,广播,交流和出版等领城中,多媒体的应用发展很快。当今多媒体充斥着人们的生活,在生活中视频网站有优酷、土豆等、媒体播放器有暴风影音、酷狗音乐盒等。6.网络计算机网络是由一些独立的和具备信息交换能力的计算机互联构成的,以实现资源共享。计算机在网络方面的应用使人们的交流跨越了时间和空间障碍。计算机网络已成为人类建立信息社会的物质基础,给我们的工作带来了极大的方便,如在全国范围内的银行信用卡的使用,火车累预订系统的使用,聊天软件的使用等;以及在lnternet上测览,检索信息,收发电子邮件,阅读书报,玩网络游戏、选购商品,实现远程教育等。当然,计算机网络也给人们带来了一些负面影响,有些人利用网络传播计算机病毒,破坏网络中数据的正常交互和传输。有些犯罪分子利用网络来诈骗钱财,窃取机密,虽然如此,计算机网络所带来的负面影响还是次要的,计算机网络给社会带来的积极作用仍然是主要的。二.计算机未来发展趋势计算机现在正向着迷你化发展,从很笨重的BM老式机器,到MacBook超薄笔记本,以及各式各样的智能手机,智能穿戴设备等。人工智能也在慢慢融入我们的生活。1.新技术随着计算机性能需求的增加,未来技术包括分子计算机,光子计算机,纳米计算机,生物计算机,神经计算机、量子计算机等,下面简单介绍一下量子计算机。量子计算机(Ouantum Computer)是一类道循量子力学规律进行高速的数学和逻辑运算,存储及处理量子信息的物理装置,当某个装置处理和计算的是量子信息,运行的是量子算法时,它就是量子计算机。量子理论认为,非相互作用下,原子在任一时刻都处于两种状态,称为量子超态,原子会旋转,即同时沿上,下两个方向自旋,这正好与电子计算机二进制数字0与1完全吻合,只要40个原子一起计算,就相当于今天一台超级计算机的性能,量子计算机以处于量子状态的原子作为中央处理器和内存,其运算速度可能比奔腾4芯片快10亿倍,就像一枚信息火箭,在一瞬间搜寻整个互联网。量子计算机芯片如图 2.大趋势随着科技的进步,计算机的发展已经进入了一个快速而又崭新的时代,计算机已经从功能单一体积较大发展到了功能复杂,体积微小,资源网络化等,计算机的未来充满了变数,性能的大幅度高是不容置疑的,而实现性能的飞跃却有多种途径,计算机从出现至今,经历了机器语言,程序语言,简单操作系统和Linux.Windows等现代操作系统四代,第四代计算机的运算速度已经达到几十亿次每秒,计算机强大的应用功能,产生了巨大的市场需要,未来计算机性能应向着巨型化,微型化.网络化,智能化,多媒体化和技术结合的方向发展。1)巨型化巨型化是指为了适应尖端科学技术的需求,发展高速度、大存储容量的超级计算机,随着人们对计算机性能的需求,特别是在某些高尖端的科学领域(如数据挖拥)对计算机的存储空间和运行速度等要求会越来越高。2)微型化微型处理器的出现,使计算机体积缩小了,成本降低了,计算机理论和技术上的不断完善促使微型计算机很快渗透到全社会的各个行业和部门中,并成为人们生活和学习的必需品,多年来,计算机的体积不断缩小,从世界上第一台计算机到现在的合式计算机,笔记本电脑,平板电脑,体积逐步微型化,为人们提供便捷的服务,因此,未来计算机不但会趋于巨型化,还会不断趋于微型化,体积将越来越小。3)网络化计算机网络化彻底改变了人类世界,人们通过互联网进行沟通,交流(使用0Q.微博等).教育资源共享(文献查阅,远程教育等)、信息查阅共享(百度、谷歌)等,特别是无线网络的出现极大地提高了人们使用网络的便捷性、网络化将会是未来计算机的发展趋势,并且网络的覆盖面会越来越广。4)人工智能化计算机人工智能化是未来发展的必然趋势,现代计算机具有强大的功能和运行速度,但与人脑相比,其智能化和逻辑能力仍有待提高。人类不断在探素如何让计算机能够更好地反映人类思维。使计算机能够具有人类的逻辑思维判断能力,可以通过思考与人类沟通交流。5)多媒体化传统的计算机处理的信息主要是字符和数字,但是人们似乎更习惯的是图片,声音,影像等多种形式的多媒体信息,多媒体技术可以集图形,图像,音频,视频为一体,使信息处理的对象和内容更加接近真实世界,使人们使用计算机时更具有体验性,6)技术结合现在的计算机CPU以晶体管为基本元件,以电能作为主要能源,但是,随着处理器的不断完善和更新换代的速度加快,计算机结构和元件也会发生很大的变化,光电技术,量子技术和生物技术的发展,对新型计算机的发展具有极大的推动作用。
计算机的发展史与计算机硬件组成(下)
SATA(Serial Advanced Teclnology Attacmert)串行高级技术附件,一种基于行业标准的串行硬件驱动器接口(2)移动硬盘移动硬盘是以硬盘为存储介质,具有较强便携性的存储设备,市场上绝大多数的移动硬盘是以标准硬盘为基础的,因为采用硬盘为存储介质,所以移动硬盘对数据的读写模式与标准DE硬盘是相同的,移动硬盘多采用USB(Uhiversal Serlal Bus.通用串行总线).EEE 1394等传输速度较快的接口,可以以较高的速度与系统进行数据传输。 4.内存内存又称内部存储器或随机存储器(RAM).其构造及技术主要有内存芯片,金手指,印制电路板(Printed Circuit Board,PCB),贴片电容,封装技术等。内存属于电子式存储设备,由电路板和芯片组成,特点是体积小,速度快,有电可存,无电清空,即计算机在开机状态时内存中可存储数据,关机后将自动清空其中的所有数据,(1)内存规格内存条主要有SDRAM(Synctroncus Dynamic Random-Access Memory,同步动态随机存储器.DDR(Double Data Rate,双倍速率).DDR2(2代).DDR3(3代).DDR4(4代)等类型,DDR3和DDR4是内存条市场中的主流产品,如图1.10所示为DDR4内存条。(2)如何判断内存条是新旧金手指也是判断内存是否属于二手货或者返修货的关键,因为被使用过的内存多少会在金手指上留下一些痕迹,理想的金手指应该不易脱落、不易被氧化。5.其他硬件(1)机箱电源机箱是计算机主机的主体框架和外衣,用来固定各种其他硬件,阻挡灰尘,防止外力的意外破坏等,机箱与电源如图。(2)主板主板是计算机中各个部件工作的一个平台。它把计算机的各个部件紧密连接在一起,各个部件通过主板进行数据传验。也就是说,计算机中重要的“交通枢纽”都在主板上,是计算机中各种硬件的连接载体,它工作的稳定性影响着整机工作的稳定性。 主板上有BIOS(Basic input/Output System,基本输入/输出系统)设置芯片.键盘和鼠标接口,面板控制开关接口、指示灯接口、CPU插座、扩充播槽、直流电源供电接口等,扩充插槽包括AGP(Accelerste Graphical Port,加速图形接口).PCl (Peripherat Cornponent Ilrtercornect,周边元件扩展接口)等,在计算机机箱外放置有主板的接口.(3)显卡显卡主要由显示芯片,显存,数模转换器,与主板的接口等几部分组成,与显示器配合输出图像,文字等内容,显卡的作用是将计算机系统所需要是示的信息进行转换,并向显示器提供行扫描信号。由此来控制显示器所显示的内容,显卡是连接显示器和计算机主板的重要元件,是“人机对话”的中间桥梁。AGP显卡如图1.21所示,PCI-E显卡如图1.22所示。(4)声卡声卡是组成多媒体计算机必不可少的一个硬件设备,是多媒体技术中最基本的组成部分,其作用是当发出播放命令后,实现声波/数字信号的相互转换,如图1.23所示,声卡主要有两种,内置独立声卡和内置集成在主板上的软声卡。 (5)显示器显示器有大有小,有薄有厚,品种多样,但其作用是相同的,即把计算机处理完的结果显示出来,它是一个输出设备,是计算机必不可少的部件之一. (6)键盘和鼠标键盘分为有线和无线两种,是主要的人工学输入设备,通常为101键或104键,用于把文字。数字等内容输入计算机中,以及实现计算机操控,是用户使用计算机不可缺少的设备之一,硬件的鼠标分为光电机械两种,机械鼠标价格低、精度低,寿命短,并且容易出现光标无故乱动、移动不灵活等机械故障,光电鼠标精度高,可靠性好,工作时要求接触面必须精密配合鼠标的光源照射角:否则无法工作。激光鼠标进一步提高了分辨率和精准度。计算机中PS/2接口的键盘、鼠标等硬件一般不支持带电插拔功能,带电插拔时瞬间电流过大,可能会烧坏主板:而有时主板上的某个电路或元器件能自动形成保护,导致计算机黑屏,主板不过电等现象,一般对主板上的硬件进行插拔后便可以正常工作了。
【Python基础篇020】网络编程初识
🦠一、前言两台或多台电脑之间不同程序的通讯大致分为以下两种第一种是应用类:在不同电脑之间要安装相对应桌面应用才可以进行通讯,比如我们日常使用的QQ微信等第二种是web类:最常见的就是CSDN,博客园等可以直接在浏览器进行访问的应用🦠二、软件开发架构🍀2.1、C/S架构C/S即:Client与Server ,中文意思:客户端与服务器端架构,这种架构也是从用户层面(也可以是物理层面)来划分的。这种架构方式有很大的缺点:这里的客户端一般泛指客户端应用程序EXE,程序需要先安装后,才能运行在用户的电脑上,对用户的电脑操作系统环境依赖较大。会给用户带来极大的不变,下面就引出另一种相对好用的架构方法🍀2.2、B/S架构Browser与Server,中文意思:浏览器端与服务器端架构,这种架构是从用户层面来划分的。 Browser浏览器,其实也是一种Client客户端,只是这个客户端不需要大家去安装什么应用程序,只需在浏览器上通过HTTP请求服务器端相关的资源(网页资源),客户端Browser浏览器就能进行增删改查,对用户的电脑操作系统要求相对较少🍀2.3、服务端与客户端服务端需要一直运行,等待用户的请求,并将用户想要的数据及时的返回给客户端客户端就是用户想发送请求的时候才向服务端要数据 🦠三、ip与端口号🍀3.1、IP地址与端口号常识ip相当于一台机器在网络上的位置,而端口号就是为了找到某台计算机上的唯一的一个程序并且我们端口号一般都开在8000之后🍀3.2、MAC和IP的概念与不同不是的同一个意思,也不是同一种类型地址.虽然MAC和IP地址在咱们电脑里都是以二进制表示的。(1)MAC地址通常是48位的。(2)IP地址通常是32位的。 用途意义不同。(1)MAC英文全称是Media Access Control Addres。MAC地址是网络设备制造商在生产时烧录在一种闪存芯片里,用来确认网络设备位置的位址,可以理解为物理地址。(2)IP地址全称是Internet Protocol Address,是指互联网协议地址。IP地址是一种统一的地址格式,IP地址为网上的每一个网络和每一台设备分配一个逻辑地址。🦠四、tcp协议和udp协议TCP(Transmission Control Protocol)可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应用:Web浏览器;电子邮件、文件传输程序。UDP(User Datagram Protocol)不可靠的、无连接的服务,传输效率高(发送前时延小),一对一、一对多、多对一、多对多、面向报文,尽最大努力服务,无拥塞控制。使用UDP的应用:域名系统 (DNS);视频流;IP语音(VoIP)。🦠五、以太网:局域网与交换机🍀5.1、什么是局域网 所谓的局域网,是指在一个特定的区域内,由很多台计算机之间相互联成的一个计算机组🍀5.2、什么是交换机“交换机(英文:Switch,意为“开关”)是一种用于电信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机通常是用来解决多台机器之间的通信问题 🍀5.3、拓展网关的概念局域网中的机器想要访问局域网外的机器,需要通过网关的访问网关的优点:微服务网关介于服务端与客户端的中间层,所有外部服务请求都会先经过微服务网关客户只能跟微服务网关进行交互,无需调用特定微服务接口,使得开发得到简化🦠六、单播、多播、广播🍀6.1、单播的特点 一个单个的发送者和一个接受者之间通过网络进行的通信。🍀6.2、多播的特点 一个发送者和多个接受者之间的通信。🍀6.3、广播的特点 主机之间“一对所有”的通讯模式,网络对其中每一台主机发出的信号都进行无条件复制并转发,所有主机都可以接收到所有信息(不管你是否需要都必须接收,并且只有相对应得一台才会有反应)。🦠七、arp协议地址解析协议,即ARP,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。🦠八、广域网与路由器🍀8.1、什么是广域网广域网(WAN),就是我们通常所说的Internet,它是一个遍及全世界的网络。🍀8.2、什么是路由器路由器是连接因特网中个局域网、广域网的设备,它根据信道的情况自动选择和设定路由,以最佳路径,按前后顺序发送信号的设备。路由器英文名Router,路由器是互联网络的枢纽、“交通警察”。目前路由器已经广泛应用于各行各业各种不同档次的产品已经成为实现各种骨干网内部连接、骨干网间互联和骨干网与互联网互联互通的主力军。简单来说,路由器就是一个连接媒介,用来连接一个个小的局域网。 来扩展一下路由器的概念。路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。🦠九、子网掩码的概念子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。其中IP地址和子网掩码按位与得到的就是网段地址🦠十、基于TCP协议的socketserver.pyimport socket
sk = socket.socket() #买手机
#sk.bind(('ip','port-端口')) #绑定手机卡
'127.0.0.1是回环地址用于同台电脑不同应用之间的通信'
sk.bind(('127.0.0.1',8080)) #绑定手机卡
sk.listen() #监听 等别人给我打电话
conn,addr = sk.accept() #接收到别人的电话, connection 连接 address 地址
conn.recv(1024) #听别人说话
conn.send(b'i am server') #和别人说话 必须传一个bytes类型
conn.close() #挂电话
sk.close() #关手机client.pyimport socket
sk = socket.socket() #买手机
sk.connect(('127.0.0.1',8080)) #拨号码
while 1:
sk.send(bytes(input('>>>'),encoding='utf-8'))
ret = sk.recv(1024).decode('utf-8')
if ret == 'Bye':
sk.send(b'Bye')
break
print('from server:{}'.format(ret))
sk.close()
nvm常用命令
nvm list 查看已经安装的版本nvm list installed 查看已经安装的版本nvm list available 查看网络可以安装的版本nvm version 查看当前的版本nvm install 安装指定版本nodenvm use ## 切换使用指定的版本nodenvm ls 列出所有版本nvm current显示当前版本nvm alias ## 给不同的版本号添加别名nvm unalias ## 删除已定义的别名nvm reinstall-packages ## 在当前版本node环境下,重新全局安装指定版本号的npm包nvm on 打开nodejs控制nvm off 关闭nodejs控制nvm proxy 查看设置与代理nvm node_mirror [url] 设置或者查看setting.txt中的node_mirror,如果不设置的默认是 https://nodejs.org/dist/nvm npm_mirror [url] 设置或者查看setting.txt中的npm_mirror,如果不设置的话默认的是: https://github.com/npm/npm/archive/.nvm uninstall 卸载制定的版本nvm use [version] [arch] 切换制定的node版本和位数nvm root [path] 设置和查看root路径
内存管理
一.内存管理
1.主要功能
内存管理的主要功能有:
内存空间的分配与回收。由操作系统完成主存储器空间的分配和管理,使程序员摆脱存储分配的麻烦,提高编程效率。
地址转换。在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致, 因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
内存空间的扩充。利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。
内存共享。指允许多个进程访问内存的同一部分。例如,多个合作进程可能需要访问同一块数据,因此必须支持对内存共享区域进行受控访问。
存储保护。保证各道作业在各自的存储空间内运行,互不干扰。
在进行具体的内存管理之前,需要了解进程运行的基本原理和要求。
2.补充
内存管理就是就是围绕这五个方面展开的。
二.程序运行的过程
1.过程
创建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤: ●编译。由编译程序将用户源代码编译成若干目标模块。 ●链接。由链接程序将编译后形成的- -组目标模块及它们所需的库函数链接在- -起,形成一个完整的装入模块。 ●装入。由装入程序将装入模块装入内存运行。
2.个人理解
编译:把你写的代码各模块编译成对应的机器语言。
链接:把各个模块链接到一起形成一个装入模块,在这个时候形成逻辑地址。
装入:装入模块(可执行文件)进入内存,这个时候逻辑地址变成物理地址。
3.链接方式
程序的链接有三种方式:
(1)静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成-一个完整的装配模块,以后不再拆开。将几个目标模块装配成一个装入模块时,需要解决两个问题:①修改相对地址,编译后的所有目标模块都是从0开始的相对地址,当链接成- -个装入模块时要修改相对地址。②变换外部调用符号,将每个模块中所用的外部调用符号也都变换为相对地址。
(2)装入时动态链接:将用户源程序编译后所得到的- -组目标模块,在装入内存时,采用边装入边链接的方式。其优点是便于修改和更新,便于实现对目标模块的共享。
(3)运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。凡在执行过程中未被用到的目标模块,都不会被调入内存和被链接到装入模块上。其优点是能加快程序的装入过程,还可节省大量的内存空间。
4.装入方式
内存的装入模块在装入内存时,同样有以下三种方式:
(1)绝对装入绝对装入方式只适用于单道程序环境。在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,因此不需对程序和数据的地址进行修改。另外,程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。
(2)可重定位装入在多道程序环境下,多个目标模块的起始地址通常都从0开始,程序中的其他地址都是相对于起始地址的,此时应采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。在装入时对目标程序中指令和数据地址的修改过程称为重定位,又因为地址变换通常是在进程装入时一次完成的,故称为静态重定位。
当一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则无法装入。此外,作业一旦进入内存,整个运行期间就不能在内存中移动,也不能再申请内存空间。
(3)动态运行时装入也称动态重定位。程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址。这种方式需要一个重定位寄存器的支持。
动态重定位的优点:可以将程序分配到不连续的存储区;在程序运行之前可以只装入部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享。
三.其他功能
1.内存保护
确保每个进程都有一个单独的内存空间。内存分配前,需要保护操作系统不受用户进程的影.响,同时保护用户进程不受其他用户进程的影响。内存保护可采取两种方法: .
1)在CPU中设置一-对上、下限寄存器,存放用户作业在主存中的下限和上限地址,每当CPU要访问一个地址时,分别和两个寄存器的值相比,判断有无越界。
2)采用重定位寄存器(又称基地址寄存器)和界地址寄存器(又称限长寄存器)来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。
2.内存共享
并不是所有的进程内存空间都适合共享,只有那些只读的区域才可以共享。可重入代码又称纯代码,是一种允许多个进程同时访问但不允许被任何进程修改的代码。但在实际执行时,也可以为每个进程配以局部数据区,把在执行中可能改变的部分复制到该数据区,这样,程序在执行时只需对该私有数据区中的内存进行修改,并不去改变共享的代码。
3.内存空间的扩充
交换技术主要在不同进程( 或作业)之间进行,而覆盖则用于同一个程序或进程中。对于主.存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术则已成为历史;而交换技术在现代操作系统中仍具有较强的生命力。
四.内存分配
1.连续分配方式
1.单一连续分配
内存在此方式下分为系统区和用户区,系统区仅供操作系统使用,通常在低地址部分:在用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占。这种方式的优点是简单、无外部碎片,无须进行内存保护,因为内存中永远只有一道程序。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
2.固定分区分配
固定分区分配是最简单的一种多道程序存储管理方式,它将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可再从外存的后备作业队列中选择适当大小的作业装入该分区,如此循环。在划分分区时有两种不同的方法。
分区大小相等。程序太小会造成浪费,程序太大又无法装入,缺乏灵活性。
分区大小不等。划分为多个较小的分区、适量的中等分区和少量大分区。
3.动态分区分配
又称可变分区分配,它是在进程装入内存时,根据进程的实际需要,动态地为之分配内存,并使分区的大小正好适合进程的需要。因此,系统中分区的大小和数目是可变的。
在进程装入或换入主存时,若内存中有多个足够大的空闲块,则操作系统必须确定分配哪个内存块给进程使用,这就是动态分区的分配策略。考虑以下几种算法:
1)首次适应(First Fit) 算法。空闲分区以地址递增的次序链接。分配内存时,从链首开始顺序查找,找到大小能满足要求的第一-个空闲分区分配给作业。
2)邻近适应(NextFit) 算法。又称循环首次适应算法,由首次适应算法演变而成。不同之处是,分配内存时从上次查找结束的位置开始继续查找。
3)最佳适应(Best Fit)算法。空闲分区按容量递增的次序形成空闲分区链,找到第-一个能满足要求且最小的空闲分区分配给作业,避免“大材小用”。
4)最坏适应(Worst Fit) 算法。空闲分区以容量递减的次序链接,找到第- -个能满足要求的,即最大的分区,从中分割一部分 存储空间给作业。
首次适应算法最简单,通常也是最好和最快的。不过,首次适应算法会使得内存的低地址部分出现很多小的空闲分区,而每次分配查找时都要经过这些分区,因此增加了开销。
邻近适应算法试图解决这个问题。但它常常导致在内存空间的尾部(因为在- -遍扫描中,内存前面部分使用后再释放时,不会参与分配)分裂成小碎片。通常比首次适应算法要差。
最佳适应算法虽然称为“最佳”,但是性能通常很差,因为每次最佳的分配会留下很小的难以利用的内存块,会产生最多的外部碎片。
最坏适应算法与最佳适应算法相反,它选择最大的可用块,这看起来最不容易产生碎片,但是却把最大的连续内存划分开,会很快导致没有可用的大内存块,因此性能也非常差。
2.非连续分配方式
非连续分配方式根据分区的大小是否固定,分为分页存储管理和分段存储管理。在分页存储管理中,又根据运行作业时是否要把作业的所有页面都装入内存才能运行,分为基本分页存储管理和请求分页存储管理。
1.基本分页存储管理
基本分页存储管理是指将主存和辅存分成若干个大小相等的页,以页为单位进行数据的读写和存储。在基本分页存储管理中,每个进程都有自己的页表,用于记录该进程的逻辑地址与物理地址之间的映射关系。
当进程需要访问某个逻辑地址时,首先通过页表将逻辑地址转换成物理地址,并判断该物理地址是否已经在主存中。如果该物理地址所对应的页不在主存中,则发生缺页中断,操作系统负责将该页从辅存中调入主存,更新页表,并重新执行该指令。如果该物理地址所对应的页已经在主存中,则直接访问该页并执行相应的操作。
基本分页存储管理可以提高内存的利用率,使得多个进程可以同时共享主存。但是在实现过程中,需要考虑到页面置换算法、页表的管理以及缺页中断的处理等问题。
2.基本分段存储管理
基本分段存储管理是指将主存和辅存分成若干个大小不等的段,以段为单位进行数据的读写和存储。在基本分段存储管理中,每个进程都有自己的段表,用于记录该进程的逻辑地址与物理地址之间的映射关系。
当进程需要访问某个逻辑地址时,首先根据该地址所属的段,在段表中查找该段的物理地址,并计算出物理地址偏移量。然后将物理地址偏移量加上段的物理地址,得到最终的物理地址,并执行相应的操作。
在基本分段存储管理中,不同的进程可以共享相同的段,从而减少了内存的浪费。但是在实现过程中,需要考虑到段的分配、段的保护、段表的管理以及地址转换等问题。同时,由于段的大小不同,因此还需要考虑段的碎片化问题。
3.基本段页式存储管理
基本段页式存储管理是指将主存和辅存分成若干个大小不等的段和页,以段和页为单位进行数据的读写和存储。在基本段页式存储管理中,每个进程都有自己的段表和页表,用于记录该进程的逻辑地址与物理地址之间的映射关系。
当进程需要访问某个逻辑地址时,首先根据该地址所属的段,在段表中查找该段所对应的页表的物理地址,并计算出该地址所对应的页的物理地址。然后在页表中查找该页的物理地址,并计算出物理地址偏移量。最后将物理地址偏移量加上页的物理地址,得到最终的物理地址,并执行相应的操作。
在基本段页式存储管理中,可以实现不同进程之间的空间隔离和内存共享,从而提高了内存的利用率。但是在实现过程中,需要考虑到段的分配、段的保护、页表的管理、页面置换算法以及缺页中断的处理等问题。同时,由于段的大小不同,也会带来段的碎片化问题。
五.虚拟内存的管理方式
1.结构图
2.请求分页式存储管理
请求分页式存储管理是基于基本分页存储管理的一种改进,它可以提高页面置换算法的效率,并减少缺页中断的次数。在请求分页式存储管理中,每个进程所占用的物理页面数量并不是固定的,而是根据进程的实际需要来动态地进行分配。
具体来说,当一个进程需要申请一页新的物理页面时,操作系统会进行以下步骤:
首先搜索空闲物理页面池,查找是否有空闲的物理页面可供使用。
如果没有空闲的物理页面,则采用页面置换算法将一个已经驻留在主存中但未被使用的页替换出去,释放其物理页面,以供当前进程使用。
如果已经找到了空闲的物理页面,则将该页面分配给当前进程,并在进程的页表中记录该页面的映射关系。
通过动态地分配物理页面,请求分页式存储管理可以避免浪费物理内存的情况发生,并且可以根据进程的实际需要来动态地分配物理内存,从而提高了内存的利用率。同时,请求分页式存储管理还可以根据不同的页面置换算法,如FIFO和LRU等,来选择最优的页面置换策略,从而减少缺页中断的次数,提高系统的性能。
3.请求分页式存储管理流程图
4.补充
在计算机组成原理中,也涉及到虚拟内存这一知识点,在那里我有详细解释,这里就不赘述了。
点我了解虚拟存储技术
带你读《云存储应用白皮书》之15:2. 块存储
2. 块存储 产品介绍: 块存储EBS(Elastic Block Storage)是为云服务器ECS提供的低时延、持久性、高可靠的块级随机存储。块存储支持在可用区内自动复制您的数据,防止意外硬件故障导致的数据不可用,保护您的业务免于硬件故障的威胁。 产品优势: ∙ 数据持久性:云盘基于多副本机制,提供9个9的数据持久性。∙ ∙ 极致性能:ESSD云盘最高可提供100万随机IOPS,4000MB/S吞吐。∙ ∙ 弹性扩展:单盘最大支持32TB,容量和性能均可弹性扩展。∙ ∙ 安全合规:所有云盘以及快照均支持加密,满足合规要求。∙ 产品功能: 丰富的块存储产品类型:提供ESSD AutoPL云盘、PL1/2/3云盘、SSD云盘、高效云盘、NVMe SSD本地盘、SATA HDD本地盘等多种磁盘类型,满足不同业务场景需求。 ∙ 弹性扩容:单盘最大支持32TB,可根据业务负载自行配置云盘容量以及类型,后续可按需在线扩容以及调整云盘类型,以满足业务诉求。∙ ∙ 数据加密:通过阿里云密钥管理服务(KMS),针对云盘以及快照提供BYOK加密能力。加解密操作对于业务性能基本无损。∙ ∙ 分布式多副本机制:基于分布式多副本技术,为云盘提供稳定、高效的数据随机访问能力,规避底层单一硬件故障带来的数据丢失问题。∙ 多元的企业级块存储特性:提供云盘加密、弹性扩展、共享挂载、在线变配等传统企业级SAN存储特性,满足线下业务无缝迁移上云。 ∙ 弹性扩容:单盘最大支持32TB,可根据业务负载自行配置云盘容量以及类型,后续可按需在线扩容以及调整云盘类型,以满足业务诉求。∙ ∙ 数据加密:通过阿里云密钥管理服务(KMS),针对云盘以及快照提供BYOK加密能力。加解密操作对于业务性能基本无损。∙ ∙ 分布式多副本机制:基于分布式多副本技术,为云盘提供稳定、高效的数据随机访问能力,规避底层单一硬件故障带来的数据丢失问题。∙ 极致的云盘性能:ESSD 云盘是阿里云目前性能强劲的企业级云盘规格,基于新一代分布式存储架构,提供单盘高达100万的随机读写和低至百微秒的单路时延能力。 ∙ 百微秒时延:采用全新架构的ESSD系列云盘最低能够提供百微秒写时延,可满足高性能数据库负载。∙ ∙ 单盘最高提供100万IOPS:ESSD PL3规格最高提供100万IOPS以及4000MB/S吞吐能力,能满足核心交易系统、自建数据库等重IO密集型场景。∙ ∙ ESSD性能变配,秒级生效:ESSD PL1/2/3规格云盘修改性能等级秒级生效,业务无需等待。∙ 简单高效的数据备份能力:通过自动快照策略或者手工方式针对ECS实例、云盘创建快照,以应对数据丢失或错误风险。同时利用快照能力可实现批量快速创盘。 ∙ 批量创建云盘:基于新一代快照服务架构,可实现短期内批量创建ECS实例或者数据盘,实现业务快照部署。∙ ∙ 快照极速可用:启用了“快照极速可用”能力的快照能够在数秒内完成快照创建或者回滚操作。可将业务等待时间缩短至秒级别。∙ ∙ 快照跨地域复制:通过手工或者自动快照策略,将快照复制到指定区域,可实现云上异地容灾或者新业务快速开服。