Концептуально, библиотечная функция является частью Вашего процесса.
Во времени выполнения Вашем исполняемом коде и коде любых библиотек (таких как libc.so) это зависит от, будьте связаны в единственный процесс. Так, когда Вы вызываете функцию в такой библиотеке, она выполняется как часть Вашего процесса с теми же ресурсами и полномочиями. Это - та же идея как вызывание функции, которую Вы записали сами (за возможными исключениями как PLT и/или функции батута, которые можно искать, если Вы заботитесь).
Концептуально, системный вызов является специальным интерфейсом, используемым для звонка из кода (который обычно непривилегирован) к ядру (который, имеет право нарастить полномочия по мере необходимости).
Например, посмотрите кирпич человека Linux. Когда программа C звонит malloc
для выделения памяти это называет библиотечную функцию в glibc.
Если уже существует достаточно пространства для выделения в процессе, это может сделать любое необходимое управление "кучей" и возвратить память вызывающей стороне.
В противном случае glibc должен запросить больше памяти от ядра: это (вероятно), звонит brk
функция glibc, которая в свою очередь звонит brk
syscall. Только, после того как управление передало ядру через syscall, может глобальное состояние виртуальной памяти быть измененным, чтобы зарезервировать больше памяти и отобразить ее в адресное пространство Вашего процесса.
bsdtar cf - . | xz | pv -L 3m | ssh host 'cd /there && xz -d | bsdtar xpSf -'
(здесь использующий bsdtar, поскольку другие обычно не хранят все метаданные файла).
xz
вероятно, лучшее сжатие, которое можно получить (но очень интенсивный ЦП), pv
для ограничения уровня (отмечают, что это - 3 мега (220) байты в секунду).
Добавьте --numeric-owner
опция к второму bsdtar
если это для резервного копирования, и Вы хотите сохранить uids/gids.
Это было бы более эффективно (с точки зрения пропускной способности и ресурса на обоих серверах), чем использование rsync
(с xz
сжатие) для полной передачи, но если необходимо возобновить передачу или синхронизирующие папки, у которых есть общие файлы, это то, где rsync
прибывает удобный (но читайте rsync
страница справочника тщательно для выбора, какие опции необходимо сохранить метаданные, которые Вы хотите сохранить).
Для подстраивания сетевой пропускной способности существуют также инструменты, такие как cstream или mbuffer.
В дополнение к -t num
отрегулировать пропускную способность к num
байты в секунду, cstream
, например, не только имеет a -b num
опция установить размер блока, используемый для чтения-записи, но также и a -B num
опция буферизовать входной блок до num
байты перед записью.
Как альтернатива ssh
и rsync
Вы могли попробовать nc (netcat)
или ncat
, особенно, если поток данных не собирается пробегаться через Интернет. ncat
часть Проекта Nmap и имеет поддержку SSL все же.
# netcat + tar + cstream example to throttle network throughput
# requires netcat on both servers
# cf. http://superuser.com/questions/291803/best-way-to-copy-millions-of-files-between-2-servers/
# cstream -T 10 -t 4m </dev/urandom >/dev/null # test
nc -l -p 2342 | tar -C /target/dir -xzf - # destination box
tar -cz /source/dir | cstream -T 30 -t 4m | nc Target_Box 2342 # source box