国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) -TFS

這篇具有很好參考價(jià)值的文章主要介紹了淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) -TFS。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) ->>TFS

目錄 :
  • 文件重新映射的接口介紹
  • 文件映射 mmap_file.cpp的實(shí)現(xiàn)
  • 進(jìn)行測(cè)試
文件重新映射 (增加 或者 減少 文件映射區(qū)域的大小)

mremap() 函數(shù)的原型如下

#include <sys/mman.h>

void *mremap( void * old_address , size_t old_size , size_t new_size , int flags );

參數(shù)說(shuō)明 :

  • old_address:指向原映射區(qū)域的起始地址。
  • old_size:原映射區(qū)域的大小,以字節(jié)為單位。
  • new_size:新映射區(qū)域的大小,以字節(jié)為單位。
  • flags:標(biāo)志參數(shù),用于指定映射操作的行為。常用的標(biāo)志是 MREMAP_MAYMOVE,表示允許系統(tǒng)將映射區(qū)域移動(dòng)到新的位置。

返回值 :

  • 成功時(shí),返回新映射區(qū)域的起始地址。
  • 失敗時(shí),返回 MAP_FAILED,并設(shè)置 errno 錯(cuò)誤碼來(lái)指示具體錯(cuò)誤。
    注意 :
    在使用 mremap() 函數(shù)前,需要通過(guò) mmap() 函數(shù)創(chuàng)建原始的內(nèi)存映射區(qū)域,并確保該內(nèi)存映射區(qū)域是有效的。另外,mremap() 函數(shù)只能用于修改已存在的內(nèi)存映射區(qū)域,無(wú)法在不同的文件描述符之間創(chuàng)建新的映射。
文件映射 mmap_file.cpp的實(shí)現(xiàn) :
#include"mmap_file.h"
#include<stdio.h>

int static Debug=1 ; 

namespace qiniu
{
	namespace largefile
	{
     //構(gòu)造函數(shù)
	 MMapFile::MMapFile():
	 size_(0),fd_(-1),data_(NULL)
	 {
		
	 }
	 MMapFile::MMapFile(const int fd):
	 size_(0),fd_(fd),data_(NULL)
	 {
				
	 }
	MMapFile::MMapFile(const MMapOption& mmp_option, const int fd):
	size_(0),fd_(fd),data_(0)
	{
	mmap_file_option_.max_mmap_size_=mmp_option.max_mmap_size_;
	mmap_file_option_.frist_mmap_size_=mmp_option.frist_mmap_size_;
	mmap_file_option_.pri_mmap_size_=mmp_option.pri_mmap_size_;
	}
	//析構(gòu)函數(shù)
	MMapFile::~MMapFile()
	{
		if(data_){   //映射內(nèi)容不為空,說(shuō)明映射成功
		   if(Debug)   printf("file information size : %d ,fd : %d , data : %p\n",size_,fd_,data_);
				     
			 msync(data_, size_, MS_SYNC);      //當(dāng)我們的數(shù)據(jù)發(fā)生改變,同步信號(hào),更新完成后一起返回
		    //解除文件映射
		     munmap(data_ , size_ );
	  
			size_=0;
			fd_=-1;
			data_=NULL;
				   
			mmap_file_option_.max_mmap_size_=0;
			mmap_file_option_.frist_mmap_size_=0;
			mmap_file_option_.pri_mmap_size_=0;
			}
	}
	//同步文件		
	bool MMapFile::sync_file()   
	{
		if(data_!=NULL && size_>0){  //如果data_為空,或者 映射的大小<0 ,則說(shuō)明沒(méi)有映射
			if( msync(data_ , size_ , MS_SYNC)<0){  //同步失敗
			   fprintf( stderr, "file sync falied %s \n", strerror(errno));
			    return false;
			}
				return true;
		 }
				return false;
	}
	 //文件映射		
	bool MMapFile::map_file(const bool write)  
	{
		int flags=PROT_READ;
		if(write){
			flags |= PROT_WRITE;     //同時(shí)設(shè)置為可讀
		}
			if(fd_ < 0){        
				return false ;
			}
				
			if(size_ > mmap_file_option_.max_mmap_size_){  //如果初始化的大小,比我們?cè)O(shè)定的最大的映射大小還要大
				size_=mmap_file_option_.max_mmap_size_;  
			}
				
			if(size_< mmap_file_option_.frist_mmap_size_){ //如果size_ 的大小,小于我們第一次分配的大小
				size_=mmap_file_option_.frist_mmap_size_ ;
			}
				
			if(!ensure_flie_size(size_)){        //調(diào)整大小
				fprintf(stderr , "ensure_flie_size falied: %d\n", size_);
				return false;
			}
			data_=mmap(NULL, size_  , flags, MAP_SHARED , fd_ , 0);  //文件映射
			
			if( MAP_FAILED==data_ ){   //內(nèi)存映射失敗,返回 MAP_FAILED
				fprintf(stderr, "file failed :%s\n",strerror(errno));
					
				fd_=-1;
				data_=NULL;
				size_=0;
				return false;
			}
			if(Debug){
				printf("file map succeed  : size_ : %d ,fd : %d , data : %p\n",size_,fd_,data_);
			}
				return true;
	}
	//獲取映射內(nèi)存的首地址		
	void* MMapFile::get_data()const
	{
		return data_;     //返回映射內(nèi)存的起始地址
	}
	//獲取映射內(nèi)存的大小		
	int32_t MMapFile::get_size()const
	{
		return size_;    //返回映射內(nèi)存的大小
	}
			
