精华内容
下载资源
问答
  • 各算法的框架,遗传,退火,蚁群以及相应的底层应用能够快速调用等等
  • 用STM8控制OPT3001采集光照强度,串口打印,亲测可用。代码,完整的工程,原理图等文件都放一起了,另外,我写了一份学习笔记,详细的说明了OPT3001的工作流程和原理,单片机如何去控制OPT3001工作都写的很清楚了,...
  • 驱动程序是基于STM8的,想用stm32或者其他单片机驱动也可以,简单改一下引脚...学习笔记也详细的说明了OPT3001的工作流程和原理,单片机如何去控制OPT3001工作等问题,保证看完都能懂。如果还有什么问题也欢迎联系我。
  • opt光源控制源码.zip

    2019-12-13 13:15:58
    c#控制opt光源控制源码,里面是一个控制类,窗体界面需要自己做。我们常用的 光源控制软件类,需要的可以下载,采用的是串口通信
  • 旅行商问题2-OPT算法的并行与优化。打包了串行版,并行版,运行的shell代码。
  • 请结合【Ubuntu下安装erlang开发环境】教程地址:https://blog.csdn.net/qq_32106647/article/details/87891423 使用
  • 奥普特环形光源(OPT-RI系列)pdf,奥普特环形光源(OPT-RI系列):环形光源提供不同角度照射,能突出物体的三维信息,有效解决对角照射阴影问题。高密度LED阵列,高亮度;多种紧凑设计,节省安装空间;可选配漫射板...
  • 光传感器opt3001的驱动,通过stm32f103的单片机读取数据
  • cpuminer-opt, 优化的多算法CPU挖掘器 cpuminer是由 Jones,djm34,Wolf0,pooler,Jeff,Jeff,ig0tik3d,elmad,Optiminer,Jeff的优化优化从其他挖掘工具的优化优化。所有的代码都被认为是开放的和免费的。 如果...
  • 最基本的蚁群算法+2opt邻域搜索_求解TSP(.xls格式)
  • opt分页算法的实现

    2015-05-23 22:02:01
    中北大学操作系统课程设计,opt分页算法的实现。
  • 该工程具体是在codeblock上面实现了操作系统课程上讲解的页面置换算法,包括先进先出(FIFO)、最佳置换算法(OPT)、最久最近未使用算法(LRU)。 具体实现功能有: 1、建立相应的数据结构 2、在屏幕上显示页面的...
  • 通过建立数组,寻找将来被访问的位置,进行页面置换算法
  • OPT最佳页面置换算法

    2013-12-19 10:12:29
    OPT算法的C语言实现,希望对你们有帮助!
  • OPT和LRU算法C语言实现

    热门讨论 2012-11-19 18:10:01
    用C语言实现的OPT和LRU算法,下载后直接用VC++6.0打开即可编译运行。亲测可用。
  • 操作系统_FIFO_LRU_OPT

    2011-05-31 00:25:37
    操作系统_FIFO_LRU_OPT.txt 操作系统_FIFO_LRU_OPT.txt 操作系统_FIFO_LRU_OPT.txt 操作系统_FIFO_LRU_OPT.txt 操作系统_FIFO_LRU_OPT.txt
  • OPT3001光照传感器驱动教学

    千次阅读 热门讨论 2019-11-02 20:54:43
    OPT3001学习笔记 一、OPT3001的寄存器 单片机是通过IIC协议读写OPT3001的寄存器来控制OPT3001的。所以我们要驱动这个芯片就必须先去了解它的寄存器。OPT3001有6个寄存器,都是16位寄存器,如图1所示。 1、 结果...

    OPT3001自学笔记

    OPT3001是一款低功耗环境光照度采集IC,之前的项目中有用到这颗芯片,因此在这里给大家分享一下,如果这篇文章刚好能帮到你那就更好了。

    一、OPT3001的寄存器

    单片机是通过IIC协议读写OPT3001的寄存器来控制OPT3001的。所以我们要驱动这个芯片就必须先去了解它的寄存器。OPT3001有6个寄存器,都是16位寄存器,如图1所示。
    图1 OPT3001寄存器
    1、 结果寄存器(地址:0x00):OPT3001采集完之后,光照数据就是存在这里。
    结果寄存器有16位,前4位是指数(用E[3:0]表示),后12位是尾数(用R[11:0]表示)。
    计算光照强度的公式为:光照强度=0.01x2 E[3:0] x R[11:0] (单位:lx 勒克斯)
    如:寄存器的数值为0x2356,2是指数,356是尾数,换算成十进制为854。那么光照强度为:0.01x22x854=34.16 lx

    2、 配置寄存器(地址:0x01):配置OPT3001采集的方式
    16位配置寄存器具体如表1所示:

    15141312111009080706050403020100
    RN[3]RN[2]RN[1]RN[0]CTM[1]M[0]OVFCRFFHFLLPOLMEFC[1]FC[0]

    15~12 RN - 配置测量光照的范围,当配置位1100传感器测量范围自动选择
    11 CT - 测量时间配置 0- 100Ms 1-800Ms
    10:9 M[1:0] - 转换模式:00:关闭模式 01:单次转换 10、11:连续转换
    8 OVF - 测量光照超出设定的范围或最大测量值 溢出标志
    7 CRF - 转换就绪字段 1-转换完成
    6 FH - 转换的光照值 大于上限值 置位
    5 FL - 转换的光照值 小于下限值 置位
    4 L - 中断输出的两种模式:1-窗口模式:这种模式下高限置位和低限置位INT输出,0-滞后模式:高限置位INT输出 具体看手册
    3 POL - INT 中断被触发输出极性 0:拉低 1:拉高
    2 ME - 掩码字段
    0:1 FC - 超出上限范围故障计数,如果超出次数,大于等于计数设定次,INT输出中断

    注:若要用窗口锁存模式,OPT3001触发中断后需要读取配置寄存器才能清除标志位。

    3、 下限寄存器(地址:0x02):设置触发下限,如果要用中断方式触发,需要用到

    4、 上限寄存器(地址:0x03):设置触发上限,如果要用中断方式触发,需要用到

    5、 产商ID寄存器(地址:0x7E):只读寄存器,固定为0x5449

    6、 设备ID寄存器(地址:0x7F):只读寄存器,固定为0x3001

    二、OPT3001的工作模式

    1、OPT3001自动采集转换数据,但不主动上报,单片机需要数据的时候去读取,计算。
    测量时间可以设置为100ms或者800ms,转换方式配置为连续转换,配置寄存器可以设为:0xCE10或者0xC410。
    2、OTP3001自动采集转换数据,超过上限或下限会触发中断,单片机可以通过读取配置寄存器清除OPT3001的中断。
    测量时间可以设置为100ms或者800ms,转换方式配置为连续转换,中断输出极性可以是高电平也可以是低电平,配置寄存器可以设为:0xCE10或者0xCE18。

    三、读写OPT3001的寄存器

    1、写入数据的步骤如下:
    1)IIC发送器件地址+读/写位,器件地址和ADDR的状态有关,具体如图2所示。如:ADDR接地,发送的读取命令为:10001000,即0x88,前7位是器件地址,最后一位0是读/写位,0是写入,1是读取。
    2)IIC发送需要写入数据的寄存器地址。如:需要写入配置寄存器,则发送0x01。
    3)IIC发送需要写入的数据(两个字节,分两次发送)。如往配置寄存器连续发送0xCE,
    0x10。
    2、读取的步骤如下:
    1)IIC发送器件地址+读/写位,器件地址和ADDR的状态有关,具体如图2所示。如:ADDR接地,发送的读取命令为:0x88。
    2)IIC发送需要读取数据的寄存器地址。如:需要读取结果寄存器,则发送0x00。
    3)IIC发送器件地址+读/写位,器件地址和ADDR的状态有关,具体如图2所示。如:ADDR接地,读取的读取命令为:0x89。
    4)IIC连续接收两个字节的数据。
    图2 OPT3001器件地址

    四、完整的IIC通讯过程

    1、 写入过程
    1)发送起始信号
    2)发送发送器件地址+0
    3)发送应答位
    4)发送寄存器地址
    5)发送应答位
    6)发送数据高8位
    7)发送应答位
    8)发送数据低8位
    9)发送应答位
    10)发送停止信号

    2、读取过程
    1)发送起始信号
    2)发送发送器件地址+0
    3)发送应答位
    4)发送寄存器地址
    5)发送应答位
    6)发送发送器件地址+1
    7)接收数据高8位
    8)发送应答位
    9)发送数据低8位
    10)不发送应答位
    11)发送停止信号
    IIC读取和写入的时序图如图3所示。
    图3 IIC时序图
    关于OPT3001这款芯片就介绍到这里,具体的代码要怎么写我这里就不详细说了,想要驱动源码的同学可以在下面的链接下载,如果还有什么问题或者文章中有哪些地方写的不对,都可以联系我,大家相互学习相互进步。

    驱动源码下载链接:
    https://download.csdn.net/download/shenzhen_zixian/11705851
    https://download.csdn.net/download/shenzhen_zixian/11939529

    展开全文
  • 2-opt优化——C语言实现

    千次阅读 2019-08-01 13:52:45
    概述 一般情况下,我们找最优路径采取贪心(greedy)策略,都可以收到一个比较好的成效,但是如果我们想要得到一个更优的解,这时候就...这里就介绍一种2-opt的优化方式。 基本思想 其实2-opt的想法非常简单 (1)我...

    概述

    一般情况下,我们找最优路径采取贪心(greedy)策略,都可以收到一个比较好的成效,但是如果我们想要得到一个更优的解,这时候就需要对我们的贪心策略进行优化。但是其实用一个算法找到最优的解是一个非常困难的问题,我们一般会用一个概率上的优化,就是如果重复次数足够多,找不到一个更好的解,我们就认为这个解是最优的。这里就介绍一种2-opt的优化方式。

    基本思想

    其实2-opt的想法非常简单
    (1)我们随机交换路径中的两个点的位置(当然也要保留这两个点之间的路径)
    比如说原路径为1 2 3 4 5,交换2, 5,我们得到的新路径为1 5 4 3 2
    (2)如果交换后的路径比原来的路径更加优化(一般是对比路径和),我们就保留交换后的路径。
    (3)重复(1),(2)直到交换N次仍然无法更新路径停止。

    具体实现的时候,首先是得到一条路径,我们可以随机给出一条路径,或者是用贪心先找到一条路径(推荐后者,因为这样更新路径的次数会少一些),然后生成两个随机数表示交换的两点,关于循环的次数N的选取,要自己经过试验选取一个较为合适的数字(较小则无法找到更优的解,较大导致运算时间过长,要自己实验得出最优化的选择)

    操作步骤

    (1)使用贪心算法找到一条路径记录在数组A中,并记录下总路径长l1。
    (2)随机生成两个不同的随机数n1,n2(将其对应到路径中顶点的下标),交换路径中n1,n2之间的路径,得到一条新路径并记录下路径总长l2。
    (3)比较新得到的路径总长与原来的路径总长,若新路径更短,则更新路径为新路径并将计数器cnt_opt置0。否则计数器加1.
    (4)重复(2),(3),直到计数器cnt_opt达到MaxCount,MaxCount即为上面提到的合理选择的循环次数N。

    代码实现

    int main() {
    	game_state_t state;
    	memset(&state, 0, sizeof(state));
    	init(&state);
    	// write your code here
    	int i, j;
    	int cnt_opt = 0;
    	double minpath = 0;
    	double minpath1 = 0;
    	n = state.n;
    	m = state.m;
    	op.x = state.start_x, op.y = state.start_y;
    	AdjGraph G;
    	Init(state, &G);
    	Floyd(G);
    	int num_in = (state.start_x * m + state.start_y);
    	for (i = 0; i < n; i++) {
    		for (j = 0; j < m; j++) {
    			if (state.food[i][j] == 1) {
    				n_food[count] = i * m + j;
    				count++;
    			}
    		}
    	}
    	count1 = count;          
    	while (count > 0) {      //这个while循环是用贪心找到一条路径
    		int nearest;
    		double MIN = 9999.9;
    		for (i = 0; i < m * n; i++) {
    			int u = i / m;
    			int v = i % m;
    			if (state.food[u][v] == 1 && A[num_in][i] < MIN && num_in != i) {
    				MIN = A[num_in][i];
    				nearest = i;
    			}
    		}
    		minpath += MIN;
    		int num_out = nearest;
    		num_in = num_out;
    		state.food[num_out / m][num_out % m] = 0;
    		pathway[count1 - count] = num_out;
    		count--;
    	}
    	num_in = (state.start_x * m + state.start_y);
    	srand((unsigned)time(NULL));          //随机数种子
    	while (cnt_opt <= MaxCount) {          //2-opt算法的循环
    		int n1, n2;
    		n1 = rand() % count1;
    		do {
    			n2 = rand() % count1;    
    
    		} while (n1 == n2);
    		if (n1 > n2) {
    			swap(&n1, &n2);
    		}
    		int left = n1, right = n2;
    		while (left < right) {           //交换两个随机数之间的路径得到新路径
    			swap(&pathway[left], &pathway[right]);
    			left++; right--;
    		}
    		minpath1 = 0;
    		for (i = 0; i < count1 - 1; i++) {
    			minpath1 += A[pathway[i]][pathway[i + 1]];
    		}
    		minpath1 += A[num_in][pathway[0]];
    		if (minpath1 < minpath) {
    			minpath = minpath1;
    			cnt_opt = 0;
    		}
    		else {
    			left = n1, right = n2;
    			while (left < right) {
    				swap(&pathway[left], &pathway[right]);
    				left++; right--;
    			}
    			cnt_opt++;
    		}
    	}
    	for (i = 0; i < count1; i++) {
    		int num_out = pathway[i];
    		BFS(G, num_in, num_out);
    		transfor(num_out, &state);
    		j = 0;
    		while (path_BFS[j] != num_out) {
    			printf("%c", p[j]);
    			j++;
    		}
    		num_in = num_out;
    	}
    	destroy(&state);
    	system("PAUSE");
    	return 0;
    }
    

    这个代码实现的问题是一个简单的吃豆人寻找最优吃豆路径的算法,地图数据存储在util.h头文件里面,还有较多的数据结构为给出有需要的自取源码
    https://github.com/yiguang-hack/2-opt/tree/master

    展开全文
  • 操作系统 页面置换算法 OPT(最佳置换算法) 郑州大学 大作业
  • 页面置换算法OPT+FIFO+LRU+clock

    热门讨论 2012-12-31 12:06:40
    C语言 页面置换算法 OPT FIFO LRU clock
  • 低工作电流:1.8μA(典型值) 工作温度范围:-40°C至+ 85°C 宽电源电压范围:1.6 V至3.6 V 5.5-V容错I / O PCB尺寸:14*13.5mm OPT3001数字环境光传感器(ALS)高精度的人眼响应分线板 OPT3001是测量可见光的强度...

    上面是我的微信和QQ群,欢迎新朋友的加入。

    写了个光强传感器的代码。

    产品特点:
    精密光学滤波以匹配人眼:拒绝IR> 99%(典型值)
    自动满量程设定功能简化了软件,并确保正确的配置
    0.01勒克斯至83K勒克斯
    23位有效动态范围,自动增益范围
    12二进制加权满量程范围设置:<0.2%(典型值)范围之间的匹配
    低工作电流:1.8μA(典型值)
    工作温度范围:-40°C至+ 85°C
    宽电源电压范围:1.6 V至3.6 V
    5.5-V容错I / O
    PCB尺寸:14*13.5mm
    
    OPT3001数字环境光传感器(ALS)高精度的人眼响应分线板
    OPT3001是测量可见光的强度的传感器。传感器的光谱响应紧密匹配的人眼的明视响应并包括显着红外线排斥。
    所述OPT3001是一个单芯片照度计,由人眼测量光作为??可见光的强度。精密光谱响应和强大的红外抑制装置的使OPT3001精确计人眼所看到不管光源的光的强度。强劲的IR抑制,也有助于保持高精确度时的工业设计为深色玻璃下安装传感器的美学要求。该OPT3001是专为创造人类基于光的经验系统,和理想的首选替代品光电二极管,光敏电阻,或者用更少的人眼匹配的IR抑制等环境光传感器。
    测量可以从0.01勒克斯到83K勒克斯而不通过使用内置的,全面设置功能手动选择满量程范围进行。这个功能允许在一个23位的有效动态范围光测量。
    数字操作灵活的系统集成。测量可以是连续的或单次。控制和中断系统具有自主运行,允许处理器睡觉而适当唤醒事件传感器搜索,通过中断引脚报告。
    低功率消耗和OPT3001的低电源电压的能力提高电池供电系统的电池寿命。

    模块是一个IIC驱动的传感器

    这里提供底层IIC驱动源码

    /*
    功能:产生IIC起始信号
    输入:无
    输出:无
    */
    void IIC_Start(void)
    {
    	SDA_OUT();     //sda线输出
    	IIC_SDA=1;	  	  
    	IIC_SCL=1;  
    	delay_us(5);
     	IIC_SDA=0;     //START:when CLK is high,DATA change form high to low 
    	delay_us(5);
    	IIC_SCL=0;     //钳住I2C总线,准备发送或接收数据 
    }	  
    
    /*
    功能:产生IIC停止信号
    输入:无
    输出:无
    */
    void IIC_Stop(void)
    {
    	SDA_OUT();//sda线输出
    	IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
     	IIC_SCL=1;
    	delay_us(5);
    	IIC_SDA=1;//发送I2C总线结束信号
    	delay_us(5);
    	IIC_SCL=0; 
    	delay_us(5);						   					   	
    }
    
    /*
    功能:等待应答信号到来
    输入:1,接收应答失败
          0,接收应答成功
    输出:无
    */
    uint8_t IIC_Wait_Ack(void)
    {
    	uint8_t res=0;
    	IIC_SDA=1;
    	SDA_IN();      //SDA设置为输入  
    	IIC_SCL=1;delay_us(5);	
      
    	res = READ_SDA;
    	delay_us(5);	
    	IIC_SCL=0;//时钟输出0 	  
    	
    	return res;  
    } 
    
    /*
    功能:产生ACK应答
    输入:1,产生应答
          0,不产生应答
    输出:无
    */
    void IIC_Ack(uint8_t ack)
    {
    	SDA_OUT();
    	IIC_SDA=ack;
    	delay_us(5);
    	IIC_SCL=1;
    	delay_us(5);
    	IIC_SCL=0;
    }
    		 				
    /*
    功能:IIC发送一个字节
    输入:txd:发送数据
    输出:无
    */
    void IIC_Send_Byte(uint8_t txd)
    {                        
    	uint8_t t;   
    	SDA_OUT(); 	    
    
    	for(t=0;t<8;t++)
    	{             
    		if(txd&0x80)
    			IIC_SDA=1;
    		else 
    			IIC_SDA=0;
    			
    			 
    		delay_us(5);
    		IIC_SCL=1;
    		delay_us(5); 
    		IIC_SCL=0;	
    		delay_us(5);
    		txd<<=1; 
    	}	
    
    	IIC_Wait_Ack();	
    } 	    
    
    /*
    功能:IIC读取一个字节
    输入:无
    输出:返回数据
    */
    uint8_t IIC_Read_Byte(void)
    {
    	unsigned char i,receive=0;
    	SDA_IN();//SDA设置为输入
    	IIC_SDA=1;
        for(i=0;i<8;i++ )
    	{
    		receive <<= 1;
            IIC_SCL=1; 
            delay_us(5);
    		receive |= READ_SDA;
    		IIC_SCL=0; 
    		delay_us(5);
        }					 
    	
        return receive;
    }
    

    然后是阅读该传感器的数据手册

    1、设备地址

    从手册可知道,这个模块有四种地址配置

    通过设置ADDR的连接,可以改变不同的设备地址

    //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改 拉低0x88  拉高0x8A  接SDA-0x8C 接SCL-0x8E

    #define    SLAVEADDR    0x88

    2、设备子地址

    一共是6个地址,还蛮简单的,有一点要注意的是,这个芯片是16位的数据寄存器

    3、只读寄存器

    这是传感器数据保存的地址,要从传感器拿环境光强数据,就是在这拿,这个地方是只读的

    4、配置寄存器

    这是个十分重要的寄存器,不同的配置可能会导致读取的数据不一样

    5、下限寄存器、上限寄存器

    我没用到

    6、ID寄存器

    这个地方挺重要的

    这个东西有两个ID:1.厂商ID 2.设备ID

    为什么说他重要,可以通过读取ID,确定IIC驱动是否正常,如果这个ID读取不到,那后面的程序也没必要写下去了

    从数据手册可以知道,设备厂商ID是0x5449,也就是ACSII码的"TI",设备ID是0x3001

    7、初始化寄存器配置

    上面就是芯片手册里面比较重要的寄存器的内容

    现在根据配置寄存器的内容,实现芯片的配置,当然,这段配置我也是抄的,非专业我懒得去折腾

    /*
    功能:配置寄存器
    输入:无
    输出:无
    */
    void opt3001_config(void)
    {
    	uint16_t vCfg = 0;
    	
    	//12:15 RN  	- 配置测量光照的范围 见手册20页表9  当配置位1100传感器测量范围自动选择
    	//11    CT  	- 测量时间配置 0- 100Ms  1-800Ms
    	//10:9  M[1:0]	- 转换模式 00-关闭模式  01 - 单次转换  10、11 - 连续多次转换
    	//8     OVF     - 测量光照超出设定的范围或最大测量值 溢出标志
    	//7     CRF		- 转换就绪字段 1-转换完成
    	//6     FH		- 转换的光照值 大于上限值 置位
    	//5     FL		- 转换的光照值 小于下限值 置位
    	//4     L		- 中断输出的两种模式  1-窗口模式 这种模式下高限置位和低限置位INT输出  0-滞后模式 高限置位INT输出 具体看手册
    	//3     POL		- INT 中断被触发输出极性 0-拉低  1-拉高
    	//2     ME 		- 掩码字段
    	//0:1   FC		- 超出上限范围故障计数  如果超出次数 大于等于计数设定次数  INT输出中断
    	
    	vCfg = (0x0C<<12);
    	vCfg |= (0x01<<11);
    	vCfg |= (0x01<<9);
    	vCfg |= (0x01<<4);
    	opt3001_write(REG_CONFIGURATION, vCfg);
    }

    8、实现ID的读取

    /*
    功能:读取厂商ID
    输入:无
    输出:无
    */
    uint16_t ID=0;
    void opt3001_manufacturer_id(void)
    {
    	ID = opt3001_read(REG_MANUFACTURER_ID);
    }
    
    /*
    功能:读取设备ID
    输入:无
    输出:无
    */
    void opt3001_device_id(void)
    {
    	ID = opt3001_read(REG_DEVICE_ID);
    }

    9、实现数据的获取

    /*
    功能:读取传感器数据
    输入:无
    输出:无
    */
    #define ARRY_SIZE 10
    uint32_t opt3001_data[ARRY_SIZE];
    uint8_t arry_wpr=0;
    
    uint8_t opt3001_get_lux(void)
    {
    	uint8_t		vRval 	= 0;
    	uint16_t  	vCfg 	= 0;
    	uint16_t  	vDat 	= 0;
    	
    	uint16_t  	vDatE = 0;
    	uint16_t  	vDatR = 0;
    	
    	float   vFval 		= 0.0;
    	float   vLsbSize 	= 0.0;
    	float   vFlux 		= 0;
    	
    	vCfg = opt3001_read(REG_CONFIGURATION);
    	vCfg |= (0x01<<9);
    	opt3001_write(REG_CONFIGURATION, vCfg);		//单次采集光照
    	
    	vCfg = opt3001_read(REG_CONFIGURATION);
    	delay_ms(900);								//大于800Ms
    	
    	vCfg = opt3001_read(REG_CONFIGURATION);
    	if((vCfg&(0x01<<7)) )						//光照采集完成
    	{
    		vDat = opt3001_read(REG_RESULT);
    		
    		vDatE = ((vDat&0xF000)>>12);
    		vDatR = (vDat&0x0FFF);
    		
    		vFval = (0x01<<vDatE);
    		vLsbSize = (0.01f * vFval);
    		
    		vFlux  = (vLsbSize * (float)vDatR);
    		opt3001_data[arry_wpr] = ((vFlux)*100.0f);//透明外壳不需要矫正 ,乳白色外壳推荐*1.8矫正 *vp_Lux = ((vFlux*1.8)*100.0)
    		arry_wpr++;	
    		if(arry_wpr >= ARRY_SIZE)		
    		{
    		arry_wpr = 0;
    		}
    	}
    	else
    	{
    		vRval = 0x01;//光照采集失败
    	}
    	
    	return vRval;
    }

    10、DEBUG看结果

    首先检查厂商ID

    然后查设备ID,可以看到,和数据手册是一致的

    最后实现光强测试

    可以看到数据会因为光强变化而变化

    展开全文
  • 全面的页面置换算法(opt、fifo、lru、clock),很全。
  • JAVA_OPT理解及调优理论

    千次阅读 2019-03-25 16:30:00
    以RocketMQ的namesrv和broker启动为例,理解CMS和G1垃圾收集器下的jdk参数 CMS垃圾收集器 ...set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspac...

    以RocketMQ的namesrv和broker启动为例,理解CMS和G1垃圾收集器下的jdk参数

    CMS垃圾收集器

    以RocketMQ中runserver.cmd为例,这是启动NameSrv的命令行文件

    set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    set "JAVA_OPT=%JAVA_OPT% -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:-UseParNewGC"
    set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:"%USERPROFILE%\rmq_srv_gc.log" -XX:+PrintGCDetails"
    set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"
    set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages"
    set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib"
    set "JAVA_OPT=%JAVA_OPT% -cp "%CLASSPATH%""
    "%JAVA%" %JAVA_OPT% %*

    -server

    -sever:在多个CPU时可优化性能

    -Xms和-Xmx设置为 FullGC之后的老年代内存占用的3-4倍

    -Xms:初始heap大小,使用的最小内存,CPU性能高时此值应设大一些;一般和Xmx一样,避免每次gc后JVM重新分配内存

    -Xmx:heap的最大值

    -Xmn:为年轻代配置一个大堆(可以并行收集),再次利用大内存系统。它有助于防止短期对象过早地被提升到旧一代,垃圾收集更加昂贵。

    -XX:MetaspaceSize -XX:MaxMetaspaceSize

    前言:Metaspace即元数据空间,1.8之后用来替代Perm永久代的。perm是用来存储klass(class文件在jvm里的运行时数据)等信息的;jvm在启动时会根据配置的-XX:MaxPermSize及-XX:PermSize来分配一块连续的内存块,但随之动态类加载增加,这块内存如果小了就会出现内存溢出,多了又会浪费内存。所以出现了元数据区Metaspace希望能解决内存管理的问题。

    Metaspace由Klass Metaspace和NoKlass Metaspace组成。这两块均是由类加载共享的。当类加载时,其类加载器拥有的SpaceManager管理属于自己内存空间,这样很容易将Klass Metaspace使用完,即出现OOM,不过一般情况下不会,NoKlass Mestaspace是由一块块内存慢慢组合起来的,在没有达到限制条件的情况下,会不断加长这条链,让它可以持续工作。

    MetaspaceSize:用于控制metaspaceGC发生的初始阈值,默认是20.8M左右

    MaxMetaspaceSize:默认基本是无限大,但如果不设置metaspace是会被无限使用的,如果设置了数值,与MaxPermSize不同,在jvm启动时,不会创建很大的Metaspace,但Permspace会。

    -XX:+UseConcMarkSweepGC

    使用CMS收集器,通过多线程并发进行垃圾回收,尽量减少垃圾回收带来的停顿。

    -XX:+UseCMSCompactAtFullCollection

    CMS收集器的一个开关,默认为true;用于在Full GC(不是CMS并发GC)之后增加一个碎片的管理过程;因为CMS是基于“标记-清除”算法实现的收集器,这种算法会导致大量的碎片,如果遇到给大对象分配内存空间时,可能会出现找不到连续的空间来分配而不得不提前触发Full GC

    -XX:CMSInitiatingOccupancyFraction=70

    指设定CMS在对内存占用率达到70%时开始GC,默认是68%,因为CMS的垃圾算法会产生碎片所以一般提早GC

    -XX:+CMSParallelRemarkEnabled

    开启并行标记,减少停顿的时间

    -XX:+CMSClassUnloadingEnabled

    只有在使用CMS垃圾收集器的情况下,表示在使用CMS垃圾回收时是否启动类卸载功能,默认不启用,如果启用,垃圾回收就会清除持久代,移除不再使用的class

    -XX:SoftRefLRUPolicyMSPerMB

    因为soft reference软引用对象只有在垃圾回收的时候才被清除,但垃圾回收不总是执行。所以设置对象存货的毫秒数,这里为0即不被引用就清除

    -XX:SurvivorRatio=8

    表示新生代的eden区:from区:to区= 8:1:1

    -XX:-UseParNewGC

    关闭年轻代的并行GC,因为当前使用-XX:+UseConcMarkSweepGC,所以-XX:UseParNewGC默认是开启的。

    -verbose:gc

    用于垃圾收集时的信息打印,和-XX:+PrintGC功能相同

    -XX:-OmitStackTraceInFastThrow

    关闭JVM优化抛出堆栈异常:对于一些频繁抛出的异常,jdk会为了性能而做出优化,jit重编译后会抛出没有堆栈的异常;在-sever模式下,该优化是默认开启的。也就是说JIT重新编译前,log中是能看见旧有堆栈的异常。

    -XX:-UseLargePages

    不使用内存分页;因为现代CPU是通过寻址来访问内存的。现引入了MMU(内存管理单元)用来解决比如32位的CPU的物理内存为4G,一般可用小于4G,当程序需要使用4G内存时,程序不得不降低内存占用。

    而内存分页就是在MMU基础上提出的一种内存管理机制。它将虚拟地址和物理地址按照固定的大小分割成页和页帧,并保证页与页帧大小相同,这种机制保证访问内存的高效性,并使系统支持使用非连续的内存空间。这时候物理地址与虚拟地址需要同过映射来寻址,而映射关系存储在页表中,而页表存在于内存中。因为CPU通过总线访问存在于内存中页表效率仍旧不高,所以引入TLB页表缓冲寄存器,用来缓冲部分经常访问的页表内容。而我们设置的内存分页就是页表缓冲寄存器是否能支持大内存分页。如果启用,则通过设置-XX:LargePageSizeInBytes=10m设置大小

    G1垃圾收集器

    以RocketMQ中runbroker.cmd为例,这是启动Broker的命令行文件

    set "JAVA_OPT=%JAVA_OPT% -server -Xms2g -Xmx2g -Xmn1g"
    set "JAVA_OPT=%JAVA_OPT% -XX:+UseG1GC -XX:G1HeapRegionSize=16m -XX:G1ReservePercent=25 -XX:InitiatingHeapOccupancyPercent=30 -XX:SoftRefLRUPolicyMSPerMB=0 -XX:SurvivorRatio=8"
    set "JAVA_OPT=%JAVA_OPT% -verbose:gc -Xloggc:%USERPROFILE%\mq_gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintAdaptiveSizePolicy"
    set "JAVA_OPT=%JAVA_OPT% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=30m"
    set "JAVA_OPT=%JAVA_OPT% -XX:-OmitStackTraceInFastThrow"
    set "JAVA_OPT=%JAVA_OPT% -XX:+AlwaysPreTouch"
    set "JAVA_OPT=%JAVA_OPT% -XX:MaxDirectMemorySize=15g"
    set "JAVA_OPT=%JAVA_OPT% -XX:-UseLargePages -XX:-UseBiasedLocking"
    set "JAVA_OPT=%JAVA_OPT% -Djava.ext.dirs=%BASE_DIR%lib"
    set "JAVA_OPT=%JAVA_OPT% -cp %CLASSPATH%"

    -XX:+UseG1GC

    G1垃圾收集器,jdk1.7后出现,为了代替CMS收集器。G1收集器是一个并行的,并发的,增量式压缩停顿短暂的垃圾收集器。G1与其他收集器不一样,不区分年轻代和老年代空间。被用于多处理器和大容量内存的环境,且整理空闲空间更快。

    相比较于CMS收集器,G1垃圾收集的同时整理内存,不会产生很多内存碎片。G1的停顿时间可预测,用户可以在指定期望时间停顿。

    -Xmn

    设置年轻代大小会干预G1,无法根据需要增大或缩小年轻代的大小。

    -XX:G1HeapRegionSize=16m

    Region大小。其他GC将连续的内存空间划分为新生代,老年代和永久代(元空间),但G1根据其垃圾收集机制会将每一代用多个不连续相同大小的区域称为region存储,除了为三代划分空间,G1还新提供存储巨大对象的功能-H-objs,为减少H-objs分配对GC的影响,需要把大对象变为普通对象建议增大Region size。G1HeapRegionSize的取值范围2^0--2^6M,如果不设定G1将根据heap大小自动决定。

    -XX:G1ReservePercent=25

    增大堆内存大小,默认是10,因为JVM在回收存活或晋升对象的时候,栈区溢出就会发生失败,因为堆的使用已经到达极限。

    -XX:MaxGCPauseMillis=200

    设置目标最大暂停时间,JVM会尽可能完成它,但不一定实现;如果设置了-Xmn说明禁用目标暂停时间

    -XX:InitiatingHeapOccupancyPercent=30

    整个堆栈使用达到百分之30的时候,启动GC周期,0表示一直GC

    -XX:+PrintGCDetails

    堆栈溢出异常,可以用于打印to-space overflow日志

    -XX:+UseGCLogFileRotation

    打开GC日志滚动记录功能,默认为0(即不限制)

    -XX:NumberOfGCLogFiles=5

    日志文件数量

    -XX:GCLogFileSize=30m

    日志文件大小

    -XX:+AlwaysPreTouch

    在调用main函数之前,使用所有可用的内存分页,这个选项可用于测试长时间运行的系统

    -XX:-UseBiasedLocking

    JVM默认启用偏向锁,但竞争激烈时,偏向锁会增加系统负担(锁会偏向当前已经占用锁的线程)

    转载于:https://www.cnblogs.com/hangzhi/p/10594532.html

    展开全文
  • Python Scikit-opt调包实践

    千次阅读 2020-07-31 21:44:59
    今天看见原来Python也有相应的优化算法包scikit-opt,但安装时出现了问题,具体可见博客。 接下来就开始快乐的学习调包吧! 今天主要学习遗传算法和模拟退火算法实现,先对这两种算法做一个简单介绍。 遗传算法 遗传...
  • 在有关Email营销和邮件列表的英文文章中,经常会出现一些专业词汇或者缩写字母,常见的有:PEM,UCE, Opt-in,Double Opt-In,Opt-out等,其中部分术语可能没有非常贴切的中文词汇。根据作者个人的理解,在《Email...
  • 设置安装在/opt项目的脚本(将它们的命令、手册页等绑定到标准位置)。 安装 在 /opt/setup/ 中创建包含这些脚本的目录。 在系统范围内安装: # git clone https://github.com/powerman/inferno-opt-setup.git $...
  • scikit-opt实现遗传算法

    千次阅读 2020-07-16 18:01:54
    最近学了下遗传算法,然后用scikit-opt包实现了一下,玩了一玩,这个包继承了scikit learn的编写思路,使用起来很简单,而且是中国人写的,文档里有中文版和英文版。官方链接,不过似乎这个包写的时间还不长,使用的...
  • 操作系统:页面置换算法OPT算法实验(C语言)

    千次阅读 多人点赞 2020-11-23 11:21:40
    OPT算法实验 实验内容: 已知页面访问序列,采用OPT页面置换算法,求缺页次数、页面置换次数和缺页率。 实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求...
  • av_opt_set函数族详解

    千次阅读 2016-12-20 16:46:26
    1、av_opt_set 是设置AVOptions的参数 例如   AVFilter* filter_src_desk = avfilter_get_by_name("buffer"); AVFilter* filter_src_cam = avfilter_get_by_name("buffer"); AVFilter* filter_sink = avfilter_ge
  • OPT页面置换算法1

    千次阅读 2019-06-09 17:31:47
    OPT页面置换算法1 OPT简单/简陋/算法实现 对于页面置换计数有待改进 当要调入一页而必须淘汰旧页时,应该淘汰以后不再访问的页,或距现在最长时间后要访问的页面。它所产生的缺页数最少,然而,却需要预测程序的页面...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 684,306
精华内容 273,722
关键字:

opt