[LINUX:27579] Re: Linux'te Sleep wakeup mekanizmas??

---------

New Message Reply About this list Date view Thread view Subject view Author view

From: Murat Koc (murat.koc@frontsite.de)
Date: Sun 06 May 2001 - 08:46:29 EEST


-----BEGIN PGP SIGNED MESSAGE-----
Hash: RIPEMD160

> Merhaba,

Merhaba,

Tesekkurler duzelttiginiz icin Turkce karakterleri,

O.k simdi baslayalim o zaman.

> KHG'yi okurken bazı şeyleri çözemedim ve bu konuda sizlere danışmak
> istedim. Yerini de söyleyim khg de basics.html'de yazıyor.
> KHG' de linux ta uygulanan sleep wakeup sistemi ile ilgili bu fonksyonu
> vermişler.
>

Oncelikle asagidaki kod degisti.

Artik su sekilde.

- -----------------------------------------------------

#define SLEEP_ON_VAR \
        unsigned long flags; \
        wait_queue_t wait; \
        init_waitqueue_entry(&wait, current);

#define SLEEP_ON_HEAD \
        wq_write_lock_irqsave(&q->lock,flags); \
        __add_wait_queue(q, &wait); \
        wq_write_unlock(&q->lock);

#define SLEEP_ON_TAIL \
        wq_write_lock_irq(&q->lock); \
        __remove_wait_queue(q, &wait); \
        wq_write_unlock_irqrestore(&q->lock,flags);

void sleep_on(wait_queue_head_t *q)
{
        SLEEP_ON_VAR

        current->state = TASK_UNINTERRUPTIBLE;

        SLEEP_ON_HEAD
        schedule();
        SLEEP_ON_TAIL
}

> ------------------------------
> static inline void __sleep_on(struct wait_queue **p, int state){
> unsigned long flags;
> struct wait_queue wait = { current, NULL };
> if (!p)
> return;
> if (current == task[0])
> panic("task[0] trying to sleep");
> current->state = state;
> add_wait_queue(p, &wait);
> save_flags(flags);
> sti();
> schedule();
> remove_wait_queue(p, &wait);
> restore_flags(flags);
> }
> ------------------------------
> Benim anlayamadığım kısıma gelince.

simdi o zaman asagidakileri aciklayalim yukaridaki kodda (yani su anki
halinde) problem olursa onu da sonra aciklariz yine.

> Aşagıda verdilen __sleep_on fonksyonunda.
> add_wait_queue() fonksyonunu çağırdıktan sonra
> schedule() ile başka bir process'i çalışmaya aldığını söylüyor.
> Ve sonra aynı process'i nedense wait queue den kaldırıyor.
> Neden process'i wait queue'den kaldırıyor. benim düşünceme göre o
> process bir sinyal ya da interrupt geldiğinde wait queden
> kaldırılması gerekiyor.

Once soru neden wait_queue ye ekliyor olmali. Ve wait_queue nedir olmali
sanirim.

wait_queue == Bazen bir process system resource larina ihtiyac duyar ve
                     bunlar karsilanana kadar beklemek zorunda kalir. Iste bunu
                        kernel handle etmek icin wait_queue adinda bir data
                        yapisi kullanir. Yani bir linked list aslinda. Iki
                        tane element vardir biri processin task_struct i (az
                        sonra bunu da anlatirim) digeri de wait_queue daki
                        sonraki element. Dolayisi ile wait_queue temelde
                        sistem kaynaklari ile senkronizasyonun saglanmasi
                        icin kullanilir.

Dolayisi ile bir process in wait_queue da olmasinin sebebi olarak system
resource ini bekliyor olmasi diyebiliriz.

sonra dedigin gibi ve kodda da gorundugu uzere schedule() calisiyor.

Peki schedule ne yapiyor? Calistirmak icin baska bir process i buluyor ve onu
calisitiriyor. Daha sonra ayni wait_queue ustunde wake_up calisir ve
wait_queue daki butun processler RUNNING state e girerler boylece tekrar
schedule calistigi zaman aday olurlar ve wait_queue deki bir process schedule
tarafindan secildigi zaman ilk yaptigi sey kendisini wait_queue den cikarmak
olur (yukarda anlamadigin yer sanirim simdi anlasilmistir).

