Linux中的零拷贝技术

Linux中的零拷贝技术,第1张

参考文章: 浅析Linux中的零拷贝技术

内核和用户空间,共享内存。数据copy到内核区后,只需要把地址共享给应用程序即可,无需再copy一次数据到用户空间。

优点:

缺点:

应用:

kafka生产者发送消息到broker的时候,broker的网络接收到数据后,copy到broker的内核空间。然后通过mmap技术,broker会修改消息头,添加一些元数据。所以,写入数据很快。当然顺序IO也是关键技术

内核直接发送数据到socket,无需用户空间参与。

优点:

缺点:

为了节省内核里面的一次copy,我们可以使用优化过的sendfile。该系统方法需要由特定的硬件来支持,并不是所有系统都支持。如下:

sendfile的时候,直接把内核空间的地址传递给socket缓存,DMA直接从指定地址读取数据到流里面。

sendfile只适用于将数据从文件拷贝到套接字上,限定了它的使用范围。Linux在2.6.17版本引入splice系统调用,用于在两个文件描述符中移动数据。

splice调用在两个文件描述符之间移动数据,而不需要数据在内核空间和用户空间来回拷贝。他从fd_in拷贝len长度的数据到fd_out,但是有一方必须是管道设备,这也是目前splice的一些局限性。flags参数有以下几种取值:

splice调用利用了Linux提出的管道缓冲区机制, 所以至少一个描述符要为管道。

以上几种零拷贝技术都是减少数据在用户空间和内核空间拷贝技术实现的,但是有些时候,数据必须在用户空间和内核空间之间拷贝。这时候,我们只能针对数据在用户空间和内核空间拷贝的时机上下功夫了。Linux通常利用写时复制(copy on write)来减少系统开销,这个技术又时常称作COW。

摘录网上:

传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过于简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork()使用写时拷贝(copy-on-write)页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写入的时候才进行,在此之前,只是以只读方式共享。这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下—举例来说,fork()后立即调用exec()—它们就无需复制了。fork()的实际开销就是复制父进程的页表以及给子进程创建惟一的进程描述符。在一般情况下,进程创建后都会马上运行一个可执行的文件,这种优化可以避免拷贝大量根本就不会被使用的数据(地址空间里常常包含数十兆的数据)。由于Unix强调进程快速执行的能力,所以这个优化是很重要的。这里补充一点:Linux COW与exec没有必然联系。

我总结下: copy-on-write技术其实是一种延迟复制的技术,只有需要用(写)的时候,才去复制数据。

Linux是什么?

1991年,芬兰赫而辛基的学生LinusTorvalds为了自己使用与学习的需要,他开发了类似Unix且运行在80386平台上运行的 *** 作系统,命名为Linux。为了使每个需要它的人都能够容易的得到它,LinusTorvalds把它变成了"自由"软件。

感谢Internet的飞速发展使得全世界的程序开发员有了一种全新的有效沟通方法。还要感谢在数年之前由RichardStallman主持的GNU项目。Linux在几年后变成了一个完整的 *** 作系统。它的能量得到了释放,变得非常可靠,并且每天都会有新的改进加入进去。

为了使Linux变得容易使用,Linux也有了许多发布版本,发布版实际上就是一整套完整的程序组合。现在已经有许多不同的Linux发行版和各自的版本号,为了不产生混淆,我们先解释一些常提到的术语。

当我们提到Linux时,一般是指"RealLinux",即内核,是所有UNIX *** 作系统的“心脏”。但光有linux并不能成为一个可用的 *** 作系统。还需要许多软件包,编译器,程序库文件,Xwindow系统等等。因为组合方式不同,面向用户对象不同,所以这就是为什么有许多不同的Linux发行版的原因。

Linux的特点

Linux *** 作系统在短短的几年之内得到了非常迅猛的发展,这与Linux具有的良好特性是分不开的。Linux包含了Unix的全部功能和特性。简单的说,Linux具有以下主要特性:

1.开放性

开放性是指系统遵循世界标准规范,特别是遵循开放系统互连(OSI)国际标准。凡遵循国际标准所开发的硬件和软件,都能彼此兼容,可方便地实现互连。

2.多用户

多用户是指系统资源可以被不同用户各自拥有使用,即每个用户对自己的资源(例如:文件、设备)有特定的权限,互不影响。Linux和Unix都具有多用户的特性。

3.多任务

多任务是现代计算机的最主要的一个特点。它是指计算机同时执行多个程序,而且各个程序的运行互相独立。Linux系统调度每一个进程,平等地访问微处理器。由于CPU的处理速度非常快,其结果是,启动的应用程序看起来好像在并行运行。事实上,从处理器执行一个应用程序中的一组指令到Linux调度微处理器再次运行这个程序之间只有很短的时间延迟,用户是感觉不出来的。

4.良好的用户界面

