Error, some other host already uses address
确认配置的IP地址是没有在用的,解决办法找到了,但是没找到什么原因;
注释/etc/sysconfig/network-scripts/ifup-eth文件内容:
#if ! arping -q -c 2 -w 3 -D -I ${REALDEVICE} ${IPADDR} ; then
# net_log $"Error, some other host already uses address ${IPADDR}."
# exit 1
#fi
-EOF-
本文在uCOS II上增加时间片任务调度的的原理:
对设置为同优先级的任务使用时间片调度,不同优先级任务仍然使用uCOS II的优先级调度策略。在同优先级任务的时间片调度中,所有任务暂时时间片长度固定,时间片的调度使用FIFO(先进先出)队列。
整体的描述参看下图。
上图中假设有3个优先级为5的任务,3个优先级为8的任务。纵向,第一列的OS_TCB形成OSTCBList双向链表(通过OSTCBNext和OSTCBPrev指针,这是原uCOS II系统已经有的部分)。横向,通过OSPSPrev和OSPSNext指针形成时间片链表(实际上是FIFO),这部分是我们在uCOS II上要增加的内容。第一列的任务每当有任务时间片用完后将挪到队列尾,从FIFO中选择下一个任务,这就是本文的时间片调度的过程。总体上看来,不同优先级使用了uCOS II原有的优先级调度策略,相同优先级之间增加了时间片调度策略,因此本文称为“优先级+时间片”联合调度。
下面我们列出实现时间片调度要修改的一些结构和函数,我们可以通过调试跟踪了解uCOS II的机理,从而理解为什么要这么做。
1 修改结构体OS_TCB(ucos_ii.h文件中)
增加4个成员变量用于时间片调度。
struct os_tcb { ... /* 增加下面4个成员 */ struct os_tcb *OSPSNext; /* 同一优先级下,每个任务的后向指针 */ struct os_tcb *OSPSPrev; /* 同一优先级下,每个任务的前向指针 */ INT8U OSPSLen; /* 该任务分配的时间片 */ INT8U OSPSCurLen; /* 该任务当前剩下的时间片 */ } OS_TCB;
2 修改OS_TCBInit任务结构体初始化函数(os_core.c文件)
在OS_TCBInit中增加时间片长度的初始化,我们可以先在os_cfg_r.h中宏定义一个时间片长度用于不同情况下的配置,
#define TIME_SLICE_LEN 10
OS_TCBInit函数中增加结构体成员初始化
ptcb->OSPSLen = TIME_SLICE_LEN; ptcb->OSPSCurLen = TIME_SLICE_LEN; ptcb->OSPSNext = (OS_TCB*)0; ptcb->OSPSPrev = (OS_TCB*)0;
当出现同优先级的情况时,任务控制块插入到时间片链表中而不是优先级链表中,OS_TCBInit函数中要增加将任务插入到时间片链表的过程,我写的一个示例如下:
if (ptcb != (OS_TCB *)0) { ... OSTCBPrioTbl[prio] = ptcb; if (OSTCBList != (OS_TCB *) 0) { /* 不存在同优先级任务, 按照uCOS ii方法链接到OSTCBList */ ptcb->OSTCBNext = OSTCBList; /* Link into TCB chain */ ptcb->OSTCBPrev = (OS_TCB *)0; if (OSTCBList != (OS_TCB *)0) { OSTCBList->OSTCBPrev = ptcb; } OSTCBList = ptcb; OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */ OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX; } else { /* 出现同优先级情况,链接到时间片链表 */ while(ptcb1->OSPSNext!=(OS_TCB*) 0) { ptcb1=ptcb1->OSPSNext; /* move to the rear of time slice list */ } ptcb1->OSPSNext = ptcb; ptcb->OSPSPrev = ptcb1; ptcb->OSPSNext=(OS_TCB*) 0; ptcb->OSTCBNext = (OS_TCB *)0; ptcb->OSTCBPrev = (OS_TCB *)0; } OSTaskCtr++; /* Increment the #tasks counter */ OS_EXIT_CRITICAL(); return (OS_ERR_NONE); }
增加时间片调度的内容,这是时间片调度的主要部分。给出一个示例:
OSTimeTick (void) { ... OS_TCB *ptcb1; if (OSRunning == TRUE) { ptcb = OSTCBList; /* Point at first TCB in TCB list */ while (ptcb->OSTCBPrio != OS_IDLE_PRIO) { /* Go through all TCBs in TCB list */ OS_ENTER_CRITICAL (); /* delay time out */ ... /* time slice count down */ if (ptcb->OSPSCurLen != 0) { --ptcb->OSPSCurLen; } else { /* time slice out */ /* reload time slice */ ptcb->OSPSCurLen = ptcb->OSPSLen; ptcb1 = ptcb->OSPSNext; if (ptcb1 != (OS_TCB*) 0) { /* there are some tasks with the same priority */ /* (1) link new to priority-level list */ ptcb1->OSTCBNext = ptcb->OSTCBNext; ptcb1->OSTCBPrev = ptcb->OSTCBPrev; if (ptcb->OSTCBNext != (OS_TCB *)0) { ptcb->OSTCBNext->OSTCBPrev = ptcb1; } if (ptcb->OSTCBPrev != (OS_TCB *)0) { ptcb->OSTCBPrev->OSTCBNext = ptcb1; } ptcb->OSTCBPrev = (OS_TCB *)0; ptcb->OSTCBNext = (OS_TCB *)0; /* (2) update OSTCBList if TCBcur is OSTCBList*/ if (ptcb == OSTCBList) { OSTCBList = ptcb1; } /* (3) Compute X, Y, BitX and BitY */ ptcb1->OSTCBY = ptcb1->OSTCBPrio >> 3; ptcb1->OSTCBBitY = OSMapTbl[ptcb1->OSTCBY]; ptcb1->OSTCBX = ptcb1->OSTCBPrio & 0x07; ptcb1->OSTCBBitX = OSMapTbl[ptcb1->OSTCBX]; /* (4) set task to be ready */ if (ptcb1->OSTCBDly == 0) { OSRdyGrp |= OSMapTbl[ptcb1->OSTCBY]; OSRdyTbl[ptcb1->OSTCBY] |= OSMapTbl[ptcb1->OSTCBX]; } /* (5) move ptcb to the rear of queue */ while(ptcb1->OSPSNext!=(OS_TCB*) 0) { ptcb1=ptcb1->OSPSNext; } ptcb1->OSPSNext = ptcb; ptcb->OSPSPrev = ptcb1; ptcb->OSPSNext=(OS_TCB*) 0; /* (6) set OSTCBPrioTbl for Context switch */ OSTCBPrioTbl[ptcb1->OSTCBPrio]=ptcb1; } else { // do nothing } } /* * (7) don't forgot that after time slice * schedule, ptcb->OSTCBNext==NULL */ if (ptcb->OSTCBNext != (OS_TCB*)0) { ptcb = ptcb->OSTCBNext; } else if (ptcb1->OSTCBNext != (OS_TCB*)0) { ptcb = ptcb1->OSTCBNext; } else { break; } OS_EXIT_CRITICAL (); } } }
OK,修改好上面的内容就大致实现了在uCOS II上增加时间片调度的过程,通过修改时间片长度TIME_SLICE_LEN可以验证时间片长度对任务调度的影响。本文最后在硬件平台STM32F103RB上测试通过,但因为时间片的引入而且未对程序做相关优化,因此时间片调度的实时性提高上还有待完善。
weblogic开发模式与生产模式介绍
开发模式:该模式启用自动部署
生产模式:该模式关闭自动部署
weblogic server 三种部署方法:自动部署、控制台部署、命令部署
自动部署:当其处于启用状态时,管理服务器将建设指定的目录以确定是否有新建的或者更新的应用程序,Weblogic server 将自动部署该目录中的所有文件或目录。
默认情况下,自动部署目录为域的"/home/weblogic/bea/user_projects/domains/domainname/autodeploy"子目录,在autodeploy目录中找到任何新文件都将自动部署,applications目录中编辑或者修改的归档文件将会重新部署。
如果应用程序处于展开格式,则创建一个名为REDEPLOY的空文件,将其放置在WEB-INF目录中,然后当应用程序需要重新部署时,请修改该文件更新其时间戳,服务器将定期检查对REDEPLOY文件时间戳的更新。 最后,当前存在的applications目录中,后来被删除的文件自动从应用服务器中取消部署。
控制台部署:登陆控制台,选择部署项目,进行下一步,下一步部署
命令部署:WLST (这个相对用的较少)
其他地方借鉴的介绍(个人认为比较靠谱):
可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一.或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true.
就是这一段
@rem Set Production Mode. When set to true, the server starts up in production mode. When
@rem set to false, the server starts up in development mode. The default is false.
set STARTMODE=true
---------------------------------------------------------------
据weblogic技术工程师说,产品模式是为保证速度快放在指定目录下,他的包不会自动更新。开发模式是比较自由的,它保证开发灵活性,随便把它扔哪里都会自动更新,这样会影响速度。一般地开发好的产品,都给客户用产品模式部署。
---------------------------------------------------------------
You can start your domain in one of two modes, development or production. You use development mode while you are developing your applications. Development mode uses a relaxed security configuration and allows you to auto-deploy applications. You use production
mode when your application is running in its final form. A production domain uses full security and may use clusters or other advanced features.
---------------------------------------------------------------
开发模式下,主要是为了满足用户的应用经常变化的需求,server会自动刷新你的应用,可以立即看到更改的最新页面,但是这样就会影响效率。所以,在正式运行的环境,一般应用变化较少,建议选择产品模式提高性能。
---------------------------------------------------------------
开发模式下支持热部署,同时启动的速度慢,运行性能不如产品模式。
生产模式与开发模式转换:
1、生产模式--》开发模式
将domain路径下%DOMAIN_HOME%\bin\setDomainEnv.cmd文件set PRODUCTION_MODE=true 更改为 set PRODUCTION_MODE=false 或set PRODUCTION_MODE=
将%DOMAIN_HOME%\config\config.xml文件中<production-mode-enabled>true</production-mode-enabled>更改为<production-mode-enabled>false</production-mode-enabled>或者直接删掉。
2、开发模式--》生产模式
将domain路径下%DOMAIN_HOME%\bin\setDomainEnv.cmd文件set PRODUCTION_MODE= 更改为 set PRODUCTION_MODE=true
ps:上面是Windows环境下更改配置的方法,linux环境下很类似。