daha ayrintili bilgi istersen de okudugun dokumanda soyledigi kitaplara
bakman lazim. Yine bir baska tavsiye ise TLK (The Linux Kernel) in okuman
olacaktir.

fakat butun bu dokumanlar biraz eski (bayaa) kaldi dolayisi ile ozellikle 2.4
serisinde kodlari oturup calisman gerekiyor.

Aslinda temelde en ustteki kodda eski kodla ayni seyi yapiyor ama
farkliliklari bulmak sana kaliyor biraz.

> Not: "current" değişkeni sadece scheduler tarafından değiştirlen, o anda
> çalışan process'i gösteren global bir değişkenmiş. Fakta "tasks[0]" ile
> neyi ifade ettiği hakkından bir şey görmedim.

task[0] == Bunu daha once bir mailde yine yazmistim. Boot asamasinda daha
                 init filan ortalikta yokken memory duzenlemelerinin
                 ve daha bircok seyin yapildigi asama (hatirlarsaniz init in
                 PID i 1 dir) bu ondan once olan bir olay dolayisi ile makina
                 daha acilirken eger sleep moda girmeye calisiyorsa problem
                 var demektir bu da makina kitlenerek yani panic olarak
                 belirtiliyor. Idle task da denir kendisine.

> Yardımlarınız için şimdiden teşekkürler

Bilgilrim biraz eski olabilir uzun zamandir kernel uzerinde hacking
yapmiyorum. Hatali veya eksik de olabilirler sonucta kernel-guru degilim.

Ama umarim temel nitelikte yardimci olmuslardir.

IYI CALISMALAR

                                                                MURAT KOC
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.0.4 (GNU/Linux)
Comment: For info see http://www.gnupg.org

iQIXAwUBOvUaG76uWt8ry/OwFANxCAf/cMea6d3+i5Fw2seUVmYkPdRIJYwnLsQU
rdIZBVOS5uv60rKjpFAHmxPLIb311l3QYhOOIUNvEIgq5Z0QIjO7GDVyd/t59RQH
y14nghum3F1VcvXJl778KcHJHiKHUbNn8GOeLTl1sTdALuy6LhDdzBrOFvbYFlo7
lvyupRGU8C8LYgsTKnlDZD73hsGgjly8frWMwriAHfx6qN7mqIBAWe7JmZqGP7za
ejgGOMVRad3th86YHv5L3OnhgaHQk8DN65tmkEkjAhg/K4Zlm5Mgc6g7m2oZPWIM
bUuodzmtkOnLzA9xsS99eEi9ehhCnGjOf4gjK01/szsuocRIXaZaewf/SQEJkQ/0
fPyCdBjs8+CqSbFaX1+BABiysLci8AjwjCqP8224O636M2EiARiJWt7PsRk2YSNE
j8EcimpYSqrKHnmMYweGDJEsknfTqLWqCP8C6bI63sZTzUEgPM/b6S+AIvnI0o9R
pRmyQAV6lxgribEb+M4Y8lukiGMmzgBu50T/dLhKuYfP91oCMVX4I2Tq3KkCd3CN
jAfjJmKp/FtgZWXmNQhZOwQ9NDoisAodwmKiU/fTi3PgAvfPVgu9T8Ag9aE46QZm
WVP8swtp0RhGtHDfMrGLUgVO+6bWQ6F7if8gzImrr1RRHjgpuzDH0Sbmb6xVHfGU
lC/LC20ZAG7Sqw==
=MaMJ
-----END PGP SIGNATURE-----
 
 Listeden cikmak icin:
          unsub linux
 mesajini listeci@bilkent.edu.tr adresine gonderiniz.
   Lutfen Listeci icin MIME / HTML / Turkce Aksan kullanmayin.
 Listeci arayuzu: http://listweb.bilkent.edu.tr/yardim/bilkent/linux.html
 Liste arsivinin adresi: http://listweb.bilkent.edu.tr/


New Message Reply About this list Date view Thread view Subject view Author view

---------

Bu arsiv hypermail 2b29 tarafindan uretilmistir.