Nous avons vu le système d'exploitation faire l'optimisation de la copie en écriture lors du démarrage d'un processus. La raison étant que la plupart du temps, fork est exécuté par exec, nous ne voulons donc pas encourir le coût des allocations de pages et copier les données de l'espace d'adressage de l'appelant inutilement.
Cela se produit également lorsque vous faites du CP sur un Linux avec des systèmes de fichiers ext4 ou xfs (journalisation). Si cela ne se produit pas, alors pourquoi pas?
linux
filesystems
ext4
xfs
copy-on-write
Mridul Verma
la source
la source
Réponses:
Le mot-clé à rechercher est
reflink
. Il a été récemment implémenté dans XFS.EDIT: l'implémentation XFS était initialement marquée EXPERIMENTAL. Cet avertissement a été supprimé dans la version 4.16 du noyau, un certain nombre de mois après avoir écrit ce qui précède :-).
la source
Depuis la
cp
page de manuel :Cela fonctionne sur les systèmes de fichiers qui prennent en charge la copie sur écriture ( reflink ), principalement BTRFS pour le moment. L'implémentation du reflink XFS est en cours de développement [1] [2] .
la source
Linux a un appel système qui permet aux processus de l'espace utilisateur de dire au noyau de faire une copie sur des copies d'écriture des fichiers. FICLONERANGE et FICLONE utilisés comme options pour ioctl autoriser la copie sur écriture de copies de fichiers et de plages dans les fichiers.
Il est utilisé par cp --reflink pour effectuer les copies là où le système de fichiers le prend en charge.
la source
Sauf si vous introduisez un syscall pour
cp
(ou du moins pour copier un bloc), le système d'exploitation a du mal à comprendre que les données que lecp
programme va écrire sont les mêmes que celles qu'il vient de lire à partir d'un autre bloc. En plus de cela, vous auriez des frais supplémentaires pour gérer le scénario "plusieurs fichiers partagent les mêmes blocs". Les gros fichiers similaires qui ne diffèrent que dans quelques blocs se produisent rarement. Il est donc moins cher dans l'ensemble de simplement copier ces blocs, puis d'ajouter cette surcharge administrative à tous les fichiers.Maintenant, si vous "copiez" des fichiers (beaucoup d'entre eux) en ajoutant un autre clone / instantané du système de fichiers dans, disons, BTRFS, la situation est différente: vous avez maintenant "copié" tous les fichiers du système de fichiers, et toutes les modifications apportées à ils seront copiés sur écriture. Cela existe, mais pas dans ext4.
"Journalling" est un concept complètement indépendant de cela, ce sont les structures administratives des fichiers qui comptent.
la source