	bool MMapFile::munmap_file()  
	{
		if(munmap(data_ , size_)==-1){    //解除文件映射失敗
			fprintf(stderr , "remove file map falied :%s \n",strerror(errno));
			return false;
		}
			return true;
	}
	//解除映射		
	bool MMapFile::ensure_flie_size(const int32_t size)
	{
		struct stat s;         //存放文件狀態(tài)(這個(gè)是系統(tǒng)提供的)
		if(fstat(fd_ , &s) < 0 ){					//獲取文件狀態(tài)
			fprintf(stderr , "fstat falied :%s \n",strerror(errno));
			return false;
		}
				
		if(s.st_size<size){        //設(shè)置文件大小
			int res=ftruncate(fd_ , size); //對(duì)大小進(jìn)行調(diào)整  
			if(res<0){             //在 linux系統(tǒng)中,大多數(shù)情況返回值<0 表示失敗
				fprintf(stderr , "resize failed :%s \n",strerror(errno));
				return false;
			}
		}
			return true;
	}
			
	/*
		重新執(zhí)行映射  (追加,減少內(nèi)存)
		mremap()
	*/
	//重新映射
	bool MMapFile::remap_file()    
	{	
	//防御性編程
		if(data_==NULL || size_<0 || fd_< 0){//判斷是否存在映射區(qū)域
			fprintf(stderr, "not map file\n");
			return false;
		}
				 
		if(size_==mmap_file_option_.max_mmap_size_){//當(dāng)前映射區(qū)域的大小,已經(jīng)達(dá)到我們?cè)O(shè)置的最大值
			fprintf(stderr,"size is already max\n");
			return false;
	    }
				 
	   int32_t new_size=size_+mmap_file_option_.pri_mmap_size_;   //新的映射區(qū)域的大小
			if(new_size>mmap_file_option_.max_mmap_size_){//如果新的大小大于我們的最大值
				new_size=mmap_file_option_.max_mmap_size_;
		    }
		//調(diào)整文件大小
		if(!ensure_flie_size(new_size)){        //調(diào)整大小
			fprintf(stderr , "ensure_flie_size falied: %d\n", size_);
			return false;
		}
		if(Debug)  printf("file map succeed  : %d ,fd : %d , data : %p\n",size_,fd_,data_);
			//最后進(jìn)行重新映射
		void *new_data=mremap(data_ , size_ , size_+ mmap_file_option_.pri_mmap_size_,MREMAP_MAYMOVE);//調(diào)整映射區(qū)域
		if(new_data==MAP_FAILED){
			fprintf(stderr , "remap_file failed :%s \n",strerror(errno));
			return false;
		}
		//賦值
		data_=new_data;
		size_=new_size;
		return true;
	 }
   }
}
  • 補(bǔ)充:
    這里呢,給大家分享一些方法,當(dāng)我們?cè)趯懸恍┐笮晚?xiàng)目的時(shí)候,我們一般會(huì)將標(biāo)準(zhǔn)化的頭文件,函數(shù)調(diào)用需要的頭文件,放到一個(gè) .h的文件中,我這里演示的也是這樣操作的 :
#ifndef _COMMON_H_
#define _COMMON_H_

