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/