Pustaka dasar lintas platform https://github.com/hujianzhe/util, unduh dan letakkan di direktori BootServer
Perkenalan:
Kode ini hanya mengimplementasikan bootstrapping startup node layanan, penjadwalan tugas, dan deskripsi modul dasar. Kode ini tidak berisi kode bisnis apa pun. Kode ini umumnya dikompilasi ke dalam perpustakaan dinamis dan tetap sangat terkendali dalam hal fungsi penggunaan. Ini mengimplementasikan beberapa alur protokol umum dan mendukung 20 Ekstensi coroutine tanpa tumpukan dan diisolasi dari beberapa kode pustaka dinamis C murni untuk mencegah C++ mencemari lapisan kerangka kerja dan memengaruhi pembuatan pustaka dinamis.
Kode di util bertanggung jawab untuk lintas platform, kecuali tidak memerlukan instalasi perpustakaan pihak ketiga mana pun
Pengenalan proses operasi:
Proses bisnis memanggil perpustakaan dinamis yang dikompilasi oleh kode dan memanggil antarmuka yang sesuai untuk digunakan. Untuk detail tentang proses pemanggilan, lihat contoh node pengujian (main_template di direktori BootServer adalah sekumpulan templat kode startup berbasis proses)
Beberapa thread menangani pembacaan dan penulisan IO jaringan di dalam modul. Thread akses penerimaan terpisah pada awalnya akan membuka thread pekerja untuk memproses pesan internal dan menerima pesan jaringan dan mengirimkannya ke logika kode bisnis Anda. Thread pekerja menggunakan coroutine tumpukan untuk menjadwalkan pemrosesan (lihat di bawah untuk mengetahui alasan mengapa coroutine tanpa tumpukan tidak digunakan)
Thread pekerja menggunakan coroutine tumpukan untuk penjadwalan secara default guna mempertahankan kompatibilitas tertinggi. Anda juga dapat dengan mudah menggunakan coroutine tanpa tumpukan C++20 (yang diterapkan di perpustakaan util) untuk penjadwalan. Ada coroutine tumpukan dan proses coroutine tanpa tumpukan dapat berjalan berdampingan
Pengenalan modul dan kode contoh:
1. BootServer: bagian kode utama, inisialisasi yang diperlukan dan pengoperasian node layanan
2. ServiceTemplate: Templat kode simpul layanan, digunakan untuk menulis logika bisnis Anda
3. SoTestClient, SoTestServer: menguji node dan menulis beberapa kode sampel
4. Cpp20-SoTestServer: node pengujian, menulis beberapa kode contoh, mengaktifkan coroutine stackless C++20 di main.cpp (menggunakan penjadwal coroutine stackless C++20 di perpustakaan util)
Menyusun:
kompilasi windows langsung VS
Gunakan make debug / make release / make asan di linux/Mac OS X
rintisan:
Edit file konfigurasi yang diperlukan untuk startup node layanan (lihat templat file konfigurasi terlampir untuk format spesifik), dan berikan setiap node file konfigurasi dan id unik, nama identifikasi log, IP, dan nomor port.
Windows terbuka langsung di VS, dan proyek dikonfigurasi dengan parameter startup <file konfigurasi>
Setelah linux/mac dikompilasi, jalankan.sh <proses layanan> <file konfigurasi>
Beberapa alasan dan wawasan desain: T: Mengapa tidak menggunakan coroutine tanpa tumpukan namun menggunakan coroutine bertumpuk? J: Sangat mudah untuk menerapkan coroutine tanpa tumpukan di C murni (untuk kode detailnya, Anda dapat melihat penjadwal coroutine tanpa tumpukan yang diimplementasikan dalam C murni di pustaka util), namun daur ulang dan persistensi sumber daya (terutama variabel pada tumpukan tunduk pada coroutine re -entri). (situasi terakhir) sangat sulit Jika Anda ingin menggunakan coroutine tanpa tumpukan dengan lancar, Anda masih perlu mengandalkan dukungan kompiler. Hal ini telah dicapai di C++20. Ada juga implementasi penjadwal coroutine tanpa tumpukan C++20 yang lengkap di pustaka util.
T: Mengapa coroutine tanpa tumpukan menyediakan fungsi tambahan ini dalam bentuk file header?
J: 1. Karena coroutine tanpa tumpukan merupakan kode yang mengganggu dan akan mengubah sejumlah besar bentuk tanda tangan fungsi
2. Berisi objek C++, yang tidak dikenali di C, dan perpustakaan dinamis tidak berhasil diekspor.
3. Diberikan dalam bentuk file header, menyerahkan izin aktivasi coroutine stackless ke lapisan aplikasi adalah cara yang saat ini saya pikirkan untuk menangani bagian perpustakaan dinamis C murni tanpa polusi apa pun.
Q: Apakah bisa diganti dengan scheduler lain?
J: Penjadwal thread pekerja dapat diganti. Thread pekerja dirancang sebagai pembawa penjadwal yang sedang berjalan. Interaksi antara thread jaringan dan thread pekerja dalam kerangka kerja dapat berhubungan dengan perilaku penjadwalan melalui kait antarmuka.
T: Apakah bisa diganti dengan perpustakaan jaringan lain?
J: 1. Saat ini tidak dapat digantikan dengan perpustakaan jaringan lain, tetapi masalah ini telah dipertimbangkan pada awal desain. Bagian jaringan dan bagian penjadwalan tugas dipisahkan sepenuhnya kait akan disediakan untuk penggantian.
2. Meskipun terdapat banyak perpustakaan jaringan pihak ketiga, fokusnya berbeda. Ada perpustakaan TCP dan UDP yang digunakan untuk pengembangan aplikasi, ada juga perpustakaan yang ingin mencakup seluruh semesta, dan ada juga perpustakaan yang mengimplementasikan seluruh tumpukan protokol jaringan pada lapisan aplikasi, jadi sebenarnya area ini tidak terpadu.
3. Jika satu set perpustakaan jaringan masuk standar di masa depan, maka saya akan menggantinya.
T: Mengapa tidak menggunakan C++ saja sebagai kerangka kerjanya?
J: 1. Saat kumpulan kode ini ditulis, C++20 belum muncul. Pada saat itu, solusi coroutine yang relatif paling matang adalah stack coroutine. Hal ini dapat dilakukan menggunakan C dengan memanggil API sistem platform yang sesuai.
2. Fungsi yang akan diimplementasikan oleh kerangka kerja jenis ini telah dipadatkan, dan siklus hidup sumber daya dipadatkan oleh prosesnya. Cukup mengimplementasikannya dalam C murni (ada versi yang diimplementasikan dalam C++ sebelumnya, dan kode lebih rumit)
3. Jika perpustakaan dinamis dipanggil oleh modul lain, ia masih perlu menyegel antarmuka di C
4. Kelas yang diekspor C++ menular, dan ABI tidak terpadu
T: Bisakah lapisan bisnis terus dikembangkan menggunakan C murni?
J: Sangat tidak disarankan, karena penulisan proses asinkron dan pengecualian yang dimasukkan ke dalam modul yang ditulis dalam bahasa tingkat tinggi membuat waktu pemusnahan sumber daya menjadi tidak pasti. Saat ini, sangat sulit untuk mengontrol sumber daya secara manual menggunakan C murni . Anda harus menggunakan bahasa tingkat yang lebih tinggi untuk menangani hal-hal ini. Misalnya, Anda dapat menggunakan C++ untuk mengembangkan kode bisnis tingkat atas, dan mekanisme RAII-nya dapat memastikan pelepasan sumber daya yang sesuai.
T: Jika saya ingin mengubah "panggilan balik" proyek lama menjadi "coroutine", bisakah saya mengganti bagian penjadwal dengan titik panggilan yang sesuai di kode bisnis?
A: Tidak sesederhana itu. Yang pertama adalah masalah beban kerja. Selain itu, baik dalam bentuk callback maupun bentuk coroutine, intinya adalah mengeluarkan permintaan dan menunggu hasilnya Merupakan masalah yang harus dipecahkan dan perlu diperhatikan dengan matang. Jika itu adalah Raw pointer, maka hampir bisa dikatakan tidak bisa ditransformasikan jika proyek sudah digunakan Sarana seperti std::shared_ptr memperpanjang siklus hidup variabel, sehingga akan lebih mudah untuk mengubahnya menjadi versi "tumpukan coroutine". Jika Anda ingin mengubahnya menjadi coroutine tanpa tumpukan C++20, beban kerjanya sangat besar sama saja dengan menulis ulang proyek (karena coroutine tanpa tumpukan memiliki intrusi kode yang kuat), jadi disarankan untuk tidak mengubah proyek lama.
T: Mengapa coroutine saat ini tidak diperbolehkan untuk dimigrasikan ke thread lain untuk dieksekusi?
J: Migrasi coroutine dapat dilakukan dengan mudah, namun alasan mengapa hal ini tidak disediakan adalah
1. Tugas yang dijalankan antar coroutine tidak pasti, yang dapat menyebabkan io dan perhitungan tercampur dalam thread penjadwalan yang sama.
2. Setelah migrasi, proses coroutine yang sama mungkin berjalan di thread yang berbeda. Dalam hal ini, Anda harus memastikan bahwa kode Anda tidak bergantung pada variabel lokal thread apa pun, namun Anda tidak dapat memastikan bahwa perpustakaan pihak ketiga tidak menggunakan variabel lokal thread. .
T: Apakah asan akan crash saat kompilasi dan dijalankan?
J: 1. Jika Anda menggunakan coroutine bertumpuk default kerangka kerja, ini jelas bukan masalah kode. Anda dapat menyesuaikan ukuran tumpukan coroutine bertumpuk di file konfigurasi node (saat ASAN diaktifkan, ruang tumpukan yang relatif besar akan digunakan, jadi ada kemungkinan ledakan tumpukan)
2. ASAN tidak sepenuhnya mendukung API coroutine bertumpuk (ucontext) di lingkungan Unix. Meskipun API coroutine ucontext telah diadaptasi ke ASAN dalam kode util, namun tetap tidak dapat menjamin 100% bahwa tidak akan ada masalah saat berjalan di ASAN. lingkungan (sejauh ini baik)
3. Di beberapa distribusi Linux yang lebih baru, jika ASAN mengeluarkan AddressSanitizer: DEADLYSIGNAL tanpa batas, sesuaikan sudo sysctl vm.mmap_rnd_bits=28 untuk menyelesaikan masalah.
YANG HARUS DILAKUKAN:
1. Saya benar-benar tidak punya waktu untuk menulis dokumentasi detail.
2. Memberikan dukungan penulisan logika bisnis dalam bahasa scripting