cari
RumahTutorial sistemLINUXProses Linux tidur dan bangun dari tidur: Jadikan sistem anda lebih penjimatan tenaga dan cekap

Proses Linux tidur dan bangun dari tidur: Jadikan sistem anda lebih penjimatan tenaga dan cekap

Feb 14, 2024 am 10:36 AM
linuxtutorial linuxsistem linuxSistem pengendalian Linuxarahan linuxskrip shellembeddedlinuxBermula dengan linuxpembelajaran linux

Sistem Linux ialah sistem pengendalian yang menyokong pelaksanaan serentak pelbagai tugas Ia boleh menjalankan berbilang proses pada masa yang sama, dengan itu meningkatkan penggunaan dan kecekapan sistem. Walau bagaimanapun, tidak semua proses perlu menduduki sumber pemproses sepanjang masa Sesetengah proses boleh menyerahkan pemproses buat sementara waktu dalam keadaan tertentu, memasuki keadaan tidur, menunggu syarat untuk dipenuhi, kemudian bangun dan meneruskan pelaksanaan. Kelebihan ini ialah ia boleh menjimatkan sumber pemproses dan memberi proses lain yang perlu dilaksanakan lebih banyak peluang Ia juga boleh mengurangkan penggunaan kuasa dan haba sistem dan meningkatkan kestabilan dan hayat sistem. Artikel ini akan memperkenalkan kaedah proses tidur dan bangun dalam sistem Linux, termasuk sebab tidur, jenis tidur, fungsi tidur, fungsi bangun tidur dan mekanisme bangun tidur.

Sudah tentu, proses juga boleh melepaskan kawalan CPU secara aktif. Jadual fungsi() ialah fungsi penjadualan yang boleh dipanggil secara aktif oleh proses untuk menjadualkan proses lain untuk menduduki CPU. Sebaik sahaja proses yang secara sukarela menyerahkan CPU dijadualkan semula untuk menduduki CPU, ia akan memulakan pelaksanaan dari tempat terakhir ia berhenti, iaitu, ia akan memulakan pelaksanaan dari baris kod seterusnya yang memanggil jadual ().
Kadangkala, proses perlu menunggu sehingga peristiwa tertentu berlaku, seperti pemulaan peranti, penyiapan operasi I/O atau tamat tempoh pemasa. Dalam kes ini, proses mesti dialih keluar daripada baris gilir larian dan ditambah pada baris gilir menunggu Pada masa ini, proses memasuki keadaan tidur.

Proses Linux tidur dan bangun dari tidur: Jadikan sistem anda lebih penjimatan tenaga dan cekap

Klasifikasi status proses tidur dalam Linux

Salah satunya ialah keadaan tidur terganggu, bendera statusnya ialah TASK_INTERRUPTIBLE
Satu lagi ialah keadaan tidur yang tidak terganggu dan bendera statusnya ialah TASK_UNINTERRUPTIBLE. Proses dalam keadaan tidur terganggu akan tidur sehingga keadaan tertentu menjadi benar Contohnya, menjana gangguan perkakasan, melepaskan sumber sistem yang sedang menunggu proses, atau menghantar isyarat boleh menjadi syarat untuk membangunkan proses. Keadaan tidur tidak terganggu adalah serupa dengan keadaan tidur terganggu, tetapi ia mempunyai satu pengecualian, iaitu, proses yang menyampaikan isyarat kepada keadaan tidur ini tidak boleh mengubah keadaannya, iaitu, ia tidak bertindak balas kepada isyarat untuk bangun. Keadaan tidur tidak terganggu biasanya kurang digunakan, tetapi ia masih sangat berguna dalam beberapa situasi tertentu Contohnya, proses mesti menunggu dan tidak boleh diganggu sehingga peristiwa tertentu berlaku.
Dalam sistem pengendalian Linux moden, proses biasanya memasuki keadaan tidur dengan memanggil jadual(). Kod berikut berfungsi
menunjukkan cara untuk meletakkan proses berjalan untuk tidur.

sleeping_task = current;
set_current_state(TASK_INTERRUPTIBLE);
schedule();
func1();
/* Rest of the code ... */

