Linux就这个范儿 第18章  这里也是鼓乐笙箫  Linux读写内存数据的三种方式

P703

Linux读写内存数据的三种方式

1、read  ,write方式会在用户空间和内核空间不断拷贝数据,占用大量用户内存空间,效率不高

2、内存映射方式把设备文件的内存映射到应用程序中的内存空间,直接处理设备内存,这是一种高效的方式。mmap函数就是这种方式

如果程序中使用了mmap方法,需要使用munmap方法删除内存映射

3、 用户指针方式,是内存片段由应用程序自己分配。

18.2.1 羞辱柱与软件许可  shame:羞耻
看到这个三个字,你可能会很吃惊。羞辱柱是什么?这得从ffmpeg的软件许可证说起。ffmpeg是一个跨平台的视频和音频流方案,属于自由软件,采用LGPL或GPL许可证,具体是什么还要依据你选择的组件来定。如果你使用了其中一些使用GPL协议发布的模块,那么你必须使用GPL协议。可是就有些不自觉的家伙使用了ffmpeg的代码,却并没有遵守LGPL/GPL协议,也就是没有公开自己的源代码。ffmpeg开发组很生气,后果很严重,便将这些违反协议的公司/组织/个人的网址贴在他们的“耻辱柱”的网页上,准备与这些公司/组织/个人商讨解决版权争议。不过现在我访问这个叫“耻辱柱”的网页http:// ffmpeg.org/shame.html发现,网页虽然还能访问,但已经看不到名单了,看来他们还是给这些违法者留了一点面子,让他们自觉地公布代码,然后在付诸法律行动。
提起软件许可的问题,我觉得还是要认真对待。越来越多的自由软件(Free Software)使用GPL作为其授权声明,如果对GPL一点都不了解,有可能在使用自由软件时会违反GPL的授权。如果是个人或不正规的公司倒也无所谓,但如果是有规模的公司,恐怕会有被起诉的风险。GPL是GNU General Public License(GNU通用公共许可证)的缩写形式。出发点是代码的开源免费使用、以及引用、修改、衍生代码的开源免费使用,但不允许修改后和衍生的代码作为闭源的商业软件发布和销售。Linux提倡自由和分享的精神,所以Linux采用的是GPL协议。这也是为什么我们能用免费的各种Linux软件,包括商业公司的Linux和Linux上各种各样的由个人、组织以及商业软件公司开发的免费软件。
我们之前谈到的GStreamer采用的是LGPL协议。LGPL是GNU Lesser General Public License(GNU宽通用公共许可证)的缩写形式,旧称GNU Library General Public License(GNU库通用公共许可证)。基于LGPL的软件允许商业化销售,但不允许封闭源代码。如果你对遵循LGPL的软件进行任何改动或再次开发并予以发布,则你的产品必须继承LGPL协议,不允许封闭源代码。但是如果你的程序对遵循LGPL的软件进行的是连接、调用而不是包含,则允许封闭源代码。明白了吧?下图描绘了GPL和LGPL协议的要求。

我们开发的软件究竟采用GPL好,还是LGPL好呢?这个问题实际上是个策略问题。由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,如果是商业或者对代码有保密要求的软件就不适合集成或采用使用GPL协议的开源代码作为它的类库和二次开发的基础。因为私有软件开发者使用了GPL库就必须公开自己的源码,自己所开发软件也要免费,这些可能都是商业软件无法接受的条件。
但是对于自由软件开发者来讲,大多数情况下采用GPL的优势比较大,自由软件开发者联合起来借着这个机会相互之间利用各自的优势不断发展壮大。当然自由软件开发也并不是所有情况都采用GPL就更好。你的库不是特殊和无法取代的库,很容易就能被私有软件以其他可替代库来实现。如果库不能给予自由软件任何特别的优势,最好还是以LGPL发布该库,GNUC库(glibc)选择了LGPL就是因为这个原因。如果我们使用GPL发布该库,将迫使私有软件开发者不得不使用其他的库,那我们的函数库的存在意义就会打了一个大大的折扣。
另外,现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们常见的开源协议如GPL、LGPL、BSD、Apache License2.0以及MIT等都是OSI批准的协议。做开源项目的时候,我们需要弄清楚这些软件引用的协议,我们自己的软件采用哪种开源协议比较好,然后选择和决定使用哪个开源软件。

f