#include<iostream>
#include<fcntl.h>     
#include<sys/stat.h>
#include<string>
#include<sys/types.h>
#include<stdint.h>
#include <errno.h>
#include<string.h>
#include<stdio.h>
#include <error.h>
#include<sys/mman.h>

#endif  /*_COMMON_H_*/     //這樣注釋起來(lái)更加清晰 , 因?yàn)槲覀兛赡懿恢拱粋€(gè)

技巧提示:
如果不知道,我們所寫的函數(shù)需要什么頭文件 ,可以這樣操作 man APi

演示 :
man mmap
淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) -TFS,淘寶分布式文件存儲(chǔ)系統(tǒng),分布式,tfs,服務(wù)器,linux,ubuntu,c++

對(duì)代碼的可行性進(jìn)行測(cè)試 :

提示: 整個(gè)測(cè)試我們需要綜合我的上一篇內(nèi)容, 結(jié)合 mmap_file.h 頭文件一起 .

#include"mmap_file.h"
#include"common.h"

using namespace std;
using namespace qiniu;

static const mode_t OPEN_MODE=0644;       //文件的權(quán)限
const static largefile::MMapOption mmp_option={10240000,4096 ,4096};  //設(shè)置內(nèi)存映射參數(shù)

int open_file(string file_name, int open_flags)
{    
    //OPEN_MODE   如果文件不存在,則創(chuàng)建
     int fd=open( file_name.c_str(), open_flags, OPEN_MODE); //成功返回值一定>0
	 if( fd<0 ){
		 return -errno;
	 }
	 return fd;
}

int main(){
	const char* file_name="./mapfile_test.txt";
	//打開(kāi)一個(gè)文件,獲取文件的句柄
	int fd=open_file(file_name , O_RDWR | O_CREAT | O_LARGEFILE );
	if( fd <0 ){     //返回的文件句柄不合法
		fprintf(stderr ," open file failed : %s  error desc : %s\n",file_name , strerror(-fd));
		return -1;
	}
	
	printf("%d\n",fd);
	
	largefile::MMapFile *map_file=new largefile::MMapFile(mmp_option,fd);
	
	bool is_mmap=map_file->map_file(true);                        //文件映射到內(nèi)存
	//printf("文件映射的起始地址: %p\n", map_file->get_data());
	//printf("映射內(nèi)存的大小 : %d\n", map_file->get_size());
	
	printf(" is_mmap: %d\n",is_mmap);
	if(is_mmap){
		memset(map_file->get_data(),'8',map_file->get_size());    //將映射的內(nèi)存全部置為'8'
		map_file->sync_file();                                    //同步文件
		
		//解除映射
		map_file->munmap_file();
	}else{
		fprintf(stderr,"map file failed \n");
	}
	
	close(fd);	
	return 0;
}
 

測(cè)試結(jié)果:

size: 文件映射到內(nèi)存的大小。

data: 文件映射到內(nèi)存的起始地址。

fd: 文件的句柄。
淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) -TFS,淘寶分布式文件存儲(chǔ)系統(tǒng),分布式,tfs,服務(wù)器,linux,ubuntu,c++
對(duì)測(cè)試結(jié)果進(jìn)行說(shuō)明:

  • 測(cè)試程序成功將文件映射到內(nèi)存,然后將文件映射到內(nèi)存的起始地址、映射的大小文件的句柄,打印了出來(lái)。當(dāng)我們對(duì)文件mapfile_test.txt進(jìn)行查看的時(shí)候,文件的內(nèi)容全是8,說(shuō)明,映射內(nèi)存的改變,會(huì)同時(shí)導(dǎo)致我們?cè)次募母淖?t同步的,當(dāng)然我們也可以對(duì)其進(jìn)行設(shè)置,文件只是共享,映射內(nèi)存改變不會(huì)影響到我們的源文件)。
  • 文件映射大概就是這樣 , 后續(xù)我會(huì)給大家介紹 文件映射操作的實(shí)戰(zhàn),還會(huì)講一些大神級(jí)別的寫法 .

最后給大家分享一個(gè)liunx函數(shù)幫助文檔:
函數(shù)幫助文檔
*提取碼: * 0307文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-732480.html