Dalam pernyataan pertama, atur cara menyimpan penunjuk struktur proses sleeping_task, semasa ialah makro, yang menunjukkan kepada pelaksanaan semasa
struktur proses. set_current_state() menukar keadaan proses daripada keadaan pelaksanaan TASK_RUNNING kepada keadaan tidur
TASK_INTERRUPTIBLE. Jika schedule() dijadualkan oleh proses dengan status TASK_RUNNING, maka schedule() akan menjadualkan proses lain untuk menduduki CPU jika schedule() dijadualkan oleh proses dengan status TASK_INTERRUPTIBLE atau TASK_UNINTERRUPTIBLE, maka terdapat langkah tambahan untuk; Sedang dilaksanakan: Proses yang sedang dilaksanakan akan dialih keluar daripada baris gilir larian sebelum proses lain dijadualkan, yang akan menyebabkan proses larian tertidur kerana ia tidak lagi dalam baris gilir larian.
Kita boleh menggunakan fungsi berikut untuk membangunkan proses yang baru sahaja tidur.
proses_bangun_bangun(tugas_tidur);
Selepas memanggil wake_up_process(), status proses tidur akan ditetapkan kepada TASK_RUNNING dan penjadual
Ia akan ditambahkan pada baris gilir larian. Sudah tentu, proses ini hanya boleh digunakan pada kali berikutnya ia dijadualkan oleh penjadual.

Bangun tidak sah

Dalam hampir semua kes, proses akan tidur selepas memeriksa syarat-syarat tertentu dan mendapati syarat-syarat itu tidak dipenuhi. Tapi kadang-kadang
Walau bagaimanapun, proses akan mula tidur selepas syarat penghakiman adalah benar. Jika ini berlaku, proses itu akan tidur selama-lamanya. Dalam sistem pengendalian, apabila berbilang proses cuba melakukan beberapa pemprosesan pada data yang dikongsi, dan hasil akhir bergantung pada susunan proses dijalankan, keadaan perlumbaan berlaku. Ini adalah masalah biasa dalam sistem pengendalian. sehingga Ia adalah disebabkan oleh keadaan persaingan.
Bayangkan terdapat dua proses A dan B. Proses A sedang memproses senarai terpaut Ia perlu menyemak sama ada senarai terpaut itu kosong, ia akan memadamkan pautan Data dalam jadual sedang menjalani beberapa operasi, dan proses B juga menambah nod pada senarai terpaut. Apabila senarai terpaut kosong, kerana tiada data untuk beroperasi, proses A menjadi tidur Apabila proses B menambah nod pada senarai terpaut, ia membangunkan proses A. Kodnya adalah seperti berikut:
. Satu proses:

1 spin_lock(&list_lock);
2 if(list_empty(&list_head)) {
3 spin_unlock(&list_lock);
4 set_current_state(TASK_INTERRUPTIBLE);
5 schedule();
6 spin_lock(&list_lock);
7 }
8
9 /* Rest of the code ... */
10 spin_unlock(&list_lock);

Proses B:

100 spin_lock(&list_lock);
101 list_add_tail(&list_head, new_node);
102 spin_unlock(&list_lock);
103 wake_up_process(processa_task);

这里会出现一个问题,假如当A进程执行到第3行后第4行前的时候,B进程被另外一个处理器调度
投 入运行。在这个时间片内,B进程执行完了它所有的指令,因此它试图唤醒A进程,而此时的A进程还没有进入睡眠,所以唤醒操作无效。在这之后,A 进程继续执行,它会错误地认为这个时候链表仍然是空的,于是将自己的状态设置为TASK_INTERRUPTIBLE然后调用schedule()进入睡 眠。由于错过了B进程唤醒,它将会无限期的睡眠下去,这就是无效唤醒问题,因为即使链表中有数据需要处理,A 进程也还是睡眠了。

避免无效唤醒