Linux就这个范儿 第18章 这里也是鼓乐笙箫 Linux读写内存数据的三种方式的更多相关文章

  1. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  2. Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统 nsswitch.conf配置文件

    Linux就这个范儿 第16章 谁都可以从头再来--从头开始编译一套Linux系统  nsswitch.conf配置文件 朋友们,今天我对你们说,在此时此刻,我们虽然遭受种种困难和挫折,我仍然有一个梦 ...

  3. Linux就这个范儿 第10章 生死与共的兄弟

    Linux就这个范儿 第10章 生死与共的兄弟 就说Linux系统的开机.必须经过加载BIOS.读取MBR.Boot Loader.加载内核.启动init进程并确定运行等级.执行初始化脚本.启动内核模 ...

  4. Linux就这个范儿 第9章 特种文件系统

    Linux就这个范儿 第9章 特种文件系统 http://book.douban.com/reading/32081222/ P326 有一种文件系统,根本不在磁盘上.这种文件系统就是大名顶顶的ram ...

  5. Linux就这个范儿 第19章 团结就是力量 LSB是Linux标准化基地(Linux Standards Base)的简称

    Linux就这个范儿 第19章 团结就是力量  LSB是Linux标准化基地(Linux Standards Base)的简称 这个图片好可爱,它是LSB组织的图标.你肯定会问:“图标这么设计一定有说 ...

  6. Linux就这个范儿 第14章 身在江湖

    Linux就这个范儿 第14章 身在江湖 “有人的地方就有江湖”,如今的计算机世界就像一个“江湖”.且不说冠希哥有多么无奈,把微博当QQ的局长有多么失败,就说如此平凡的你我什么时候就成了任人摆布的羔羊 ...

  7. Linux就这个范儿 第13章 打通任督二脉

    Linux就这个范儿 第13章 打通任督二脉 0111010110……你有没有想过,数据从看得见或看不见的线缆上飞来飞去,是怎么实现的呢?数据传输业务的未来又在哪里?在前面两章中我们学习了Linux网 ...

  8. Linux就这个范儿 第12章 一个网络一个世界

    Linux就这个范儿 第12章 一个网络一个世界 与Linux有缘相识还得从一项开发任务说起.十八年前,我在Nucleus  OS上开发无线网桥AP,需要加入STP生成树协议(SpanningTree ...

  9. Linux就这个范儿 第11章 独霸网络的蜘蛛神功

    Linux就这个范儿 第11章  独霸网络的蜘蛛神功  第11章 应用层 (Application):网络服务与最终用户的一个接口.协议有:HTTP FTP TFTP SMTP SNMP DNS表示层 ...

随机推荐

  1. ICursor查询后的排序问题

    为某表做剔除整合处理,各行相关.起初使用 ICursor pCursor = pTable.Search(null,false); 语句查询,ICursor的第一行并没有指向表的第一行,虽然不是第一行 ...

  2. Apache和mysql的安装设置

    Apache和mysql的安装较简单,主要是安装前请保证80端口未被占用 比如 iis 以前安装过的apache mysql 先停止运行phpmyadmin,主要是配置文件的问题,把phpMyAdmi ...

  3. JSP简单访问数据库

    Java代码 public class DBHelper { private String driverName; private String url; private String user; p ...

  4. HDU 1007 Quoit Design(二分+浮点数精度控制)

    Quoit Design Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) To ...

  5. PHP 错误与异常 笔记与总结(13 )自定义异常类

    针对不同的异常,进行不同的处理,可以通过自定义异常类记录特定的异常信息来处理不同类型的异常.自定义异常类通过继承基类(Exception),对基类进行扩展. 自定义异常类 <?php heade ...

  6. pycharm使用笔记

    Basic code completion (the name of any class, method or variable) control + 空格  # 代码补全,如果跟系统spotligh ...

  7. 转载:C/C++源代码到可执行程序的过程详解

    C/C++源代码到可执行程序的过程详解 编译,编译程序读取源程序(字符流),对之进行词法和语法的分析,将高级语言指令转换为功能等效的汇编代码,再由汇编程序转换为机器语言,并且按照操作系统对可执行文件格 ...

  8. Laravel timestamps 设置为unix时间戳

    Laravel timestamps 设置为unix时间戳 class BaseModel extends Eloquent { /** * 默认使用时间戳戳功能 * * @var bool */ p ...

  9. the computer spends over 96% of its time waiting for I/O devices to finish transferring data

    COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION

  10. a computer-centered view of information systems to a database-centered view

    Code.Complete.Second.Edition 2004 Bachman compared the Ptolemaic-to-Copernican change in astronomy t ...