精华内容
下载资源
问答
  • C语言的静态存储方式和动态存储方式
    千次阅读
    2019-12-19 14:04:47
    • 从变量的作用域角度可以对变量进行分类为【全局变量】和【局部变量】
    • 从变量值的生存期可以对变量进行分类为【静态存储方式】和【动态存储方式】
    • 用户的存储空间可大致分为以下三种
      1、程序区
      2、静态区
      3、动态区

    一、 静态存储

    1、基本概念

    • 静态存储方式:指在程序运行时,给变量分配固定的存储空间的方式

    2、 静态存储区存放以下变量:

    • 全局变量:在程序开始执行时给全局变量分配存储区,程序运行完毕之后释放。在程序运行过程中它们占据固定的存储单元而不动态进行分配和释放。
    • 静态局部变量:有时希望局部变量的值在函数调用结束后不消失而保留原值,这时就应该指定局部变量为“静态局部变量”了,用关键字static进行生命

    二、动态存储

    1、基本概念

    动态存储方式:指在程序运行时,根据需要给变量分配动态的存储空间的方式

    2、动态存储区存放以下变量。

    • 函数形式的参数
    • 自动变量(未加static声明的局部变量):函数中的局部变量,如不声明为static存储类别的变量,则都是动态存储类别的。函数的形参和函数体中定义的变量都属于此类。在调用函数的时候系统给他自动分配空间,在函数调用结束后,自动释放存储空间。这类局部变量称为自动变量,用关键字auto声明存储类别。
    • 函数调用时的现场保护和返回地址。

    三、示例脚本代码

    1、示例脚本代码
    static int c;
    int prine(register int number)//判断是否为素数函数
    {
    	register int flag =1;
    	auto int n;
    	for(n=2;n<number/2  && flag==1;n++)
    		if (number%n==0)
    			flag=0;
    		return flag;
    }
    demo (int a )//static、auto变量的演示函数
    {
    	auto int b=0;
    	int d;
    	static c=3;
    	b=b+1;
    	c=c+1;
    	lr_output_message("demo()函数中的d=%d",d);
    	lr_output_message("demo()函数中的static c=%d",c);
    	return a+b+c;
    }
    
    Action()
    {
    	int a=2,i;
    	for(i=0;i<3;i++)
    	{
    		lr_output_message("demo()函数部分第%d运行情况如下:",i+1);
    		lr_output_message("函数demo运行结果为:%d",demo(a));
    		lr_output_message("------------------\n\r");
    	}
    	
    	//判断13是否为素数,并输出提示信息
    	if(prime(13)==0) lr_output_message("13不是素数!");
    	else lr_output_message("13是素数!");
    	
    	lr_output_message("c=%d",c);//输出静态变量的值
    	
    	return 0;
    }
    
    2、以上代码的输出信息
    Running Vuser...
    Starting iteration 1.
    Starting action Action.
    Action.c(30):demo()函数部分第1运行情况如下:
    Action.c(18):demo()函数中的d=25362920;
    Action.c(19):demo()函数中的static c=4;
    Action.c(31):函数demo运行结果为:7
    Action.c(32):---------------------
    
    Action.c(30):demo()函数部分第2运行情况如下:
    Action.c(18):demo()函数中的d=25362920;
    Action.c(19):demo()函数中的static c=5;
    Action.c(31):函数demo运行结果为:8
    Action.c(32):---------------------
    
    Action.c(30):demo()函数部分第3运行情况如下:
    Action.c(18):demo()函数中的d=25362920;
    Action.c(19):demo()函数中的static c=6;
    Action.c(31):函数demo运行结果为:9
    Action.c(32):---------------------
    
    Action.c(36):13是素数!
    Action.c(38):c=0
    Ending action Action.
    Ending iteration 1.
    Ending Vuser...
    
    3、解析
    • 在demo()函数中,d未被赋值,则输出的是值应该是随机数
    • 如果没给自动变量赋初值,则在它的值为一个不确定值,自动变量在函数调用的时候,每调用一次,给函数重新赋一次值。
    • 静态局部变量在定义时不赋值,则编译时默认为0。如上静态变量c。
    • 静态局部变量在编译的时候赋初值,即只赋初值一次。参见demo()函数中的static c=3,每次调用时,它的值都在变化,第一次调用c=3;c=c+1后c的值为4,第二次调用c的值为4…
    更多相关内容
  • MSSQL中动态执行sql语句可以使用EXEC()函数。MSSQL中也有类似的函数EXECUTE(),不过不同的是MYSQL中动态执行存储过程语句与MSSQL还是有区别的。
  • 动态存储分配

    千次阅读 2018-09-15 11:29:07
    动态存储分配:是指在程序运行期间根据需要进行动态的分配存储空间的方式。   使用函数:malloc()、free() 需要malloc.h头文件的支持。 函数声明:void *malloc(unsigned int 字节数) 该函数的...

     

    静态存储方式:是指在程序运行期间由系统分配固定的存储空间的方式。

    动态存储分配:是指在程序运行期间根据需要进行动态的分配存储空间的方式。

     

    使用函数:malloc()、free()      需要malloc.h头文件的支持

    函数声明:void *malloc(unsigned int  字节数)       

    该函数的返回值类型是:void * 称为无类型指针 (因为不确定未来给什么类型用)。

                  返回值返回的是申请好的空间的首地址

    对于用malloc()函数申请的空间,必须使用free()函数进行释放!

     

    colloc()函数:

    函数声明:void *calloc(unsigned n,  unsigned  size);

    在内存的动态存储区中分配n个长度为size的连续空间。

    用calloc函数可以为一维数组开辟动态存储空间,n为数组元素个数,每个元素长度为size。    

     

    (1)

    int  *p;

    double *q;

    错误形式:p = malloc(1000); // 向操作系统申请1000个字节的内存空间。

                     q = malloc(1000);

    正确形式:p = (int *)malloc(1000);

                      q = (double *)malloc(1000);

    free(p);         //释放的是p所指向的空间

    free(q);    //为什么只告诉首地址,不告诉长度呢?  

                   //因为在申请空间时就把首地址和长度写到了已分配空间表,所以告知了首地址后,会自动查找出长度

     

    上述两次空间申请得到了怎样的东西?

    *(p + 1)  <=>  p[1]               p[0] … p[249] 其实可以看成是申请了一个拥有250个int元素的数组p!

    *(q + 1)  <=>   q[1]              q[0] … q[124] 其实可以看成是申请了一个拥有125个double元素的数组q!

     

    (2)  这种方式比较常见,而且修改数值时比较方便

    int n;

    int *p;

    scanf(“%d”, &n);

    p = (int *)malloc(sizeof(int) * n);

     

    (3)

    int *p;

    p = (int *)malloc(sizeof(int));

    其实,这相当于申请了一个整型变量空间!以后,可以通过*p实现对这段空间的引用(赋值、运算……)。

     

    (4)对于malloc()和free(),在使用时要万分小心!

    int i;

    int *p;

     

    for(i = 0; i < 3; i++)

    p = (int *)malloc(sizeof(int) * 20);

    for(i = 0; i < 3; i++)

    free(p);

     

    程序循环,在第二次循环时,用新申请的空间的首地址值,覆盖了p空间原来的第一块空间的首地址值,使得第二块空间不能再被引用,甚至不能释放第一块和第二块空间!这就是著名的“内存泄露”问题!非常严重!!!

     

    对于for(i = 0; i < 3; i++)  free(p);是将“以p的值为首地址的空间“释放3次!

    其实,根本就轮不到第三次释放,在第二次释放时,系统就崩溃了。  

    free(p)释放的是以p的值为首地址所指向的空间,p空间本身是不会被释放的。因为p指向第三块空间,所以将释放第三块空间,

    内存的回收与释放是根据已使用空间表,给定首地址,它找到表格里想对应的那一行,把那一行转到可用空间,进行内存合并。第二次free,它将在已分配空间表里找之前的地址,但是已经没了,所以系统就崩溃了。

     

    (5)

    int *fun1(){
        int a[10];
        return a;
    }
    int *fun2(){
        int *p;
        p = (int *)malloc(sizeof(int) * 10);
        return p;
    }
    void main(void){
        int *q;
        int *p;
        p = fun1();
        *p = …;
        q = fun2();
        *q = …;
        free(p);
        free(q);
    }
    上述程序段存在的问题:
    1、fun1()函数中的int a[10],是这个函数的局部(私有、临时)数组空间,将随着fun1()函数的运行结束而释放!fun()函数将这个已经释放的空间的首地址传递给主调函数,并在主调函数中对其空间进行操作,这就是错误的!(逻辑错误,即,不能被C便以软件发现的错误!)
    2、int a[10]是fun1()函数的局部数组,将被fun1()函数的”}”释放空间;再一次在main()函数中释放该空间,将引起系统崩溃!
    上述程序段也说明一种malloc()动态存储分配在使用时的一种模式:可以在两个不同的函数中,一个申请,一个释放!

     

    展开全文
  • 动态存储和静态存储区域区别

    万次阅读 多人点赞 2017-11-27 19:19:23
    动态存储方式 所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数...

    有关动态对象创建:一般来说,编译器将内存分为三部分:静态存储区域、栈、堆。静态存储区主要保存 全局变量和静态变量,栈存储调用函数相关的变量、地址等,堆存储动态生成的变量,在c中是指由malloc,free运算产生释放的存储空间,在c++中 就是指new和delete运算符作用的存储区域。

    1、  静态存储分配

    指在编译时对数据对象分配固定的存储位置,运行时始终不变。即一旦存储空间的某个位置分配给了某个数据名,则在目标程序的整个运行过程中,此位置(地址)就属于该数据名。
    由静态存储分配产生的数据区称为静态数据区。
    静态存储分配适用于不允许递归过程或递归调用,不允许可变体积的数据结构的语言
    静态存储分配的特点:简单、易于实现
    例:FORTRAN语言,它所有的数据都属于这一类。

    2、  动态存储分配

    指在运行阶段动态地为源程序中的数据对象分配存储位置
    实行动态存储分配的语言的特点:
    允许递归过程
    允许可变数据结构(可变数组或记录等)
    允许用户自由申请和释放空间
    这种程序在编译时无法确定运行时所需数据空间的大小,需待程序运行时动态确定
    有两种动态存储分配方式:栈式(stack)、堆式(heap)。

    3、  栈式动态存储分配

    在数据空间中开辟一个栈区,每当调用一个过程时,它所需要的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。空间的使用符合先借后还的原则。
    特点:先借后还,管理简单,空间使用效率高
    栈式动态存储分配适合于PASCAL、C等典型过程式语言。

    4、  堆式动态存储分配

    在数据空间中开辟一片连续的存储区(通常叫做堆),每当需要时就从这片空间借用一块,不用时再退还。借用与归还未必服从“先借后还”的原则。
    堆式动态存储分配适合于用户可以自由申请和归还数据空间的语言,如C++。
    特点:适用范围广,容易出现碎片。
    如何充分利用空间是个难题。


    动态存储方式

    所谓动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的形式参数,在函数定义时并不给形参分配存储单元,只是在函数被调用时,才予以分配, 调用函数完毕立即释放。如果一个函数被多次调用,则反复地分配、 释放形参变量的存储单元。

    静态存储方式

    所谓静态存储方式是指在程序编译期间分配固定的存储空间的方式。该存储方式通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。全局变量,静态变量等就属于此类存储方式。

    总结

    从以上分析可知, 静态存储变量是一直存在的, 而动态存储变量则时而存在时而消失。我们又把这种由于变量存储方式不同而产生的特性称变量的生存期。 生存期表示了变量存在的时间。 生存期和作用域是从时间和空间这两个不同的角度来描述变量的特性,这两者既有联系,又有区别。 一个变量究竟属于哪一种存储方式, 并不能仅从其作用域来判断,还应有明确的存储类型说明。

    内存中用户存储空间的分配情况(三种):

     程序区:存放程序语句

    静态存储区存放全局变量,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。

    动态存储区:存放以下数据:函数形式参数。在调用函数时给形参分配存储空间;自动变量(未加static声明的局部变量;函数调用时的现场保护和返回地址等;

    就是那些由编辑器在需要的时候分配,在不需要的时候自动清除的变量的存储区,里面的变量通常是局部变量。函数参数等。

    就是那些右new分配的内存块,他们的释放编辑器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

    堆和栈的区别主要为:

    1.管理方式不同: 对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。

    2.能否产生碎片不同:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他

      们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出

    3.生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。

    4.分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动  态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。

    5.分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大小的空间,如果没有足够大小的空间(可能是由于内存碎片太多),就有可能调用系统功能去增加程序数据段的内存空间,这样就有机会分到足够大小的内存,然后进行返回。显然,堆的效率比栈要低得多。 

    总结

    堆和栈相比,由于大量new/delete的使用,容易造成大量的内存碎片;由于没有专门的系统支持,效率很低;由于可能引发用户态和核心态的切换,内存的申请,代价变得更加昂贵。所以栈在程序中是应用最广泛的,就算是函数的调用也利用栈去完成,函数调用过程中的参数,返回地址,EBP和局部变量都采用栈的方式存放。所以,我们推荐大家尽量用栈,而不是用堆。   
    栈有如此众多的好处,但是由于和堆相比不是那么灵活,有时候分配大量的内存空间,还是用堆好一些。
    无论是堆还是栈,都要防止越界现象的发生(除非你是故意使其越界),因为越界的结果要么是程序崩溃,要么是摧毁程序的堆、栈结构,产生以想不到的结果,就算是在你的程序运行过程中,没有发生上面的问题,你还是要小心,说不定什么时候就崩掉,那时候debug可是相当困难的:)  

    以下转载一篇关于栈和堆的区别的文章

    来源:http://www.chinaitpower.com/2005September/2005-09-13/206685.html

    一、预备知识—程序的内存分配

    一个由c/C++编译的程序占用的内存分为以下几个部分 
    1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 
    2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。 
    3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放 
    4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放 
    5、程序代码区—存放函数体的二进制代码。 
    二、例子程序 
    这是一个前辈写的,非常详细 
    //main.cpp 
    int a = 0; 全局初始化区 
    char *p1; 全局未初始化区 
    main() 

    int b; 栈 
    char s[] = "abc"; 栈 
    char *p2; 栈 
    char *p3 = "123456"; 123456在常量区,p3在栈上。 
    static int c =0; 全局(静态)初始化区 
    p1 = (char *)malloc(10); 
    p2 = (char *)malloc(20); 
    分配得来得10和20字节的区域就在堆区。 
    strcpy(p1, "123456"); 123456放在常量区,编译器可能会将它与p3所指向的"123456"优化成一个地方。 

    二、堆和栈的理论知识 
    2.1申请方式 
    stack: 
    由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 
    heap: 
    需要程序员自己申请,并指明大小,在c中malloc函数 
    如p1 = (char *)malloc(10); 
    在C++中用new运算符 
    如p2 = (char *)malloc(10); 
    但是注意p1、p2本身是在栈中的。 
    2.2 
    申请后系统的响应 
    栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。 
    堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。 
    2.3申请大小的限制 
    栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在 WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),如果申请的空间超过栈的剩余空间时,将提示overflow。因此,能从栈获得的空间较小。 
    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。 
    2.4申请效率的比较: 
    栈由系统自动分配,速度较快。但程序员是无法控制的。 
    堆是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 
    另外,在WINDOWS下,最好的方式是用VirtualAlloc分配内存,他不是在堆,也不是在栈是直接在进程的地址空间中保留一快内存,虽然用起来最不方便。但是速度快,也最灵活 
    2.5堆和栈中的存储内容 
    栈: 在函数调用时,第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。 
    当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。 
    堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。 
    2.6存取效率的比较 

    char s1[] = "aaaaaaaaaaaaaaa"; 
    char *s2 = "bbbbbbbbbbbbbbbbb"; 
    aaaaaaaaaaa是在运行时刻赋值的; 
    而bbbbbbbbbbb是在编译时就确定的; 
    但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。 
    比如: 
    #include <stdio.h> 
    void main() 

    char a = 1; 
    char c[] = "1234567890"; 
    char *p ="1234567890"; 
    a = c[1]; 
    a = p[1]; 
    return; 

    对应的汇编代码 
    10: a = c[1]; 
    00401067 8A 4D F1 mov cl,byte ptr [ebp-0Fh] 
    0040106A 88 4D FC mov byte ptr [ebp-4],cl 
    11: a = p[1]; 
    0040106D 8B 55 EC mov edx,dword ptr [ebp-14h] 
    00401070 8A 42 01 mov al,byte ptr [edx+1] 
    00401073 88 45 FC mov byte ptr [ebp-4],al 
    第一种在读取时直接就把字符串中的元素读到寄存器cl中,而第二种则要先把指针值读到edx中,在根据edx读取字符,显然慢了。

     
    2.7小结: 
    堆和栈的区别可以用如下的比喻来看出: 
    使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。 
    使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。 

    堆和栈的区别主要分: 
    操作系统方面的堆和栈,如上面说的那些,不多说了。 
    还有就是数据结构方面的堆和栈,这些都是不同的概念。这里的堆实际上指的就是(满足堆性质的)优先队列的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构。 
    虽然堆栈,堆栈的说法是连起来叫,但是他们还是有很大区别的,连着叫只是由于历史的原因。

    展开全文
  • k8s + nfs 动态存储模式

    千次阅读 2022-03-03 16:23:55
    动态创建PV,是指在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage ...

    Kubernetes使用NFS共享存储有两种方式:

    • 手动方式静态创建所需要的PV和PVC;
    • 通过创建PVC动态地创建对应PV,无需手动创建PV。

    动态创建PV,是指在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage Class的对象由存储系统根据PVC的要求自动创建。

    其中动态方式是通过StorageClass来完成的,这是一种新的存储供应方式。动态卷供给能力让管理员不必进行预先创建存储卷,而是随用户需求进行创建。

    使用StorageClass有什么好处呢?除了由存储系统动态创建,节省了管理员的时间,还有一个好处是可以封装不同类型的存储供PVC选用。

    在StorageClass出现以前,PVC绑定一个PV只能根据两个条件,一个是存储的大小,另一个是访问模式。在StorageClass出现后,等于增加了一个绑定维度。

    1、下载动态PV配置yaml文件

    https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client/deploy

    [root@master1 pv-d]# ls
    class.yaml  deployment.yaml  rbac.yaml

    更改deployment.yaml,将nfs地址和路径修改为自己的本地地址

     

    2、依次应用yaml文件

    [root@master1 pv-d]# kubectl apply -f rbac.yaml 
    serviceaccount/nfs-client-provisioner created
    clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created
    clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created
    role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
    rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created
    [root@master1 pv-d]# kubectl apply -f class.yaml 
    storageclass.storage.k8s.io/managed-nfs-storage created
    [root@master1 pv-d]# kubectl apply -f deployment.yaml 
    deployment.apps/nfs-client-provisioner created
    

    3、创建nginx-svc.yaml文件

    apiVersion: v1
    kind: Service
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      ports:
      - port: 80
        name: nginx
      selector:
        app: nginx
      clusterIP: None
    

    创建pod   nginx-stfset.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "nginx"
      replicas: 3
      template:
        metadata:
          labels:
            app: nginx
        spec:
          imagePullSecrets:
          - name: huoban-harbor
          terminationGracePeriodSeconds: 10
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
              name: web
            volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: www
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: "managed-nfs-storage"
          resources:
            requests:
              storage: 1Gi
    

    应用两个yaml文件

    [root@master1 pv-d]# kubectl apply -f nginx-svc.yaml 
    service/nginx created
    [root@master1 pv-d]# kubectl apply -f nginx-stfset.yaml 
    statefulset.apps/web created
    

    如果pod一直处于pending状态,

    #在/etc/kubernetes/manifests/kube-apiserver.yaml配置文件中加入如下代码:
    - --feature-gates=RemoveSelfLink=false
    #重新应用apiserver yaml文件,同时重新创建所有NFS yaml文件即可。
    kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
    

     

     

     

    展开全文
  • 初学记录--数组的动态存储

    千次阅读 2020-12-09 22:52:28
    动态数组:malloc (void* malloc(size_t size)???? 1:申请:int *p=(int *)malloc(sizeod(int )*(字节数)) 例子:int *p=(int )malloc(sizeod(int )(5)) 和 int a[5]一样,五个元素 遍历:p[1],p[0],p[2],p[3],p[4]...
  • 动态存储区、静态存储区、堆和栈的区别

    千次阅读 多人点赞 2018-09-11 12:43:46
    动态存储区、静态存储区、堆和栈的区别 内存中用户存储空间的分配情况(三种) 程序区:存放程序语句 静态存储区 动态存储区  ...
  • 动态存储方式和静态存储方式

    千次阅读 2018-01-29 10:27:41
    从变量的作用域的角度来观察,变量可以分为...从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式动态
  • k8s使用nas存储基于nfs实现动态存储持久卷PV,PVC 工作中遇到项目组采用statefulset部署有状态副本集,需要存储一些中间件应用数据,应用有多个副本,静态pv不能满足需求,因此需要考虑动态创建持久卷。目前开发测试...
  • C中静态存储区和动态存储

    千次阅读 2017-05-05 16:45:53
    而内存主要分为两类:静态存储区和动态存储区。 1、静态存储区 (1)分为数据区(只读数据区(代码区?在linux中又叫文本段)、读写数据区)、未初始化区(BSS)。 (2)它们都是在程序编译连接阶段确定的。 2、...
  • 静态存储和动态存储详解

    千次阅读 2015-04-01 22:29:07
    静态存储与动态存储:  静态存储变量通常是在变量定义时就分定存储单元并一直保持不变, 直至整个程序结束。动态存储变量是在程序执行过程中,使用它时才分配存储单元, 使用完毕立即释放。 典型的例子是函数的...
  • c++动态存储空间分配

    千次阅读 多人点赞 2018-05-12 16:20:21
    // 用 new 开辟的整型数据空间放在堆里面,此空间存储 100 ,指针 p 指向这块动态开辟的空间。  • *p=10 ; // 将 p 指针所指向的空间内容变为 10  • delete p ; // 把 p 指向内存释放掉  • 注意 :释放的...
  • 动态存储方式与静态存储方式 我们已经了解了变量的作用域。作用域是从空间的角度来分析的,分为全局变量和局部变量。 变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的...
  • 顺序表的动态存储细节

    千次阅读 2016-12-03 21:42:45
    顺序表的动态存储细节@(算法学习) 在顺序表的动态存储定义中需要包含的数据成员是(C) I. 数组指针 II. 表中元素个数n III. 表的大小maxSize IV. 数组基址base A. I 、II B. I 、II、IV C. I 、II、III ...
  • 动态区域(栈、堆)、静态存储区(数据段和程序段)    堆 1 类成员变量存放在堆区,所有类的实例和数组都是在堆上分配内存的,堆内存由存活和死亡的对象,空闲碎片区组成,对象所占的堆内存是由自动内存管理...
  • 静态存储和堆栈动态存储

    千次阅读 2014-12-02 23:03:36
    目标程序运行时的存储组织 从逻辑上看,在代码生成前,编译程序必须进行目标程序运行环境的设计和数据空间的分配.程序在运行的时候需要得到一块内存空间让自己在上面运行,此空间需要包含目标代码和目标代码运行时的...
  • 使用helm搭建动态存储卷(PV/SC/PVC)

    千次阅读 2020-04-14 18:15:59
    使用helm搭建动态存储卷(PV/SC/PVC) 在日常学习测试kubernetes时,经常需要PersistentVolume把一些数据(例如:数据库、日志等)存储起来,不随着容器的删除而丢失;关于PV、PVC、StorageClass的关系参考PV/PVC/...
  • 什么时候要用到动态存储呢?它在用的时候还要指定大小,和静态分配区别在哪呢?
  • C语言基础--静态存储和动态存储

    千次阅读 2016-06-30 13:54:18
     变量从变量值存在的时间(即生存期)角度分:静态存储方式和动态存储方式。静态:由系统分配固定的存储空间,全局变量就存储在静态存储区。动态:系统根据需要进行动态的分配存储空间。在动态存储区存放一下数据:...
  • 1、数据结构进阶一动态存储管理概念  在之前的笔记中,我们学习了数据结构的一些重要概念以及简单实现。很多代码都是摘自网络的,不过都亲测可用的并附以解释了。  这篇开始还是学习数据结构,不过类似数据结构...
  • 动态存储方式与静态存储方式

    千次阅读 2013-07-23 15:31:41
    从变量值存在的时间(即生存期)观察,变量的存储有两种不同的方式:静态存储方式和动态存储方式 静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式动态存储方式是在程序运行期间根据需要进行动态的...
  • 主要介绍了MySQL存储过程中实现执行动态SQL语句的方法,实例分析了MySQL中构造及执行动态SQL语句的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • 一、动态存储方式与静态存储方式 变量还有另一种属性——存储期(storage duration,也称生命期)。存储期是指变量在内存中的存在期间。这是从变量值存在的时间角度来分析的。存储期可以分为静态存储期(static storage...
  • C中的静态存储区和动态存储

    千次阅读 2013-03-12 15:17:13
    而内存主要分为两类:静态存储区和动态存储区; 1.静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。 ...
  • Android之动态申请存储权限

    千次阅读 2021-05-28 01:27:32
    需要在AndroidManifest文件中配置权限。(必须)首先判断当前sdk是否大于6.0,是则判断是否已经开启了权限,否则直接执行代码doCode()判断是否已经开启权限,如果还没有权限,则执行requestPermissions();...
  • 动态存储变量和静态存储变量

    千次阅读 2011-03-31 20:21:00
    动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。 内存中供用户使用的存储空间分为三类: 1.程序区 2.静态区  3.动态存储区 数据分别存放在静态存储区和动态存储区。 在...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,194,897
精华内容 477,958
关键字:

动态存储