1. 程式人生 > >OpenStack 整合使用Ceph實現(Copy-On-Write)克隆 (筆記)

OpenStack 整合使用Ceph實現(Copy-On-Write)克隆 (筆記)

作者:zhangshen發表於:2014-08-28

本文使用的系統環境: CentOS6.5 四臺機器 規劃如下:


HostName IP        安裝服務
c01 192.168.40.101 mon mds osd
c02 192.168.40.102 mon osd
c03 192.168.40.103 osd
c04 192.168.40.104 備用


部署完成後將另做變更操作
1、增加OSD節點


在c04節點上增加OSD節點
c01 192.168.40.101 mon mds osd
c02 192.168.40.102 mon osd
c03 192.168.40.103 osd
c04 192.168.40.104 osd
2、增加MON節點


在c03節點上新增加MON節點
c01 192.168.40.101 mon mds osd
c02 192.168.40.102 mon osd
c03 192.168.40.103 mon osd
c04 192.168.40.104 osd


  
首先三臺機器組成ceph儲存叢集,hostname分別為c01,c02,c03,下文將都是使用這些短的hostname代表節點,其中在這三臺機器上都部署monitor和物件儲存osd,在mds上部署metadata伺服器mds,另外一臺機器作為openstack all-in-one環境節點 hostname:client
採用ceph-deploy來部署安裝ceph, 這個類似與我們部署openstack用的chef。非常方便。
第一步:  在所有ceph節點上修改/etc/hosts,ceph-deploy 後面的節點引數必須使用hostname,為了能夠解析hostname,需要配置/etc/hosts。


[
[email protected]
~]# cat /etc/hosts
127.0.0.1localhost.localdomain localhost
::1localhost6.localdomain6 localhost6
10.10.6.101 c01
10.10.6.102 c02
10.10.6.103 c03
10.10.6.104 c04




第二步:配置ceph節點無密碼訪問其他節點,這個是方便我們使用ceph-deploy部署安裝ceph


[[email protected] ~]# ssh-keygen  
[[email protected] ~]# ssh-copy-id c02  
[
[email protected]
~]# ssh-copy-id c03  
[[email protected] ~]# ssh-copy-id c04  


第三步:關閉selinux和iptables;
關閉selinux並且關閉iptables或允許6789埠


/etc/init.d/iptables stop &&chkconfig iptables off
sed -i '/^SELINUX=/ cSELINUX=disabled' /etc/selinux/config
setenforce 0




第四步: 安裝ceph
4.1安裝ceph-deploy
本文使用ceph-deploy來做部署,ceph-deploy為Ceph官方提供的安裝部署工具,只需要在任意一臺ceph節點安裝即可。使用ceph-deploy的前提是配置統一hosts與ssh key互相認證。本次ceph-deploy安裝在c01節點上。。
[
[email protected]
~]# rpm -ivh http://ceph.com/rpm-firefly/el6/noarch/ceph-release-1-0.el6.noarch.rpm
[[email protected] ~]# yum -y install ceph-deploy




部署之前確保ceph每個節點沒有ceph資料包(先清空之前所有的ceph資料,如果是新裝環境不用執行此步驟,如果是重新部署的話也執行下面的命令),其中c01、c02為主機名
 [[email protected] ~]# ceph-deploy purgedata c01 c02  
 [[email protected] ~]# ceph-deploy forgetkeys
 [[email protected] ~]# ceph-deploy purge c01 c02  


注:如果是新環境,沒有任何資料的無需執行


4.2批量安裝ceph


在c01節點使用ceph-deploy工具向各個節點安裝ceph
[[email protected] ~]# ceph-deploy install c01 c02 c03 c04
(如果安裝過程中由於網路原因中斷,可以單獨為某臺伺服器安裝ceph-deploy install <hostname> 即可)
注:也可以純手動安裝ceph,安裝過程如下:


yum clean all
yum -y install wget
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -Uvh --replacepkgs epel-release-6*.rpm
yum -y install yum-plugin-priorities
rpm --import https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc
rpm -Uvh --replacepkgs http://ceph.com/rpm-firefly/el6/noarch/ceph-release-1-0.el6.noarch.rpm
yum -y install ceph
ceph --version
[c01][DEBUG ] ceph version 0.80.5 (38b73c67d375a2552d8ed67843c8a65c2c0feba6)