如何避免无效唤醒问题呢?我们发现无效唤醒主要发生在检查条件之后和进程状态被设置为睡眠状
态之前, 本来B进程的wake_up_process()提供了一次将A进程状态置为TASK_RUNNING 的机会,可惜这个时候A进程的状态仍然是TASK_RUNNING,所以wake_up_process()将A进程状态从睡眠状态转变为运行状态的努力 没有起到预期的作用。要解决这个问题,必须使用一种保障机制使得判断链表为空和设置进程状态为睡眠状态成为一个不可分割的步骤才行,也就是必须消除竞争条 件产生的根源,这样在这之后出现的wake_up_process ()就可以起到唤醒状态是睡眠状态的进程的作用了。
找到了原因后,重新设计一下A进程的代码结构,就可以避免上面例子中的无效唤醒问题了。
A进程:

1 set_current_state(TASK_INTERRUPTIBLE);
2 spin_lock(&list_lock);
3 if(list_empty(&list_head)) {
4 spin_unlock(&list_lock);
5 schedule();
6 spin_lock(&list_lock);
7 }
8 set_current_state(TASK_RUNNING);
9
10 /* Rest of the code ... */
11 spin_unlock(&list_lock);

可以看到,这段代码在测试条件之前就将当前执行进程状态转设置成TASK_INTERRUPTIBLE了,并且在链表不为空的情况下又将自己置为TASK_RUNNING状态。这样一来如果B进程在A进程进程检查
了链表为空以后调用wake_up_process(),那么A进程的状态就会自动由原来TASK_INTERRUPTIBLE
变成TASK_RUNNING,此后即使进程又调用了schedule(),由于它现在的状态是TASK_RUNNING,所以仍然不会被从运行队列中移出,因而不会错误的进入睡眠,当然也就避免了无效唤醒问题。

Linux内核的例子

在Linux操作系统中,内核的稳定性至关重要,为了避免在Linux操作系统内核中出现无效唤醒问题,
Linux内核在需要进程睡眠的时候应该使用类似如下的操作:
/* ‘q’是我们希望睡眠的等待队列 /
DECLARE_WAITQUEUE(wait,current);
add_wait_queue(q, &wait);
set_current_state(TASK_INTERRUPTIBLE);
/
或TASK_INTERRUPTIBLE /
while(!condition) /
‘condition’ 是等待的条件*/
schedule();
set_current_state(TASK_RUNNING);
remove_wait_queue(q, &wait);
上面的操作,使得进程通过下面的一系列步骤安全地将自己加入到一个等待队列中进行睡眠:首先调
用DECLARE_WAITQUEUE ()创建一个等待队列的项,然后调用add_wait_queue()把自己加入到等待队列中,并且将进程的状态设置为 TASK_INTERRUPTIBLE 或者TASK_INTERRUPTIBLE。然后循环检查条件是否为真:如果是的话就没有必要睡眠,如果条件不为真,就调用schedule()。当进程 检查的条件满足后,进程又将自己设置为TASK_RUNNING 并调用remove_wait_queue()将自己移出等待队列。
从上面可以看到,Linux的内核代码维护者也是在进程检查条件之前就设置进程的状态为睡眠状态,
然后才循环检查条件。如果在进程开始睡眠之前条件就已经达成了,那么循环会退出并用set_current_state()将自己的状态设置为就绪,这样同样保证了进程不会存在错误的进入睡眠的倾向,当然也就不会导致出现无效唤醒问题。
下面让我们用linux 内核中的实例来看看Linux 内核是如何避免无效睡眠的,这段代码出自Linux2.6的内核(linux-2.6.11/kernel/sched.c: 4254):
4253 /* Wait for kthread_stop */
4254 set_current_state(TASK_INTERRUPTIBLE);
4255 while (!kthread_should_stop()) {
4256 schedule();
4257 set_current_state(TASK_INTERRUPTIBLE);
4258 }
4259 __set_current_state(TASK_RUNNING);
4260 return 0;
上面的这些代码属于迁移服务线程migration_thread,这个线程不断地检查kthread_should_stop(),
直 到kthread_should_stop()返回1它才可以退出循环,也就是说只要kthread_should_stop()返回0该进程就会一直睡 眠。从代码中我们可以看出,检查kthread_should_stop()确实是在进程的状态被置为TASK_INTERRUPTIBLE后才开始执行 的。因此,如果在条件检查之后但是在schedule()之前有其他进程试图唤醒它,那么该进程的唤醒操作不会失效。

