精华内容
下载资源
问答
  • 内存中只有程序和数据
    千次阅读
    2021-06-17 10:09:46

    一、选择题计算机中用来保存程序和数据,以及运算的中间结果和最后

    一、选择题

    1、计算机中用来保存程序和数据,以及运算的中间结果和最后结果的装置是(B)。

    A、RAM B、内存和外存 C、ROM D、高速缓存

    2、当前的计算机一般被认为是第四代计算机,它所采用的逻辑元件是_(D)。

    A、晶体管 B、集成电路 C、电子管 D、大规模集成电路

    3、通常所说的“裸机”是指计算机仅有(A)。

    A、硬件系统 B、软件 C、指令系统 D、CPU

    4、在计算机领域中、通常用大写英文字母“B”来表示(C)

    A、字 B、字长 C、字节 D、二进制位

    5、十进制向二进制转换时,十进制91相当于二进制数(D)。

    A、1101011 B、1101111 C、1110001 D、1011011

    6、下列4种软件中属于应用软件的是(A)

    A、财务管理系统 B、DOS C、Windows 98 D、Windows 2000

    7、下列各项中,不是微型计算机的主要性能指标的是(D)

    A、字长 B、存取周期 C、主频 C、硬盘容量

    8、计算机的主存储器是指(C)

    A、RAM和硬盘 B、ROM C、RAM和ROM D、硬盘和光盘

    9、微型计算机的微处理器上集成了(B)

    A、CPU和RAM B、控制器和运算器 C、控制器和RAM D、运算器和I/O接口

    10、在微型计算机中,应用最普遍的字符编码是(B)

    A、BCD码 B、ASCII码 C、汉字编码 D、补码

    11、在WORD编辑状态下,对于选定的汉字(C)

    A、可以移动,不可以复制,B、可以复制、不可以移动

    C、可以进行移动或复制 D、可以同时进行移动和复制

    12、在WORD中,当多个文档打开时,关于保存这些文档的说法正确的是(A)

    A、用“文件”菜单的“保存”命令,只能保存活动文档

    B、用“文件”菜单的“保存”命令,可以重命名保存所有文档

    C、用“文件”菜单的“保存”命令,可一次性保存所有打开的文档

    D、用“文件”菜单的“全部保存”命令保存所有打开的文档

    13、在Excel的电子工作表中建立的数据表,通常把每一行称为一个(A)

    A、记录 B、字段 C、属性 D、关键字

    14、电子工作表中每个单元格的默认格式为(D)

    A、数字 B、文本 C、日期 D、常规

    15、在Windows中,要设置屏幕保护程序,可以使用控制面板的(D)。

    A、添加/删除程序命令 B、系统命令 C、密码命令 D、外观和主题命令

    16、在Windows中,“写字板”和“记事本”所编辑的文档(A)。

    A、均可通过剪切、复制和粘贴与其他Windows应用程序交换信息

    B、只有写字板可通过上述操作与其他Windows应用程序交换信息

    C、只有记事本可通过上述操作与其他Windows应用程序交换信息

    D、两者均不能与其他Windows应用程序交换信息

    17、用户的电子邮箱是(C)

    A、通过邮局申请的个人信箱

    B、邮件服务器内存中的一块区域

    C、邮件服务器硬盘上的一块区域

    D、用户计算机硬盘上的一块区域

    18、在Internet上搜索信息时,下列说法不正确的是(D)

    A、windows and client表示检索结果必需同时满足windows和client两个条件

    B、windows or client表示检索结果只需满足windows和client中一个条件即可

    C、windows not client表示检索结果中不能含有client

    D、windows client表示检索结果中含有windows或client

    19、PowerPoint中幻灯片能够按照预设时间自动连续播放,应设置(B)。

    A、自定义放映

    B、排练记时

    C、动作设置

    D、观看方式

    20、在PowerPoint的数据表中,数字默认是(A)

    A、左对齐

    B、右对齐

    C、居中

    D、两端对齐

    21、以下设备中,属于视频设备的是(B)

    A、声卡

    B、DV卡

    C、音箱

    D、话筒

    22、Windows Media Player支持播放的文件格式是(C)

    A、RAM

    B、MOV

    C、MP3

    D、RMVB

    23、下列对Internet叙述正确的是(C)

    A、Internet就是www

    B、Internet就是信息高速公路

    C、Internet是众多自治子网和终端用户机的互联

    D、Internet就是局域网互联

    24、域名服务DNS的主要功能是(A)

    A、通过请求及回答获取主机和网络相关信息

    B、查询主机的MAC地址

    C、为主机自动命名

    D、合理分配IP地址

    25、TCP协议称为(B)

    A、网际协议

    B、传输控制协议

    C、Network内部协议

    D、中转控制协议

    26、下列不属于计算机病毒特征的是(C)

    A、传染性

    B、突发性

    C、可预见性

    D、隐藏性

    27、关于计算机病毒说法不正确的是(C)

    A、仅通过技术手段预防病毒

    B、仅通过管理手段预防病毒

    C、管

    更多相关内容
  • 深度分析数据内存中的存储形式

    万次阅读 多人点赞 2021-08-09 16:48:04
    文章目录一、数据的基本类型介绍二、整型在内存中的存储形式1.原码、反码、补码2.大小端介绍3.浮点型在内存中的存储 一、数据的基本类型介绍 char//字符数据类型 short//短整型 int//整形 long//长整型 long long ...


    一、数据的基本类型介绍

    char//字符数据类型
    short//短整型
    int//整形
    long//长整型
    long long   //更长的整形
    float//单精度浮点数
    double//双精度浮点数
    

    二、整型在内存中的存储形式

    一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。那接下来我们谈谈数据在所开辟内存中到底是如何存储的?
    比如:

    int a = 20;
    int b = -10;
    

    我们知道为a分配四个字节的空间。
    那如何存储?
    下来了解下面的概念:

    1.原码、反码、补码

    计算机中的整数有三种表示方法,即原码、反码和补码。
    三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位负整数的三种表示方法各不相同
    原码
    直接将二进制按照正负数的形式翻译成二进制就可以。
    反码
    将原码的符号位不变,其他位依次按位取反就可以得到了。
    补码
    反码+1就得到补码。
    正数的原、反、补码都相同。
    对于整形来说:数据存放内存中其实存放的是补码。
    为什么呢?
    在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
    同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    int a = 20;
    int b = -10;
    int* p = &a;
    int* q = &b;
    

    在这里插入图片描述
    在这里插入图片描述
    在这组数据中,会发现数据的存储顺序是倒着的
    这是又为什么?

    2.大小端介绍

    什么大端小端:
    大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
    小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
    为什么有大端和小端:
    为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
    例如:一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

    百度2015年系统工程师笔试题:请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)

    //代码1
    #include <stdio.h>
    int check_sys(){    
    	int i = 1;   
        return (*(char *)&i);
        }
     int main(){    
        int ret = check_sys(); 
        if(ret == 1)    {
        printf("小端\n");  
          }   
        else    {
        printf("大端\n");
            }    
         return 0;
         }
         //代码2
         int check_sys()
         {    
         union   
          {
             int i;
             char c;
           }un;    
           un.i = 1;   
           return un.c;
           }
    

    3.浮点型在内存中的存储

    常见的浮点数:
    3.141591
    E10
    浮点数家族包括:float、double、long double类型。
    浮点数表示的范围:float.h中定义

    浮点数存储规则
    根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

    1. (-1)^S * M * 2^E
    2. (-1)^s 表示符号位,当s=0,V为正数;当s=1,V为负数
    3. M表示有效数字,大于等于1,小于2
    4. 2^E表示指数位。

    举例来说:
    十进制的5.0,写成二进制是101.0,相当于1.01×2^2。
    那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。
    十进制的-5.0,写成二进制是-101.0,相当于-1.01×2^2。那么,s=1,M=1.01,E=2。
    IEEE 754规定:对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
    在这里插入图片描述
    对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
    在这里插入图片描述
    IEEE 754对有效数字M和指数E,还有一些特别规定。
    前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。
    IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
    至于指数E,情况就比较复杂。
    首先,E为一个无符号整数(unsigned int)

    这意味着,如果E为8位,它的取值范围为0-255;如果E为11位,它的取值范围为0-2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001。

    然后,指数E从内存中取出还可以再分成三种情况:
    E不全为0或不全为1
    这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
    比如:
    0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:

     0  01111110 00000000000000000000000
    

    E全为0
    这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

    E全为1
    这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);
    好了,关于浮点数的表示规则,就说到这里。

    展开全文
  • 程序内存空间(代码段、数据段、堆栈段)

    万次阅读 多人点赞 2016-08-24 20:55:12
    在冯诺依曼的体系结构必须有:代码段,堆栈段,数据段。 进程的虚拟地址空间图示如下: 堆栈段:  1. 为函数内部的局部变量提供存储空间。  2. 进行函数调用时,存储“过程活动记录”。  3. 用作暂时...

    在冯诺依曼的体系结构中,一个进程必须有:代码段,堆栈段,数据段。

    进程的虚拟地址空间图示如下:


    堆栈段:

      1. 为函数内部的局部变量提供存储空间。

      2. 进行函数调用时,存储“过程活动记录”。

      3. 用作暂时存储区。如计算一个很长的算术表达式时,可以将部分计算结果压入堆栈。

    数据段(静态存储区):

      包括BSS段(Block Started by Symbol)的数据段。BSS段存储未初始化或初始化为0的全局变量、静态变量,具体体现为一个占位符,并不给该段的数据分配空间,只是记录数据所需空间的大小。数据段存储经过初始化的全局和静态变量。

    #define DEBUG "debug"  
      
    int space[1024][1024];  
    int data = 1;  
    int no_data = 0;  
      
    int main()  
    {  
      char *a = DEBUG;  
      return 1;  
    }  
      使用nm查看后
    0000000000600660 d _DYNAMIC  
    00000000006007f8 d _GLOBAL_OFFSET_TABLE_  
    0000000000400578 R _IO_stdin_used  
                     w _Jv_RegisterClasses  
    0000000000600640 d __CTOR_END__  
    0000000000600638 d __CTOR_LIST__  
    0000000000600650 D __DTOR_END__  
    0000000000600648 d __DTOR_LIST__  
    0000000000400630 r __FRAME_END__  
    0000000000600658 d __JCR_END__  
    0000000000600658 d __JCR_LIST__  
    0000000000600820 A __bss_start  
    0000000000600818 D __data_start  
    0000000000400530 t __do_global_ctors_aux  
    00000000004003e0 t __do_global_dtors_aux  
    0000000000400580 R __dso_handle  
                     w __gmon_start__  
    0000000000600634 d __init_array_end  
    0000000000600634 d __init_array_start  
    0000000000400490 T __libc_csu_fini  
    00000000004004a0 T __libc_csu_init  
                     U __libc_start_main@@GLIBC_2.2.5  
    0000000000600820 A _edata  
    0000000000a00840 A _end  
    0000000000400568 T _fini  
    0000000000400358 T _init  
    0000000000400390 T _start  
    00000000004003bc t call_gmon_start  
    0000000000600820 b completed.6347  
    000000000060081c D data  
    0000000000600818 W data_start  
    0000000000600828 b dtor_idx.6349  
    0000000000400450 t frame_dummy  
    0000000000400474 T main  
    0000000000600830 B no_data  
    0000000000600840 B space
      可以看到变量data被分配在data段,而被初始化为0的no_data被分配在了BSS段。

      .bss是不占用.exe文件空间的,其内容由操作系统初始化(清零);而.data却需要占用,其内容由程序初始化。

      注意:.data和.bss在加载时合并到一个Segment(Data Segment)中,这个Segment是可读可写的。

    代码段:

      又称为文本段。存储可执行文件的指令;也有可能包含一些只读的常数变量,例如字符串常量等。

      .rodata段:存放只读数据,比如printf语句中的格式字符串和开关语句的跳转表。也就是你所说的常量区。例如,全局作用域中的 const int ival = 10,ival存放在.rodata段;再如,函数局部作用域中的printf("Hello world %d\n", c);语句中的格式字符串"Hello world %d\n",也存放在.rodata段。

      但是注意并不是所有的常量都是放在常量数据段的,其特殊情况如下:

      1)有些立即数与指令编译在一起直接放在代码段。

    int main()  
    {  
      int a = 10;  
      return 1;  
    }  

      a是常量,但是它没有被放入常量区,而是在指令中直接通过立即数赋值

      2)对于字符串常量,编译器会去掉重复的常量,让程序的每个字符串常量只有一份。

    char *str = "123456789";  
    char *str1 = "helloworld";  
      
    int main()  
    {  
      char* a = "helloworld";  
      char b[10] = "helloworld";  
      return 1;  
    }  

      汇编代码如下:

                    .file   "hello.c"  
    .globl str  
            .section        .rodata  
    .LC0:  
            .string "123456789"  
            .data  
            .align 8  
            .type   str, @object  
            .size   str, 8  
    str:  
            .quad   .LC0  
    .globl str1  
            .section        .rodata  
    .LC1:  
            .string "helloworld"  
            .data  
            .align 8  
            .type   str1, @object  
            .size   str1, 8  
    str1:  
            .quad   .LC1  
            .text  
    .globl main  
            .type   main, @function  
    main:  
    .LFB0:  
            .cfi_startproc  
            pushq   %rbp  
            .cfi_def_cfa_offset 16  
            .cfi_offset 6, -16  
            movq    %rsp, %rbp  
            .cfi_def_cfa_register 6  
            movq    $.LC1, -8(%rbp)  
            movl    $1819043176, -32(%rbp)  
            movl    $1919907695, -28(%rbp)  
            movw    $25708, -24(%rbp)  
            movl    $1, %eax  
            leave  
            .cfi_def_cfa 7, 8  
            ret  
            .cfi_endproc  
    .LFE0:  
            .size   main, .-main  
            .ident  "GCC: (GNU) 4.4.6 20110731 (Red Hat 4.4.6-3)"  
            .section        .note.GNU-stack,"",@progbits  
      可以看到str1和a同时指向.rodata段中同一个LC1

      3)用数组初始化的字符串常量是没有放入常量区的。

      4)用const修饰的全局变量是放入常量区的,但是使用const修饰的局部变量只是设置为只读起到防止修改的效果,没有放入常量区。
      5)有些系统中rodata段是多个进程共享的,目的是为了提高空间的利用率。

      注意:程序加载运行时,.rodata段和.text段通常合并到一个Segment(Text Segment)中,操作系统将这个Segment的页面只读保护起来,防止意外的改写。

    堆:

      就像堆栈段能够根据需要自动增长一样,数据段也有一个对象,用于完成这项工作,这就是堆。堆区域是用来动态分配的内存空间,用 malloc 函数申请的,用free函数释放。calloc、realloc和malloc类似:前者返回指针的之前把分配好的内存内容都清空为零;后者改变一个指针所指向的内存块的大小,可以扩大和缩小,它经常把内存拷贝到别的地方然后将新地址返回。



    栈、堆辨析:

    1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。 
    2、堆区(heap):由程序员分配释放, 若程序员不释放,程序结束时可能由操作系统回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 



    程序示例:

    1、举个例子说明各种变量存放在什么区: 

    #include <stdlib.h>
    
    int a=123; //a在全局已初始化数据区 
    
    char *p1; //p1在BSS区(未初始化全局变量) 
    
    int main()
    {
    	int b; //b为局部变量,在栈区 
    
    	char s[]="abc"; //s为局部数组变量,在栈区 
    			//"abc"为字符串常量,存储在已初始化数据区 
    
    	char *p1,*p2; //p1,p2为局部变量,在栈区 
    
    	char *p3="123456"; //p3在栈区,"123456"在常量区(.rodata)
    
    	static int c=456; //c为局部(静态)数据,在已初始化数据区 
    
    	//静态局部变量会自动初始化(因为BSS区自动用0或NULL初始化)
    
    	p1=(char*)malloc(10); //分配得来的10个字节的区域在堆区 
    
    	p2=(char*)malloc(20); //分配得来的20个字节的区域在堆区 
    
    	free(p1);
    
    	free(p2);
    
    	p1=NULL; //显示地将p1置为NULL,避免以后错误地使用p1
    
    	p2=NULL;
    }

    2、我们再写一个程序,输出各变量的内存空间:

    #include <stdio.h>
    #include <stdlib.h>
    
    extern void afunc(void);
    
    extern etext,edata,end;
    
    int bss_var;//未初始化全局变量存储在BSS段
    
    int data_var=42;//初始化全局存储在数据段
    
    #define SHW_ADR(ID,I) printf("The %s is at address: %8x\n",ID,&I);//打印地址宏
    
    int main(int argc,char *argv[])
    {
    	char *p,*b,*nb;
    
    	printf("etext address: %8x\tedata address: %8x\tend address: %8x\t\n",&etext,&edata,&end);
    
    	SHW_ADR("main",main);//查看代码段main函数位置
    
    	SHW_ADR("afunc",afunc);//查看代码段afunc函数位置
    
    	printf("\nbss Locatoin:\n");
    	SHW_ADR("bss_var",bss_var);//查看BSS段变量地址
    
    	printf("\ndata Location:\n");
    	SHW_ADR("data_var",data_var);//查看数据段变量地址
    
    	printf("\nStack Loation:\n");
    	afunc();
    	printf("\n");
    
    	p=(char*)alloca(32);//从栈中分配空间
    
    	if(p!=NULL)
    	{
    		SHW_ADR("string p in stack start",*p);
    		SHW_ADR("string p in stack end",*(p+32*sizeof(char)));
    	}
    
    	b=(char*)malloc(32*sizeof(char));//从堆中分配空间
    	nb=(char*)malloc(16*sizeof(char));//从堆中分配空间
    
    	printf("\nHeap Location:\n");
    	SHW_ADR("allocated heap start",*b);//已分配的堆空间的起始地址
    	SHW_ADR("allocated heap end",*(nb+16*sizeof(char)));//已分配的堆空间的结束地址
    
    	printf("\np,b and nb in stack\n");
    	SHW_ADR("p",p);//显示栈中数据p的地址
    	SHW_ADR("b",b);//显示栈中数据b的地址
    	SHW_ADR("nb",nb);//显示栈中数据nb的地址
    
    	free(b);//释放申请的空间,以避免内存泄露
    	free(nb);
    }
    
    void afunc(void)
    {
    	static int level=0;//初始化为0的静态数据存储在BSS段中
    
    	int stack_var;//局部变量,存储在栈区
    
    	if(++level==5)
    		return;
    
    	SHW_ADR("stack_var in stack section",stack_var);
    	SHW_ADR("leval in bss section",level);
    
    	afunc();
    }
    
    /* Output
    etext address:  80488bf	edata address:  8049b48	end address:  8049b58	
    The main is at address:  80485be
    The afunc is at address:  8048550
    
    bss Locatoin:
    The bss_var is at address:  8049b54
    
    data Location:
    The data_var is at address:  8049b40
    
    Stack Loation:
    The stack_var in stack section is at address: ff9cdf80
    The level in bss section is at address:  8049b50
    The stack_var in stack section is at address: ff9cdf50
    The level in bss section is at address:  8049b50
    The stack_var in stack section is at address: ff9cdf20
    The level in bss section is at address:  8049b50
    The stack_var in stack section is at address: ff9cdef0
    The level in bss section is at address:  8049b50
    
    The string p in stack start is at address: ff9cdf70
    The string p in stack end is at address: ff9cdf90
    
    Heap Location:
    The allocated heap start is at address:  9020078
    The allocated heap end is at address:  90200c8
    
    p,b and nb in stack
    The p is at address: ff9cdfac
    The b is at address: ff9cdfa8
    The nb is at address: ff9cdfa4
    */

    内存管理函数:
    这里插入一段对void*的解释:
    void*这不叫空指针,这叫无确切类型指针.这个指针指向一块内存,却没有告诉程序该用何种方式来解释这片内存.所以这种类型的指针不能直接进行取内容的操作.必须先转成别的类型的指针才可以把内容解释出来.

    还有'\0',这也不是空指针所指的内容.'\0'是表示一个字符串的结尾而已,并不是NULL的意思.

    真正的空指针是说,这个指针没有指向一块有意义的内存,比如说:
    char* k;
    这里这个k就叫空指针.我们并未让它指向任意内存.
    又或者
    char* k = NULL;
    这里这个k也叫空指针,因为它指向NULL也就是0,注意是整数0,不是'\0'.

    一个空指针我们也无法对它进行取内容操作.
    空指针只有在真正指向了一块有意义的内存后,我们才能对它取内容.也就是说要这样
    k = "hello world!";
    这时k就不是空指针了.

    void *malloc(size_t size)
    (typedef unsigned int size_t;)
    malloc在内存的动态存储区中分配一个长度为size字节的连续空间,其参数是无符号整型,返回一个指向所分配的连续空间的起始地址的指针。分配空间不成功(如内存不足)时返回一个NULL指针。

    void free(void *ptr)
    free释放掉内存空间。

    void *realloc(void *ptr,size_tsize)
    当需要扩大一块内存空间时,realloc试图直接从堆的当前内存段后面获得更多的内在空间,并返回原指针;如果空间不够就使用第一个能够满足这个要求的内存块,并将当前数据复制到新位置,释放原来的数据块;如果申请空间失败,返回NULL。

    void *calloc(size_t nmemb, size_t size)
    calloc是malloc的简单包装,它把动态分配的内存空间进行初始化,全部清0。此函数的实现描述:
    void *calloc(size_t nmemb, size_t size)
    {
        void *p;

        size_t total;
        total=nmemb*size;

        p=malloc(total);
        if(p!=NULL)//申请空间

            memset(p,'\0',total);//初始化\0


        return p;
    }

    void *alloca(size_t size);
    alloca在栈中分配size个内存空间(函数返回时自动释放掉空间,无需程序员手动释放),并将空间初始化为0。


    Reference:

    https://en.wikipedia.org/wiki/Data_segment

    展开全文
  • 一个简单的爬虫程序,爬取10页数据共计150条,每天定时写入数据库总共不到150行,没运行期间内存已经20%多了,运行期间内存会涨到60%,CPU会涨到40%左右一个简单程序如此高的消耗肯定是有问题的,参考了网上的一些...

    这篇文章是基于上篇文章的续章~

    一台机器要部署很多爬虫,每天定时执行的情况下,服务器CPU和内存占比较高的情况出现后

    模拟一份代码,进行分析。

    5c035ee8cc417584135a02c71274b177.png

    一个简单的爬虫程序,爬取10页数据共计150条,每天定时写入数据库

    总共不到150行,没运行期间内存已经20%多了,运行期间内存会涨到60%,CPU会涨到40%左右

    一个简单程序如此高的消耗肯定是有问题的,参考了网上的一些文章

    有使用工具的,安装第三方包的,写时间判断的等等

    但是对我的帮助不大(windows....)

    努(带)力(薪)工(拉)作(*)之后,根据看过的文章思考了一番:1.内存和CPU高代表着程序当中的部分代码在大量或反复的执行2.爬取的时间3-4秒,写入MYSQL数据库,解析使用的XPATH,

    保存数据使用的单表,索引只有ID和URL,表结构数据长度都合适3.使用了线程,线程数4个4.没有文件读写操作,网络请求较快,对方服务器响应较快5.使用了schedule定时模块6.对后台接口进行任务轮询和定时模块当中出现了while True

    还有文章提到判断导入的模块是否时c写的,导致底层频繁调用,首先这个说法不说对不对...一是不会看,二是看了不也得用这个模块吗

    所以不考虑这种情况1.部分代码在大量或反复的执行,具体是哪里差

    展开全文
  • CS(CodeString)指向的是指令段地址,指令段寄存器DS(DataString)指向的是数据段地址,数据段寄存器SS(StackString)指向的是栈顶段地址,栈段寄存器内存中数据和程序没有区别,说都是以2进制形式存储CS指向的段地址...
  • 本文主要介绍程序中内存以及内存与栈、堆、数据区的关系。 由于字多看的眼睛疼,所以分为四个部分如下: C语言精讲之程序中内存从哪里来(2)栈 C语言精讲之程序中内存从哪里来(3)堆 C语言精讲之程序中内存从...
  • 在 4GB 物理内存的机器上,申请 8G 内存会怎么样?

    万次阅读 多人点赞 2022-06-08 10:58:11
    大家好,我是小林。看到读者在群里讨论这些面试题:其中,第一个问题「在 4GB ...当应用程序读写了这块虚拟内存,CPU 就会去访问这个虚拟内存, 这时会发现这个虚拟内存没有映射到物理内存, CPU 就会产生缺页中断,
  • 1. 在linux下,查看一个运行程序, 占用了多少内存, 一般的命令有 (1). ps aux: 其中 VSZ(或VSS)列 表示,程序占用了多少虚拟内存。 RSS列 表示, 程序占用了多少物理内存。 虚拟内存可以不用考虑,它...
  • C51单片机是怎么存储程序和数据

    千次阅读 2017-07-02 08:06:49
    本文着重介绍了51单片机存储器寻址空间的分布,讲述了单片机是如何进行存储程序数据的。
  • 程序内存分配之堆栈的区别

    万次阅读 多人点赞 2015-10-01 09:38:52
    在单片机应用,堆栈是个特殊的存储区,主要功能是暂时存放数据和地址,通常用来保护断点现场。要点: 堆,优先队列(priority queue);普通的队列是一种先进先出的数据结构(FIFO—First-In/First-Out),元
  • C/C++基本数据类型所占内存大小

    万次阅读 多人点赞 2017-09-11 17:49:29
    C不同数据类型所占的字节大小,在不同的操作系统编译器下,是不同的,一般主要说gcc下,32位或64位系统的,红色部分是32 64位系统不同的,做了个表如下: char 1 1 -128~127 unsigned char(当byte使用) 1 1 0...
  • java的基本数据类型引用数据类型以及它们的存储方式堆内存和内存
  • 内存泄漏:是指在堆空间一直有引用链引用着某些对象。导致对象不能被垃圾收集。 解决办法:如果是内存泄漏,课进一步通过工具查看泄漏对象到GC Roots 的引用链。于是就能找到泄漏对象是通过的路径与GC Roots 相关...
  • 比较全面的总结了诸多版本,知识无国界,感谢各位的...首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆栈。  堆栈都是一种数据项按序排列的数据结构。 栈就像装数据的桶或
  • 内存和磁盘的关系

    千次阅读 2020-02-06 11:43:05
    文章目录内存和磁盘的区别程序内存和磁盘的交互关系磁盘缓存缓存虚拟内存分页式虚拟内存分段式虚拟内存从代码编写角度来节约内存磁盘的物理结构固态硬盘 VS 传统硬盘固态硬盘 VS 内存经典提问环节 内存和磁盘的...
  • 51单片机程序存储器和数据存储器

    万次阅读 多人点赞 2017-12-14 14:34:37
    (文字略有改动)  为了保证程序能够连续地执行下去,CPU必须具有某些手段来确定一条指令的地址。程序计数器PC正是起到了这种作用,所以通常又称其为...即程序的第一条指令所在的内存单元地址送入PC。当执行指令时,
  • 文件有10G个整数,乱序排列,要求找出位数  (2010-09-25 18:15:03) 转载▼ 标签:  杂谈 分类: 算法   题目:在一个文件有 10G 个整数,乱序排列,
  • 栈的区别 之 数据结构和内存

    万次阅读 多人点赞 2018-02-26 13:54:26
    数据结构的栈堆首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆栈。堆栈都是一种数据项按序排列的数据结构。栈就像装数据的桶或箱子我们先从大家比较熟悉的栈说起吧,它是一...
  • 没有内存,怎么还能跑程序

    万次阅读 多人点赞 2020-02-26 10:33:00
    虽然目前大多数内存的增长速度要比 IBM 7094 要快的多,但是,程序大小的增长要比内存的增长还快很多。正如帕金森定律说的那样:不管存储器有多大,但是程序大小的增长速度比内存容量的增长速度要快的多。下面我们...
  • 在介绍之前需要强调一点,大页内存也有适用范围,程序耗费内存很小或者程序的访存局部性很好,大页内存很难获得性能提升。所以,如果你面临的程序优化问题有上述两个特点,请不要考虑大页内存。后面会详细解释为啥...
  • 一、内存映射 内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。内存映射文件的物理存储器来自磁盘已有的文件,而不是来自系统的页交换文件。一旦把文件映射到地址空间,就可以对它进行访问,...
  • 程序运行时的内存空间分布

    万次阅读 多人点赞 2014-03-21 01:33:18
    我们在写程序时,既有程序的逻辑代码,也有在程序中定义的变量等数据,那么当我们的程序进行时,我们的代码和数据究竟是存放在哪里的呢?下面就来总结一下。 一、程序运行时的内存空间情况 其实在程序运行时,...
  • 事实上在JVM是用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。 一、运行时数据区域包括哪些? 根据《Ja
  • Linux中内存管理详解

    千次阅读 多人点赞 2021-09-25 20:41:51
    CPU寄存器存储的是逻辑地址,需要进行映射才能转化为对应的物理地址,然后获取对应的内存。 通过引入逻辑地址,每个进程都拥有单独的逻辑地址范围。 当进程申请内存的时候,会为其分配逻辑地址物理地址,并将...
  • 这里我们讲讲物理机对并发的处理方案,因为物理机遇到的并发问题与虚拟机的情况有不少相似之处,所以它的方案对于虚拟机的实现也有相当大的参考意义。如何让计算机并发执行若干个运算任务以及如何...
  • 8G16G的内存(Memory)容量,对于普通电脑用户(办公等等)并没有多大区别;而对于专业用户(音、视频编辑、动画创作等等),8G16G内存使用区别非常明显。对于32位的操作系统而言,8G16G的内存没有任何区别;这是...
  • LINUX程序(进程)在内存中的布局

    千次阅读 2015-07-30 02:00:33
    翻译自: ... 是编程系统管理的关键部分,在接下来的几篇文章会从实际应用 内部角度对内存管理模块进行分析. 内存管理的相关概念都是通用的,我们依照32位的linuxwi
  • 可执行程序加载到内存的过程

    千次阅读 2018-10-08 09:27:36
    在linux程序的加载,涉及到两个工具,linker loader。Linker主要涉及动态链接库的使用,loader主要涉及软件的加载。 1、 exec执行一个程序 2、 elf为现在非常流行的可执行文件的格式,它为程序运行划分了两...
  • **内存泄漏定义(memory leak):**一个不再被程序使用的对象或变量还在内存中占有存储空间。 一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 内存溢出 out of memory :指程序申请内存时,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,014,842
精华内容 405,936
关键字:

内存中只有程序和数据

友情链接: VirtualEmployee.rar