4.3 部署mon節點
4.3.1建立mon節點
建立一個叢集包含c01 c02
使用ceph-deploy new c01 c02      
(執行這條命令後c01和c02都作為了monitor節點,多個mon節點可以在後面加入hostname多個實現互備如: ceph-deploy new c01 c02 c03)
[[email protected] ~]#  cd /etc/ceph/
[[email protected] ceph]# ceph-deploy new c01 c02  
 
檢視生成的配置


[[email protected] ceph]# ls
ceph.conf  ceph.log  ceph.mon.keyrin
[[email protected] ceph]# cat ceph.conf 
[global]
auth_service_required = cephx
filestore_xattr_use_omap = true
auth_client_required = cephx
auth_cluster_required = cephx
mon_host = 10.10.6.101,10.10.6.102
mon_initial_members = c01, c02
fsid = 1fb6919e-f455-4948-8038-e7383b840770


[[email protected] ceph]# 


4.3.2修改預設osd大小
編輯mon節點的ceph配置檔案,把下面的配置放入ceph.conf中
如果只有1個osd節點那麼下面2個配置都設定成1。否則設定osd pool default size = 2即可
[[email protected] ceph]# vim /etc/ceph/ceph.conf
osd pool default size = 1
osd pool default min size = 1


4.3.3修改安全認證
為了更方便得讓客戶端掛載,使用none無需使用cephx認證。
[[email protected] ceph]# vim /etc/ceph/ceph.conf
auth_service_required = none
auth_client_required = none 
auth_cluster_required = none
auth supported = none


4.3.4初始化mon節點
新增初始監控節點並收集金鑰(新的ceph-deploy v1.1.3以上的版本需要此配置)。


[[email protected] ceph]# ceph-deploy --overwrite-conf mon create-initial


日誌見附錄1.1


可以看到在/etc/ceph目錄下多出了3個keyring檔案
[[email protected] ceph]# ll -lh
total 172K
-rw-r--r--. 1 root root   71 Aug 13 14:27 ceph.bootstrap-mds.keyring
-rw-r--r--. 1 root root   71 Aug 13 14:27 ceph.bootstrap-osd.keyring
-rw-------. 1 root root   63 Aug 13 14:26 ceph.client.admin.keyring




4.3.5 檢查mon狀態
使用ceph quorum_status --format json-pretty檢視mon節點性息
[[email protected] ceph]# ceph quorum_status --format json-pretty


{ "election_epoch": 4,
  "quorum": [
        0,
        1],
  "quorum_names": [
        "c01",
        "c02"],
  "quorum_leader_name": "c01",
  "monmap": { "epoch": 1,
      "fsid": "1fb6919e-f455-4948-8038-e7383b840770",
      "modified": "0.000000",
      "created": "0.000000",
      "mons": [
            { "rank": 0,
              "name": "c01",
              "addr": "10.10.6.101:6789\/0"},
            { "rank": 1,
              "name": "c02",
              "addr": "10.10.6.102:6789\/0"}]}}
也可以使用ceph -s命令檢視狀態,看到有2個mon
[[email protected] ceph]# ceph -s
    cluster 1fb6919e-f455-4948-8038-e7383b840770
     health HEALTH_ERR 192 pgs stuck inactive; 192 pgs stuck unclean; no osds
     monmap e1: 2 mons at {c01=10.10.6.101:6789/0,c02=10.10.6.102:6789/0}, election epoch 4, quorum 0,1 c01,c02
     osdmap e1: 0 osds: 0 up, 0 in
      pgmap v2: 192 pgs, 3 pools, 0 bytes data, 0 objects
            0 kB used, 0 kB / 0 kB avail
                 192 creating


2014-08-22 17:25:12.597033 mon.0 [INF] osdmap e1: 0 osds: 0 up, 0 in




4.4配置osd節點
4.4.1配置OSD節點硬碟裝置


使用c01上的/dev/sdb1裝置作為osd
[[email protected] ceph]# fdisk -l


Disk /dev/sdb: 96.6 GB, 96636764160 bytes
255 heads, 63 sectors/track, 11748 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xd6257124


   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        3916    31455238+  83  Linux
/dev/sdb2            3917        7832    31455270   83  Linux
/dev/sdb3            7833       11748    31455270   83  Linux


