-
swap
2009-03-06 13:13:00linux的一个swap area可以是一个分区,也可以是一个文件,因为可以是一个文件,所有每个swap area包含一个或多个swap extent,用swap_extent来进行表示。每个swap_extent代表一个连续的磁盘空间。如果swap area是一...linux的一个swap area可以是一个分区,也可以是一个文件,因为可以是一个文件,所有每个swap area包含一个或多个swap extent,用swap_extent来进行表示。每个swap_extent代表一个连续的磁盘空间。如果swap area是一个分区,那么它只有一个swap extent,如果是一个文件那么,文件在磁盘上有多少个连续的分区就有多少个swap extent。
linux使用swap_info(一个数组)来描述所有的swap area,每个swap area使用swap_area_info来描述。每个swap area被分为多个page slot,对应一个page frame,第一个page slot用来存储swap area的一些信息,不能用与page frame的存储。
当一个page frame被换到swap时,它对应的页表项会保存这样一个索引:
page slot index(31-8)area number(7-1)0
其中的第0位的值是0,表示页项对应的page frame不在内存中,在swap区里。
-
多方法实现 swap 2 个 int 变量的值
2015-08-30 20:08:52最常用方法是用临时变量保存备份值void swap(int &x, int &y) { int temp = x; x = y; y = temp; }不使用临时变量,方法是:按位异或 及 四则运算实现#include #include using namespace std; void swap(int &x...最常用方法是用临时变量保存备份值
void swap(int &x, int &y) { int temp = x; x = y; y = temp; }
不使用临时变量,方法是:按位异或 及 四则运算实现
#include <iostream> #include <limits> using namespace std; void swap(int &x, int &y) { x ^= y; y = x ^ y; x = x ^ y; } void swap1(int &x, int &y) { x = x + y; // 即使溢出,结果仍正确 y = x - y; x = x - y; } void swap2(int &x, int &y) { x = x - y; // x - y 丢失数据 y = x + y; x = x + y; } void swap3(int &x, int &y) { x = x * y; // x*y 可能溢出 y = x / y; x = x / y; } void swap4(int &x, int &y) { x = y / x; y = y / x; // x = 0 出错 x = x * y; } int main(void) { int x = numeric_limits<int>::max(); int y = numeric_limits<int>::max()-1; // x = 1, y = 2; cout << "原值" << x << " " << y << endl; swap(x, y); swap(x, y); cout << "swap 异或:"; cout << x << " " << y << endl; swap1(x, y); swap1(x, y); cout << "swap 加:"; cout << x << " " << y << endl; swap2(x, y); swap2(x, y); cout << "swap 减:"; cout << x << " " << y << endl; // swap3(x, y); // cout << "swap 乘:"; // cout << x << " " << y << endl; // swap4(x, y); // cout << "swap 除:"; // cout << x << " " << y << endl; cout << "===========" << endl; x = numeric_limits<int>::min(); y = numeric_limits<int>::min()+1; cout << "原值" << x << " " << y << endl; swap(x, y); swap(x, y); cout << "swap 异或:"; cout << x << " " << y << endl; swap1(x, y); swap1(x, y); cout << "swap 加:"; cout << x << " " << y << endl; swap2(x, y); swap2(x, y); cout << "swap 减:"; cout << x << " " << y << endl; }
运行结果为:
原值2147483647 2147483646 以下交换使用一种方法均进行交换2次,如仍输出原值,结果正确 swap 异或:2147483647 2147483646 swap 加:2147483647 2147483646 swap 减:-2147483647 -2147483648 =========== 原值-2147483648 -2147483647 swap 异或:-2147483648 -2147483647 swap 加:-2147483648 -2147483647 swap 减:2147483646 2147483647 [Finished in 0.4s]
由以上结果分析,只有通过按位异或的方式和用一个变量保存和(虽然溢出但结果正确)的方式能正确实现交换。
// 异或 void swap(int &x, int &y) { x ^= y; y = x ^ y; x = x ^ y; } // 用 x 保存 x+y 的和 void swap1(int &x, int &y) { x = x + y; y = x - y; x = x - y; }
其他方式,如通过保存2个变量的差/积/商,对于某些数据可能输出正确结果,但是对于可能溢出的数据,不能实现正确的交换。
结论:
除了使用临时变量实现交换的方法外,还可以用按位异或 和 用其中一个变量保存和的形式实现交换2个整型变量。
-
SWAP
2010-01-30 16:13:05SWAP 交换分区 百度上的废话有点多, 挑些有用的吧: 总大小不能超过4G ...最多可以有4 个SWAP分区 2G以上内存没有必要用SWAP, 号称容易假死+ + 转载于:https://blog.51cto.com/felixli/272367...SWAP 交换分区百度上的废话有点多, 挑些有用的吧:总大小不能超过4G单个的大小不能超2G最多可以有4 个SWAP分区2G以上内存没有必要用SWAP, 号称容易假死+ +转载于:https://blog.51cto.com/felixli/272367
-
java swap的作用_怎么用Java实现一个swap函数?
2021-02-28 09:47:10刚好想深入探讨一波,考察点应该是值传递和引用传递,和c不一样,但因为这个,也意识到了java的骚操作更多。自己的实现:两种方式://数组public static void swap (int[] arr) {int temp = arr[0];arr[0] = arr[1];...刚好想深入探讨一波,考察点应该是值传递和引用传递,和c不一样,但因为这个,也意识到了java的骚操作更多。自己的实现:两种方式:
//数组public static void swap (int[] arr) {
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
};
//成员对象public void swapNum(int a, int b) {
this.a = b;
this.b = a;
};
深入分析一下:引用一下Java耕耘者的笔记:感觉贼详细:
在分析之前,我们先介绍一下Java访问对象的方式。在 Java 堆中还必须包含能查找到此对象类型数据(如对象类型、父类、 实现的接口、方法等)的地址信息,这些类型数据则存储在方法区中。
既然java栈中的是对象的引用,那么我们如何使用对象那,主流的访问方式有两种:使用句柄和直接指针。
(1)使用句柄:
如果使用句柄访问方式, Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和类型数据各自的具体地址信息,如图:
(2)直接指针
如果使用直接指针访问方式, Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息, reference 中直接存储的就是对象地址,如图:
这两种对象的访问方式各有优势,使用句柄访问方式的最大好处就是 reference 中存储的是稳定的句柄地址,在对象被移动(垃圾收集时移动对象是非常普遍的行为)时只会改变句柄中的实例数据指针,而 reference 本身不需要被修改。
使用直接指针访问方式的最大好处就是速度更快,它节省了一次指针定位的时间开销,由于对象的访问在 Java 中非常频繁,因此这类开销积少成多后也是一项非常可观的执行成本。
接着我们回到正题,这里也是今天要讲的第一个知识点:Java的传值在java中,有两种传值方式:一种是按值传递,一种是引用传递!
那么,按值传递意味着将当前的参数传递给方法的时候,方法中的变量接收的是传过来变量的副本值(相当于拷贝了一份值),因此,我们修改了方法里面的变量的值,并不会改变外面变量的值。
引用传递:传递的是指向值的地址的指针
那么,请问大家,这里是按值传递还是引用传递?好,老司机告诉你们,这里是按值传递,为什么?Integer不是对象吗? 对象传递不是传递的指针吗?大家有没有去看过Integer类的源码,看看这个类是怎么定义的,我们来看下,实际上面Integer使用的final定义的,也就意味着通过Integer实例化的对象是不能改变的,跟String是不是差不多。所以这里的话,是传递的值,我们来画下图:
那么,我们首先看一下Java运行时数据区域:
我们一般在开发中认为JVM不过有堆和栈两部分组成,但是实际的Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁。如下图:
Java中的内存主要分为两块把:堆和栈,栈存储变量本身,堆存储对象的值,然后通过栈执行堆内存地址来建立关系。
通过swap方法后:意味着,会同样创建两个变量num1和num2,他们的值是刚刚拷贝过来的ab的值,此时内存中时怎么变化的呢:
大家,知道为什么会有地址指针这个东西,主要是我们的堆内存他主要是存储的是一些对象,对象是最占内存的,为了能够节省对内从的空间,就出现了这种概念。好,讲到这里,至少大家应该清楚了一点:引用传递和按值传递的不同。
我们再来看,这个Integer他内部是如何赋值的,我们来看下:进入Integer类Ctrl+o搜索Integer构造方法:
然后我们发现这个value定义的是final类型的:
如果他有一个setValue()的方法的话,那么我们是是不是可以通过这个方法来改变值,但是Integer并没有提供。也就是说这种方法是行不通的,好,那么我们今天讲到第二个知识点:反射有没有人在做这个题目的时候有没有想过用反射来实现?
有想过的,看有多少人有往这个方面去想,我们刚刚看到Integer类中存在一个value值变量吗?对吧,所以我们需要拿到这个value变量然后来改变他的值,对吧,那么我们怎么来做,我们可以通过反射的方式拿到这个变量,这个Filed,然后去改变他的值,对吧。我们来看下怎么写:
理论上来说,这种方式是一定能够实现我们的要求的.Run下:报错:“Class com.edu.example.test.Test can not access a member of class java.lang.Integer with modifiers "private final"”
报错了,是不是,那么这又是另外一个知识点:
私有的成员属性是不能通过反射来赋值的!
那么,如果要强攻,怎么办?实际上面,在java反射中,提供了一个叫设置访问权限的东西,我们进入Field类中看下:
然后他里面有一个setAccessible的方法:
这个方法就是用来设置成员属性访问权限的。我们看到最后是给obj.override=flag
那么我们在回过头来看下,Field的set方法:
这几行代码意味着,也就是说,如果override是false,就会调用Reflection.quickCheckMemberAccess(clazz, modifiers)来检查成员属性的访问权限。
所以说,我们再来看,这个时候是不是就可以通过设置setAccessible(true)为true来标志不需要访问权限的检查。这样就可以修改value的值了。对不。我们来试验下:
好,大家觉得这样没问题,结果如下:
结果是,a的值确实变了,但是b的值却没有变,首先说明通过这种方式确实可以改变值,但是为什么b的值没有变化呢?。请问为什么?我们再回过头来看看外面的方法,检查一下,我们定义了:
有没有发现什么问题?
Integer是不是一个封装类型,而他的值1,2,是不是一个int类型,是一个基本数据类型,那么这里是怎么赋值的呢? 那么我们按照正常来写是不是这样子的:
int a = 1;
但是为什么使用Integer也不会报错了,好,这就讲到了我们又一个知识点:(笔记)
Java中的装箱和拆箱
装箱:把基本类型用它们相应的引用类型包装起来,使其具有对象的性质。int包装成Integer、float包装成Float;
拆箱:和装箱相反,将引用类型的对象简化成值类型的数据;
Integer a = 100; // 这是自动装箱 (编译器调用的是static Integer valueOf(int i))
int b = new Integer(100); //这是自动拆箱
那么我们来实际看下,我们耳听为虚,眼见为实,我们来看下编译的字节码文件:
命令:javap -c Test.class
可以看到:
Jvm他自动做了装箱操作,看的清清楚楚对吧,对吧
好那么,我们来看下Integer.valueOf(1):源码
意味着值大于IntegerCace.low小于IntegerCache.high的话:
会从IntegerCache中获取,也就是从缓存中取值。
那么我们来看下IntegerCache:
也就是说从-128到127直接的所有值,都是从缓存中获取。而缓存中的值,是什么时候放进去的,是jvm启动的时候就放进去了,然后分配好内存地址。
你们有没有发现,就短短几行代码,怎么就有这么多知识,是不是都有点感觉不认识java了。很神奇吧,哈哈好,前面这两行代码我们分析完了对吧,好,然后,然后我们把ab的值传进来,我们再来分析swap中的这段代码,好吧,精华部分就是这段代码了啊,这是精华部分,哈哈,我们来看:断点到这句
然后按F5进去看下,把IntegerCache里面的值全面拿出来放到notepat++
第一步:是不是需要获取num2的值,那么他从下标[2+128=130]IntegerCache中获取值为:130下标,也就是第131个数字为:2
第二步:field.set(num1,num2),, 意味着第一步先获取num1在IntegerCache中的值IntegerCache[1+128] =1 ,然后会修改IntegerCache[num1]的值为num2从Integercache中获取到的值2, 也就是修改为:integerCache[129] = 2
第三步:下一行代码执行
此时,再次拿出IntegerCache, 那么下标为129,130的值都变成了2, 此时tmp的值为1,那么从IntegerCache获取到的值为IntegerCache[1+128=129] ,也就是获取130行的数,也就是2,所以结果就是这样。实际上面和下面这个是一样的:
从这一句debug进去:发现走的缓存,然后从cache中第129个下标找到了。
所以,当我们的值是在【-127-128】的时候,他是从IntegerCache中获取的。其实,我们可以这样来验证一下:
结果为:true
结果为:false
那么,这个当时我其实又遇到这个坑,被坑惨了是吧。哈哈哈。
那么我们怎么解决最后的问题:(
1.
2.
3.取巧的方式:
-
发送多个数据_揭秘IPFS数据交换模块Bitswap
2021-01-07 11:50:14导 读本文为IPFS系列文第4篇,详解IPFS的核心模块——Bitswap。(之前的技术干货已为读者详细讲解了IPFS文件存储、文件系统等相关内容,精彩回顾详见文末链接?)星际文件系统(InterPlanetary File System,缩写IPFS)是... -
mysql占用过多swap_由于占用太多服务器swap内存发现的MySQL相关的性能问题
2021-01-19 07:25:23for i in $( cd /proc;ls |grep "^[0-9]"|awk ‘ $0 >100‘) ;do awk ‘/Swap:/{a=a+$2}END{print ‘"$i"‘,a/1024"M"}‘ /proc/$... done | sort -k2nr | head -10可以看到pid=18906的这个经常 占用了最多的swap... -
内存空间还有很多,swap被使用
2016-05-23 00:25:28内存还有很多,使用了swap这时候,swap未必影响到性能:换句话说,现在swap里存储的还是不常使用的数据也就是swap正在发挥正常的作用)根据内存管理算法,当长时间没有访问内存page后,这个page就被换出了,不影响... -
此次faceswap只用到前两个板块Detection和Alignment: Detection - 用于找到视频中被换脸人的脸的位置 Alignment - 用于解决B脸和A脸的表情同步,判断正脸侧脸等问题 3 实现流程图 五个步骤:视频转图片、人脸...
-
Linux的swap空间需要设置多大?怎么释放SWAP
2019-07-12 14:52:45过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的swap岂不是太占用硬盘空间? 下图是虚拟内存和交换空间的映射关系,虚拟内存的存在,可以... -
[centos] 设置交换空间swap
2021-01-29 00:20:54前言 swap通常在传统机械硬盘上表现更好,在SSD上使用swap可能会造成问题,尤其是硬件老化之后。所以,对于DigitalOcean以及其他使用基于SSD的云主机服务的用户,我们不...一个系统可以设置多个swap,不过一般来说一 -
CentOS7上配置Swap交换空间
2020-05-15 16:07:25前言 swap通常在传统机械硬盘上表现更好,在SSD上使用swap可能会造成问题,尤其是硬件老化之后。所以,对于DigitalOcean以及其他使用基于SSD的云主机服务的用户,我们不推荐启用...一个系统可以设置多个swap,不过一 -
linux 的swap具体分析_SWaP的SWAP分区分析
2021-01-27 05:36:24展开全部SWAP就是LINUX下的虚拟内存分区,它62616964757a686964616fe78988e69d8331333361303030的作用是在物理内存使用完之后,...需要注意的是,虽然这个SWAP分区能够作为虚拟的内存,但它的速度比物理内存可是慢多了... -
浅析C语言中的5个swap函数
2013-11-25 09:14:50这些操作细节应该多积累,多练才能掌握的好啊! #include "stdafx.h" /*-----try to swap the value of a and b, but it does not work out.*/ /*void swap1(int x,int y) { int temp; temp = x; x = y; y = ... -
Swap 分区介绍和 增加Swap分区
2020-03-28 19:36:43Swap意思是交换分区,就是我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理... -
vim 设置 swap file, 防止 同一个文件同时被多次打开,而且有恢复的功效
2019-09-26 01:07:06在.vimrc里加入: set swapfile 即可以使能swap file, swapfile的名字一般是 .filename.swp (如 .doc.txt.swp) 若打开vi的时候不想使用 swapfile, 可以运行 vim -n filename ...先创建一个目录,如: ~/.vim/tm... -
内存还剩余很多,却使用 swap 分区
2020-07-27 15:50:00内存还剩余很多,却使用 swap 分区 原因 今天早上 AI 部门工程师来找我说,你会给 ubuntu 设置 swap 分区吗,我们机器内存好像不咋够用了,给我搞个 swap 分区吧!我说好的,这么简单分分钟钟的事情,我... -
关于swap
2015-04-20 14:05:00一个小小的swap确出现了好多个版本。不断的优化,不断的发现问题: 版本一: function swap(a,b){ var temp = a; a = b; b = temp; } 这个版本对于数组中的位置无法实现其交换功能。原因是在这种... -
linux swap 交换空间 设置多大合适
2020-03-21 12:03:24过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的swap岂不是太占用硬盘空间? 下图是虚拟内存和交换空间的映射关系,虚拟内存的存在,可以... -
swap交换分区
2020-06-27 12:11:10虚拟内存:将硬盘的一部分空间当作内存来使用。用来缓解物理内存不足的问题...硬盘已经没有剩余空间来创建swap分区时,在硬盘上创建一个swap文件来充当swap分区。 1、使用dd这个命令来创建一个128M的文件在/opt目录中: -
Swap是个什么东东?
2016-12-02 15:48:59一个CPU上跑多个进程, 但进程不知道到底有多少内存可以用,它能访问内存最大地址。例如16位系统就能访问2^16byte,32位就是2^32位。但是实际上没有那么多内存阿?怎么办?保护模式就应运而生了。 假设进程是一个... -
swap手法
2011-04-09 16:12:43swap手法不应当是C++独有的技术,很多语言都可以实现,并且从中得到好处。只是C++存在的一些缺陷迫使大牛们发掘,并开始重视这种有用的手法。这 个原本被用来解决C++的资源安全和异常保证问题的技术在使用中逐步... -
Linux swap分区
2019-08-11 21:26:35什么是swap?...简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到... -
Linux检查Swap交换空间的五个命令小结
2021-01-10 13:01:40Linux下可以创建两种类型的交换空间,一种是swap分区,一种是swap文件。前者适合有空闲的分区可以使用,后者适合于没有空的硬盘分区,硬盘的空间都已经分配完毕。例如:安装redhat的时候,你可以默认划分硬盘空间,... -
Linux的swap空间需要设置多大?
2017-11-07 23:28:04过去以来,虚拟内存的大小应该是物理内存的两倍,但是最近几年来,物理内存的大小至少都有了好几个GB,如果16G内存用32G的swap岂不是太占用硬盘空间? 下图是虚拟内存和交换空间的映射关系,虚拟内存的存在,可以...