Google
 
Filed Under (Linux, Uygulama) by mutkanx on 09-12-2006

Bu wait_queue yu anlamak icin biraz arastirma yaptim ve sadece 1 tane türkçe adamakıllı kaynak buldum(full ayrıntılı anlatmasada yeterli). Burdan tesekkurlerimi sunarim Bilkent Türkiye Linux Haberleşme Listesine…wait_queue ve digerlerini ogrenmek icin devamını okuyun…
> 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



Post a comment
Name: 
Email: 
URL: 
Comments: 
Verification Image

Please type the letters you see in the picture.