Şu anda Linux programlayıcısı hakkında çalışıyorum.Her işlem, zamanlayıcı tarafından belirli bir çekirdeğe nasıl sabitlenir (Linux)
1) nasıl bir çekirdeğe her işlem (iplik) tutturulmuş: işlemci çekirdek afinite ile ilgili olarak, aşağıdaki bilmek isteyen?
bir işlem yürütülür olan çekirdek afinite değiştirmek için bir sistem çağrısı sched_setaffinity
vardır. Fakat dahili olarak, bir süreç (veya bir iplik) oluşturulduğunda, varsayılan Linux zamanlayıcısı belirli bir çekirdeğe (iş parçacığı) nasıl atanır? Bir çekirdekten diğerine taşınmakta olan görev hakkında bilgi vermek için sched_setaffinity
sistem çağrısı değiştirdim.
printk(KERN_INFO "%d %d %ld %lu %s\n", current->pid, current->tgid,
current->state, current->cpus_allowed,
current->comm);
O /var/log/messages
yukarıdaki bilgilerin hiçbir dökümü olduğu görülmektedir. Böylece, varsayılan zamanlayıcı her işlemi farklı bir şekilde işaretler, ancak nasıl olduğunu anlayamıyorum.
2) Çekirdek kimliğini PID veya başka bir bilgi ile almak mümkün mü?
Linux çekirdeği içinde uygulamak istediğim şey budur. task_struct
'da cpus_allowed
adlı bir üye var. Ancak bu, çekirdek kimliği değil, yakınlık ayarlayan bir maskedir. Belirtilen işlemin çalıştığı çekirdeği tanımlayan bir veri almak istiyorum.
Teşekkürler,
Cevabınız için teşekkür ederiz. Ama istediğim bu farklı. Açıklamanızın yanıltıcı olup olmadığını merak ediyordum ... Öncelikle, kullanıcı alanında çalışan bir uygulama yaratmadığım için 'sched_setaffinity' sistem çağrısı kullanmıyorum (sched_set_affinity değil, sched_setaffinity). – akry
İkincisi, 'cpus_allowed' (cpu_allowed değil) alanı, işlemin çalıştığı CPU çekirdeğini tanımlamak için yeterli bilgi değildir. cpus_allowed varsayılan olarak 1 olarak ayarlanır, böylece işlem mevcut tüm çekirdekleri taşıyacaktır. Sürecin çalıştığı yeri belirten herhangi bir alan/yöntem varsa, gerçekten bilmek istediğim şey budur. – akry
Neyse, sorumu cevapladığınız için teşekkür ederim. – akry