Sebutan pemasa berketepatan tinggi secara tiba-tiba membuatkan saya berasa keliru Sekurang-kurangnya pemula akan kecewa Dan jika anda memahaminya secara literal, ia adalah sangat mudah, maka tiada lagi. Walaupun begitu, ia hanya melibatkan beberapa butiran lain.
Jika seorang pekerja ingin menjalankan tugasnya dengan baik, dia mesti mengasah alatnya dahulu Sebelum kita mula bercakap, mari kita asah alatannya dahulu:
2 Beberapa fail kod sumber berkaitan dan laluannya adalah seperti berikut:
Hrtimers.txt(linux-3.2.12documentationtimers)
Hrtimer.c(linux-3.2.12kernel)
Hrtimer.h(linux-3.2.12includelinux)
2 Hanya kendalikan pemasa ketepatan tinggi dalam mod pemasa ketepatan tinggi Keseluruhan rangka kerja operasi adalah seperti berikut:
Inikan hrtimer_init, tetapkan data yang berkaitan melalui struktur hetimer, seperti tempoh masa, dsb.-> hrtimer_interrupt-> Alih keluar pemasa ketepatan tinggi remove_hrtimer.
Pembaca kini mempunyai rangka kerja dalam kepala mereka, dan butiran pemandu khusus akan dibincangkan satu persatu di bawah.
Mari kita beri gambaran terlebih dahulu Mungkin terdapat beberapa perkara yang janggal di dalamnya yang sukar untuk difahami.
? Isih pemasa ketepatan tinggi pada pokok merah hitam mengikut masa.
? Mereka bebas daripada jam tempoh pemasa aplikasi linux, menggunakan cap masa lebar denyut dan bukannya dimensi masa jiffies.
Mula-mula keluarkan dokumentasi yang berkaitan dengan pemasa ketepatan tinggi dalam kod Linux dan lihat pengenalannya kemudian saya akan menerangkannya, laluan dokumen: Hrtimers.txt (linux-3.2.12documentationtimers)
.Kandungan dokumen... Sejujurnya, dokumen itu agak panjang, tetapi penyelenggaraan dokumen Linux tidak begitu tinggi saya menemui beberapa ayat dari atas dan diterjemahkan, dan kemudian menerangkannya:
?Patchinimemperkenalkansistemberitauntukpembuatkernelberesolusi tinggi. Tampalan frasa dalam ayat ini agak menarik Ini bermakna pemasa berketepatan tinggi dipasang ke dalam sistem sebagai pakej tampalan.
? Perkara kedua, bahasa Inggeris terlalu panjang jadi saya tidak akan menyiarkannya. Itulah sebabnya kita perlu menggunakan pemasa ketepatan tinggi Memandangkan setiap sistem mempunyai pemasa, ketepatannya sebenarnya tidak tinggi dipanggil pemasa ketepatan rendah. Secara terang-terangan, ketepatan tinggi diperlukan.
? Perkara ketiga, satu lagi ciri pemasa ketepatan tinggi ialah rangka kerjanya berada dalam kernel semasa menyusun, dan jika pemasa ketepatan tinggi tidak dikonfigurasikan, pemasa ketepatan tinggi sedemikian adalah berdasarkan larian pemasa biasa.
?Titik terakhir, pemasa ketepatan tinggi dilaksanakan menggunakan algoritma bakau hitam, manakala pemasa biasa dilaksanakan menggunakan algoritma time round robin.
?Selain itu, dokumen itu juga menerangkan banyak isu seperti sumber jam, struktur data, pokok merah-hitam, dll. Isu ini dibincangkan secara berasingan di bawah.
1. Struktur data berkaitan
Struktur data yang terlibat dalam pemasa kadar bingkai tinggi, kami mempertimbangkan dari aspek berikut:
Mengenai sumber: Bagaimana jam ini berasal? Struktur ditakrifkan dalam hrtimer.h, kodnya adalah seperti berikut:
structhrtimer_clock_base{
structhrtimer_cpu_base*cpu_base;
intindex; //Atribut yang digunakan untuk membezakan jam (terdapat dua jenis secara keseluruhan, yang akan disebutkan di bawah)
clockid_tclockid; // ID jam yang disokong oleh setiap CPU
structtimerqueue_headactive;//Nod cawangan hitam dan merah pemasa didayakan
ktime_tresolution;//Kadar bingkai jam, milisaat
ktime_t(*get_time)(void);//Digunakan untuk memulihkan jam semasa
ktime_tsoftirq_time;//Masa untuk menjalankan baris gilir pemasa ketepatan yang luas dalam gangguan lembut
ktime_toffset;//Tukar jumlah offset jam pemasa
};
Mengenai elemen sebelum ini, sila jelaskan beberapa perkara.
Pemasa kadar bingkai tinggi boleh berdasarkan dua jam (dasar jam): satu ialah jam monotonik (CLOCK_MONOTONIC), yang bermula dari 0 apabila sistem bermula; Dalam struktur structhrtimer_clock_base di atas, elemen indeks digunakan untuk membezakan sama ada ia adalah jam CLOCK_MONOTONIC atau CLOCK_REALTIME. Untuk setiap CPU sistem, struktur data yang mengandungi dua pangkalan jam ini disediakan Setiap jumlah pangkalan jam mempunyai pokok merah hitam untuk mengisih semua pemasa ketepatan tinggi yang belum selesaipemasa aplikasi linux , dan setiap CPU menyediakan dua pangkalan jam (monotonik. jam dan masa nyata), dan semua pemasa diisih pada pokok merah hitam mengikut masa tamat Jika pemasa telah tamat tetapi fungsi lantunan pengendalinya masih belum dilaksanakan, maka Berhijrah daripada bakau hitam kepada tatasusunan. Apabila melaraskan jam masa nyata, akan terdapat ralat antara nilai masa tamat pemasa yang disimpan dalam jam CLOCK_REALTIME dan masa sebenar semasa. Tatasusunan offset membantu membetulkan situasi ini. Ia mewakili jumlah ofset yang perlu ditentukur oleh pemasa. Kerana ini hanya kesan sementara dan jarang berlaku.
Sebelum memahami sumber jam, kita juga mungkin perlu mengetahui structhrtimer struktur, kodnya adalah seperti berikut:
structhrtimer{
structtimerqueue_nodenode;//Nod baris gilir pemasa juga mengurus nod.expires Masa tamat tempoh mutlak pemasa ketepatan tinggi adalah dalam algoritma dalamannya ) .
ktime_t_softexpires;//Masa tamat tempoh paling awal mutlak
enumhrtimer_restart(*)(structhrtimer*);//Fungsi lantunan tamat tempoh pemasa
structhrtimer_clock_base*base;//Tangan menunjuk ke pangkalan masa (setiap CPU, setiap jam)
unsignedlongstate;//Maklumat status, digunakan untuk melihat nilai bit
#ifdefCONFIG_TIMER_STATS
intstart_pid; //Pid tugas yang mula pemasaan disimpan dalam kawasan statistik pemasa
void*start_site;//Pemasa menyimpan nilai permulaan semasa pemasa
charstart_comm[16];//Nama kawasan statistik pemasa memulakan proses penyimpanan pemasaan
#endif
};
Untuk struktur di atas, pengguna hanya perlu mengambil berat tentang tiga mata Yang pertama ialah fungsi rebound selepas pemasa tamat tempoh, yang mewakili masa tamat penggunaan struktur pemasa ketepatan tinggi mesti dimulakan oleh fungsi hrtimer_init() Fungsi hrtimer_init() tergolong dalam soket aplikasi, jadi ia disebut di atas. Terdapat satu lagi isu di sini, yang juga merupakan isu teras pemasa ketepatan tinggi, iaitu penggunaan bakau hitam dalam pemasa ketepatan tinggi Sebenarnya, agak awal untuk membincangkan perkara ini sekarang, dan biarkan pembaca mempunyai idea asas dahulu. Pemasa tradisional Linux Pemasa dilaksanakan melalui algoritma roda masa (timer.c), tetapi hrtimer dilaksanakan melalui algoritma bakau hitam. Terdapat medan nod pada structhrtimer, jenisnya ialah structtimerqueue_node Medan ini mewakili kedudukan hrtimer dalam pokok merah hitam Perhatikan bahawa kod sumber yang saya rujuk ialah versi 3.6.X, format ini medan ialah structrb_node. Izinkan saya bertanya khabar terlebih dahulu kepada pembaca.
Dua struktur penting telah selesai Kerana ia perlu serasi dengan pemproses berbilang teras, ia akan melibatkan asas masa setiap CPU Struktur structhrtimer_cpu_base digunakan untuk menentukan jam setiap CPU Jam monotonik dan jam masa nyata, strukturnya adalah seperti berikut:
structhrtimer_cpu_base{//Struktur asas masa CPU tunggal
raw_spinlock_tlock;//Kunci pangkalan masa dan pemasa yang berkaitan, kunci pembawa
unsignedlongactive_bases;//Tandai tatasusunan bit asas dengan pemasa aktif
#ifdefCONFIG_HIGH_RES_TIMERS
ktime_texpires_next;//Waktu mutlak masa seterusnya yang akan tamat tempoh
inthres_active; //Status mod kadar bingkai tinggi, pembolehubah Boolean
inthang_detected; // Gangguan pemasa ketepatan tinggi yang belum selesai dikesan
unsignedlongnr_events;//Jumlah gangguan pemasa ketepatan tinggi
unsignedlongnr_retries;//Jumlah percubaan semula gangguan pemasa ketepatan tinggi
unsignedlongnr_hangs;//Jumlah gangguan pemasa ketepatan tinggi terputus
ktime_tmax_hang_time;//Masa maksimum untuk gangguan pemasa ketepatan tinggi dicetuskan
#endif
structhrtimer_clock_baseclock_base[HRTIMER_MAX_CLOCK_BASES];//Jarum asas masa CPU ini
};
Tiga struktur di dalamnya hendaklah yang paling asas, mentakrifkan fungsi dan elemen yang berkaitan dengan pemasa ketepatan tinggi, dan setiap CPU mempunyai set lengkap struktur yang ditentukan, dan kemudian memulakan hrtimer.
Sekarang kita telah selesai bercakap tentang struktur asas, mari mula bercakap tentang soket API.
Yang pertama ialah mengkonfigurasi dan memulakan API hrtimer. Apabila kita bercakap tentang structhrtimer pada mulanya, kita menyebut bahawa untuk menggunakan structhrtimer, kita perlu memulakannya dahulu Kod pengisytiharan fungsi adalah seperti berikut:
voidhrtimer_init(structhrtimer*timer,clockid_tclock_id,
enumhrtimer_modemode)//Diberi pemasa permulaan jam
debug_init(pemasa, id_jam, mod);
__hrtimer_init(pemasa, id_jam, mod);
Fungsi di atas melaksanakan pemulaan pemasa ketepatan tinggi Berikut ialah penjelasan tentang elemen yang berkaitan:
/**
*hrtimer_init – Mulakan pemasa dengan jam yang diberikan
*@timer: Pemasa yang akan dimulakan
*@clock_id: Jam yang akan digunakan
*@mode: mod pemasa abs/rel
*/
mod boleh menggunakan lima pemalar, seperti berikut:
enumhrtimer_mode{
HRTIMER_MODE_ABS=0x0,/*Masa adalah mutlak*/
HRTIMER_MODE_REL=0x1,/*Masa adalah relatif*/
HRTIMER_MODE_PINNED=0x02,/*Pemasa terikat pada CPU*/
HRTIMER_MODE_ABS_PINNED=0x02,
HRTIMER_MODE_REL_PINNED=0x03,
};
Fungsi hrtimer_init() memanggil fungsi __hrtimer_init() Berikut ialah prototaip fungsi ini:
staticvoid__hrtimer_init(structhrtimer*timer,clockid_tclock_id,enumhrtimer_modemode)
structhrtimer_cpu_base*cpu_base;
intbase;
memsettimer,0,sizeof(structhrtimer));
cpu_base=&__raw_get_cpu_var(hrtimer_bases);
jika(id_jam==MASA_SEBENAR&&mod!=HRTIMER_MODE_ABS)
clock_id=JAM_MONOTONIK;
base=hrtimer_clockid_to_base(clock_id);
pemasa->base=&cpu_base->clock_base[base];
timerqueue_init(&timer->nod);
#ifdefCONFIG_TIMER_STATS
timer->start_site=NULL;
timer->start_pid=-1;
memset(timer->start_comm,0,TASK_COMM_LEN);
#endif
__hrtimer_init() function calls the structhrtimer_cpu_base structure to initialize the CPU and uses the memset() function. The prototype is as follows:
void*memset(void*s,intc,size_tn)
inti;
char*ss=s;
for(i=0;i ss[i]=c; returns; This function clears the contents of memory and completes the initialization, memset(timer,0,sizeof(structhrtimer)). Please note here, it is still a problem mentioned above. The source code I used is 3.2.12, and the source code provided in 2.6.X only has two constants
Atas ialah kandungan terperinci Analisis rangka kerja pengenalan dan operasi yang berkaitan bagi pemasa ketepatan tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!