4.4.2準備分割槽檔案系統
在c01節點上新增osd節點,預設檔案系統是xfs,--fs-type引數可以指定使用ext4。此處c01為節點hostname,/dev/sdb1為預先為osd0準備好的分割槽


增加osd.0節點
[[email protected] ceph]# ceph-deploy osd prepare c01:/dev/sdb1 --fs-type ext4


日誌見附錄1.2
4.4.3啟用osd
[[email protected] ceph]# ceph-deploy osd activate c01:/dev/sdb1


日誌見附錄1.3




[[email protected] ceph]# ceph -s
    cluster 1fb6919e-f455-4948-8038-e7383b840770
     health HEALTH_OK
     monmap e1: 2 mons at {c01=10.10.6.101:6789/0,c02=10.10.6.102:6789/0}, election epoch 6, quorum 0,1 c01,c02
     osdmap e5: 1 osds: 1 up, 1 in
      pgmap v7: 192 pgs, 3 pools, 0 bytes data, 0 objects
            5294 MB used, 23405 MB / 30236 MB avail
                 192 active+clean


2014-08-22 22:25:33.550694 mon.0 [INF] pgmap v7: 192 pgs: 192 active+clean; 0 bytes data, 5294 MB used, 23405 MB / 30236 MB avail
[[email protected] ceph]# 
修改所有節點ceph配置


[osd]
osd mkfs type =ext4
osd mount options ext4 = "rw,noatime,user_xattr"


[osd.0]
host=c01
devs=/dev/sdb1




4.5 增加osd.1節點
ceph-deploy osd prepare c02:/dev/sdb1 --fs-type ext4
ceph-deploy osd activate c02:/dev/sdb1


[[email protected] ceph]# ceph -s
    cluster 1fb6919e-f455-4948-8038-e7383b840770
     health HEALTH_OK
     monmap e1: 2 mons at {c01=10.10.6.101:6789/0,c02=10.10.6.102:6789/0}, election epoch 6, quorum 0,1 c01,c02
     osdmap e9: 2 osds: 2 up, 2 in
      pgmap v15: 192 pgs, 3 pools, 0 bytes data, 0 objects
            10587 MB used, 42027 MB / 55430 MB avail
                  28 active+clean+replay
                 164 active+clean
[[email protected] ceph]# 


修改配置增加
[osd.1]
host=c02
devs=/dev/sdb1


4.6 增加osd.2
ceph-deploy osd prepare c03:/dev/sdb1 --fs-type ext4
ceph-deploy osd activate c03:/dev/sdb1


修改配置增加
[osd.2]
host=c03
devs=/dev/sdb1






[[email protected] ceph]# ceph -s
    cluster 1fb6919e-f455-4948-8038-e7383b840770
     health HEALTH_OK
     monmap e1: 2 mons at {c01=10.10.6.101:6789/0,c02=10.10.6.102:6789/0}, election epoch 6, quorum 0,1 c01,c02
     osdmap e13: 3 osds: 3 up, 3 in
      pgmap v26: 192 pgs, 3 pools, 0 bytes data, 0 objects
            15879 MB used, 60649 MB / 80624 MB avail
                 192 active+clean
[[email protected] ceph]# 
[[email protected] ceph]# 
[[email protected] ceph]# ceph osd tree
# idweight type nameup/downreweight
-10.06998 root default
-20.03 host c01
00.03 osd.0up 1
-30.01999 host c02
10.01999 osd.1up 1
-40.01999 host c03
20.01999 osd.2up 1
[[email protected] ceph]# 




4.6新增mds節點


[[email protected] ceph]# ceph-deploy mds create c01


[[email protected] ceph]# ceph -s
    cluster 1fb6919e-f455-4948-8038-e7383b840770
     health HEALTH_OK
     monmap e1: 2 mons at {c01=10.10.6.101:6789/0,c02=10.10.6.102:6789/0}, election epoch 8, quorum 0,1 c01,c02
     mdsmap e4: 1/1/1 up {0=c01=up:active}
     osdmap e20: 3 osds: 3 up, 3 in
      pgmap v124: 192 pgs, 3 pools, 1884 bytes data, 20 objects
            15880 MB used, 60647 MB / 80624 MB avail
                 192 active+clean
[[email protected] ceph]# 