到了這里,關(guān)于淘寶分布式文件存儲(chǔ)系統(tǒng)( 三 ) -TFS的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • OSS文件上傳、MinIO分布式文件存儲(chǔ)系統(tǒng)

    阿里云OSS上傳圖片 實(shí)現(xiàn)步驟: 1. 定義OSS相關(guān)配置 application-dev.yml application.yml 2. 讀取OSS配置 在sky-common模塊中,已定義 3. 生成OSS工具類對(duì)象 在sky-server模塊 其中,AliOssUtil.java已在sky-common模塊中定義 4. 定義文件上傳接口 在sky-server模塊中定義接口 MinIO分布式文件存儲(chǔ)系統(tǒng) MinI

    2024年01月24日
    瀏覽(20)
  • 搭建單機(jī)版FastDFS分布式文件存儲(chǔ)系統(tǒng)

    搭建單機(jī)版FastDFS分布式文件存儲(chǔ)系統(tǒng)

    1、下載FastDFS安裝包和依賴包 https://codeload.github.com/happyfish100/libfastcommon/tar.gz/V1.0.43 https://codeload.github.com/happyfish100/fastdfs/tar.gz/V6.06 https://codeload.github.com/happyfish100/fastdfs-nginx-module/tar.gz/V1.22 注:可以使用window瀏覽器(下載后需要上傳到服務(wù)器上),也可以使用linux的curl命令 2、

    2024年02月09日
    瀏覽(29)
  • HDFS Hadoop分布式文件存儲(chǔ)系統(tǒng)整體概述

    HDFS Hadoop分布式文件存儲(chǔ)系統(tǒng)整體概述

    整體概述舉例: 包括機(jī)架 rack1、rack2 包括5個(gè)Datanode,一個(gè)Namenode( 主角色 )帶領(lǐng)5個(gè)Datanode( 從角色 ),每一個(gè)rack中包含不同的block模塊文件為 分塊存儲(chǔ)模式 。塊與塊之間通過(guò)replication進(jìn)行 副本備份 ,進(jìn)行冗余存儲(chǔ),Namenode對(duì)存儲(chǔ)的 元數(shù)據(jù)進(jìn)行記錄 。該架構(gòu)可以概括為一個(gè) 抽象

    2024年02月16日
    瀏覽(89)
  • 常用分布式文件系統(tǒng)(對(duì)象存儲(chǔ))對(duì)比-SeaweedFS、Minio

    常用分布式文件系統(tǒng)(對(duì)象存儲(chǔ))對(duì)比-SeaweedFS、Minio

    常用分布式文件系統(tǒng),相對(duì)比較熱門的有Minio,SeaweedFS,FastDFS,ceph。主要對(duì)比一下Minio,SeaweedFS。 什么是SeaweedFS? SeaweedFS是一種簡(jiǎn)單的、高度可擴(kuò)展的分布式文件系統(tǒng)。SeaweedFS是一個(gè)非常優(yōu)秀的由 Go語(yǔ)言開(kāi)發(fā)的分布式存儲(chǔ)開(kāi)源項(xiàng)目。它是用來(lái)存儲(chǔ)文件的系統(tǒng),并且與使用的語(yǔ)言無(wú)

    2024年02月03日
    瀏覽(34)
  • Hbase 系列教程:HBase 分布式文件存儲(chǔ)系統(tǒng)解析

    作者:禪與計(jì)算機(jī)程序設(shè)計(jì)藝術(shù) : Hbase 是 Apache 的開(kāi)源 NoSQL 數(shù)據(jù)庫(kù)項(xiàng)目之一。它是一個(gè)分布式、可擴(kuò)展的、高性能、面向列的非關(guān)系型數(shù)據(jù)庫(kù)。作為 Hadoop 大數(shù)據(jù)生態(tài)的一部分,Hbase 以高可用性、可伸縮性和水平可擴(kuò)展性著稱。它提供了一個(gè)列族模型(Column Family Model),能

    2024年02月05日
    瀏覽(20)
  • Ceph分布式文件系統(tǒng)——文件系統(tǒng)MDS接口 塊存儲(chǔ)RDB接口 對(duì)象存儲(chǔ)RGW接口

    Ceph分布式文件系統(tǒng)——文件系統(tǒng)MDS接口 塊存儲(chǔ)RDB接口 對(duì)象存儲(chǔ)RGW接口

    服務(wù)端操作 1)在管理節(jié)點(diǎn)創(chuàng)建 mds 服務(wù) 2)查看各個(gè)節(jié)點(diǎn)的 mds 服務(wù) 3)創(chuàng)建存儲(chǔ)池,啟用 ceph 文件系統(tǒng) ceph 文件系統(tǒng)至少需要兩個(gè) rados 池,一個(gè)用于存儲(chǔ)數(shù)據(jù),一個(gè)用于存儲(chǔ)元數(shù)據(jù)。此時(shí)數(shù)據(jù)池就類似于文件系統(tǒng)的共享目錄。 創(chuàng)建 cephfs,命令格式:ceph fs new FS_NAME CEPHFS_ME

    2024年02月16日
    瀏覽(34)
  • Hadoop的分布式文件存儲(chǔ)系統(tǒng)HDFS組件的使用

    Hadoop的分布式文件存儲(chǔ)系統(tǒng)HDFS組件的使用

    存儲(chǔ)整個(gè)HDFS集群的元數(shù)據(jù)(metaData) —— 整個(gè)集群中存儲(chǔ)的目錄和文件的索引 管理整個(gè)HDFS集群 接收客戶端的請(qǐng)求 負(fù)責(zé)節(jié)點(diǎn)的故障轉(zhuǎn)移 存儲(chǔ)數(shù)據(jù),是以block塊的形式進(jìn)行數(shù)據(jù)的存放。 默認(rèn)情況下block塊的大小是128M。 blocksize大小的計(jì)算公式: 尋址時(shí)間:下載文件時(shí)找到文件

    2024年02月09日
    瀏覽(97)
  • 【開(kāi)發(fā)環(huán)境】(阿里云分布式文件系統(tǒng))對(duì)象存儲(chǔ)OSS 服務(wù)配置

    【開(kāi)發(fā)環(huán)境】(阿里云分布式文件系統(tǒng))對(duì)象存儲(chǔ)OSS 服務(wù)配置

    目錄 一、開(kāi)通 “對(duì)象存儲(chǔ) OSS” 服務(wù): 二、創(chuàng)建 Bucket 容器: 1.創(chuàng)建一個(gè)Bucket: 三、使用 OSS 對(duì)象存儲(chǔ): 四、使用 SDK 訪問(wèn) OSS: 1.安裝使用 OSS SDK: 2.SDK 配置和測(cè)試: ? ? ? ? 進(jìn)入阿里云官網(wǎng): https://www.aliyun.com/ https://www.aliyun.com/ ? ? ? ? 進(jìn)入到 OSS 對(duì)象存儲(chǔ)的管理平臺(tái)

    2024年02月02日
    瀏覽(122)
  • 大數(shù)據(jù)技術(shù)原理與應(yīng)用 概念、存儲(chǔ)、處理、分析和應(yīng)用(林子雨)——第三章 分布式文件系統(tǒng)HDFS

    大數(shù)據(jù)技術(shù)原理與應(yīng)用 概念、存儲(chǔ)、處理、分析和應(yīng)用(林子雨)——第三章 分布式文件系統(tǒng)HDFS

    大數(shù)據(jù)要解決數(shù)據(jù)存儲(chǔ)問(wèn)題,所以有了分布式文件系統(tǒng)(DFS),但可能不符合當(dāng)時(shí)的一些應(yīng)用需求,于是谷歌公司開(kāi)發(fā)了GFS(Google file System)。GFS是閉源的,而HDFS是對(duì)GFS的開(kāi)源實(shí)現(xiàn)。 1.GFS和DFS有什么區(qū)別? GFS(Google File System)和DFS(Distributed File System)都是分布式文件系統(tǒng),

    2024年02月03日
    瀏覽(99)
  • 分布式數(shù)據(jù)(文件)存儲(chǔ)

    分布式數(shù)據(jù)(文件)存儲(chǔ)

    在分布式存儲(chǔ)里面,比較常見(jiàn)的有kafka,Hbase,HDFS,fastDFS等,這里面涉及到文件的分布式存儲(chǔ)以及數(shù)據(jù)的分布式存儲(chǔ)。分布式存儲(chǔ)的背景:就是將數(shù)據(jù)文件分散的存儲(chǔ)到分布式集群的每一個(gè)節(jié)點(diǎn),提升了存儲(chǔ)的容量(大數(shù)據(jù)化);同時(shí)盡量凸顯分布式的檢索能力。分布式存儲(chǔ)的原

    2024年02月07日
    瀏覽(22)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包