UNIX编程课堂笔记


一.课程定位
   1/3就业.
   奠定程序基础
二.学习方法
   效果:先做,后理解.
   方法:练习.50-200行代码
三.课程结构
   Bash脚本语言(系统管理,安装部署脚本) 
 
   内存管理
   文件管理
   IO操作(Curses字符界面)
   进程创建
   进程通信
   线程
   线程的同步与异步
   信号
   socket编程
   QT图形界面
   Pro*c/c++
 
   UML与OOA&D
 
   GTK+
   XML的处理与解析
   Web Service
   Corba
   Tuxedo

项目:数据采集 
   网络爬虫
   聊天程序   

四.内存管理.
   Unix/Linux系统的内存管理brk/sbrk/mmap/munmap
   C的内存管理方式malloc/calloc/realloc/free  
   C++的内存管理方式new new[] delete/delete[] new()
 
   STL
   智能指针
 
   1.查看Unix/Linux的内存的结构.
    a.任何一个程序在系统中被管理的时候使用唯一的ID标示
      进程ID. pid_t getpid() 
      #include <unistd.h>
     System V
     BSD
     Posix(Linux/)
        
    
    b.man 分8节
     2:系统函数调用
     3:C函数调用
     7:综合函数调用 
 
   实验:
     目的:查看程序的内存结构
     ps aue
     pstree
     top
     在系统有一个目录/proc/${pid}/ 进程管理目录
     cat maps 查看进程的内存结构.
   
     代码内存空间
     全局内存空间(全局栈)
     局部内存空间(局部栈)
   
     自由内存空间(堆)
   2.用户变量存放在哪些内存空间?
    auto/static
    register/valitile
    const  
   
    restrict 函数的指针参数
    mutable/const成员变量
    explicit修饰构造器(禁止构造器作为类型转换)
  
   3.查看栈数据的特点.
      全局栈从小到大
      局部栈从大到小
    
      堆空间不要越界访问.
    
      malloc/calloc/realloc/free 自己在内部维护着一个链表数据结构.
       struct
       {
        用户申请的数据空间 4 1
        上次分配的空间地址 4 2
        下次分配空间地址   4 3
        本空间大小      4 4
       }
   4.new怎么分配的,与malloc有什么区别
    new =malloc (new 分配完毕调用构造器)
    delete=free (delete释放之前调用析构器) 
  
    delete[] 与delete 都释放一次,但delete[]多次调用析构函数
             delete调用一次.
     技巧,回避调用构造器来产生对象.
///////////////////////////////////////////////////////////
总结:
   1.能否查看某个进程的ID.
      a.getpid
      b.ps aue
      c.top   
      d.pstree
   2.了解/proc目录作用以及maps文件的饿内容.
   3.知道程序的4个内存区域的作用.
   4.了解常用数据变量存放的区域
   5.malloc/new工作的过程:后台维护一个数据结构管理内存
     越界访问,因为容易破坏后台结构,导致malloc/free new/delete无法正常工作
   6.new/malloc区别free/delete的区别,delete 与delete[]的区别
///////////////////////////////////////////////////////////
 
   5.Linux低层提供内存分配方式
    内存地址其实不是物理地址. 是虚拟地址.
    计算机使用4字节表示内存地址.4G.4G的地址根本不存在.
  
    虚拟地址:地址本身不具备意义,只有与某个物理内存映射后,地址才有意义.
      虚拟地址可以映射到内存/磁盘文件/网卡/键盘/扫描仪.
    
    一个地址要合法使用满足两个条件.
       a.地址有物理映射(段错误)(能访问)
       b.地址要被分配(数据不安全)(合法访问) new malloc 
    保护模式:
    平面内存: 
    5.1.得到虚拟空间的空闲地址
         sbrk/brk
        得到没有映射空闲虚拟地址。
        分配与释放空间  
      sbrk函数说明
      void *sbrk(intptr_t size);
      参数:分配的空间的大小.
      返回:分配空间的首地址.
    
      如果空间大小是0,直接返回空闲地址,不分配空间
    5.2.试验:
       使用sbrk返回一个空闲地址,察看是否映射?
     
    5.3.使用sbrk分配空间  
        sbrk参数不能为0;
      
    5.4.空间映射的基本单位4K=4094字节。--页(page)   
       映射的空间至少是pagesize*X
       size_t getpagesize();
    5.5.使用brk函数分配空间/释放空间
       int brk(void *ptr)
       参数:指定内存的结束地址。
          ptr>当前空闲(sbrk(0)获取)地址,分配空间
          ptr<当前空闲(sbrk(0)获取)地址,释放空间
       当一个page被释放,则page被自动解除映射
  
    总结:
      1.brk/sbrk是内存分配释放函数
      2.使用brk/sbrk得到空闲首地址
      3.使用brk/sbrk分配释放内存
      4.什么时候需要使用brk/sbrk(大块的连续内存)
    
6.Linux提供更加底层的内存分配
    mmap分配空间/映射内存空间 分配尺寸至少是4K的倍数。
    ((4字节/4K)+1)*4k
    munmap释放空间,并且解除映射
    函数说明:
    void * mmap(
     void *ptr,//指定从什么地址开始映射。必须是页首,而且没有被映射的.可以使用sbrk(0)来获取
          //如果是NULL,系统来确定开始位置.
     size_t size,//分配空间大小,建议是pagesize的倍数
     int prot,//分配空间的访问模式.
          //PROT_READ | PROT_WRITE |PROT_NONE |PROT_EXECUTE
     int flags,//映射方式:
             // 共享还是私有MAP_SHARED MAP_PRIVATE
             // 内存映射还是文件映射MAP_ANONMOUS
     int fd,     //这个参数在没有MAP_ANONMOUS的时候有效,否则无效   
     offset_t off);
  
    返回值:分配失败,返回0,NULL   ,否则空间首地址。
  
    int munmap(void*,size_t);
  
试验:
    使用mmap分配空间 。
    1.学习使用mmap分配,munmap释放
    2.体会PROT_READ|PROT_WRITE的作用
      MAP_SHARED|MAP_PRIVATE    
    3.映射必须是一个页
    4.释放的大小与规律
  
总结:
    1.使用mmap分配空间。
    2.RPOT_WRITE PROT_READ PROT_EXECUTE作用
    3.释放空间的规律
    4.分配的开始位置可以指定.
       sbrk/brk与mmap不要混杂使用。

回顾:

    1.使用brk/sbrk(大块内存/无权限考虑)
    2.使用mmap/munmap (大块内存/有权限考虑)    
    3.两组内存分配函数的区别,以及new/malloc的区别。
作业:
    1.
    输入随便多个数或者指定个数的整数,使用brk/mmap申请内存存放输入数。
    输入完毕,把素数与合数分开分别打印出来。
  
    2.
    找出10000之内所有相邻素数。
  
思考:
   1。声明函数指针变量.
   2。函数指针类型转换.
   3。函数指针赋值.
   *4。函数是怎么传递参数的,尤其是指针参数以及C++的引用?
 

1.zip 压缩文件名 目录/*

相关内容