版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第一篇次并行封等到名計算
第1章并行計算與云計算........2
U并行計算到云計算的演變..........2
1.2云計算需要定義嗎?.......4
1.3云計算是否是新瓶裝舊酒..........5
1.4MP1與Hadoop,不同學(xué)科
學(xué)者的選擇.…6
1.5云計算與瀏覽器.........8
第2章MPI并行計算環(huán)境的建立..........10
2.1配置前的準(zhǔn)備工作....10
2.2掛載NFS文件系統(tǒng).........11
2.3配置ssh實現(xiàn)MPI節(jié)點間
用戶的無密碼訪問..........12
2.4安裝MPICH2......................12
2.5建立并行計算環(huán)境時的
注意事項.…..…14
第3章并行計算時代的程序設(shè)計方法.……15
3.1最簡單的并行程序..........15
3.2獲取進(jìn)程標(biāo)志和機器名...........18
3.3有消息傳遞功能的并行程序...........20
3.4MonteCarlo法在并行程序設(shè)計
中的應(yīng)用.........23
3.5并行計算中節(jié)點間的
Reduce操作.25
3.6用MPI的6個基本函數(shù)實現(xiàn)
Reduce函數(shù)功能.......28
3.7計算與通信的并行.—30
3.8節(jié)點間自定義復(fù)雜數(shù)據(jù)
結(jié)構(gòu)的傳輸.?34
3.9MP1與MySQL數(shù)據(jù)庫的
結(jié)合應(yīng)用.........37
3.10設(shè)計MPI并行程序時的
注意事項…41
第4章從MP1走向云計算.....43
4.1MPI沒有分布式文件系統(tǒng)支持....43
4.2MPI無法應(yīng)對節(jié)點的失效.......44
4.3假如用MPI來構(gòu)建云計算系統(tǒng)...44
第二篇云計算的關(guān)鍵技術(shù)
第5章Map/Reduce是云計算的選擇嗎.....48
5.1Map/Reduce跨越5Q年的
歷史..........48
5.2實現(xiàn)Map/Reduce的C語言實例.49
5.3采用MPI實現(xiàn)并行化的
Map/Reduce功能.......51
第6章Hadoop技術(shù)..58
6.1Hadoop與MPI在數(shù)據(jù)處理上的
對比..........58
6.2Hadoop的主從式結(jié)構(gòu).59
6.2.1主從式文件系統(tǒng)HDFS.......59
6.2.2主從式計算系統(tǒng)
Map/Reduce.........60
6.2.3文件分塊策略分析........61
6.3Hadoop文件系統(tǒng)HDFS的
前輩GFS.........64
6.4構(gòu)建云文件系統(tǒng)需要解決的
關(guān)鍵問題...……66
6.5云計算不相信節(jié)點服務(wù)器........67
6.6揭密云計算架構(gòu)下的典型
服務(wù)器----Google務(wù)器........68
6.6.1Google服務(wù)器概述.......68
6.6.2揭開Goo原e服務(wù)器的
神秘面紗.......69
6.6.3Google服務(wù)器的配置
情況.69
6.6.4Goog/e服務(wù)器的性能
評測.73
第7章Hadoop環(huán)境的建立....75
7.1Hadoop配置環(huán)境.....75
7.2配置ssh實現(xiàn)Hadoop結(jié)點間
用戶的無密碼訪問.………76
7.3JDK的安裝配置.....76
7.4Hadoop的安裝配置........77
7.5Hadoop中的HelloWorld..................81
7.6C語言程序在Hadoop
上運行.......82
第8章動手做自己的云計算
V0.01系統(tǒng).....86
8.1系統(tǒng)總體分析...........86
8.1.1系統(tǒng)架構(gòu)........86
8.1.2文件分布式存儲流程.....88
8.1.3計算與存儲的整合流程......88
8.2管理節(jié)點程序設(shè)計與分析.......89
8.2.1管理節(jié)點服務(wù)器程序
主函數(shù)...........90
8.2.2管理節(jié)點各線程函數(shù)的
設(shè)計..93
8.2.3主服務(wù)器中其他函數(shù)的
設(shè)計..95
8.3子節(jié)點程序分析.......98
8.3.1子節(jié)點主函數(shù).....99
8.3.2子節(jié)點各線程函數(shù)設(shè)計..102
8.4客戶端API設(shè)計.....107
8.4.1客戶端文件的存儲.......108
8.4.2客戶端啟動子節(jié)點計算...113
8.4.3客戶端應(yīng)用的簡單實例...114
8.5客戶端應(yīng)用開發(fā)實例115
第三篇云計算應(yīng)用實例
第9章基于不可信服務(wù)器節(jié)點的云計算
基礎(chǔ)架構(gòu).......118
9.1云計算基礎(chǔ)架構(gòu)的應(yīng)用場景........118
9.2云計算基礎(chǔ)架構(gòu)......120
9.3基于單向指針目錄映射的分層
用戶隔離......121
9.4云文件系統(tǒng)的物理存儲管理..……123
9.5云存儲的安全級別劃分..........124
9.6計算和存儲的整合.……125
9.7計算和存儲的遷移.......126
9.8任務(wù)的可并行性和分類分析........127
9.9簡化的服務(wù)器級粗粒度計算和
存儲資源分配方案...130
9.10數(shù)據(jù)的云計算系統(tǒng)之旅.......133
第10章云計算與智能.........135
W.1云計算的智能與人類
智能的比較..........735
10.2云計算提升終端智能..........136
10.3云計算智能與MonteCarb
方法.......138
10.4云計算時代不確定性智能算法
示例——模擬諧振子算法....138
10.4.1簡諧振動的描述.........139
10.4.2模擬諧振子算法描述......141
1043模擬諧振子算法流程......144
10.4.4模擬諧振子算法分析......146
10.4.5模擬諧振子算法應(yīng)用于
旅行商問題.....149
10.4.6模擬諧振子算法在連續(xù)
和非線性優(yōu)化問題中的
應(yīng)用.............161
10.4.7模擬諧振子算法的隱含
并行性........162
10.5云計算中的人工智能..........162
第11章云計算企業(yè)之間的競爭性
分析........164
11.1云計算技術(shù)流派分析...........164
存儲型一數(shù)據(jù)密集云
計算平臺.....164
11.1.2計算型一計算密集云
計算平臺.....165
11.1.3綜合云計算平臺........165
11.2國際云計算公司分析...........165
1121云計算技術(shù)的提出者
Google..................166
11.2.2“端”的霸主微軟......166
11.2.3藍(lán)色巨人IBM的藍(lán)云....167
11.2.4云計算的市場先行者
Amazon公司.168
11.2.5Salesforce從SaaS走入
云中...........168
11.2.6熱愛白皮書的Sun...........169
11.2.7EMC云計算的核心是
虛擬化........170
11.2.8漁翁得利的思科.........170
11.3國內(nèi)云計算公司分析............171
11.3.1擁有基礎(chǔ)設(shè)施的
世紀(jì)互聯(lián).....171
11.3.2阿里巴巴下決心
入云...........172
11.3.3中國移動的BigCloud......172
11.3.4國產(chǎn)旗幟友友云計算
平臺...........173
11.3.5曙光高性能與云計算......173
11.3.6展覽也要云..…173
11.4開源云計算平臺分析............174
11.5國際國內(nèi)云計算平臺提供商
對比研究..175
11.6產(chǎn)業(yè)綜合分析.......179
H.6.1云計算與網(wǎng)絡(luò)設(shè)備商的
關(guān)系...........179
11.6.2云計算與移動通訊運
營商的關(guān)系..…180
11.6.3云計算與服務(wù)器提
供商的關(guān)系..…180
1164云計算與應(yīng)用程序開
發(fā)商的關(guān)系..…181
后記:未來的計算機一不確定性和
隱含并行計算...........182
附錄:計算力的標(biāo)準(zhǔn)Unpack測試詳細(xì)
指南..........186
參考文獻(xiàn)196
面對云計算,有的人越來越糊涂,經(jīng)常聽到有人用云里霧里來形容現(xiàn)在的云計算。云計算系
統(tǒng)
確實是一個龐大和綜合的系統(tǒng),即使是國際大公司也不敢貿(mào)然進(jìn)軍云計算領(lǐng)域,大量的企業(yè)
不
是將自己的傳統(tǒng)技術(shù)優(yōu)勢稱為云計算,就是雷聲大雨點小的觀望。一般開發(fā)者更是不適應(yīng)在
機
群的環(huán)境下工作,所以本章將用一個簡單的例子來展現(xiàn)云計算的基本特點和技術(shù)開發(fā)方式,
我
們并不保證這個系統(tǒng)是一個完善的系統(tǒng),但它具備了云計算的一些基本特點如計算和存儲的
整
合、計算向存儲的遷移、文件的分布式存儲、計算的并行化等,我們對這些功能采用了最簡
單
的實現(xiàn)方法以使大多數(shù)讀者能從中體會到云計算技術(shù)的核心理念,所以我們命名這個系統(tǒng)為
云
計算V0.01,運行環(huán)境為Windows.
8.1
系統(tǒng)總體分析
我們進(jìn)行系統(tǒng)總體結(jié)構(gòu)設(shè)計時主要著眼于云計算基本特征的實現(xiàn),不考慮系統(tǒng)中很多細(xì)節(jié)性
的
要求和高級要求,并采用中等水平的讀者能完成的難度設(shè)計。
設(shè)計需要實現(xiàn)的基本功能如下。
(1)向開發(fā)云應(yīng)用的客戶提供可以調(diào)用的API函數(shù),利用API函數(shù)實現(xiàn)對云計算系統(tǒng)的訪
問。
(2)實現(xiàn)分布式的文件存儲。
(3)實現(xiàn)計算向存儲的遷移,使計算和存儲在同一個節(jié)點完成,避免數(shù)據(jù)在網(wǎng)絡(luò)中的傳送。
(4)向用戶隔離計算的并行性和存儲的分布性,用戶無需關(guān)心系統(tǒng)具體的操作過程。
(5)初步實現(xiàn)對數(shù)據(jù)求和及求最大值的處理,演示云計算的基本特點。讀者可以通過增加處
理
函數(shù)實現(xiàn)更多的計算功能。
8.1.1
系統(tǒng)架構(gòu)
云計算V0.01系統(tǒng)是一個完全模型化的實驗用系統(tǒng),開發(fā)和運行環(huán)境為Windows系統(tǒng),通過
對該
系統(tǒng)的學(xué)習(xí)使讀者對云計算技術(shù)的基本要點有一定的了廨,云計算V0.01將云計算設(shè)備分為
3個
角色:管理節(jié)點、子節(jié)點和客戶端。管理節(jié)點和子節(jié)點構(gòu)成了云計算的服務(wù)器端,客戶端通
過
對API的調(diào)用實現(xiàn)對云計算系統(tǒng)的訪問,并通過API整合為不同的應(yīng)用程序。為了簡化系統(tǒng)
的設(shè)
計難度,我們在做云計算V0.01時限定所做的計算任務(wù)包括對大數(shù)據(jù)量數(shù)組求和、求最大值
等操
作,讀者可通過實際的系統(tǒng)體會存儲的分布化與計算的并行化的關(guān)系,并理解計算向存儲遷
移
的作用。云計算V0.01沒有實現(xiàn)存儲的副本策略,因此暫時不能處理節(jié)點失效的問題,這也
是為
了降低系統(tǒng)難度的需要。以下的系統(tǒng)架構(gòu)方法僅供參考和學(xué)習(xí),并且不代表我們贊成這一架
構(gòu),
不同的讀者可以設(shè)計不同的系統(tǒng)架構(gòu)。
系統(tǒng)的整個架構(gòu)如圖8.1所示,這種架構(gòu)方式是一個以客戶端為核心的架構(gòu)方法,系統(tǒng)中的
所有
操作指令均由客戶端發(fā)出,管理節(jié)點不和任一子節(jié)點作數(shù)據(jù)和指令的通信,管理節(jié)點的作用
主
要是維護(hù)root.dat和node.dat兩個系統(tǒng)文件。rootdat文件存儲著現(xiàn)在系統(tǒng)中已注冊的用戶名
及該用
戶所對應(yīng)的文件分塊描述文件所在節(jié)點的IP地址,系統(tǒng)利用這一文件可實現(xiàn)用戶的注冊、認(rèn)
證
及用戶登錄后獲得文件分塊描述文件所在節(jié)點的IP地址。node.dat文件則維護(hù)著整個云計算
系統(tǒng)
所有子節(jié)點的IP地址、端口、最大空間、剩余空間等信息,客戶端通過該文件能夠獲得整個
機
群的信息,從而實現(xiàn)向各子節(jié)點的直接連接??蛻舳藦墓芾砉?jié)點獲得了相關(guān)的系統(tǒng)信息后將
根
據(jù)這一信息直接向各個子節(jié)點發(fā)起連接,完成文件存儲及計算的功能,這大大提高了數(shù)據(jù)傳
輸
的速率,減輕了管理節(jié)點的負(fù)荷。各用戶文件的具體分塊和存儲方式被系統(tǒng)用該用戶的用戶
名
(username)作為文件名的文件分塊描述文件存儲于其中的一個子節(jié)點,這一子節(jié)點的IP可
在
root,dat文件中找到。
圖8.1云計算V0.01的系統(tǒng)結(jié)構(gòu)
在云計算V0.01系統(tǒng)中不同角色間存在兩類數(shù)據(jù)的傳送:一類是命令數(shù)據(jù)CMD,管理節(jié)點和
子
節(jié)點通過命令數(shù)據(jù)判斷自己下一步所要完成的任務(wù);一類是信息數(shù)據(jù),這類數(shù)據(jù)是系統(tǒng)要完
成
相關(guān)任務(wù)所需要數(shù)據(jù),如系統(tǒng)描述信息、文件信息等,這類數(shù)據(jù)的數(shù)據(jù)量相對較大。由于采
用
了計算向存儲的遷移策略,系統(tǒng)中出現(xiàn)用戶文件數(shù)據(jù)傳輸?shù)那闆r很少,這大大提高了系統(tǒng)的
運
行效率。
8.1.2
文件分布式存儲流程
系統(tǒng)在進(jìn)行文件存儲時先通過客戶端連接管理節(jié)點,讀取rootdat文件數(shù)據(jù),檢驗是否有該
用戶
存在,并獲取用戶數(shù)據(jù)塊文件所在節(jié)點的IP地址。通過讀取node.dat文件從管理節(jié)點讀取子
節(jié)點
的IP地址的列表,根據(jù)以上信息完成對數(shù)據(jù)的分割,啟動多線程函數(shù)同時連接各子節(jié)點將數(shù)
據(jù)
分別保存在各個節(jié)點上,最后更新username表以備訪問時重新找到文件的分布情況。
uesername
文件將被存儲于某一節(jié)點上,管理節(jié)點會根據(jù)現(xiàn)有username文件的分布情況向用戶分配一個
節(jié)
點的IP地址存放username文件,文件名就是該用戶的用戶名,由于用戶名在系統(tǒng)中是惟一
的,
所以每個用戶的username也是惟一的,不會造成混亂,如圖8.2所示。
圖8.2文件的分布式存儲流程
8.1.3
計算與存儲的整合流程
如圖&3所示,在云計算V0.01系統(tǒng)中,我們利用獲得的用戶名、文件名、數(shù)據(jù)塊號以及數(shù)據(jù)
分
塊信息文件的IP地址信息,可以惟一地確定任一數(shù)據(jù)塊的位置和文件名,客戶端同時向各個
子
節(jié)點發(fā)送啟動計算的命令,各節(jié)點就地讀取數(shù)據(jù)塊本她文件,并對其進(jìn)行計算,計算完成后
發(fā)
送回客戶端匯總得到最后的結(jié)果。
圖8.3計算與存儲的整合流程
這一計算過程不用移動任何數(shù)據(jù),對于數(shù)據(jù)的處理就在存儲數(shù)據(jù)塊的節(jié)點完成,系統(tǒng)根據(jù)客
戶
端的指令,將計算遷移到節(jié)點上分布式的完成,大大提高了計算效率,避免了數(shù)據(jù)在網(wǎng)絡(luò)中
的
大量流動所造成的效率下降,對于海量數(shù)據(jù)來說,這一做法的效果是相當(dāng)明顯的。對于不同
的
數(shù)據(jù),我們可以定義不同的數(shù)據(jù)處理方法,從而擴展系統(tǒng)的應(yīng)用領(lǐng)域。
8.2
管理節(jié)點程序設(shè)計與分析
管理節(jié)點在云計算V。.01系統(tǒng)中只與客戶端進(jìn)行通信,存儲系統(tǒng)中的節(jié)點信息和用戶注冊信
息,
并不負(fù)責(zé)任務(wù)的調(diào)度工作。
在管理節(jié)點我們將保存root.dat和node.dat兩個系統(tǒng)信息文件。root.dat文件保存用戶名及該
用戶文
件系統(tǒng)所在的子節(jié)點的IP地址,采用userinfo數(shù)據(jù)結(jié)構(gòu)來描述??蛻舳顺绦蛑挥蝎@得了子節(jié)
點JP
地址才能和該子節(jié)點直接建立連接獲取子節(jié)點上的用戶存儲情況文件,該文件的文件名就是
用
戶的用戶名,通過這一個文件可以知道數(shù)據(jù)的具體存儲情況,從而由客戶端直接與數(shù)據(jù)塊存
儲
節(jié)點建立連接。nodedat文件保存了云計算系統(tǒng)的所有子節(jié)點的1P地址、總空間和可用空間
等信
息,由nodclnfo數(shù)據(jù)結(jié)構(gòu)來描述。
管理節(jié)點各函數(shù)調(diào)用關(guān)系如圖8.4所示。
圖8.4管理節(jié)點函數(shù)調(diào)用結(jié)構(gòu)
8.2.1
管理節(jié)點服務(wù)器程序主函數(shù)
管理節(jié)點主程序為整個管理程序的主入口,通過4個線程函數(shù)來監(jiān)聽并完成客戶端所提交的
任
務(wù)。
程序8.1
/*文件名mainsever.cpp*/
//定義管理節(jié)點服務(wù)器程序的入口點
voidtcst();
int_tmain(intargc,_TCHAR*argv[J)
{
openfilcO;//獲得root,dat、node,dat的文件指針
tcstO;//該函數(shù)完成對主服務(wù)器的配置工作
WSADATAwsn;
intret:-0;
intPORT=5100;
SOCKETs_socket;
SOCKETc_sockct;
structsockaddr__ins_socknddr;
structsockaddjinc_socknddr;
intc__socknddr__lcn—sizcof(c_socknddr);
ret=WSAStartup(MAKEWORD(2,2),&wsa);
if(ret!=O)
{
cout<<"InkWinSockfailed:"<<ret<<cndl;
return0;
}
if((s_socket=socket(AF」NET,SOCK_STREAMfJPPROTO_TCP))==SOCKET_ERROR)
{
cout<<"CreateSocketFailed:"vvWSAGetLastErrorQ<<end/;
WSAClennupO;
return0;
s_sockaddr.sin_family=AF_1NET;
s_sockaddr.sin_port—htons(PC)RT);
s_sockaddr.sin_addr.s_addr=htonl(INADDR_ANY);
if(bind(s_socketf(SOCKADDR*)&s_sockaddr,sizeof(s_sockaddr))==SOCKET_ERROR)
{
cout<<"bindfailed:"<<WSAGetLustErrorQ?endl;
c/osesocket(s_socket);
WSAClennupO;
return0;
/
if(listen(s_socket,5)=-SOCKET_ERROR)
{
cout<<"ListenFailed:"vvWSAGetLastErrorQ?endl;
closesockct(s_socket);
WSAClcanupO;
return0;
}
CMDemd;
//進(jìn)入循環(huán)接收來自客戶端的操作命令emd
whilc(l)
{
c_socket—accept(s_socket,(SOCKADDR*)&c_sockaddr,&c_socknddr_len);
r€cv(c_sockct,(char*)&cmd,sizcof(CMD),0);〃從客戶端獲取操作命令
SOCKET*tsock=(SOCKET*)malloc(sizeof(SOCI<ET));
*tsock—c_socket;
switch(cmd)
{
caseUSERADD:
_beginthreadex(NULL,0,&usernddthread,tsock,OfNULL);//進(jìn)入增加用戶線程
break;
caseUSERGET:
_beginthreadex(NULL,Of&uscrgctdirciidftsock,0,NULL);//進(jìn)入獲取用戶信息
線程
caseUSERDEL:
_beginthreadex(NULL,0,&userdelthrend,tsock,0,NULL);//刪除用戶,暫未定
義
caseGETNODE:
_beginthreadex(NULL,0,&getnodeaddrthrendftsock,0,NULL);〃進(jìn)入獲取節(jié)點
信息線程
default:
break;
}
}
cin.getQ;
cin.getO;
return0;
}
//test。函數(shù)用于配置各子節(jié)點的IP、端口等信息,并將信息存儲到管理節(jié)點的ncde.dat文件
voidtest()
{
cout?"輸入地址信息”vvendl;
charip[16];
intport:=5101;
while(l)
{
cout<<〃輸入IP"<<cndl;
scanf(”%s”jp);
if(strcmp(ip,"0")--0)
break;
if(nodendd(ipfport,1024*10)——0)
cout?〃該記錄已經(jīng)存在"wcncll;
}
cout?〃主服務(wù)器配置完成“vvendl;
}
上面的管理服務(wù)器主程序在5100端口監(jiān)聽來自客戶端的連接及操作命令,其命令由emd定
根據(jù)從客戶端接收到的命令進(jìn)入不同的處理線程,在本系統(tǒng)已實現(xiàn)的功能有添加用戶功能、
獲
取用戶信息功能和獲取節(jié)點信息功能。管理節(jié)點服務(wù)器在啟動時就調(diào)用心埼函數(shù)完成對子節(jié)
點
信息的添加及配置。節(jié)點信息被存到node.dat文件,用戶信息被存到root.dat。在用戶需要進(jìn)
行數(shù)
據(jù)訪問時將讀取這兩個文件獲得當(dāng)前云計算系統(tǒng)所有已接入系統(tǒng)的子節(jié)點,并判斷當(dāng)前用戶
是
否存在,如存在則返回其文件分配信信息存儲位置。
我們要注意的是在現(xiàn)在這個系統(tǒng)中管理節(jié)點并不和任何的子節(jié)點進(jìn)行通信,也不直接協(xié)調(diào)子
節(jié)
點的工作。用戶在獲取相關(guān)信息后將直接與子節(jié)點聯(lián)系進(jìn)行操作和數(shù)據(jù)訪問,這樣可以大大
減
輕主節(jié)點的負(fù)載。
在管理節(jié)點程序中我們定義了一些常用的數(shù)據(jù)結(jié)構(gòu)主要有userinf。,該數(shù)據(jù)結(jié)構(gòu)與root.dat文
件有
若包括用戶名、用戶數(shù)據(jù)配置文件所在節(jié)點的IP地址等信息,因為用戶數(shù)據(jù)文件的信息沒
有
存放在管理節(jié)點而是放在某一個子節(jié)點上的,客戶端要訪問文件數(shù)據(jù)首先要從管理節(jié)點的
rootdat文件中獲取該用戶數(shù)據(jù)配置文件所在節(jié)點的IP地址,再通過該IP地址獲取數(shù)據(jù)的存
儲信
息。另一個數(shù)據(jù)結(jié)構(gòu)是nodelnfd,該數(shù)據(jù)結(jié)構(gòu)與node.dat文件有關(guān),包括節(jié)點IP、端口、芾
點總
容量、可用空間等,系統(tǒng)中所有節(jié)點的相關(guān)內(nèi)容都采用這一數(shù)據(jù)結(jié)構(gòu)存入nodcdat文件。
主節(jié)點服務(wù)器程序部分參數(shù)及數(shù)據(jù)結(jié)構(gòu)的定義如程序8.2所示。
程序8.2
/*文件名melem.h*/
^defineUSERADD1//添加用戶
^defineUSERGET2〃獲取用戶信息
#defineUSERDEL3
#defineGETNODE4//獲取節(jié)點信息
#defineBLOCKSIZE1024//定義文件塊大小
typedefintCMD;//CMD為命令標(biāo)識
/*此結(jié)構(gòu)體寫入root.dat文件*/
typedefstruct
{
charuser[20];〃用戶名
charip[16];〃用戶數(shù)據(jù)配置文件所在節(jié)點的IP地址
/ntport;
}uscrlnfo;
/*此結(jié)構(gòu)體寫入node.dat文件*/
typedefstruct
{
charip[16];//存儲節(jié)點的IP地址
import;〃端口號
intuserNum;//用戶數(shù)目
_off_ttotalsize;//節(jié)點的總?cè)萘?/p>
freesize;//節(jié)點的可用空間
}nodclnfo;
typedefstruct
(
charip[16];
intport;
}nodeaddr;
8.2,2
管理節(jié)點各線程函數(shù)的設(shè)計
管理節(jié)點程序的功能基本是由其定義的4個線程函數(shù)(其中刪除用戶未定義)提供的,這些
函數(shù)
的功能主要是完成用戶信息的注冊、服務(wù)器節(jié)點信息的管理和用戶數(shù)據(jù)配置信息的管理。管
理
節(jié)點可以看作是一個信息的中轉(zhuǎn)站,其自身并不完成任何的數(shù)據(jù)操作和處理工作。
各線程的函數(shù)定義如下。
1
.增加新用戶線程函數(shù)
程序8.3
/*文件名znthread.epp*/
/*增加新的用戶,用于新用戶注冊功能*/
unsigned_stdcnlluscraddthrcad(LPVOIDp)
{
SOCKET*tsock=(SOCKET*)p;
structsockaddr_intaddr;
intlen=20;
char*username=(char*)malloc(len*sizeof(chnr));
rccv(*tsock,username,len,0);〃從客戶端接收用戶名
intresult=useradd(username);
send(*tsockf(char*)&result,size。f(int),0);
dosesocket(*tsock);
frcc(uscrnnmc);
free(tsock);
return1;
}
函數(shù)uscraddthreadO接收來自于客戶端的新注冊用戶名,調(diào)用uscradd。函數(shù)將用戶名及存儲該
用
戶文件信息的節(jié)點IP地址寫入主節(jié)點的rootdat文件,客戶端訪問該文件可以獲得某一用戶
的文
件存儲信息文件所在的子節(jié)點IP地址,該文件的文件名就是用戶名。
2
.獲取用戶信息線程函數(shù)
程序8.4
/*文件名mthread.cpp*/
/*客戶端獲取用戶信息文件*/
unsigned_stdciillusergetthread(LPVOIDp)
{
SOCKET*tsock=(SOCKET*)p;
structsockaddr_intaddr;
intlen—20;
char*username—(char*)malloc(len);
userinfo*user—(userinfo*)molloc(sizeof(userinfo));
recv(*tsock,username,len,0);
cout<<"接收到的用戶名:〃<vusername<<cndl;
/*根據(jù)用戶名讀取rootle中的用戶及對應(yīng)存儲文件描述信息的子節(jié)點1P*/
if(userget(usernnme,user)——0)
{
cout<<"getfalse"<<cndl;
strepy(user->user,〃0");
strcpy(uscr->ip,"");
user->port—0;
}
cout<<"int_dircnd:,r<<uscr->uscr<<",r<<uscr->ip<<,r:rr<<uscr->port<<cndl;
scnd(*tsockt(char*)uscr,sizcof(uscrlnfo),0);
closesocket:(*tsock);
frec(uscrnamc);
free(user);
return1;
}
函數(shù)usergetthread。接收來自客戶端的用戶名,并在root.dat文件中查找該用戶名對應(yīng)的
userinfo
數(shù)據(jù)結(jié)構(gòu),并傳回紿客戶端。其中調(diào)用userget。函數(shù)從rootdat讀取與username對應(yīng)的uscrlnfo
信
息。通過調(diào)用這一函數(shù)客戶端可以知道對應(yīng)用戶的文件描述文件存儲在哪個子節(jié)點上,通過
連
接該子節(jié)點獲取文件的具體存儲方式??蛻舳嗽谡{(diào)用一這函數(shù)后將通過返回的IP地址與存儲
7
數(shù)據(jù)分塊描述情況文件的子節(jié)點進(jìn)行連接。
.文件分塊線程函數(shù)
程序8.5
/*文件名mthread.cpp*/
/*根據(jù)nodcdat文件中的節(jié)點信息,將數(shù)據(jù)塊分配到各節(jié)點*/
unsigned_stdca]]getnodenddrthrend(LPVOIDp)
{
SOCKET*tsock=(SOCKET*)p;
intbJocknuni—0;
nodeinfo*node—(nodeinfo*)mnlloc(sizeof(nodelnfd));
nodeaddr*naddr—(nodcaddr*)nialJoc(sizcof(nodcaddr));
recv(*tsock,(char*)&blocknumfsizeof(int),0);〃獲取數(shù)據(jù)塊個數(shù)
for(inti=0;i<blocknum;i++)
{
mcmsct(nodc,0,sizcof(nodclnfb));
memset(naddr,0,sizeof(nodenddr));
datagcmodu(nodc);〃獲取該數(shù)據(jù)塊的存儲位置
naddr->port—nodc->port;
strcpy(naddr->ip,node->ip);
scnd(*tsockf(char*)nnddr,sizcof(nodcaddr),0);〃該數(shù)據(jù)塊的存儲位置發(fā)送回客戶端
}
closesocket(*tsock);
frce(node);
frcc(naddr);
free(tsock);
return1;
}
函數(shù)浮modeaddrthread。接收來自客戶端的數(shù)據(jù)塊個數(shù),并為每個數(shù)據(jù)塊分配一個存儲節(jié)點,
數(shù)
據(jù)塊的分配通過調(diào)用datagetnode。函數(shù)來完成,該函數(shù)按剩余空間最大的策略向各數(shù)據(jù)塊分
配存
儲節(jié)點,并將分配結(jié)果發(fā)送回客戶端,由客戶端根據(jù)接收到的子節(jié)點IP直接連接子節(jié)點來完
成
文件的存儲工作,并將存儲結(jié)果寫入子節(jié)點中的數(shù)據(jù)分塊描述文件中,以便系統(tǒng)在下次讀取
時
獲得數(shù)據(jù)的存儲情況。
8.2.3
主服務(wù)器中其他函數(shù)的設(shè)計
主服務(wù)器其他函數(shù)定義。
程序8.6
/*文件名mfilc.cpp*/
/*向node.datX件添加節(jié)點信息*/
intnodeadd(char*ip,hitport,_off_ttotalsizc)
{
nodeinfo*temp=(nodeinfo*)mulloc(sizeof(nodelnfo));
fseek(fp_node,0,0);
/*判斷該節(jié)點是否已存在*/
while(&ead(temp,sizeof(nodeinfo),1,fp_node)——1)
{
if(strcmp(temp->ipfip)——0&&temp->port——port)
{
frcc(tcmp);
return0;
}
}
strcpy(tcmp->ipfip);
temp->port-port;
tcmp->uscrNum—0;
temp->totalsize-totalsize;
temp->freesize—totulsize;
/*寫入nodu.dat文件*/
fwritc(t:cmp9sizcof(nodclnfo),1,fp_node);
fseek(fp_node,0,0);
fflush(fp_nodc);
free(temp);
return1;
}
/*分配用戶數(shù)據(jù)描述文件存儲節(jié)點的IP*/
intusergetnode(nodelnfd*node)
{
nodeinfo*temp=(nodeinfo*)malloc(sizeof(nodeinfo));
fscck(fp__nodc,0,0);
intnum=0;
intno-0;
/*尋找已分配uesername文件最少的節(jié)點TP*/
if(fread(node,sizeof(nodeinfo),1,fp_node)/—1)
return0;
while(freiid(temp}sizeof(nodeinfo),7,fp_node)——1)
(
++num;
if(tcmp->uscrNum<node->userNum)
(
*node—*temp;
no=num;
}
/
memset(teinp,0,sizeof(nodeinfo));
*temp—*node;
temp->userNum+=1;
fscek(fp_nodc,no^sizcof(nodclnfo),0);
Avri【c(【cmp,sizeof(nodclnfo),1,fp_nodc);
fseek(fp_node,0,0);
fflush(fp_nodc);
frcc(tcmp);
return1;
}
/*將username及對應(yīng)存儲數(shù)據(jù)描述文件的節(jié)點IP寫入rootdat文件*/
intuseradd(char*username)
(
uscrlnfo*tcmp—(uscrlnfo*)malloc(sizcof(uscrlnfo));
nodeinfo*node=(nodeinfo*)malloc(sizeof(nodeJnfo));
fseck(fp_uscr,Of0);
while(frend(temp,sizeof(userlnfo),1,fp_user)==1)
/*檢測該用戶名是否存在*/
if(strcmp(temp->user,username)==0)
{
free(temp);
frcc(nodc);
return0;//該用戶名已經(jīng)存在
}
if(usergetnode(node)==0)〃獲取該用戶數(shù)據(jù)描述文件存儲節(jié)點的IP,通過node參數(shù)傳出
return-1;//獲取節(jié)點失敗
memset(temp,0,si^eof(userlnfd));
strcpy(temp->userfusername);
strcpy(teinp->ipfnodc->ip);
temp->port—node->port;
/*將userinfo信息寫入root.dat文件,確認(rèn)數(shù)據(jù)塊描述文件的存儲位置*/
fwrite(temp,sizeof(userlnfo),1,fp_user);
fseck(fp_user,0,0);
fflush(fp_user);
free(temp);
free(node);
return1;
}
/*根據(jù)用戶名,讀取root.dat文件中的uscrlnfo數(shù)據(jù)*/
intuserget(char*username,userinfo*user)
{
uscrlnfo*tcmp—(uscrlnfo*)mulloc(sizcof(uscrlnfo));
fscek(fp_uscrt0,0);
while(fread(temp,sizeof(userinfo),1,fp_user)——1)
if(strcmp(temp->userfusername)==0)
{
*user=*temp;
return1;
}
return0;
}
/*根據(jù)nodc.datX件獲取系統(tǒng)中的節(jié)點信息nodclnfo,并按最大剩余空間優(yōu)先策略分配給數(shù)
據(jù)塊
*/
/*分配完成后更新nodedat文件的內(nèi)容*/
intdatngetnode(nodelnfo*node)
{
nodclnfo*tcmp—(nodclnfo*)mulloc(sizcof(nodclnfb));
fseek(fp_node,0,0);
intnum—0;
intno=0;
if(frcad(nodc,sizcof(nodclnfo),1,fp_nodc)/—1)
return0;
/*首先向剩余空間最大的節(jié)點分配數(shù)據(jù)塊*/
while(fread(temp,sizeof(nodeinfo),1,fp_node)==1)
++num;
if(temp->freesize>node->freesize)
(
*node—*temp;
no—num;
}
}
memset(temp,0,sizeof(nodelnfo));
*tcmp=*nodc;
temp->freesize--BLOCKSIZE;
fscck(fp_nodc9no*sizcof(nodclnfo),0);
/*將分配后的信息寫回node.dat文件,更新文件信息*/
fwrite(temp,sizeof(nodeJnfo),1,fp_node);
fscck(fp_nodc,0,0);
fflush(fp_nodc);
free(temp);
return1;
}
/*獲得rood.dat和node.dat的文件指針*/
/*fp_uscr指向root.d就文件*/
/*fp_node指向node.dat文件*/
voidopenfileO
{
if((fp_uscr=6pcn(\oot.dat':,b+"))==NULL)
fp_user=fopen("root.dat':"wb+");
H,r
if((fp_nodc=fopcn("nodc.datf"rb-b))==NULL)
fp_node=fdpenC'node.dat","wb+');
}
8.3
子節(jié)點程序分析
云計算vaoi中子節(jié)點主要完成數(shù)據(jù)的存儲及用戶文件存儲信息的保存,各用戶文件存儲信
息的
文件名為該用戶的用戶名,子節(jié)點程序需要在所有的節(jié)點上同時運行。文件的存儲和訪問由
客
戶端與子節(jié)點直接連接來完成,子節(jié)點和管理節(jié)點不進(jìn)行任何的數(shù)據(jù)通信工作。
各數(shù)據(jù)塊存儲的文件名為uscrnnmc_filcnnmc_blockNo,即用戶名加文件名加數(shù)據(jù)塊號,之間
用
下劃線連接。
子節(jié)點函數(shù)調(diào)用結(jié)構(gòu)如圖8.5所示。
圖8.5子節(jié)點函數(shù)調(diào)用結(jié)構(gòu)
8.3.1
子節(jié)點主函數(shù)
子節(jié)點的主程序啟動后監(jiān)聽來自于客戶端發(fā)過來的命令cmd,根據(jù)不同的命令進(jìn)入不同的線
程
進(jìn)行處理。
程序8.7
/*文件名blockscvcr.cpp*/
//blocksever.cpp:定之控制臺應(yīng)用程序的入口點
int_tmain(intargc,_TCHAR*argv[])
{
WSADATAwsa;
intret=0;
intPORT=5101;
SOCKETs_socket;
SOCKETc_sockct;
structsockaddr_ins_sockaddr;
structsockaddr_inc_sockaddr;
intc__sockaddr_lcn—sizeof(c__sockaddr);
ret=WSAStartup(MAKEWORD(2,2),&wsa);
if(ret!=0)
(
cout<<HInitWinSockfailed:"<<ret<<endJ;
return0;
}
if((s_socket=socket(AF_INETfSOCK_STREAM,IPPROTO_TCP))==SOCKET_ERROR)
{
cout<<"CreateSocketFailed:f,<<WSAGetLustErrorQ<<end/;
WSACleanup0;
return0;
}
s_sockaddr.sin_family=AF_INET;
s_sockaddr.sin_port—htons(PORT);
s_sockaddr.sin_addr.s_nddr=htonl(INADDR_ANY);
if(bind(s_sockctt(SOCKADDR*)&s_sockaddjsizcof(s_socknddr))==SOCKET^ERROR)
cout?"bindfailed:"<vWSAGetLastErrorQ?endl;
closcsockct:(s_socket);
WSACleanupO;
return0;
}
if(listen(s_socket,5)-=SOCKET_ERROR)
{
cout?"ListenFailed:"vvWSAGetLastErrorf)?endl;
closesocket(s_socket);
WSACleanup0;
return0;
}
CMDemd;
while。)
{
c_sockct—accept(s_socket,(SOCKADDR*)&c_sockaddj&c_sockaddr_lcn);
recv(c_socketf(char*)&cmdfsizeof(CMD),0);
SOCKET*tsock=(SOCKET^)malloc(sizcof(SOCKET));
*tsock—c_sockct;
/*獲取用戶文件存儲信息,該文件存儲于其中一個子節(jié)點*/
/*用戶根據(jù)管理節(jié)點提供的IP,直接連接該子節(jié)點獲取*/
if(cmd==USERINFOGET)
_beginthreadex(NULL,Of&userinfogetthrendftsock,0,NULL);
elseif(cmd==FILEINFOADD)
_beginthrcadcx(NULL,0,&Hlcinfbaddthread,tsock,0,NULL);//添加文件存儲
信息
elseif(cmd==STOREBLOCK)
_beginthrendex(NULI.,0,&storedatathread,tsock,0,NULI);〃存儲數(shù)據(jù)塊
elseif(cmd==GETDATA)
_begindireadex(NULL,0,&getdatathread,tsock,0,NULL);//完成計算工作
else
continue;
}
return0;
子節(jié)點的主函數(shù)的功能是啟動對客戶端發(fā)出命令的監(jiān)聽和執(zhí)行,主要是完成4項工作,分別
由4
個不同的線程函數(shù)來完成。一是獲取文件存儲信息;二是在文件分塊描述文件中添加信息;
是實現(xiàn)數(shù)據(jù)塊的存儲工作;四是在各節(jié)點啟動計算,完成存儲與計算的整合工作。
子節(jié)點程序要用到的一些常用數(shù)據(jù)結(jié)構(gòu)定義如下。
程序&8
/*文件名belem.h*/
#ifndefBELEM_H
#defineBELEM_H
#include"stdafx.h"
#defineUSERNAME_LEN20
#defineFILENAME_LEN64
#defineBLOCKNAME_LEN128
ffdefineL1STLEN5
#defineMAINIP〃〃
ffdefineUSERADD1
#defineUSERGET2
#defineUSERDEL3
^defineUSERINFOGET5
^defineFILEINFOADD6
#defineSTOREBLOCK7
#defineGETDATA8
typedefintCMD;
/*filelnfo數(shù)據(jù)結(jié)構(gòu)為子節(jié)點上用戶數(shù)據(jù)文件描述的內(nèi)容*/
typedefstruct
(
charfilenamc[FILENAME_LEN];//文件名
intb/ockNO;//數(shù)據(jù)塊號
charip[16];//數(shù)據(jù)塊存放節(jié)點的IP地址
intport;
}fileinfo;
/*數(shù)據(jù)塊描述數(shù)據(jù)結(jié)構(gòu)*/
typedefstruct:
{
intblockNO;
charip[16];
intport;
}blockinfd;
typedefstruct
Hlelnfo*e;
intlength;
intsize;
}filelnfoList;
#endif
8.3.2
子節(jié)點各線程函數(shù)設(shè)計
1
.獲取文件存儲信息線程函數(shù)
程序8.9
/*文件名bthrend.cpp*/
unsigned_stdcidluserinfogetthread(LPVOIDp)//獲取用戶信息文件線程
{
SOCKET*tsock=(SOCKET*)p;
charuscrnamc[USERNAME_LEN];
rccv(*tsockfusername,USERNAME_LEN,0);
FILE*fp;
if((fp=fbpcn(uscrnamc,"rb"))==NULL)
fp-fopcn(uscniamc,"wb+〃);//打開用戶存儲信息描述表
struct_statinfo;
_sm(uscrnamc,&info);//度取文件信息
filelen=info.st_size;
send(*tsock,(char*)&filelen,sizeof(_off_t),0);
if(filcicn>0)
{
char*buf=(char*)malloc(fiielen);
fread(buf91,filelcn,fp);
send(*tsock,buf,filelen,0);
free(buf);
}
closesockct(*tsock);
fclose(fp);
return1;
}
用戶從管理節(jié)點獲取到數(shù)據(jù)塊描述文件所在的節(jié)點IP地址后,即可連接該節(jié)點并調(diào)用此函數(shù)
獲
取文件內(nèi)容,由于該文件的文件名就是用戶名,所以子節(jié)點只要知道了用戶名即可知道需要
打
開的文件名,該節(jié)點通過socket接收用戶名就是這個原因。
2
.添加數(shù)據(jù)塊描述信息線程函數(shù)
程序&10
/*文件名bthrend.cpp*/
unsigned_stdcaUfileinfbacldthread(LPVOIDp)〃添加文件信息線程
{
SOCKET*tsock=(SOCKET*)p;
intlistlen-0;
char6Icnamc[FlLENAME_LEN];
charusername[USERNAME_LEN];
fileinfoftmp;〃定義文件信息數(shù)據(jù)結(jié)構(gòu)
blockinfobtrnp;
filelnfoListL;
rccv(*tsockfusername,USERNAME_LEN,0);〃獲取用戶名
recv(*tsockffilename,FILENAME_LEN,0);//獲取文件名
rccv(*tsock,(char*)&UstJen,sizcof(int),0)//獲取文件分塊個數(shù),即獲取順序表的長度
for(inti=O;ivlistlcn;i++)//獲取各個數(shù)據(jù)塊的存儲信息與在文件中的順序號,順序號以0
開始
{
recv(*tsock,(char*)&btrnp,sizeof(btmp),0);//接收數(shù)據(jù)塊信息,包括塊號、存儲的IP地
址
strcpy(ftmp.filename,filename);
strcpy(ftmp.ip,btmp.ip);
ftmp.blockNO=bmp.blockNO;
fmp.port—bmp.port;
addlist(&L,ftmp);//加入順序表
}
FILE*fp;
if((fp—fbpcn(uscrnnmc,”rb+"))--NULL)
fp=fopen(username,"wb+");
£lcadd(&L,fp);//將文件存儲信息的順序表添加到數(shù)據(jù)分塊文件中,文件名就為用戶名
fclose(fp);
intresult—1;
send(*tsock,(char*)&resu/t,sizeof(int),0);
dcstroylist:(&L);
closesocket(*tsock);
free(tsock);
return1;
/
添加數(shù)據(jù)塊描述信息線程函數(shù)從客戶端通過socket接收用戶名、文件名及文件分塊個數(shù),并
將每
個數(shù)據(jù)塊的塊號blockNO和存儲位置所在IP地址等信息建立順序表,將此順序表存到該用
戶的文
件分塊描述文件中。
這一線程函數(shù)調(diào)用HleaddO函數(shù)實現(xiàn)向username添加文件塊存儲信息,這個信息由fileinfo數(shù)
據(jù)結(jié)
構(gòu)來描述,fHeadd。函數(shù)定義如下。
程序8.11
/*位于文件bfile.cpp中*/
intfilendd(fileJnfolAst*L,FILE*fp)//fp為username文件指針
{
charfilcnamc[20];
fileinfofile;
strcpy(filcnamc,L->c[OJ.filename);
if(filcscnrch(61cnnmeffp)--0)//檢測是否有同名文件
filedel(filename,fp);〃如有同名文件則刪除并覆蓋該文件
fscck(fptOfSEEK_END);
for(inti=0;i<L->length;i++)
{
file=L->c[iJ;
fwritc(&filc,sizcof(filclnfo),1,fp);
)
return1;
}
/*在username.文件中檢測是杳有同名文件*/
intfilesearch(char*filename,FILE*fp)
{
fileinfoftmp;
fscck(fp,0,0);
while(fread(&ftmp,sizeof(filelnfo)91,fp)==1)
if(strcmp(ftmp.filename,filename)——0)
return0;
return1;
/*覆蓋同名文件*/
intfilcdcl(chnr*filename,FILE*fjp)
{
filclnfbftmp;
fseek(fpfOf0);
whilc(!feof(fp))
{
fread(&ftmp,sizeof(filelnfo),/,fp);
if(strcmp(fmp.filename,filename)——0)
{
strcpy(fmp.filename,"0");
fseek(fp,ftcll(fp)-sizcof(filclnfo),0);
sizeof(fileinfo),7,fp);
fseek(fp,ftell(fp),0);
}
}
return1;
)
在文件存儲信息的添加過程中我們采用順序表來維護(hù)各數(shù)據(jù)塊的存儲信息,因此定義了幾個
基
本的順序表操作。
程序8.12
/*位于文件blist.cpp*/
/*初始化順序表函數(shù)*/
intinitlist(BldnfoList*L)
{
L->c—(filclnfb*)malloc(LISTLEN*sizcof(filclnfb));
if(I.->e==NULL)
{
printf("初始化表,分配內(nèi)存失敗
return0;
}
L->lcngth—0;
L->size=LISTLEN;
return1;
}
/*向順序表中加入一個數(shù)據(jù)塊存儲信息*/
intaddlist(fileInfoList*L,fileinfoe)
if(L->lcngth>=L->size)
flicinfo*ncwbasc—(filclnfo*)rcalloc(L->e,(L->sizc+L1STLEN)*sizeof(filclnfb));
if(newbase==NULL)
{
printf("向表添加數(shù)據(jù),增加內(nèi)存空間失敗");
return0;
}
L->c—ncwbasc;
L->size+=LISTLEN;
}
L->e[L->length]—e;
++L->length;
return0;
}
/*釋放存儲空間*/
intdcstroylist(filclnfoList*L)
{
L->length=0;
L->sizc—0;
free(I.->e);
return0;
}
3
.保存數(shù)據(jù)塊線程函數(shù)
程序8.13
/*文件名bthread.cpp*/
unsigned_stdcallstoredatathread(LPVOIDp)//保存數(shù)據(jù)塊
{
SOCKET*tsock=(SOCKET*)p;
intdatalen--1;
intblockNo--1;
char印ename[FILENAME_LEN];
charuscrnamc[USERNAME_LEN];
recv(*tsock,username,USERNAME_LEN,0);
rccv(*tsockffilename,FILENAME_LEN,0);
recv(*tsock,(char*)&blockNo,sizeof(int),0);
recv(*tsockf(char*)&dntalen,sizeof(int),0);
char*buf=(char*)malloc(datalcn);
recv(*tsock,buf,datolen,0);
cout?"storcdatathrcadblockNo:r,<<biockNo<<cndl;
cout<<"storedutathrendbuflen:,f?dutulen<<endl;
charblocknamc[BLOCKNAME_LEN];//數(shù)據(jù)塊文件名
sprintf(blockname,username,filename,blockNc);//生成數(shù)據(jù)塊文件名
FILE*fp;
fp-fopen(blockname,''w-F");//打開數(shù)據(jù)塊文件
fwrit€(buf,1,datalen,fp);//寫入信息
fclose(fp);
frcc(buf);
closesocket(*tsock);
free(tsock);
return1;
}
本函數(shù)完成對各數(shù)據(jù)塊的存儲工作,客戶端根據(jù)管理節(jié)點的數(shù)據(jù)塊存儲安排,獲取各數(shù)據(jù)塊
存
儲節(jié)點的IP地址,由客戶端直接連接各存儲節(jié)點,調(diào)用storedatathread。函數(shù),本函數(shù)獲取數(shù)
據(jù)
塊的所屬用戶名、文件名、塊號、塊大小和數(shù)據(jù)塊的具體內(nèi)容,將數(shù)據(jù)塊存儲在當(dāng)前節(jié)點,
各
個數(shù)據(jù)塊的命名原則為用戶名一文件名一塊號(username_filename_blockNO),這樣任何一"A數(shù)
據(jù)
塊將有一個惟一的文件名,該數(shù)據(jù)塊的存儲信息同時被寫入了數(shù)據(jù)塊描述文件。雖然文件被
分
割為多個數(shù)據(jù)塊并存儲在不同的子節(jié)點上,但由于有數(shù)據(jù)塊描述文件,我們可以在任何時候
恢
復(fù)并訪問該文件。
4
.獲取數(shù)據(jù)計算結(jié)果線程函數(shù)
程序8.14
/*文件名btbrcad.cpp*/
unsigned_stdcallgetdatathread(I.PVOIDp)〃獲取數(shù)據(jù)計算結(jié)果
SOCKET*tsock=(SOCKET*)p;
intdatalcn=0;
intbiockNo=0;
result—0;
char61ennmc[FlLENAME_LEN];
charusername[USERNAME_LEN];
rccv(*tsock,username,USERNAME_LEN,0);
recv(*tsock,filename,FILENAME_LEN,0);
recv(*tsock,(char*)&blockNo,sizeof(int),0);
FILE*fp;
charblockname[BLOCK^AME_LEN;〃數(shù)據(jù)塊文件名
sprintf(blocknnme,"%s_%s_%d”,username,filename,blockNo);
fp=fopcn(blocknamc,"r");//打開本節(jié)點上的數(shù)據(jù)塊文件
getresLilt(&resLiltffp);〃在本節(jié)點完成計算工作
fclosc(fp);
cout<<"num:"<<result<<endl;
send(*tsock,(char*)&result,sizcof(_off_t),0);
closcsocket(*tsock);
frcc(tsock);
return1;
}
獲取數(shù)據(jù)計算結(jié)果線程函數(shù)實現(xiàn)了在這個云計算系統(tǒng)中計算與存儲的整合演示,我們以對一
串
數(shù)據(jù)求和操作為例,客戶端根據(jù)數(shù)據(jù)塊存儲描述文件的描述向各個存儲有數(shù)據(jù)塊的節(jié)點發(fā)送
用
戶名、文件名和數(shù)據(jù)塊號,這些信息實際上就確定了一個數(shù)據(jù)塊文件的位置,存儲每個數(shù)據(jù)
塊
的節(jié)點就在該節(jié)點就地啟動對該數(shù)據(jù)塊的計算工作,完成計算后將自己的局部計算結(jié)果發(fā)送
到
客戶端,由客戶端完成數(shù)據(jù)的最后整合工作。這樣就避免了大量數(shù)據(jù)在機群中的移動,大火
提
高系統(tǒng)的工作效率,體現(xiàn)了“計算向存儲遷移”的云計算理念。這一線程函數(shù)中的getresultO
函數(shù)
就是完成計算工作的函數(shù),根據(jù)不同的數(shù)據(jù)和工作需要我們定義不同的計算函數(shù),這一函數(shù)
必
需在所有的節(jié)點上都要駐留,這樣系統(tǒng)才能將計算向該節(jié)點遷移。函數(shù)getresultO在本例中的
定
義如下。
程序8.15
/*位于文件bfilc.cpp中*/
/*完成對本節(jié)點數(shù)據(jù)塊內(nèi)數(shù)據(jù)的求和操作*/
intgetresult(_off_t*numfFILE*fp)
fseek(fp,Of0);
charc;
inti=0;
intj=O;
while(!feof(fp))
{
c-fgetc(fp);
cout<<c;
i=0;
whilc(!fcof(fp))
{
i=0;
if(c>='O'&&c<=刃
(
i—ntoi(&c);
j=10*j+i;
}
c=fgetc(fp);
cout<<c;
if(c<fOfllc>力
break;
}
*num+二j;
}
return1;
}
我們的計算數(shù)據(jù)是按字符串存儲,函數(shù)getresultO對本節(jié)點數(shù)據(jù)塊實施求和操作,我們同樣也
定
義其他的數(shù)據(jù)處理函數(shù),如類似wordcount函數(shù)等,通過這一函數(shù)我們實現(xiàn)對數(shù)據(jù)的本地化
處理,
每個gptresultO函數(shù)只處理本節(jié)點所存儲數(shù)據(jù)塊的數(shù)據(jù)。這一函數(shù)演示了計算向存儲的遷移過
程。
8.4
客戶端API
設(shè)計
云計算V0.01為客戶端提供7可以訪問的API函數(shù),從負(fù)載上我們給客戶端增加了一些負(fù)載,
將
文件的分塊等工作交給了客戶端來完成,只是將計算工作交給子節(jié)點來完成。客戶端的主要
工
作模式是從管理節(jié)點讀取系統(tǒng)信息,根據(jù)這一信息與各子節(jié)點直接進(jìn)行聯(lián)系完成文件操作及
計
算任務(wù)。
T面是系統(tǒng)提供的主要API函數(shù),分別在capi.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 仿古建筑施工方案
- 光通信系統(tǒng)優(yōu)化-第2篇-深度研究
- 數(shù)據(jù)倉庫中的數(shù)據(jù)整合策略-深度研究
- 防塵治理專項施工方案
- 城市社會治理創(chuàng)新-深度研究
- 二零二五年度1022注冊工程師聘用合同(智能穿戴設(shè)備研發(fā))2篇
- 5G切片架構(gòu)優(yōu)化-深度研究
- 2025年度商鋪租賃意向金預(yù)付合同4篇
- 極地極端天氣事件預(yù)測模型-深度研究
- 2025年度農(nóng)村飲水安全打井承包工程標(biāo)準(zhǔn)合同范本4篇
- GB/T 45107-2024表土剝離及其再利用技術(shù)要求
- 2024-2025學(xué)年八年級上學(xué)期1月期末物理試題(含答案)
- 商場電氣設(shè)備維護(hù)勞務(wù)合同
- 2023年國家公務(wù)員錄用考試《行測》真題(行政執(zhí)法)及答案解析
- 2024智慧醫(yī)療數(shù)據(jù)字典標(biāo)準(zhǔn)值域代碼
- 年產(chǎn)12萬噸裝配式智能鋼結(jié)構(gòu)項目可行性研究報告模板-立項備案
- 【獨家揭秘】2024年企業(yè)微信年費全解析:9大行業(yè)收費標(biāo)準(zhǔn)一覽
- 醫(yī)療器械經(jīng)銷商會議
- 《±1100kV特高壓直流換流變壓器使用技術(shù)條件》
- 1-1 擁抱夢想:就這樣埋下一顆種子【2022中考作文最熱8主題押題24道 構(gòu)思點撥+范文點評】
- 《風(fēng)電場項目經(jīng)濟評價規(guī)范》(NB-T 31085-2016)
評論
0/150
提交評論