c++ 学习笔记(高级linux编程) day1

一. 约定
       1.作业完成
       2.50-200 lines codes

二.课程体系
         语言
                     C
                     C++
             算法
                     算法
                     数据结构
             基础(系统核心(Kernel)编程)
         ---------------------------------
         linux/unix   windows  MacOSX
            PC机       服务器    ARM
         设备驱动/进程管理/内存管理/文件目录系统管理/IO/
                 
                 内存管理
                 文件目录
                 IO
                 进程管理
                         进程创建
                         进程控制
                         进程通信
                         进程同步
                 线程管理
                         线程创建
                         线程同步
                         线程通信
                 
                 应用
                     网络
                     数据库
                     UI
                     shell
                     
                     XML处理
                     分布式与中间件(Tuxedo/Corba/MQ)
                     web service
                     OpenGL
                 
定位:提供编程的能力,为设备驱动与Windows应用奠定基础
 
三.内存管理
            硬件层次
            内核层次
            语言层次
                C: malloc/free
                C++:new/delete
            数据结构
                STL
                智能指针
                1.问题:
                    malloc怎么分配空间?
                    malloc与new的关系?
                2.Linux对内存的结构描述
                    1. /proc/${pid}/   存放进程运行时候所有的信息
                
                结论:
                        任何程序的内存空间分成4个基本部分
                        1.代码区
                        2.全局栈区
                        3.堆
                        4.局部栈
                        进程查看
                        ps  aue
                    2.理解程序的变量与内存空间的关系
                    
                    结论:
                            1.内存分四个区
                            2.各种变量对应存放区
                            3.堆栈是一种管理内存的数据结构.
                            4.查看程序的内存地址
                    
                    3.理解malloc的工作的原理
                    malloc使用一个数据结构(链表)维护分配空间
                    链表的构成:分配的空间/上一个空间数据/下一个空间数据
                    对malloc分配的空间不要越界访问,因为容易造成内存泄露
                    
                    4.C++的new与malloc的关系
                    malloc  new  new[]
                    realloc  ??
                    calloc   ??
                    free     delete  delete??
                    
                    结论:
                        
                         new的实现使用的是malloc来实现的.
                    
                    区别:
                            
                            new使用malloc后,还要初始化空间.
                            基本类型直接初始化为默认值.
                            UDT类型,调用指定的构造器
                            
                            delete调用free实现
                            delete负责调用析构器
                            
                            new与new[]区别
                                    new只调用一个构造器初始化
                                    new[]循环对每个区域调用构造器
                            delete与delete[]
                            没有区别  delete[] 只调用一次析构器 循环次数由系统决定
         5.函数调用栈空间的分配和释放
         ` 5.1 总结:
                         1.函数执行的时候有自己的临时栈.
                         2.函数的参数就在临时栈中.如果函数传递实参,直接覆盖形参的"垃圾值"
                         
                         3.通过寄存去返回值(使用返回值返回数据)
                         4.通过参数返回值(参数必须是指针)
                                     指针指向的区域必须实现分配
                         5.如果参数返回指针.参数就是双指针.
                 5.2. _stdcal  _cdecl   _fastcall
                         
                         1.决定函数栈压栈的参数顺序.
                         2.决定函数栈的清空方式
                         3.决定了函数的名字转换方式.                 
     
     6. far  near huge指针
             near 16位
             far  32位
             huge 综合
四.虚拟内存
        问题:
            一个程序不能访问另外一个程序的地址指向的空间;
        理解:
                1.每个程序的开始地址0x80084000
                2.程序中使用的地址不是物理地址,而是逻辑地址。(虚拟地址)
                        逻辑地址仅仅是个编号,编号使用int4 季节整数表示。
                        每个程序提供了4G的访问能力
        问题:
                    逻辑地址与物理地址关联才有意义:过程称为内存映射
        背景:
                    虚拟内存的提出:禁止用户直接访问物理存储空间,有助于系统的稳定。
        结论:
                    虚拟地址与物理地址映射的时候有一个基本单位
                            4k 1000   内存页.
                    段错误:无效访问.
                    合法访问:比如malloc分配的空间之外的空间,但访问非法;    
五.虚拟内存的分配.
    `        栈:编译器自动生成代码维护
            堆:地址是否映射,映射的空间是否被管理.
            1.brk/sbrk 内存映射函数
            
            
            
            补充:帮助手册
                    man  节 关键字
                    1-8  1:linux 系统(shell)指令
                             2:系统函数
                             3:标准c函数
                            
                             7:系统编程帮助
                    分配释放内存:
                    int  brk(void *end);//分配空间,释放空间
                    void *sbrk(int size);//返回地址空间;
                    应用:
                            1.使用sbrk分配空间
                            2.使用sbrk得到没有映射的虚拟地址.
                            3.使用brk分配空间
                            4.使用brk释放空间
                    理解:
                        sbrk(int)
                        如果是第一次运行,则返回没有映射的空闲空间首地址,
                        同时产生一个数据:指向地址.
                        
                        sbrk与brk后台系统维护一个指针.
                        指针默认是null.
                        调用sbrk,判定指针是否是0,是:得到大块空闲空间的初始化首地址
                                                                         否:返回指针,并且把指针位+size
                        int *p1=sbrk(4);//返回空闲地址,并修改指针为+size
                        brk(p1+3)  以sbrk的返回的指针为基准,将指针向前移动3个单位
                        brk(0) 返回sbrk指向的指针.
            应用案例:
                        写一个程序查找1-10000之间所有的素数.
                        并且存放到缓冲,然后打印.
                        
                        缓冲的实现使用sbrk/brk
                        流程:
                                循环
                                        判定是否素数(isPrimer)
                                        是:分配空间存放
                                        否:继续下步
                        总结:
                                share_ptr
                                stl
                                new/delete
                                malloc/free
                                brk/sbrk
                        异常处理
                                int brk(void*)
                                void* sbrk(int)
                                如果成功 :brk返回0  sbrk返回一个指针
                                如果失败:brk返回-1  sbrk返回(void*)-1
                        unix函数错误,修改内部变量
                                errno
                        字符串函数
                        内存管理函数 malloc  memset mamcmp  memcpy  ...
                                                bzero
                        错误处理函数
                        标准IO函数
                        时间函数
                        类型转换函数
----------------------------------------------------------------------

                        
----------------------------------------------------------------------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值