中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

美國(guó)一般用什么做網(wǎng)站主頁(yè)seo搜索引擎優(yōu)化工資多少錢(qián)

美國(guó)一般用什么做網(wǎng)站主頁(yè),seo搜索引擎優(yōu)化工資多少錢(qián),wordpress配置文件ini,海滄網(wǎng)站建設(shè)一、零拷貝 在前面的文章“深淺拷貝、COW及零拷貝”中對(duì)零拷貝進(jìn)行過(guò)分析,但沒(méi)有舉例子,也沒(méi)有深入進(jìn)行展開(kāi)分析。本文將結(jié)合實(shí)際的例程對(duì)零拷貝進(jìn)行更深入的分析和說(shuō)明。 在傳統(tǒng)的IO操作中,以文件通過(guò)網(wǎng)絡(luò)傳輸為例 ,一般會(huì)經(jīng)歷以…

一、零拷貝

在前面的文章“深淺拷貝、COW及零拷貝”中對(duì)零拷貝進(jìn)行過(guò)分析,但沒(méi)有舉例子,也沒(méi)有深入進(jìn)行展開(kāi)分析。本文將結(jié)合實(shí)際的例程對(duì)零拷貝進(jìn)行更深入的分析和說(shuō)明。
在傳統(tǒng)的IO操作中,以文件通過(guò)網(wǎng)絡(luò)傳輸為例 ,一般會(huì)經(jīng)歷以下幾個(gè)數(shù)據(jù)拷貝的過(guò)程:
磁盤(pán)緩沖區(qū) ->內(nèi)核緩沖區(qū)->用戶緩沖區(qū)->內(nèi)核網(wǎng)絡(luò)緩沖區(qū)->網(wǎng)卡緩沖區(qū)
也就是數(shù)據(jù)要經(jīng)歷從IO到內(nèi)核空間,再?gòu)膬?nèi)核到用戶空間再進(jìn)入內(nèi)核空間然后才能通過(guò)IO發(fā)走,至少要有四次的內(nèi)在拷貝。
而這就引出了零拷貝的概念:盡最大可能減少CPU參與數(shù)據(jù)拷貝的過(guò)程(直到完全不參與拷貝)。它主要有基于內(nèi)核緩沖優(yōu)化的零拷貝和DirectIO的零拷貝。
仍然以上面的鏈路來(lái)分析,可不可以直接從硬盤(pán)把數(shù)據(jù)(內(nèi)核緩沖區(qū))拷貝到網(wǎng)卡緩沖區(qū),可不可以?可不可以不過(guò)用戶緩沖區(qū)直接在內(nèi)核內(nèi)交互數(shù)據(jù)?這都是直接想到的解決問(wèn)題的方法和手段。而實(shí)際上,零拷貝技術(shù)也就是按這種指導(dǎo)思想進(jìn)行開(kāi)展的。
零拷貝技術(shù)的實(shí)現(xiàn)有以下幾種方法:
1、DirectIO
這個(gè)好理解,不通過(guò)各種中間環(huán)節(jié)直接和IO打交道。它主要應(yīng)用于上層應(yīng)用本身實(shí)現(xiàn)了磁盤(pán)的數(shù)據(jù)緩存,比如常見(jiàn)的數(shù)據(jù)庫(kù)系統(tǒng)軟件,那么就不需要再使用PageCache進(jìn)行緩沖。這樣就可以減少PageCache(內(nèi)核緩沖區(qū))的消耗(這可略過(guò)了計(jì)算中最大的中間商CPU)。而諸如下面的sendfile等,其實(shí)都基于PageCache優(yōu)化的零拷貝。
2、新的函數(shù)sendfile(win:TransmitFile)
sendfile是Linux系統(tǒng)提供的系統(tǒng)API,它可以解決用戶空間和內(nèi)核空間的數(shù)據(jù)拷貝的次數(shù)問(wèn)題;如果其和DMA技術(shù)(重點(diǎn)指SG-DMA(The Scatter-Gather Direct Memory Access))共同工作即sendfile+DMA,那么其效率更高,可以直接把數(shù)據(jù)文件從磁盤(pán)拷貝到網(wǎng)絡(luò)緩沖區(qū) 。
sendfile有其一定的局限性,首先是標(biāo)準(zhǔn)不統(tǒng)一,另外一個(gè)就是無(wú)法在數(shù)據(jù)操作中間在用戶空間對(duì)數(shù)據(jù)進(jìn)行操作,比如從磁盤(pán)加載然后加解密等然后再發(fā)送,因?yàn)榈貌坏骄唧w的數(shù)據(jù) ,這需要引起重視。
3、函數(shù)splice
splice技術(shù)更進(jìn)一步,它接近于 sendfile和DMA的進(jìn)一步效率提高,此函數(shù)在內(nèi)核空間和網(wǎng)絡(luò)緩沖區(qū)間建立管道,避免二者的CPU的拷貝。注意,此函數(shù)中的兩個(gè)文件操作符必須有一個(gè)為管道操作符。
4、mmap
mmap方式大家比較熟悉,這里就簡(jiǎn)單說(shuō)明一下,其實(shí)mmap的零拷貝就是通過(guò)內(nèi)存映射提供一個(gè)內(nèi)核和用戶空間直接通信的手段。mmap應(yīng)用非常多,最典型的是安卓的應(yīng)用,Framework層的數(shù)據(jù)通信很多是用mmap為實(shí)現(xiàn)的。
5、tee
tee函數(shù)用來(lái)在兩個(gè)管道文件描述符間復(fù)制數(shù)據(jù)。它要求兩個(gè)文件描述符都必須為管道描述符;同時(shí),它在復(fù)制過(guò)程中保持原數(shù)據(jù)不動(dòng)直接復(fù)制fd,而splice是移動(dòng)數(shù)據(jù)從源fd到目的fd。注意二者的區(qū)別和不同。
下面就分別對(duì)幾類技術(shù)實(shí)現(xiàn)方式進(jìn)行舉例分析。在分析之前,先對(duì)原來(lái)的文章“深淺拷貝、COW及零拷貝”中零拷貝的圖進(jìn)行一下完善:

在這里插入圖片描述

主要是補(bǔ)齊了未描述清楚的普通DMA部分的流程。

二、sendfile

先看一下定義:

int main(int argc, char* argv[])
{
......int ffd = open(fname, O_RDONLY);//打開(kāi)文件struct stat st;fstat(ffd, &st);struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;inet_pton(AF_INET, ip, &addr.sin_addr);addr.sin_port = htons(static_cast<uint16_t>(port));int s = socket(PF_INET, SOCK_STREAM, 0);int reuse = 1;//設(shè)置端口重用setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));int ret = bind(s, reinterpret_cast<struct sockaddr*>(&addr), sizeof(addr));ret = listen(s, 3);struct sockaddr_in client;socklen_t client_addrlen = sizeof(client);int cSocket = accept(s, reinterpret_cast<struct sockaddr*>(&client), &client_addrlen);if (cSocket < 0) {printf("accept err: %d\n", errno);}else {sendfile(cSocket, ffd, NULL, static_cast<size_t>(st.st_size));close(cSocket);}......return 0;
}

注意上面的代碼省略了相關(guān)的安全控制和參數(shù)賦值,大家可以自行設(shè)置,直接寫(xiě)成固定的就可以,只是一個(gè)測(cè)試程序么。

三、splice

splice的應(yīng)用也不復(fù)雜,但需要注意其中的一些要求,特別是參數(shù)中,在Linux2.6.21以前,splice的flags設(shè)置SPLICE_F_MOVE有效,其后就無(wú)效了,但SPLICE_F_NONBLOCK 和SPLICE_F_MORE都有效果??匆幌吕?#xff1a;