Linux向用户提供了两种界面:用户界面和系统调用。Linux的传统用户界面是基于文本的命令行界面,即shell,它既可以联机使用,又可存在文件上脱机使用。shell有很强的程序设计能力,用户可方便地用它编制程序,从而为用户扩充系统功能提供了更高级的手段。可编程Shell是指将多条命令组合在一起,形成一个 Shell程序,这个程序可以单独运行,也可以与其他程序同时运行。

系统调用给用户提供编程时使用的界面。用户可以在编程时直接使用系统提供的系统调用命令。系统通过这个界面为用户程序提供低级、高效率的服务。Linux还为用户提供了图形用户界面。它利用鼠标、菜单、窗口、滚动条等设施,给用户呈现一个直观、易 *** 作、交互性强的友好的图形化界面。

5.设备独立性

设备独立性是指 *** 作系统把所有外部设备统一当作成文件来看待,只要安装它们的驱动程序,任何用户都可以象使用文件一样, *** 纵、使用这些设备,而不必知道它们的具体存在形式。

具有设备独立性的 *** 作系统,通过把每一个外围设备看作一个独立文件来简化增加新设备的工作。当需要增加新设备时、系统管理员就在内核中增加必要的连接。这种连接(也称作设备驱动程序)保证每次调用设备提供服务时,内核以相同的方式来处理它们。当新的及更好的外设被开发并交付给用户时, *** 作允许在这些设备连接到内核后,就能不受限制地立即访问它们。设备独立性的关键在于内核的适应能力。其他 *** 作系统只允许一定数量或一定种类的外部设备连接。而设备独立性的 *** 作系统能够容纳任意种类及任意数量的设备,因为每一个设备都是通过其与内核的专用连接独立进行访问。

Linux是具有设备独立性的 *** 作系统,它的内核具有高度适应能力,随着更多的程序员加入Linux编程,会有更多硬件设备加入到各种Linux内核和发行版本中。另外,由于用户可以免费得到Linux的内核源代码,因此,用户可以修改内核源代码,以便适应新增加的外部设备。

6.提供了丰富的网络功能

完善的内置网络是Linux的一大特点。Linux在通信和网络功能方面优于其他 *** 作系统。其他 *** 作系统不包含如此紧密地和内核结合在一起的连接网络的能力,也没有内置这些联网特性的灵活性。而Linux为用户提供了完善的、强大的网络功能。

支持Internet是其网络功能之一。Linux免费提供了大量支持Internet的软件,Internet是在Unix领域中建立并繁荣起来的,在这方面使用Linux是相当方便的,用户能用Linux与世界上的其他人通过Internet网络进行通信。

文件传输是其网络功能之二。用户能通过一些Linux命令完成内部信息或文件的传输。

远程访问是其网络功能之三。Linux不仅允许进行文件和程序的传输,它还为系统管理员和技术人员提供了访问其他系统的窗口。通过这种远程访问的功能,一位技术人员能够有效地为多个系统服务,即使那些系统位于相距很远的地方。

7.可靠的系统安全

Linux采取了许多安全技术措施,包括对读、写进行权限控制、带保护的子系统、审计跟踪、核心授权等,这为网络多用户环境中的用户提供了必要的安全保障。

8.良好的可移植性

可移植性是指将 *** 作系统从一个平台转移到另一个平台使它仍然能按其自身的方式运行的能力。

Linux是一种可移植的 *** 作系统,能够在从微型计算机到大型计算机的任何环境中和任何平台上运行。可移植性为运行Linux的不同计算机平台与其他任何机器进行准确而有效的通信提供了手段,不需要另外增加特殊的和昂贵的通信接口。

我们为什么要用Linux?

Linux是"免费"的,上面又有那么多"免费"的软件,为什么不用?

Windows实在太不稳定了,受不了,换个平台吧。

想学习UNIX,可是钱包里的钞票不多,先从Linux开始吧。

想学习 *** 作系统,哪里有开放源代码的OS?而且还要很活跃,有前途的。

基于Linux的并行计算,不但费用低廉,而且功能强大,有潜力,重要的是有源代码。

想成为一名Hacker(当然是网侠一类),Linux当然是最好的工具之一。

Linux潜在的商业价值不可限量,性能相当地好,稳定性也很好,用其替换商业 *** 作系统真是明智的选择。

Oracle,Infomix,Sysbase,IBM都支持Linux了,用其作数据库平台挺不错。烦了一次又一次去买许可证(奸商经常设这样的陷阱),Linux遵循公共版权许可证(GPL)正合我意。

Linux太适合Internet/Intranet,本身就是通过网络来协同开发的,网络时代为什么不用Linux?

采用Linux可以极大的降低拥有者总成本(TCO)。等待商业 *** 作系统补丁的耐心是有限度的,更受不了总被商家牵着鼻子走,开放源代码的Linux至少可以使用户有一定的控制权。开放源代码使用户可以按照自己的需要添加或删除某些功能,用户可定制性,真是太好了!

利用开放源代码的Linux还可以开发路由器,嵌入式系统,网络计算机,个人数字助理等等,GNU真是巨大的知识宝库,何乐而不用


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/7128393.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-02
下一篇2023-04-02

发表评论

登录后才能评论

评论列表(0条)

    保存