精华内容
下载资源
问答
  • hi3531 区域管理region

    2013-07-30 16:14:21
     REGION用于管理这些区域资源,区域管理可以实现区域的创建,并叠加到视频中对视频进行遮挡。  实际应用中,用户通过创建一个区域,通过HI_MPI_RGN_AttachToChn,将该区域叠加到某个通道(如group

          用户一般要在视频中叠加OSD用于显示一些特定的信息(如:通道号,时间戳,字幕等),必要时还会填充色块。这些叠加在视频上的OSD和挡在视频上的色块统称为区域。

          REGION用于管理这些区域资源,区域管理可以实现区域的创建,并叠加到视频中对视频进行遮挡。

          实际应用中,用户通过创建一个区域,通过HI_MPI_RGN_AttachToChn,将该区域叠加到某个通道(如group)中。在进行通道调度时,则会将OSD叠加在视频中。一个区域支持通过支持通过设置通道显示属性接口指定到多个通道中(如多个group通道,多个vi通道,),并支持在每个通道的显示属性(如位置,层次,透明度)。

         主要概念:

        Overlay  视频叠加区域,实现在GROUP通道进行位图的加载和背景色更新

        Cover    视频遮挡区域,实现在VI通道填充纯色块。由VI硬件自身完成。

        CoverEx 
                      扩展视频遮挡区域,实现在绑定通道填充纯色块,当Cover个数不能满足用户需求时,可以使用此扩展cover。

      区域层次   区域层次表示区域的叠加级别,层次值越大,表示区域的显示级别越高。当发生重叠时,层次值大的将会覆盖层次值小的。如果是同一级别,则根据区域叠加的
                         先后顺序,后叠加的将显示在上层。


      位图填充(针对Overlay和OverlayEx有效) 位图填充是指将位图的内存值填充到区域内存空间中位图将会从区域的左上角开始填充。当位图小于区域时,将只能填充一部分内存,剩                    余部分保持原有值;位图大小等于区域时,将刚好全部填充;当位图大于区域时,位图只能将自身和区域一样大小的内存信息填充到区域中。

      区域属性  用户创建一个区域时,需要设置该属性信息,它包含公共的资源信息。例如,Overlay包含像素格式,大小和背景色。

      通道显示属性(RGN_CHN_ATTR_S)  通道显示属性表明区域在某通道的显示特征。例如,Overlay的通道显示属性包含显示位置,层次,前景Alpha,背景Alpha,还有编码用                       到的QP信息。当通道显示属性中的区域是否显示(bShow)为TRUE时,表示显示在该通道中;反之,表示在该通道中存在,但处于隐藏状态。
     

     OSD反色(仅针对Overlay) 叠加在视频上的OSD可能会随着视频背景的变化而变得不清晰,OSD反色功能会自适应背景变化,自动对OSD的颜色作出调整,达到OSD清晰可见的目的。具体原理为:当视频背景亮度发生变化,大于或小于(具体跟反色模式有关,大于对应反色触发模式为MORETHAN_LUM_THRESH,小于对应反色触发模式为

    LESSTHAN_LUM_THRESH)用户设置的亮度阈值,此时会对OSD做反色处理。


    支持的模块目前region支持的模块信息如表8-1所示,在绑定region区域到通道时须参考此表。 

    展开全文
  • 按照手册中的说明,使用区域管理功能需要做如下几步 1.用户填充区域属性并创建区域 2.将该区域指定到具体通道中(如VENC)。在指定到具体通道时,需要输入通道的显示属性 之后用户可以通过以下操作来控制区域属性,...

    按照手册中的说明,使用区域管理功能需要做如下几步
    1.用户填充区域属性并创建区域
    2.将该区域指定到具体通道中(如VENC)。在指定到具体通道时,需要输入通道的显示属性
        之后用户可以通过以下操作来控制区域属性,以及在某通道的通道显示属性
        2.1通过 HI_MPI_RGN_GetAttr、 HI_MPI_RGN_SetAttr 获取和设置区域属性
        2.2通过 HI_MPI_RGN_SetBitMap(仅针对 Overlay)设置区域的位图信息
        2.3通过 HI_MPI_RGN_GetDisplayAttr 和 HI_MPI_RGN_SetDisplayAttr 获取和设置区域在某通道(如 VENC 通道)的通道显示属性。
        2.4最后用户可以将该区域从通道中撤出(非必须操作),再销毁区域。

     

    接下来我们看看每一步应该怎么做

    第一步:用户填充区域属性并创建区域

    想要创建区域,可以调用函数

    HI_MPI_RGN_Create

    来创建一个region区域,函数原型如下

    HI_S32 HI_MPI_RGN_Create(
        RGN_HANDLE Handle,                  //区域句柄号
        const RGN_ATTR_S *pstRegion         //区域属性指针
    );


    每一个区域对应一个句柄,和一个具体的属性RGN_ATTR_S,属性结构体定义如下
     

    typedef struct hiRGN_ATTR_S
    {
        RGN_TYPE_E enType;                  //区域类型
        RGN_ATTR_U unAttr;                  //区域属性
    } RGN_ATTR_S;

    区域类型有以下几种

    • OVERLAY_RGN                           //VENC通道视频叠加区域
    • COVER_RGN                               //VI通道视频叠加区域
    • COVEREX_RGN                          //扩展视频遮挡区域
    • OVERLAYEX_RGN                      //扩展视频叠加区域

    对应的区域属性就有两种

    • OVERLAY_ATTR_S      stOverlay                //VENC通道叠加区域属性
    • OVERLAYEX_ATTR_S    stOverlayEx         //扩展叠加区域属性

    这两个属性的结构体其实是一样的,以OVERLAY_ATTR_S举例,结构体定义如下
     

    typedef struct hiOVERLAY_ATTR_S
    {
        PIXEL_FORMAT_E enPixelFmt;          //OSD的像素格式,目前只支持ARGB1555,ARGB4444,ARGB8888这三种
        HI_U32 u32BgColor;                  //区域的背景色
        SIZE_S stSize;                      //区域的高宽
    }OVERLAY_ATTR_S;

    将这些属性填充好,调用HI_MPI_RGN_Create函数后,区域就创建好了,之后我们就可以通过区域句柄号进行管理

     

    第二步:将该区域指定到具体通道中

    想要指定到具体通道,可以调用函数

    HI_MPI_RGN_AttachToChn

    将区域叠加到通道上,该函数原型为

    HI_S32 HI_MPI_RGN_AttachToChn(
        RGN_HANDLE Handle,                  //区域句柄号
        const MPP_CHN_S *pstChn,            //通道结构体指针
        const RGN_CHN_ATTR_S *pstChnAttr    //区域通道显示属性指针
    );


    区域句柄我们已经有了,通道结构体指针定义如下

    typedef struct hiMPP_CHN_S
    {
        MOD_ID_E    enModId;                //模块号
        HI_S32      s32DevId;               //设备号
        HI_S32      s32ChnId;               //通道号
    } MPP_CHN_S;


    其实意思就是告诉系统,这个区域是叠加在哪个模块的哪个设备的哪个通道上面的
    区域通道显示属性指针就是用来设定区域显示属性的,结构体定义如下
     

    typedef struct hiRGN_CHN_ATTR_S
    {
        HI_BOOL           bShow;            //区域是否显示
        RGN_TYPE_E        enType;           //区域类型(OVERLAY_RGN,COVER_RGN,COVEREX_RGN,OVERLAYEX_RGN)
        RGN_CHN_ATTR_U    unChnAttr;        //区域通道显示属性(对应上面的四种类型,这个属性也有四种,具体请查阅手册)
    } RGN_CHN_ATTR_S;

    创建区域并指定到具体的通道中之后,我们的区域就已经完成了
    接下来我们就可以通过其他操作在区域里面进行显示了
    比如叠加层次,位图填充,叠加透明度等等(表8-2 Hi3516A/Hi3518EV200 region 支持的功能)

     

    这里给出一个示例Demo如下

    HI_S32 regions_Create( RGN_HANDLE RgnHandle, int width, int height, int position_x, int position_y )
    {
        HI_S32 s32Ret = HI_FAILURE;
        RGN_ATTR_S stRgnAttr;
        
        MPP_CHN_S stChn;
        RGN_CHN_ATTR_S stChnAttr;
        
        /****************************************
        step 1: create overlay regions
        ****************************************/
        stRgnAttr.enType = OVERLAYEX_RGN;
        stRgnAttr.unAttr.stOverlay.enPixelFmt = PIXEL_FORMAT_RGB_1555;
        stRgnAttr.unAttr.stOverlay.stSize.u32Width = width;
        stRgnAttr.unAttr.stOverlay.stSize.u32Height = height;
        stRgnAttr.unAttr.stOverlay.u32BgColor = 0x1f;
        RgnHandle = 0;///*域操作句柄*/
    
        s32Ret = HI_MPI_RGN_Create(RgnHandle, &stRgnAttr);
        if (HI_SUCCESS != s32Ret)
        {
    	SAMPLE_PRT("HI_MPI_RGN_Create (%d) failed with %#x!\n", RgnHandle, s32Ret);
    	return HI_FAILURE;
        }
        
        /****************************************
        step 2: attach to VPSS
        ****************************************/    
        
        stChn.enModId = HI_ID_VPSS;//HI_ID_VENC;//HI_ID_GROUP;
        stChn.s32DevId = 0;
        stChn.s32ChnId = 0;
        
        
        memset(&stChnAttr, 0, sizeof(stChnAttr));
        stChnAttr.bShow = HI_TRUE;
        stChnAttr.enType = OVERLAYEX_RGN;
        stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32X = position_x;	//通道画面中显示的位置(x)
        stChnAttr.unChnAttr.stOverlayExChn.stPoint.s32Y = position_y;	//通道画面中显示的位置(Y)
        stChnAttr.unChnAttr.stOverlayExChn.u32BgAlpha = 0;  	        //OSD Alpha
        stChnAttr.unChnAttr.stOverlayExChn.u32FgAlpha = 128;
        stChnAttr.unChnAttr.stOverlayExChn.u32Layer = 0;
    
        s32Ret = HI_MPI_RGN_AttachToChn(RgnHandle, &stChn, &stChnAttr);
        if (HI_SUCCESS != s32Ret) {
    	SAMPLE_PRT("HI_MPI_RGN_AttachToChn (RgnHandle:%d, chnid:%d) failed with %#x!\n", RgnHandle, stChn.s32ChnId , s32Ret);
    	return HI_FAILURE;
        }
        
        return HI_TRUE;
    }

     

    事实上我们创建了区域以后,需要给我们的区域填充一些内容,常用的就是位图填充了,下面我们看看如何进行位图填充

     

    功能一:bmp图片进行位图填充

     

    Hi3516A的OSD只能使用位图来进行填充,如果你有一张图片,比如logo之类的,把它做成bmp格式的图片
    然后调用

    HI_S32 SAMPLE_RGN_LoadBmp

    函数先读取位图文件信息,函数原型如下

    HI_S32 SAMPLE_RGN_LoadBmp(
        const char *filename,               //文件路径
        BITMAP_S *pstBitmap,                //位图属性指针,打开的位图属性将会存放在这里
        HI_BOOL bFil,                       //暂时不关注
        HI_U32 u16FilColor                  //暂时不关注
    )


    位图文件的属性有了,我们可以调用

    HI_MPI_RGN_SetBitMap

    函数在区域里面进行位图填充,函数原型如下

    HI_S32 HI_MPI_RGN_SetBitMap(
        RGN_HANDLE Handle,                  //区域句柄号
        const BITMAP_S *pstBitmap           //位图属性指针,就是我们要进行填充的位图信息
    );


    调用之后,系统就会在根据我们之前设置的区域属性,在对应模块对应设备对应通道上面进行填充

    示例Demo如下

    HI_S32 update_regions(const char *filename, RGN_HANDLE RgnHandle, const BITMAP_S *stBitmap)
    {
        HI_S32 s32Ret = HI_FAILURE;
        
        if( HI_SUCCESS != SAMPLE_RGN_LoadBmp(filename, stBitmap, HI_FALSE, 0))
        {
    	SAMPLE_PRT("load bmp failed\n");
            return HI_FAILURE;
        }
    	    
    
        s32Ret = HI_MPI_RGN_SetBitMap(RgnHandle, stBitmap);
        if (s32Ret != HI_SUCCESS) {
    	SAMPLE_PRT("HI_MPI_RGN_SetBitMap (RgnHandle:%d) failed with %#x!\n", RgnHandle, s32Ret);
    	return HI_FAILURE;
        }
    
    
        return HI_TRUE;
    }

     

    功能二:字库文件进行位图填充

     

    有时候我们需要在图像上动态更新时间,码率等等信息,这时候如果都使用bmp图片,肯定不太合适
    那就需要把字库的点阵信息转化更位图信息,以英文字符举例


    1.打开文件

    FILE *asc16;
    
    asc16 = fopen(asc16File, "rb");
    if (asc16 == NULL )
    {
        dpf("open asc16 error!\n");
        return HI_FAILURE;
    }


    2.分配内存空间

    以8 * 16的字库举例,字库里面的8 * 16代表有8 * 16个点,但是我们要转化成位图信息就意味着,
    我们要把字库中的每个点转化为RGB格式的像素点,如果使用RGB1555格式的像素点,
    那点阵中的每一个需要占用1 + 5 + 5 + 5 = 16Bit共2个字节的大小,所以每一个字需要分配
    2 * 8 * 16大小的空间,一共有ASCNum个字就需要2 * 8 * 16 * ASCNum大小的空间

    char *FontDatabase = NULL;
    
    FontDatabase = malloc((2 * 8 * 16) * ASCNum);
    if (FontDatabase == NULL )
    {
        dpf("do malloc error!\n");
        return HI_FAILURE;
    }


        
    3.读取所有可以显示的字符,并转化为像素信息

    我们知道ASCII码可以显示的字符范围是‘ ’ ~ ‘~’,其他的是特殊字符
    所以我们需要从‘ ’开始的位置一直读取到‘~’位置为止,并将每一个点阵点转化为像素点,使用RGB1555格式
        

    HI_U16 *memp;
        
    fseek(asc16, ' ' * 16, SEEK_SET);                   //找到‘ ’开始的位置,8 * 16点阵中每一个字占用16字节的空间
    memp = (HI_U16*) FontDatabase;
    for (i = 0; i < ASCNum * 16; i++)                   //遍历所有字
    {
        ch = fgetc(asc16);                              //每次读取一行
        //显示一个字节
        for (j = 0; j < 8; j++, shortp++)               //遍历一行里面的所有点,如果是1,则转化为黑色((HI_U16)0x8000),是0则转化为白色((HI_U16)0x7fff)
        {
            if (ch & (0x01 << (7 - j)))         
                *memp = BlackPot;
            else
                *memp = WhitePot;
        }
    }


        
    4.构建位图数据

    由之前的信息我们知道,想要叠加位图需要调用函数

    HI_MPI_RGN_SetBitMap

    这个函数原型如下

    HI_S32 HI_MPI_RGN_SetBitMap(
        RGN_HANDLE Handle,                              //区域句柄号
        const BITMAP_S *pstBitmap                       //位图属性指针
    );


    区域句柄号我们创建的时候已经有了,现在需要的就是填充这个位图信息了,这个结构体原型如下

    typedef struct hiBITMAP_S
    {
        PIXEL_FORMAT_E enPixelFormat;                   //像素格式,比如555,565,1555等         
        HI_U32 u32Width;                                //图像宽度
        HI_U32 u32Height;                               //图像高度
        HI_VOID* pData;                                 //位图数据
    } BITMAP_S;

    假设我们需要显示count个字,代码应该大体是这样的
        

    void make_bitmap(const char *osdString, BITMAP_S *pstBitmap)
    {
        int locations[128] = {0};                       //存储字模的位置
        int count = 0;                                 //需要显示count个字
        int i = 0;
        int j = 0;
            
        pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;    //像素格式为RGB1555
        pstBitmap->u32Width = 8 * count                     //每个字的宽度依然是8个像素点
        pstBitmap->u32Height = 16                           //每行的高度依然是16个像素点
        pstBitmap->pData = malloc(2 * 8 * 16 * count);      //点阵点转化为像素点需要的空间
            
        memset(pstBitmap->pData, 0, 2 * 8 * 16 * count);
            
        //获取要显示的字的个数和在字模中的位置
        for (i = 0; osdString[i] != '\0'; i++)
        {
            if (osdString[i] >= ' ' && osdString[i] <= '~')
            {
                locations[count] = osdString[i] - ' ';
                count++;
            }
        }
            
        //遍历所有要显示的字
        for (i = 0; i < count; i++)
        {
            //遍历每一行,一次拷贝一行即8 * 2个字节(每一个点阵点转化为像素点后占用2个字节存储)
            for (j = 0; j < 16; j++)
            {
                memcpy(
                    //展开后对应存储像素点的第j行的起始位置
                    pstBitmap->pData + j * pstBitmap->u32Width * 2,
                    //展开后对应存储点阵点的第i个字符第j行的起始位置
                    memp + (locations[i] * 2 * 8 * 16) + (16 * j),
                    16
                );
            }
        }
    }

    填充好位图信息后,我们调用HI_MPI_RGN_SetBitMap函数进行设置即可。

     

    汉字字库的方式其实是一样的,只不过汉字的位置是由区码加位码的形式来查找的,字库相关的知识可以参考HZK16汉字16*16点阵字库的使用及示例程序

    而一个16 * 16汉字点阵转化为像素点需要16 * 16 * 2的空间

    所以如果想把一个hzk16中的汉字点阵转化为像素,代码应该是这样的

    HI_U16 *memp;
        
    fseek(hzk16, location * 32, SEEK_SET);     //location代表汉字的区码+位码,16 * 16点阵中每一个字占用32字节的空间
    memp = (HI_U16*) FontDatabase;
    for (i = 0; i < 32; i++)                   //遍历这32个字节
    {
        ch = fgetc(hzk16);                              //每次读取一个字节
        //显示一个字节
        for (j = 0; j < 8; j++)               //遍历字节,如果是1,则转化为黑色((HI_U16)0x8000),是0则转化为白色((HI_U16)0x7fff)
        {
            if (ch & (0x01 << (7 - j)))         
                *memp = BlackPot;
            else
                *memp = WhitePot;
        }
    }

    如果要显示count个汉字,代码大体应该是这样的

    void make_bitmap(const char *osdString, BITMAP_S *pstBitmap)
    {
        int locations[128] = {0};                       //存储字模的位置
        int count = 0;                                 //需要显示count个字
        int i = 0;
        int j = 0;
            
        pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;    //像素格式为RGB1555
        pstBitmap->u32Width = 16 * count                     //每个字的宽度依然是16个像素点
        pstBitmap->u32Height = 16                            //每行的高度依然是16个像素点
        pstBitmap->pData = malloc(2 * 16 * 16 * count);       //点阵点转化为像素点需要的空间
            
        memset(pstBitmap->pData, 0, 2 * 16 * 16 * count);
            
        //获取要显示的字的个数和在字模中的位置
        for (i = 0; osdString[i] != '\0'; i++)
        {
            if (osdString[i] >= 0xa1 && osdString[i + 1] >= 0xa1)
            {
                locations[osdLen] = (osdString[i] - 0xa1) * 94 + (osdString[i + 1] - 0xa1);
                count++;
                i++;
            }
        }
            
        //遍历所有要显示的字
        for (i = 0; i < count; i++)
        {
            //遍历每一行,一次拷贝一行即16 * 2个字节(每一个点阵点转化为像素点后占用2个字节存储)
            for (j = 0; j < 16; j++)
            {
                memcpy(
                    //展开后对应存储像素点的第j行的起始位置
                    pstBitmap->pData + j * pstBitmap->u32Width * 2,
                    //展开后对应存储点阵点的第i个字符第j行的起始位置
                    memp + (locations[i] * 2 * 16 * 16) + (32 * j),
                    32
                );
            }
        }
    }

    同样的,填充好位图信息后,我们调用HI_MPI_RGN_SetBitMap函数进行设置即可。

     

     

     

     

    展开全文
  • DNS学习笔记之6 - DNS区域管理

    千次阅读 2012-01-06 11:29:57
    DNS学习笔记之6 - DNS区域管理   DNS学习笔记之6 - DNS区域管理一内容简介:这一篇是DNS笔记的最后一节,建立区域是很简单的,但是我们要分辨出区域类型之间的区别。我这里对区域的管理做说明。 管理正向区域 ...

    DNS学习笔记之6 - DNS区域管理

     
    DNS学习笔记之6 - DNS区域管理一内容简介:这一篇是DNS笔记的最后一节,建立区域是很简单的,但是我们要分辨出区域类型之间的区别。我这里对区域的管理做说明。 管理正向区域 根据区域类型和区域存储方式的不同,管理DNS区域的方式也不同,在此我根据区域类型

    这一篇是DNS笔记的最后一节,建立区域是很简单的,但是我们要分辨出区域类型之间的区别。我这里对区域的管理做说明。

    管理正向区域

    根据区域类型和区域存储方式的不同,管理DNS区域的方式也不同,在此我根据区域类型来进行介绍:

    1、主要区域

    活动目录集成主要区域和标准主要区域相比,常规选项不同,并且具有安全标签。

    在活动目录集成主要区域的常规标签,你可以暂停和开始区域的运行,并且可以修改区域类型、复制方式和动态更新方式;

    DNS 学习笔记之6- DNS区域的管理①

    而在标准主要区域的常规标签,你可以暂停和开始区域的运行,并且可以修改区域类型、区域数据存储的文件名和动态更新方式,但是不支持安全动态更新。

    DNS 学习笔记之6- DNS区域的管理①

    点击老化按钮→区域老化/清理属性设置,此设置必须和DNS服务器的老化/清理设置共同 使用方可生效。

    当启用老化时,对于每个动态更新记录,会基于当前的DNS服务器时间创建一个时间戳,当DHCP客户端服务或者DHCP服务器为此区域中的A记录进行动态更新时,会刷新时间 戳。手动创建的资源记录会分配一个为0的时间戳记录,代表它们将不会老化。

    •    无刷新间隔:无刷新间隔是在上次时间戳刷新后,DNS服务器拒绝再次进行刷新的时间周期,这阻止DNS服务器进行没有必要的刷新和减少了没有必要的区域传输流量。默认情况下,无刷新间隔为7天;

    •    刷新间隔:刷新间隔是在无刷新间隔后的时候,在这段时间周期内允许DNS客户端刷新资源记录的时间戳,并且资源记录不会被DNS服务器清理。 当无刷新间隔和刷新间隔之后,如果资源记录没有被DNS客户端进行刷新,则此资源记录将会被DNS服务器清除掉。默认情况下刷新间隔是7天,这意味着默认情况下动态注册的 资源记录将会在14天后被清理掉。

    如果你需要修改这两个参数,请记住以下原则:刷新间隔应该大于或等于无刷新间隔。

    DNS 学习笔记之6- DNS区域的管理① 

    起始授权机构(SOA)

    起始授权机构(SOA)标签允许你配置此DNS区域的SOA记录。当DNS服务器加载DNS区域时,它首先通过SOA记录来决定此DNS区域的基本信息和主服务器,如下图所示:

    DNS 学习笔记之6- DNS区域的管理①

    * 序列号:序列号代表了此区域文件的修订号。当区域中任何资源记录被修改或者点击了增量按钮时,此序列号会自动增加。 在配置了区域复制时,辅助DNS服务器会间歇的查询主服务器上DNS区域的序列号,如果主服务器上DNS区域的序列号大于自己的序列号,则辅助DNS服务器向主服务器发起区域 复制。

    * 主服务器:主服务器包含了此DNS区域的主DNS服务器的FQDN,此名字必须使用“.”结尾。

    * 负责人:指定了管理此DNS区域的负责人的邮箱,你可以修改为在DNS区域中定义的其他RP(负责人)资源记录,此名字必须使用 “.”结尾。

    * 刷新间隔: 此参数定义了辅助DNS服务器查询主服务器以进行区域更新前等待的时间。当刷新时间到期时,辅助DNS服务器从主服务器上获取主 DNS区域的SOA记录,然后和本地辅助DNS区域的SOA记录相比较,如果值不相同则进行区域传输。默认情况下,刷新间隔为15分钟。

    * 重试间隔:此参数定义了当区域复制失败时,辅助DNS服务器进行重试前需要等待的时间间隔,默认情况下为10分钟。

    * 过期时间:此参数定义了当辅助DNS服务器无法联系主服务器时,还可以使用此辅助DNS区域答复DNS客户端请求的时间,当到达此时间限制时,辅 助DNS服务器会认为此辅助DNS区域不可信。默认情况下为1天。

    * 最小(默认)TTL:此参数定义了应用到此DNS区域中所有资源记录的生存时间(TTL),默认情况下为1小时。此TTL只是和资源记录在非权威的 DNS服务器上进行缓存时的生存时间,当TTL过期时,缓存此资源记录的DNS服务器将丢弃此记录的缓存。

    注意:增大TTL可以减少网络中DNS解析请求的流量,但是可能会导致修改资源记录后DNS解析时延的问题。一般情况下无需对默认参数进行修改。

    * 此记录的TTL:此参数用于设置此SOA记录的TTL值,这个参数将覆盖最小(默认)TTL中设置的值。

    名称服务器

    名字服务器标签允许你配置DNS区域的NS资源记录,NS记录用于指定此DNS区域中的权威DNS服务器,默认情况下会包含此DNS区域的主服务器,并且一个区域 至少必须具有一个NS资源记录。

    和SOA记录一样,你只能在区域属性中对NS记录进行修改,你不能创建NS记录。

    DNS 学习笔记之6- DNS区域的管理①

    WINS

    你可以在WINS标签配置DNS服务器使用WINS查找,此时,当DNS服务器无法解析某个FQDN时,将会使用配置的WINS服务器来查询此FQDN的主机名;对于正向 区域是查询WINS服务器的正向记录,对于反向区域是查询WINS服务器的反向记录;如果在WINS服务器上查询到对应的记录,则DNS服务器会将此记录复制到此区域中,你可以勾选不复制此记录来让DNS服务器不复制从WINS服务器获得的记录。

    DNS 学习笔记之6- DNS区域的管理① 

    区域复制

    你可以在区域复制标签中配置是否允许此区域进行区域复制,以及区域复制到的对象,它们之间的区别在于:

    * 到所有服务器:所有服务器都可以从此DNS服务器获取此区域的区域数据;

    * 只有在“名称服务器”选项卡中列出的服务器:只有在名称服务器标签中列出的DNS服务器才能从此DNS服务器获取区域数据;

    * 只允许到下列服务器:只允许你在下面列表中指定的DNS服务器从此DNS服务器获取区域数据;

    在windows 2000中,默认情况下是允许区域复制到所有服务器,这个选项具有安全隐患,所以在Windows Server 2003中,对于标准主要区域,默认情况下只是允许区域复制到名称服务器中所定义的DNS服务中,而对于活动目录集成主要区域,由于通过活动目录进行复制,默认情况下是不允许区域复制。

    DNS 学习笔记之6- DNS区域的管理①

    DNS 学习笔记之6- DNS区域的管理①

    你可以点击通知按钮来配置通知辅助DNS服务器接收区域更新,默认情况下此DNS区域更新时,主服务器会通知名称服务器标签中的所有 DNS服务器。

    DNS 学习笔记之6- DNS区域的管理①

    当某个标准区域产生以下事件时,将进行通知或初始化区域复制:

    * 主DNS区域的SOA记录的刷新间隔过期;

    * 辅助DNS服务器启动;此时辅助DNS服务器会联系主服务器获取SOA记录,然后比较本地的SOA记录来决定是否需要区域复制;

    * 主服务器上对区域数据进行了修改,则主服务器按照配置来通知辅助DNS服务器。

    当初始化区域复制时,辅助DNS服务器可以从主服务器执行增量区域传输(IXFR)或者完全区域传输(AXFR),运行在Windows Server 2003上的DNS服务器 支持IXFR和AXFR。默认情况下,运行在Windows 2000服务器和Windows Server 2003系统上的DNS服务器从主服务器进行区域复制时执行IXFR,此时,只有更新数据才会进行 传输;Windows NT服务器不支持IXFR,只能执行AXFR,此时,将会对所有区域数据进行传输。

    其他的就不说了,关于如何添加资源记录,网上教程很多,这里只说一个MX记录的添加的(关于MX、PTR我在exchange哪里还会仔细说明的):

    新建邮件交换器(MX):

    在创建邮件交换器记录之前,必须已经为此MX记录所对应的邮件服务器创建了A记录;在主机或子域中输入邮件域名,如果不输入则代表此DNS区域;

    你可以针对相同的DNS域配置多个MX记录,但是邮件服务器优先级数值越低的MX记录具有越高的优先级。

    DNS 学习笔记之6- DNS区域的管理①

    注意:主机或子域内容--是不需要填写的

    管理任务

    主要区域的管理任务如下图所示:

    DNS 学习笔记之6- DNS区域的管理①

    更新服务器数据文件:同DNS服务器的更新服务器数据文件管理任务;

    重新加载:重新从本地的区域文件或者活动目录中加载此DNS区域;

    辅助区域和主要区域的属性基本相同,我在此着重介绍不同之处:

    在常规标签,你可以暂停和开始区域的运行,并且可以修改区域类型和用于复制区域数据的主服务器地址。主服务器上必须允许了区域复制到此辅助 DNS服务器。

    辅助区域不能和活动目录集成,因此复制选项不可用;并且也不支持动态更新,因为辅助区域是只读的。

    DNS 学习笔记之6- DNS区域的管理②  

    起始授权机构(SOA)

    对于辅助区域而言,起始授权机构(SOA)记录是只读的,因此你不能在起始授权机构(SOA)标签进行任何配置,如下图所示:

    DNS 学习笔记之6- DNS区域的管理②

    名称服务器

    和起始授权机构(SOA)记录一样,NS记录是只读的,因此你不能在辅助DNS服务器上修改名字服务器,如下图所示:

    DNS 学习笔记之6- DNS区域的管理②

    WINS

    你可以在WINS标签配置辅助DNS服务器使用WINS查找,但是由于辅助DNS区域是只读的,所以对于从WINS服务器获得的记录,你只能缓存在本地,而不能将其复制到DNS区域中。

    DNS 学习笔记之6- DNS区域的管理②

    区域复制

    你可以在区域复制标签配置将此辅助DNS区域复制到其他辅助DNS服务器,但是默认情况下是不会配置辅助区域的区域复制。

    DNS 学习笔记之6- DNS区域的管理②

    当在域控制器上安装DNS服务器时,辅助DNS区域的属性中会具有安全标签,用于控制用户对于此DNS区域及所属子对象的权限。

    和主要区域相比,辅助区域的管理任务只有三项,如下图所示:

    DNS 学习笔记之6- DNS区域的管理②

     

    展开全文
  • JVM内存区域管理

    2013-04-05 22:17:12
    初步学习JVM,在网上找到许多资料,感觉有点凌乱,不方便自己以后回过头来重看,就把别人...JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途、创建和销毁时间。根据《Java虚拟机规范(第二版)》

            初步学习JVM,在网上找到许多资料,感觉有点凌乱,不方便自己以后回过头来重看,就把别人写得好的文章或书籍上写得好的章节,用自己的话描述一下。本文以下内容主要参考了《深入理解java虚拟机:JVM高级特性与最佳实践》一书以及《JVM详解》电子书。

     

    运行时数据区域

    JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途、创建和销毁时间。根据《Java虚拟机规范(第二版)》(下文称VM Spec)的规定,JVM包括下列几个运行时数据区域:

     

     其中程序计数器、JAVA栈、本地方法栈3个区域随线程而生,随线程而死。

     

    程序计数器


     程序计数器是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的方式去实现),字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。

      由于JAVA虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,在任何一个确定时刻,一个处理器(对于多核处理器是一个内核)只会执行一个线程中的指令。因此为了线程切换后能恢复正确的执行位置,每条线程都需要一个独立的程序计数器,各条线程之间的程序计数器互不影响,独立存储,我们称这类内存区域为“线程私有”内存。

      如果线程正在执行的是一个JAVA方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的Native方法,这个计数器 值则为空(Undefined)。此内存区域是唯一一个JAVA虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

     

    JAVA虚拟机栈

            与程序计数器一样,VM栈的生命周期也是与线程相同。VM栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个帧在VM栈中的入栈至出栈的过程。在后文中,我们将着重讨论VM栈中本地变量表部分。
            经常有人把Java内存简单的区分为堆内存(Heap)和栈内存(Stack),实际中的区域远比这种观点复杂,这样划分只是说明与变量定义密切相关的内存区域是这两块。其中所指的“堆”后面会专门描述,而所指的“栈”就是VM栈中各个帧的本地变量表部分。本地变量表存放了编译期可知的各种标量类型(boolean、byte、char、short、int、float、long、double)、对象引用(不是对象本身,仅仅是一个引用指针)、方法返回地址等。其中long和double会占用2个本地变量空间(32bit),其余占用1个。本地变量表在进入方法时进行分配,当进入一个方法时,这个方法需要在帧中分配多大的本地变量是一件完全确定的事情,在方法运行期间不改变本地变量表的大小。
          在VM Spec中对这个区域规定了2中异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果VM栈可以动态扩展(VM Spec中允许固定长度的VM栈),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。

    本地方法栈
           本地方法栈与VM栈所发挥作用是类似的,只不过栈为虚拟机运行VM原语服务,而本地方法栈是为虚拟机使用到的Native方法服务。它的实现的语言、方式与结构并没有强制规定,甚至有的虚拟机(譬如Sun Hotspot虚拟机)直接就把本地方法栈和VM栈合二为一。和VM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。

     JAVA堆

          对于绝大多数的应用程序来说,JAVA堆是JVM所管理的内存中最大的一块。JAVA堆也是所有线程共享的内存区域,在虚拟机启动的时候创建。此内存区的唯一目的就是存放对象实例,几乎所有对象实例都在这里分配内存。

         JAVA堆是垃圾收集管理器管理的主要区域,因此很多时候也称作"GC堆"。如果从内存回收的角度看,由于现在收集器基本都是采用分代收集算法,所以JAVA堆中还可以细分为:年轻代和老年代。

    方法区

        在JVM中,被装在的class信息存在Method Area区中。当虚拟机装载某个类型时,它使用类加载器定位相应的class文件,然后读入这个class文件内容,提取其中类型信息,并将这些信息保存到方法区中。该类型中的类(静态)变量同样也存到方法去中。和JAVA堆一样也是,多线程共享的。

       运行时常量池,也是方法区中的一部分。Class文件中除了有类的版本、字段、方法、接口等描述信息,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面和符号引用,这部分内容将在类加载后存放在方法区的运行时常量池中。比如String s="a",则"a"会放入常量池中。

    方法区保存的信息:

    这个类型的全限定名。这个类型的直接超类的全限定名(除非这个类是java.lang.Object,它没有超类)这个类型是类类型还是接口类型。这个类型的访问修饰符(public,abstract或final的某个子集)任何直接超接口的全限定名的有序列表。该类型的常量池。字段信息。方法信息。除了常量以外的所有类(静态)变量。一个到类ClassLoader的引用。一个到Class类的引用。
    public class A1 {
    	public static String a1="abc";
    	public static Integer Int1=100;
    }
    
    
    public class A2 {
    	public static String a2="abc";
    	public static Integer Int2=100;
    	public static void compare(){
    		String s="abc";
    		Integer i=100;
    		System.out.println(A1.a1==A2.a2);
    		System.out.println(A1.a1==s);
    		System.out.println(A2.a2==s);
    		
    		System.out.println(A1.Int1==A2.Int2);
    		System.out.println(A1.Int1==i);
    		System.out.println(A2.Int2==i);
    	}
    	public static void main(String[] args){
    		compare();
    	}
    }


    运行结果

    true
    true
    true
    true
    true
    true

     

     

     

     

      

         

     

     

    1.Young年轻代(新生区)

          年轻代(是属于java堆的一部分)分3个区:1个Eden区(有人叫伊甸园,因为所有对象实例都在这出生),2个survivor幸存区。大部分对象都在Eden中生成。当Eden区满时,GC会把Eden中不存活的对象(就是该对象没有任何其他对象引用它了)销毁,把还存活的对象复制到survivor 0区(为了方便描述,2个survivor,用0,1区分下 ),如果survivor 0 去也满了,GC把servivor 0不存活的对象销毁,则把survivor 0区中还存活的对象复制到survivor 1区中,如果survivor 1也满了,GC把servivor 1不存活的对象销毁,把survivor 1中还存活的对象复制到养老区Tenured中去,如果Tenured也满了,则GC把Tenured不存活的对象销毁。如果Eden,servivor,Tenured都满了,则JVM会报错:java.lang.OutOfMemoryError:Java heap space).也就是堆空间没有空间来创建新对象了。

         2.Tenured年老代(养老区)

        年老代也是java堆的一部分。这区存放的都是从年轻代还存活的对象复制过来的,这里存放的对象的生命周期都是较长的。一般如果系统中使用了Application级别的缓存,缓存中的对象往往会被转移到这里。

         3.持久代

         持久代其实就是方法区Method Area。主要存储class,method,filed对象,这部分空间一般不会溢出,除非一次性加载很多类。

     

         GC做Young GC时,只是回收堆中的不存活对象,不对Perm区(方法区)做GC。如果Perm满了,需要动态扩张的话,会触发一次Full GC,对Perm中不存活的对象进行销毁,所以常量池中的对象也并不是一定不会GC。

    展开全文
  • 快乐虾http://blog.csdn.net/lights_joy/lights@hb165.com 本文适用于ADI bf561 DSPuclinux-2008r1-rc8 (移植到vdsp5)Visual DSP++ 5.0 欢迎转载,但请保留作者信息 1.1 存储区域管理Linux支持非一致内存访问(N
  • Java内存管理:深入Java内存区域  本文引用自:深入理解Java虚拟机的第2章内容  Java与C++之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。  概述: ...
  • 视频叠加区域,其中区域支持位图的加载、背景色更新等功能,简单理解就是可以设置透明度,也就是下面的Alpha值 (2)Cover遮挡 视频遮挡区域,其中区域支持纯色块遮挡,与Overlay叠加不同的是它不能加载图片,不能...
  • 在第三天课程中,重点 Easy UI的 datagrid , UI框架自带数据表格插件 Datagrid : 主要功能显示,自带分页查询、 条件查询、 排序 EasyUI 、ExtJs、Flex 通常基于json格式数据...1. 取派员管理主要管理,取派货物快递
  • (一)字符编码介绍 1.1 ASCII码 我们知道, 在计算机内部, 所有的信息最终都表示为一个二进制的字符串. 每一个二进制位(bit)有0和1两种状态, 因此八个二进制位就可以组合出 256种状态, 这被称为一个字节(byte)....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,829
精华内容 11,931
关键字:

区域管理