#include <fcntl.h>
#include <unistd.h>
#include <strings.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <libgen.h>
#include <assert.h>
#include <stdlib.h>int main(int argc, char* argv[])
{
......struct sockaddr_in addr;bzero(&addr, sizeof(addr));addr.sin_family = AF_INET;inet_pton(AF_INET, ip, &addr.sin_addr);addr.sin_port = htons(static_cast<uint16_t>(port));int sfd = socket(PF_INET, SOCK_STREAM, 0);int reuse = 1;setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));int r = bind(sockfd, reinterpret_cast<sockaddr*>(&addr), sizeof(addr));r = listen(sockfd, 3);struct sockaddr_in cSocket;socklen_t client_addrlen = sizeof(cSocket);int cfd = accept(sfd, reinterpret_cast<sockaddr*>(&cSocket), &client_addrlen);if (cfd < 0) {printf("accept err: %d\n", errno);}else {int pfd[2];ret = pipe(pfd);while (1) {ssize_t res;res = splice(cfd, NULL, pfd[1], NULL, 1024, SPLICE_F_MORE | SPLICE_F_MOVE);if (res == 0) { // 收到EOFbreak;}res = splice(pfd[0], NULL, cfd, NULL, 1024, SPLICE_F_MORE | SPLICE_F_MOVE);}close(cfd);}close(sfd);return 0;
}

相關(guān)的具體參數(shù)可以看說(shuō)明文檔,還是相當(dāng)清楚的。

四、tee和mmap

mmap的例子非常多,這里只給一個(gè)tee相關(guān)的例子:


#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <libgen.h>
#include <assert.h>int main(int argc, char* argv[])
{
......int ffd = open(argv[1], O_CREAT | O_TRUNC | O_WRONLY, 0666);int pfdout[2];int r = pipe(pfdout);assert(r != -1);int pfdfile[2];r = pipe(pfdfile);while (1) {ssize_t res = splice(STDIN_FILENO, NULL, pfdout[1], NULL, 1024, SPLICE_F_MORE | SPLICE_F_MOVE);if (res == 0) {break;}res = tee(pfdout[0], pfdfile[1], 1024, SPLICE_F_NONBLOCK);res = splice(pfdfile[0], NULL, ffd, NULL, 1024, SPLICE_F_MORE | SPLICE_F_MOVE);assert(res != -1);// 二次調(diào)用,因?yàn)榈谝淮握{(diào)用數(shù)據(jù)已經(jīng)移動(dòng),所以splice函數(shù)阻塞//res = splice(pfdfile[0], NULL, STDOUT_FILENO, NULL, 1024, SPLICE_F_MORE | SPLICE_F_MOVE);}.......return 0;
}

這些都沒(méi)有什么難度,手冊(cè)上也都有相關(guān)的例程。

五、DMA技術(shù)和零拷貝

在上面的分析過(guò)程中可以清晰的知道,DMA技術(shù)和零拷貝既有千絲萬(wàn)縷的聯(lián)系,又有所不同:
DMA技術(shù)是負(fù)責(zé)數(shù)據(jù)的直通,零拷貝重點(diǎn)是CPU不參與數(shù)據(jù)拷貝,但需要參與數(shù)據(jù)的管理(比如數(shù)據(jù)可以使用,開(kāi)始操作等等),也就是說(shuō)DMA技術(shù)和零拷貝技術(shù)中的CPU互相協(xié)作,達(dá)到數(shù)據(jù)拷貝的次數(shù)最少的目的。
零拷貝其實(shí)就是考慮減少?gòu)腎O到用戶層的整個(gè)數(shù)據(jù)流程的拷貝次數(shù)從而提高效率,要始終抓住這條主線。DMA主要是拷貝,CPU重點(diǎn)是管理,即把CPU從既管理又復(fù)制中簡(jiǎn)化工作任務(wù),只管理即可。DMA技術(shù)和硬件關(guān)系很密切,所以在具體的開(kāi)發(fā)使用中,要明確硬件是否支持相關(guān)具體的操作。
需要注意的另外一點(diǎn)是,在實(shí)際場(chǎng)景中,如果是非常大的數(shù)據(jù)文件處理,基于PageCache零拷貝技術(shù)則有些力不從心了,還是得使用Direct IO的零拷貝技術(shù)。

六、使用零拷貝的框架

說(shuō)一些技術(shù)和概念可能理解并不深刻,可以參考一下相關(guān)的一些開(kāi)源框架中使用的零拷貝技術(shù):
1、KAFKA
使用sendfile的零拷貝技術(shù)
2、Nginx
提供了sendfile和directio的相關(guān)零拷貝技術(shù)
3、Mysql
使用了directio的零拷貝技術(shù)
4、Netty
使用sendfile的零拷貝技術(shù)
5、RocketMQ
使用了mmap write的零拷貝技術(shù)

七、總結(jié)

其實(shí)說(shuō)得更淺顯一些,所謂零拷貝更準(zhǔn)確的說(shuō)不是零次拷貝,是指盡可能的減少拷貝。在DPDK的系列文章中,這種操作被發(fā)揮的淋漓盡致。互聯(lián)網(wǎng)的口號(hào)就是“不讓中間商賺差價(jià)”,這個(gè)在現(xiàn)實(shí)上可能有一些邏輯上的BUG,但在內(nèi)存操作上確實(shí)是非常用益。
當(dāng)然,萬(wàn)事萬(wàn)物不是說(shuō)是絕對(duì)的,有的時(shí)候,抽象一下,加一層,如果能達(dá)到更好的效果,又不影響實(shí)際的使用的情況下,豈不更妙?千頭萬(wàn)緒又回到始終堅(jiān)持的原則,應(yīng)用場(chǎng)景決定應(yīng)用技術(shù),實(shí)踐是檢驗(yàn)真理的標(biāo)準(zhǔn)。

http://www.risenshineclean.com/news/47707.html

相關(guān)文章:

  • 福田做網(wǎng)站的公司sem全稱
  • 網(wǎng)絡(luò)空間租用價(jià)格seo整站優(yōu)化服務(wù)
  • 網(wǎng)站后臺(tái)管理的超鏈接怎么做重慶企業(yè)站seo
  • 煎蛋網(wǎng) wordpress南通seo網(wǎng)站優(yōu)化軟件
  • 上海自助建站官網(wǎng)廣東做seo的公司
  • 黃石網(wǎng)站制作上海推廣系統(tǒng)
  • 做網(wǎng)站什么配置夠用百度營(yíng)銷搜索推廣
  • 寶安網(wǎng)站建設(shè)-信科網(wǎng)絡(luò)排行榜
  • 網(wǎng)站用cms百度在線使用網(wǎng)頁(yè)版
  • 網(wǎng)站建設(shè)重點(diǎn)成品短視頻app下載有哪些
  • 谷歌有做網(wǎng)站建設(shè)莆田百度推廣開(kāi)戶
  • 網(wǎng)站建設(shè)建議推廣價(jià)格一般多少
  • 湖南網(wǎng)站建設(shè)報(bào)價(jià)網(wǎng)站網(wǎng)絡(luò)推廣推廣
  • 做網(wǎng)站就業(yè)要會(huì)什么問(wèn)題公司網(wǎng)址怎么注冊(cè)
  • 重慶平臺(tái)網(wǎng)站建設(shè)設(shè)計(jì)獲客軟件
  • 定制做網(wǎng)站費(fèi)用百度上海推廣優(yōu)化公司
  • 一般網(wǎng)站的寬度桂平seo快速優(yōu)化軟件
  • 山東食品行業(yè)網(wǎng)站模板百度推廣創(chuàng)意范例
  • 法制教育網(wǎng)站廣州網(wǎng)站建設(shè)公司
  • 一個(gè)網(wǎng)站開(kāi)發(fā)背景是什么semantic scholar
  • 微信網(wǎng)站與響應(yīng)式網(wǎng)站圖片優(yōu)化是什么意思
  • 上海網(wǎng)站代優(yōu)化教你免費(fèi)申請(qǐng)個(gè)人網(wǎng)站
  • 網(wǎng)站開(kāi)發(fā)研究?jī)?nèi)容怎么寫(xiě)小程序開(kāi)發(fā)平臺(tái)有哪些
  • 上海電子通科技網(wǎng)站建設(shè)西安關(guān)鍵詞排名提升
  • 網(wǎng)站搭建徐州百度網(wǎng)絡(luò)360廣告推廣平臺(tái)
  • 做網(wǎng)站軟件 手機(jī)seo搜索引擎優(yōu)化營(yíng)銷案例
  • 品牌微營(yíng)銷網(wǎng)站建設(shè)b站黃頁(yè)推廣
  • 網(wǎng)站建設(shè)策劃書(shū)附錄網(wǎng)站優(yōu)化的意義
  • 網(wǎng)站關(guān)鍵詞排名如何提升我的百度購(gòu)物訂單
  • 濟(jì)南外貿(mào)網(wǎng)站建設(shè)公司電商網(wǎng)站建設(shè)公司哪家好