Artikel ini memperkenalkan kaedah proses tidur dan bangun dalam sistem Linux, termasuk sebab tidur, jenis tidur, fungsi tidur, fungsi bangun tidur dan mekanisme bangun proses. Dengan memahami dan menguasai pengetahuan ini, kami boleh mengurus dan mengawal proses dalam sistem Linux dengan lebih baik, menjadikan sistem berjalan lebih penjimatan tenaga dan cekap. Sudah tentu, terdapat banyak butiran dan teknik untuk proses tidur dan bangun dalam sistem Linux, yang memerlukan kita untuk terus belajar dan berlatih

Atas ialah kandungan terperinci Proses Linux tidur dan bangun dari tidur: Jadikan sistem anda lebih penjimatan tenaga dan cekap. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Artikel ini dikembalikan pada:良许Linux教程网. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Apakah perbezaan bagaimana pemacu peranti Linux dan Windows?Apakah perbezaan bagaimana pemacu peranti Linux dan Windows?Apr 25, 2025 am 12:13 AM

Perbezaan antara Linux dan Windows dalam pengendalian pemacu peranti terutamanya ditunjukkan dalam fleksibiliti pengurusan pemandu dan persekitaran pembangunan. 1. Linux mengamalkan reka bentuk modular, dan pemandu boleh dimuatkan dan dipasang secara dinamik. Pemaju perlu mempunyai pemahaman yang mendalam tentang mekanisme kernel. 2. Windows bergantung pada ekosistem Microsoft, dan pemandu perlu dibangunkan melalui WDK dan ditandatangani dan disahkan. Perkembangan ini agak rumit tetapi memastikan kestabilan dan keselamatan sistem.

Bandingkan dan sebaliknya model keselamatan Linux dan Windows.Bandingkan dan sebaliknya model keselamatan Linux dan Windows.Apr 24, 2025 am 12:03 AM

Model keselamatan Linux dan Windows masing -masing mempunyai kelebihan mereka sendiri. Linux menyediakan fleksibiliti dan kebolehpercayaan, membolehkan keselamatan melalui kebenaran pengguna, keizinan sistem fail, dan selinux/apparmor. Windows memberi tumpuan kepada keramahan pengguna dan bergantung kepada WindowsDefender, UAC, Firewall dan Bitlocker untuk memastikan keselamatan.

Bagaimanakah keserasian perkakasan berbeza antara Linux dan Windows?Bagaimanakah keserasian perkakasan berbeza antara Linux dan Windows?Apr 23, 2025 am 12:15 AM

Linux dan Windows berbeza dalam keserasian perkakasan: Windows mempunyai sokongan pemacu yang luas, dan Linux bergantung kepada komuniti dan vendor. Untuk menyelesaikan masalah keserasian Linux, anda boleh menyusun pemandu secara manual, seperti pengklonan RTL8188EU Repositori pemandu, menyusun dan memasang; Pengguna Windows perlu menguruskan pemandu untuk mengoptimumkan prestasi.

Apakah perbezaan sokongan virtualisasi antara Linux dan Windows?Apakah perbezaan sokongan virtualisasi antara Linux dan Windows?Apr 22, 2025 pm 06:09 PM

Perbezaan utama antara Linux dan Windows dalam sokongan virtualisasi adalah: 1) Linux menyediakan KVM dan XEN, dengan prestasi dan fleksibiliti yang luar biasa, sesuai untuk persekitaran penyesuaian yang tinggi; 2) Windows menyokong virtualisasi melalui Hyper-V, dengan antara muka yang mesra, dan disepadukan dengan ekosistem Microsoft, sesuai untuk perusahaan yang bergantung pada perisian Microsoft.

Apakah tugas utama pentadbir sistem Linux?Apakah tugas utama pentadbir sistem Linux?Apr 19, 2025 am 12:23 AM