5.1RBD儲存
5.1.1安裝ceph客戶端工具
配置源
rpm -ivh http://ceph.com/rpm-firefly/el6/noarch/ceph-release-1-0.el6.noarch.rpm
安裝ceph-fuse
yum install ceph-fuse -y --disablerepo=epel
把祕鑰及配置檔案拷貝到客戶端
[[email protected] ceph]# scp ceph.conf ceph.client.admin.keyring <client ip>:/etc/ceph/




5.1.2 建立池


 預設情況下,Ceph的塊裝置使用RBD池。您可以使用任何可用的池。我們建議建立一個 Cinder使用池和一個Glance使用池。確保您的Ceph的叢集正常執行,然後再建立池。


   ceph osd pool create volumes 128
   ceph osd pool create images 128
   ceph osd pool create backups 128






5.2 配置使用Ceph的OpenStack


 
5.2.1 配置GLANCE


 


GLANCE可以使用多個後端儲存映象。預設情況下使用Ceph塊裝置,編輯 /etc/glance/glance-api.conf,並新增:


default_store = rbd
rbd_store_user = admin
rbd_store_pool = images


如果你要啟用讀寫克隆映象到volumes,還可以新增:


show_image_direct_url = True


5.2.2 配置CINDER


     OpenStack請求驅動程式與Ceph的塊裝置互動。您還必須指定塊裝置的池名稱。在你的OpenStack的節點主機上,編輯/etc/cinder/cinder.conf 並新增如下內容:


volume_driver = cinder.volume.drivers.rbd.RBDDriver
rbd_pool =volumes
glance_api_version = 2
(#)
rbd_user=admin
# rbd_secret_uuid=<None>
rbd_ceph_conf=/etc/ceph/ceph.conf
rbd_flatten_volume_from_snapshot=false
rbd_max_clone_depth=5




如果你使用認證cephx,新增到libvirt之前要配置使用者和安全的UUID:


rbd_user = volumes
#rbd_secret_uuid = {uuid of secret}




vim /etc/cinder/cinder.conf
backup_driver=cinder.backup.drivers.ceph
backup_ceph_user=admin
backup_ceph_pool=backups
backup_ceph_chunk_size=134217728
backup_ceph_stripe_unit=0
backup_ceph_stripe_count=0
restore_discard_excess_bytes=true


5.2.3 配置nova使用ceph
本文中安裝的qemu,libvirt均為新版本,版本過低可能存在rbd的支援問題。編譯安裝的方法為qemu安裝libvirt安裝
【問題: qemu版本問題,必須能支援rbd格式的,因為libvirt就是通過qemu相關命令與ceph儲存互動,可通過"qemu-img–help”察看。
qemu-img version 0.12.1,
Supported formats: raw cow qcow vdi vmdk cloop dmg bochs vpc vvfat qcow2 qedvhdx parallels nbd blkdebug host_cdrom host_floppy host_device filegluster gluster gluster gluster
可以看到0.12.1不支援rbd,要裝0.15以上的】
為了整合nova, 先做如下給libvirt建立金鑰的操作,這個金鑰在qemu執行建立image命令時會使用到,應在nova-compute服務執行的節點上執行如下操作。本文使用all-in-one,所以直接在client節點執行
qemu包含rbd
http://ceph.com/packages/ceph-extras/rpm/centos6/x86_64/qemu-kvm-0.12.1.2-2.415.el6.3ceph.x86_64.rpm
http://ceph.com/packages/ceph-extras/rpm/centos6/x86_64/qemu-img-0.12.1.2-2.415.el6.3ceph.x86_64.rpm
http://ceph.com/packages/ceph-extras/rpm/centos6/x86_64/qemu-kvm-tools-0.12.1.2-2.415.el6.3ceph.x86_64.rpm


[[email protected] ~]# cat > secret.xml << EOF  
<secret ephemeral = 'no' private = 'no'>  
<usage type = 'ceph'>  
<name>client.admin secret</name>  
</usage>  
</secret>  
EOF  
[[email protected] ~]# sudo virsh secret-define --file secret.xml  
Secret 28ca7db4-a1f3-e007-2db6-4a06252c8e0a created  


[[email protected] ~]# cat /etc/ceph/ceph.client.admin.keyring 
[client.admin]
key = AQDiZuxTeKUjNxAA8gaEVK/GYqXg94lD+LBpUg==
[[email protected] ~]# sudo virsh secret-set-value --secret 28ca7db4-a1f3-e007-2db6-4a06252c8e0a --base64 AQDiZuxTeKUjNxAA8gaEVK/GYqXg94lD+LBpUg==
Secret value set




vim /etc/nova/nova.conf
libvirt_images_type=rbd
libvirt_images_rbd_pool=volumes
libvirt_images_rbd_ceph_conf=/etc/ceph/ceph.conf 
rbd_secret_uuid=28ca7db4-a1f3-e007-2db6-4a06252c8e0a
rbd_user=admin






重新啟動OpenStack


下載映象
wget http://download.cirros-cloud.net/0.3.2/cirros-0.3.2-x86_64-disk.img
qcow2轉raw
qemu-img convert -f qcow2 -O raw cirros-0.3.2-x86_64-disk.img cirros-0.3.2-x86_64-disk.raw


上傳image


檢視pool下的檔案
[[email protected] ~]# rados -p images ls
rbd_data.10a695b62b0.0000000000000002
rbd_directory
rbd_data.10a695b62b0.0000000000000000
rbd_header.10a695b62b0
rbd_id.6822eca5-4f4c-4db4-a75e-2f95bc0d59fd
rbd_data.10a695b62b0.0000000000000004
rbd_data.10a695b62b0.0000000000000001
rbd_data.10a695b62b0.0000000000000003


建立1個雲硬碟後檢視pool下檔案
[[email protected] ~]# rados -p volumes ls
rbd_directory
rbd_header.10c0158a4c5f
rbd_id.volume-5f918839-20b2-4bb8-8214-e1ce1106f0a1
[[email protected] ~]# 




相關推薦

OpenStack 整合使用Ceph實現(Copy-On-Write)克隆 筆記

作者:zhangshen發表於:2014-08-28 本文使用的系統環境: CentOS6.5 四臺機器 規劃如下: HostName IP        安裝服務 c01 192.168.40.101 mon mds osd c02 192.168.40.10

標準C++類string的Copy-On-Write技術

寫時才拷貝(Copy-On-Write)技術,就是程式設計界“懶惰行為”——拖延戰術的產物。舉個例子,比如我們有個程式要寫檔案,不斷地根據網路傳來的資料寫,如果每一次fwrite或是fprintf都要進行一個磁碟的I/O操作的話,都簡直就是效能上巨大的損失,因此通常的做法是,每次寫檔案操作都寫在特定大小的一塊

標準C++類string的Copy-On-Write技術

不過,問題又來了,這個RefCnt該存在在哪裡呢?如果存放在string類中,那麼每個string的例項都有各自的一套,根本不能共有一個RefCnt,如果是宣告成全域性變數,或是靜態成員,那就是所有的string類共享一個了,這也不行,我們需要的是一個“民主和集中”的一個解決方法。這是如何做到的呢?呵呵,人生

shared_ptr實現copy-on-write

最近再看陳碩的《Linux多執行緒服務端程式設計使用muduoC++網路庫》,2.8節看到這個內容:使用shared_ptr實現copy-on-write的手法降低鎖競爭。 目的: 利用普通mutex替換讀寫鎖 shared_ptr是引用技術型智慧指標,當只有一個觀察者時

藉助shared_ptr實現copy-on-write以提高多執行緒併發效能

        鎖競爭是伺服器效能四大殺手之一(其他三個是:資料拷貝、環境切換、動態資源申請),本文將基於之前釋出的kimgbo網路I/O庫,以一個多執行緒群發聊天伺服器的實現為例,介紹如何藉助shared_ptr提高多執行緒併發的效能。         多執行緒群發聊天伺

理解 shared_ptr實現copy-on-writeCOW

shared_ptr實現COW(Copy-On-Write) 前不久在《Linux多執行緒服務端程式設計使用muduoC++網路庫》2.8節看到這個內容,一直沒有真正理解,後來在書中7.3中再次提到使用shared_ptr實現copy-on-write的手法降

借shared_ptr實現copy-on-write 1

    在《Linux多執行緒服務端程式設計使用muduoC++網路庫》2.8節說“借shared_ptr實現copy-on-write”。那麼copy-on-write是怎樣的技術?    COW(Copy-On-Write)通過淺拷貝(shallow copy)只複製引

垃圾收集演算法實現與垃圾收集器筆記

一、HotSpot中垃圾收集的演算法實現 1、列舉根節點 1.1、從可達性分析中從GC Roots節點找引用鏈這個操作為例,可作為GC Roots的節點主要在全域性性的引用(例如常量和類靜態屬性)與執行上下文(例如棧幀中的本地變量表)中,現在很多應用僅僅方法區就有數百兆,

Copy-On-Write寫時複製機制與Java中CopyOnWriteArrayList容器原始碼實現

Copy-on-Write機制簡稱COW,是一種併發設計策略。其基本思路是多執行緒同時共享同一個內容,當某個執行緒想要修改這個內容的時候,才會真正的把內容copy出去形成一個新的內容然後修改,其它的執行緒繼續讀舊的內容,直到修改完成。這是一種延時懶惰策略。 Copy-on-Write有

string類的簡單實現寫時拷貝Copy-on-write

前言:上一篇文章實現了string的深拷貝寫法;那我們能不能用淺拷貝寫string類呢?當然可以; 一、 (1) 當我們需要對拷貝之後的物件進行修改時,採用深拷貝的方式; 如果不需要修改,只是輸出字串的內容時,或者是當偶爾修改的的時候,我們再採用深拷貝的方

C++ string 類 部分成員函式實現實現COW copy-on-write

雖然標題中說實現了COW,但是事實上是很浪費的,並且命名也很不標準,程式碼也非常小學生,畢竟初學(給自己找藉口.jpg),以後應該還會把這篇找出來認真修改一下的。 Mystring.h: #pragma once #ifndef _MYSTRING_H_ #define

Linux寫時拷貝技術(copy-on-write)

但是 現在 進程地址空間 優化 如何 進程創建 http exe fork COW技術初窺: 在Linux程序中,fork()會產生一個和父進程完全相同的子進程,但子進程在此後多會exec系統調用,出於效率考慮,linux中引入了“寫時復制“技術,也就是只有進程

寫時拷貝COWcopy-on-write

display 語句 namespace div str pre style -a [0 寫時拷貝技術是通過"引用計數"實現的,在分配空間的時候多分配4個字節,用來記錄有多少個指針指向塊空間,當有新的指針指向這塊空間時,引用計數加一,當要釋放這塊空間時,引用計數減一

【轉】標準C++類std::string的內存共享和Copy-On-Write技術

信息 在哪裏 主程序 分析 ash 3.4 alloc 是否 今天 1、 概念 Scott Meyers在《More Effective C++》中舉了個例子,不知你是否還記得?在你還在上學的時候,你的父母要你不要看電視,而去復習功課,於是你

copy on write

base span += str process pass processor copy empty 1 yl::string CBaseAutopProcessor::AddAuthorizedInfo(const yl::string & strOrigi

COW奶牛!Copy On Write機制瞭解一下

前言 只有光頭才能變強 在讀《Redis設計與實現》關於雜湊表擴容的時候,發現這麼一段話: 執行BGSAVE命令或者BGREWRITEAOF命令的過程中,Redis需要建立當前伺服器程序的子程序,而大多數作業系統都採用寫時複製(copy-on-write)來優化子程序的使用效率,所以在子

寫實複製原理(copy-on-write)

CopyOnWrite特點 讀寫併發時無需加鎖,一般用於讀多寫少的操作,但要注意的是,讀資料不能保證實時性 以CopyOnWriteArrayList原始碼進行分析 屬性 // 顯示操作的重入鎖物件 final transient ReentrantLock lock = new ReentrantL

Java 中的寫時複製 (Copy on Write, COW)

Background 寫時複製 (Copy on Write, COW) 有時也叫 "隱式共享", 顧名思義, 就是讓所有需要使用資源 R 的使用者共享資源 R 的同一個副本, 當其中的某一個使用者要對資源 R 進行修改操作時, 先複製 R 的一個副本 R' , 再進行修改操作; Problem 在 J

Copy On Write機制瞭解一下

一、Linux下的copy-on-write 在說明Linux下的copy-on-write機制前,我們首先要知道兩個函式:fork()和exec()。需要注意的是exec()並不是一個特定的函式, 它是一組函式的統稱, 它包括了execl()、execlp()、execv()、execle()

string copy on write

#include<iostream> #include<string> #include<cstdio> using namespace std; main() { string str1 = "hello world";