Linus Torvalds (torvalds@cs.helsinki.fi)
Sal, 6 Ağu 1996 12:47:31 +0300 (EET DST)
İletilere göre sıralandı: [tarih] [konu] [konu] [yazar]
Sonraki mesaj: Bernd P. Ziller: "Re: Hata!
Önceki mesaj: Linus Torvalds: "Re: I / O istek siparişi"
5 Ağustos 1996 Pzt, Peter P. Eiserloh şunu yazdı:
İplik kavramını açık tutmalıyız. Çok fazla insan bir iş parçacığını bir süreçle karıştırıyor gibi görünüyor. Aşağıdaki tartışma linux'un mevcut durumunu yansıtmaz, daha ziyade üst düzey bir tartışmada kalma girişimidir.
HAYIR!
"İş parçacıkları" ve "süreçlerin" ayrı varlıklar olduğunu düşünmek için hiçbir neden yoktur. Geleneksel olarak bu şekilde yapılır, ancak kişisel olarak bu şekilde düşünmenin büyük bir hata olduğunu düşünüyorum. Bu şekilde düşünmenin tek nedeni tarihsel bagajdır.
Hem iş parçacıkları hem de süreçler sadece bir şeydir: "yürütme bağlamı". Farklı vakaları yapay olarak ayırt etmeye çalışmak sadece kendi kendini sınırlar.
Burada COE olarak adlandırılan bir "yürütme bağlamı", yalnızca bu COE'nin tüm durumunun bir araya gelmesidir. Bu durum CPU durumu (kayıtlar vb.), MMU durumu (sayfa eşlemeleri), izin durumu (uid, gid) ve çeşitli "iletişim durumları" (açık dosyalar, sinyal işleyicileri vb.) Geleneksel olarak, bir "iş parçacığı" ve "işlem" arasındaki fark esas olarak bir iş parçacığının CPU durumuna (+ muhtemelen başka bir minimum duruma) sahip olması, diğer tüm bağlamın işlemden gelmesidir. Bununla birlikte, bu , COE'nin toplam durumunu bölmenin sadece
bir yoludur ve bunu yapmanın doğru yolu olduğunu söyleyen hiçbir şey yoktur. Kendinizi bu tür bir görüntüyle sınırlamak sadece aptalca.
Linux bu düşünen yolu (ve İşe şeyler istiyorum yön) orada olmasıdır olan bir "süreç" ya da bir "iş parçacığı" diye bir şey. Yalnızca COE'nin bütünü vardır (Linux tarafından "görev" olarak adlandırılır). Farklı COE'ler bağlamlarının bölümlerini birbirleriyle paylaşabilir ve bu paylaşımın bir alt kümesi geleneksel "iş parçacığı" / "işlem" kurulumudur, ancak bu gerçekten SADECE bir alt küme olarak görülmelidir (önemli bir alt kümedir, ancak bu önem gelir tasarımdan değil, standartlardan: Linux üzerinde standartlara uygun iş parçacığı programlarını da açıkça uygulamak istiyoruz).
Kısacası: İş parçacığı / süreç düşünme şekli etrafında tasarlamayın. Çekirdek, COE düşünme şekli etrafında tasarlanmalıdır ve daha sonra pthreads kütüphanesi , sınırlı pthreads arayüzünü COE'lere bakmak için bu şekilde kullanmak isteyen kullanıcılara aktarabilir.
Tıpkı COE'yi iş parçacığının / sürecin aksine düşündüğünüzde neyin mümkün olduğuna bir örnek olarak:
- Harici bir "cd" programı, UNIX ve / veya işlem / iş parçacığında geleneksel olarak imkansız olan bir şey yapabilirsiniz (aptal örnek, ancak fikir, geleneksel UNIX ile sınırlı olmayan bu tür "modüllere" sahip olabilmenizdir. / thread kurulumu). Şunu yapın:
klon (CLONE_VM | CLONE_FS);
çocuk: yürütmek ("harici-cd");
/ * "execve ()" sanal makineyle olan ilişkisini kesecektir, bu yüzden CLONE_VM kullanmamızın tek nedeni klonlama işlemini daha hızlı yapmaktı * /
- Doğal olarak "vfork ()" yapabilirsiniz (minimal çekirdek desteğine uygundur, ancak bu destek CUA'nın mükemmel düşünme şekline uyar):
klonu (CLONE_VM);
child: koşmaya devam et, sonunda execute ()
anne: idam beklemek
- harici "IO deamons" yapabilirsiniz:
klonu (CLONE_FILES);
child: açık dosya tanımlayıcıları vb.
Anne: Açılan çocuğun ve vv.
Yukarıdakilerin hepsi iş parçacığı / süreç düşünme tarzına bağlı olmadığınızdan çalışır. Örneğin, CGI betiklerinin "yürütme konuları" olarak yapıldığı bir web sunucusu düşünün. Bunu geleneksel iş parçacıklarıyla yapamazsınız, çünkü geleneksel iş parçacıkları her zaman tüm adres alanını paylaşmak zorundadır, bu nedenle web sunucusunun kendisinde yapmak istediğiniz her şeye bağlamanız gerekir (bir "iş parçacığı" çalışamaz) başka bir çalıştırılabilir).
Soruna bir "yürütme bağlamında" olarak düşünmek yerine, istedikleri takdirde görevleri artık vb dış programları çalıştırmak (= ebeveynden adres alanını birbirinden ayırmak) seçti, ya da ebeveyn ile örnek payı her şey için can haricinde için dosya tanımlayıcıları (böylece alt "iş parçacıkları", üst öğe hakkında endişelenmeye gerek kalmadan çok sayıda dosyayı açabilir: alt "iş parçacığı" çıktığında otomatik olarak kapanırlar ve üst dosyada fd'leri kullanmazlar) .
Örneğin, dişli bir "inetd" düşünün. Düşük çatal + exec istiyorsanız, Linux yolu ile "fork ()" kullanmak yerine her iş parçacığının sadece CLONE_VM ile paylaşıldığı çok parçacıklı bir inetd yazabilirsiniz (adres alanını paylaşın, ancak dosyayı paylaşmayın) tanımlayıcılar vb.). Daha sonra çocuk, harici bir hizmetse (örneğin rlogind) veya belki de iç inetd hizmetlerinden (echo, timeofday) biri olabilirse, bu durumda sadece bir şey yapar ve çıkar.
Bunu "thread" / "process" ile yapamazsınız.
Linus