Mengapa urutan boot linux di sh dan tidak di c

5

Saya memiliki perangkat tertanam yang menjalankan linux.

Saya mencoba mempercepat urutan boot. Apakah menulis ulang sebagian besar urutan booting di C akan mempercepat banyak?

misalnya saya punya banyak skrip yang menguji ini atau itu, kemudian pasang ini atau itu. Ini adalah /etc/rcS.d/S03sysfs

#!/bin/sh

if [ -e /proc ] && ! [ -e /proc/mounts ]; then
  mount -t proc proc /proc
fi

if [ -e /sys ] && grep -q sysfs /proc/filesystems; then
  mount sysfs /sys -t sysfs
fi

exit 0

Dugaan saya adalah bahwa jika itu dalam C, itu akan jauh lebih cepat bukan?

Pertanyaan saya :

Mengapa belum ada di C?
Apakah akan ada peningkatan kecepatan untuk menulis ini dalam C?

pengguna1190
sumber

Jawaban:

9

Ini akan menjadi agak lebih cepat di C, tetapi pilihan bahasa bukan yang paling mempengaruhi kinerja. Biasanya lebih efektif untuk melakukan berbagai tugas secara paralel, daripada menunggu masing-masing untuk menyelesaikan secara berurutan seperti yang dilakukan oleh sistem init yang lebih sederhana. Sebagai contoh, sshd dan httpd dapat dimulai pada saat yang bersamaan, karena keduanya tidak membutuhkan yang lain untuk sudah berjalan.


Tidak ada "urutan boot Linux" tunggal. Setiap distribusi memiliki sendiri; bahkan tidak ada satu pun kesamaan yang mereka miliki. Itu bisa dalam C, Perl, Haskell, apa pun; satu-satunya persyaratan adalah bahwa executable name /initharus ada di initramfs, atau /sbin/initdi sistem file root.

The /etc/rc?.dSkema hanyalah perpanjangan dari proses boot Unix dari 20 tahun yang lalu, bahkan mungkin 30 tahun. Sistem Unix yang paling awal jarang di-boot-ulang, sehingga mereka akan memiliki skrip sederhana, /etc/rcatau serupa, yang akan diluncurkan oleh init dan memulai berbagai daemon secara berurutan.

Bahkan saat ini SysV init sedang digunakan untuk memulai semua skrip tersebut, meskipun metode yang tepat dapat bervariasi. Awalnya, sebuah sistem akan memulai semua skrip /etc/rc?.dsecara berurutan; saat ini Debian menggunakan dependensi gaya Makefile.

Beberapa distribusi - Ubuntu, Chrome OS, Fedora hingga v14 - telah beralih ke Upstart , yang ditulis dalam C dan "berbasis-event", memungkinkan daemon dimulai secara paralel. Sistem init lain, systemd , tampaknya meningkat dengan cepat dalam popularitas - digunakan secara default di Fedora dan OpenSuSE. Itu juga ditulis dalam C. (Kedua sistem masih membaca file konfigurasi tekstual untuk memutuskan daemon mana yang akan dijalankan.)

Distribusi yang masih melekat dengan SysVinit biasanya melakukannya untuk "kesederhanaan"; argumen [rujukan?] yang paling sering terdengar tampaknya tentang skrip shell lebih mudah dipelihara daripada kode C yang setara (meskipun skrip shell tersebut terdiri dari 90% copypasta), serta ketakutan fana untuk memperkenalkan dependensi perpustakaan tambahan [subjektif] . Anda dapat melihat sendiri di utas ini , ini , ini dan ini di milis Debian mulai Mei 2012.

(Penafian: Saya sendiri pengguna systemd .)

grawity
sumber
Ini juga merupakan bacaan yang menarik: Mengapa kita tidak menggunakan kata 'di sini' dalam tautan teks
Marco
Saya hanya memiliki satu inti pada perangkat saya sehingga hal-hal paralel tidak akan meningkatkan kecepatan sangat banyak kan? Kecuali jika startup saya sering memblokir ... bukan?
user1190
@ user1190: Menunggu di IO adalah blok umum, jadi bahkan pada satu inti Anda akan melihat keuntungan.
Daenyth
5

Mengapa belum ada di C?

Untuk kompatibilitas lintas platform dan karena itu memungkinkan untuk menggunakan file sh untuk menggambarkan proses boot. Mempertahankan skrip boot di C akan menjadi PITA.

Apakah akan ada peningkatan kecepatan untuk menulis ini dalam C?

Tidak banyak. Sementara beberapa bagian akan lebih cepat, kenaikan kecepatan keseluruhan akan menjadi marjinal. Sebagian besar proses boot secara berurutan, khususnya langkah-langkah di init 1 dan 2. Dari init 3 dan ke atas, proses booting dapat dibatalkan menggunakan sesuatu seperti Runit , yang akan membuat Anda memperoleh kecepatan tinggi.

Gerardo Curiel
sumber
Skrip boot tidak harus 100% kode C; mereka masih dapat membaca file konfigurasi tekstual (seperti fstabuntuk sistem file), misalnya, ini .
grawity
1
Mengapa GCC menjadi ketergantungan untuk suatu program yang dapat didistribusikan sebagai paket biner? Ingat bahwa sysvinit juga ditulis dalam C. (Juga, sebagai pengelola beberapa paket Arch, saya merasa jauh lebih mudah untuk memastikan konsistensi file unit 5-line yang bekerja di mana-mana, daripada skrip shell 20-line yang bervariasi dari distro to distro.)
grawity
1
Sistem init sendiri sudah ditulis dalam C dan memiliki kompiler sebagai Build-Dep. Di sisi lain, skrip init untuk setiap layanan tidak harus skrip sama sekali; mereka bisa berupa file konfigurasi tekstual sederhana , seperti pada contoh saya sebelumnya. Tidak ada alasan bagi mereka untuk dikompilasi.
grawity
2
@grawity: Kita dapat memanggil file teks "skrip" dan kode C "shell" dan kemudian - oh tunggu, begitulah cara mengaturnya sekarang. Serius, kecepatan seperti apa yang menurut Anda mungkin Anda dapatkan? Ingatlah bahwa shell sudah akan dibaca ke dalam RAM, alasan lain untuk menjaganya agar tetap disebutkan di halaman ini, dan keuntungan kinerja yang sangat kecil dengan banyak rasa sakit admin ...
mpez0
1
Satu perbedaan adalah bahwa shskrip mengandalkan sejumlah besar program eksternal; bahkan jika mereka di-cache dalam memori, fork () ing mereka masih memiliki biaya yang lebih besar daripada satu mount () syscall (seperti dalam contoh OP). Adapun rasa sakit admin, satu-satunya perubahan yang saya lihat sejauh ini adalah penurunan . (Saya merasa bahwa saya terlibat dalam flamewar ketiga minggu ini. Saya harus berhenti.)
grawity
2

Sebagian besar waktu yang dihabiskannya adalah menunggu sesuatu, satu demi satu: sistem file, jaringan, dll.

Jika Anda menginginkan urutan boot yang sangat cepat, boot dengan init = / bin / sh - prompt perintah instan! Jika ini adalah sistem tertanam, Anda dapat mem-boot-nya langsung ke aplikasi Anda.

pjc50
sumber