Tugas utama pentadbir sistem Linux termasuk pemantauan sistem dan penalaan prestasi, pengurusan pengguna, pengurusan pakej perisian, pengurusan keselamatan dan sandaran, penyelesaian masalah dan resolusi, pengoptimuman prestasi dan amalan terbaik. 1. Gunakan alat atas, HTOP dan lain -lain untuk memantau prestasi sistem dan menyesuaikannya. 2. Menguruskan akaun pengguna dan keizinan melalui arahan USERADD dan arahan lain. 3. Gunakan APT dan YUM untuk menguruskan pakej perisian untuk memastikan kemas kini sistem dan keselamatan. 4. Konfigurasi firewall, memantau log, dan lakukan sandaran data untuk memastikan keselamatan sistem. 5. menyelesaikan masalah dan menyelesaikan melalui analisis log dan penggunaan alat. 6. Mengoptimumkan parameter kernel dan konfigurasi aplikasi, dan ikuti amalan terbaik untuk meningkatkan prestasi sistem dan kestabilan.

Adakah sukar untuk belajar Linux?Adakah sukar untuk belajar Linux?Apr 18, 2025 am 12:23 AM

Pembelajaran Linux tidak sukar. 1.Linux adalah sistem operasi sumber terbuka berdasarkan UNIX dan digunakan secara meluas dalam pelayan, sistem tertanam dan komputer peribadi. 2. Memahami sistem fail dan pengurusan kebenaran adalah kunci. Sistem fail adalah hierarki, dan keizinan termasuk membaca, menulis dan melaksanakan. 3. Sistem pengurusan pakej seperti APT dan DNF menjadikan pengurusan perisian mudah. 4. Pengurusan proses dilaksanakan melalui PS dan arahan teratas. 5. Mula belajar dari arahan asas seperti MKDIR, CD, Touch dan Nano, dan kemudian cuba penggunaan lanjutan seperti skrip shell dan pemprosesan teks. 6. Kesilapan umum seperti masalah kebenaran dapat diselesaikan melalui sudo dan chmod. 7. Cadangan Pengoptimuman Prestasi termasuk menggunakan HTOP untuk memantau sumber, membersihkan fail yang tidak perlu, dan menggunakan SY

Apakah gaji Pentadbir Linux?Apakah gaji Pentadbir Linux?Apr 17, 2025 am 12:24 AM

Purata gaji tahunan pentadbir Linux ialah $ 75,000 hingga $ 95,000 di Amerika Syarikat dan € 40,000 hingga € 60,000 di Eropah. Untuk meningkatkan gaji, anda boleh: 1. Secara berterusan mempelajari teknologi baru, seperti pengkomputeran awan dan teknologi kontena; 2. Mengumpulkan pengalaman projek dan menubuhkan portfolio; 3. Mewujudkan rangkaian profesional dan mengembangkan rangkaian anda.

Apakah tujuan utama Linux?Apakah tujuan utama Linux?Apr 16, 2025 am 12:19 AM

Penggunaan utama Linux termasuk: 1. Sistem Operasi Pelayan, 2. Sistem Terbenam, 3. Linux cemerlang dalam bidang ini, menyediakan kestabilan, keselamatan dan alat pembangunan yang cekap.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

DVWA

DVWA

Damn Vulnerable Web App (DVWA) ialah aplikasi web PHP/MySQL yang sangat terdedah. Matlamat utamanya adalah untuk menjadi bantuan bagi profesional keselamatan untuk menguji kemahiran dan alatan mereka dalam persekitaran undang-undang, untuk membantu pembangun web lebih memahami proses mengamankan aplikasi web, dan untuk membantu guru/pelajar mengajar/belajar dalam persekitaran bilik darjah Aplikasi web keselamatan. Matlamat DVWA adalah untuk mempraktikkan beberapa kelemahan web yang paling biasa melalui antara muka yang mudah dan mudah, dengan pelbagai tahap kesukaran. Sila ambil perhatian bahawa perisian ini

SublimeText3 versi Inggeris

SublimeText3 versi Inggeris

Disyorkan: Versi Win, menyokong gesaan kod!

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma