Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Uyarı
Windows 11'de kullanıcı modu zamanlaması desteklenmez. Tüm çağrılar ERROR_NOT_SUPPORTED
hatasıyla başarısız olur.
Kullanıcı modu zamanlaması (UMS), uygulamaların kendi iş parçacıklarını zamanlamak için kullanabileceği basit bir mekanizmadır. Bir uygulama, sistem zamanlayıcı dahil etmeden kullanıcı modunda UMS iş parçacıkları arasında geçiş yapabilir ve çekirdekte ums iş parçacığı blokları varsa işlemcinin denetimini yeniden kazanabilir. UMS iş parçacıkları, her bir UMS iş parçacığının kendi bağlamı olmasıyla, tek bir iş parçacığının bağlamını paylaşan fiberlerden farklılık gösterir. Kullanıcı modunda iş parçacıkları arasında geçiş yapabilme özelliği, UMS'nin az sayıda sistem çağrısı gerektiren çok sayıda kısa süreli iş öğesini yönetmek için iş parçacığı havuzlarından daha verimli olmasını sağlar.
UMS, çok işlemcili veya çok çekirdekli sistemlerde birçok iş parçacığını eşzamanlı olarak verimli bir şekilde çalıştırması gereken yüksek performans gereksinimleri olan uygulamalar için önerilir. UMS'nin avantajlarından yararlanmak için bir uygulamanın UMS iş parçacıklarını yöneten ve ne zaman çalışması gerektiğini belirleyen bir zamanlayıcı bileşeni uygulaması gerekir. Geliştiriciler, uygulama performansı gereksinimlerinin bu tür bir bileşenin geliştirilmesinde yer alan çalışmayı gerekçelendirip gerekçelendirmediğini dikkate almalıdır. Orta düzeyde performans gereksinimleri olan uygulamalar, sistem zamanlayıcısının iş parçacıklarını zamanlamasına izin vererek daha iyi hizmet verebilir.
UMS, Windows 7 ve Windows Server 2008 R2 ile Windows 10 Sürüm 21H2 ve Windows Server 2022'nin AMD64 ve Itanium sürümlerinde çalışan 64 bit uygulamalar için kullanılabilir. Bu özellik Arm64, Windows'un 32 bit sürümlerinde veya Windows 11'de kullanılamaz.
Ayrıntılar için aşağıdaki bölümlere bakın:
- UMS Zamanlayıcı
- UMS Zamanlayıcı İş Parçacığı
- UMS Çalışan İçerik Parçaları, Parça Bağlamları ve Tamamlama Listeleri
- UMS Zamanlayıcı Giriş Noktası İşlevi
- UMS İş Parçacığı Yürütme
- UMS En İyi Uygulamalar
UMS Zamanlayıcı
Uygulamanın UMS zamanlayıcısı, UMS iş parçacıklarını oluşturmak, yönetmek ve silmek ve çalıştırılacak UMS iş parçacığını belirlemekle sorumludur. Uygulamanın zamanlayıcısı aşağıdaki görevleri gerçekleştirir:
- Uygulamanın UMS çalışan iş parçacıklarını çalıştıracağı her işlemci için bir UMS zamanlayıcı iş parçacığı oluşturur.
- Uygulamanın görevlerini yerine getirmek için UMS çalışan iş parçacıkları oluşturur.
- Kendi çalışmaya hazır iş parçacığı kuyruğunu korur ve uygulamanın zamanlama ilkelerine göre çalıştırılacak iş parçacıklarını seçer.
- Çekirdekte işleme tamamlandığında sistemin iş parçacıklarını kuyruğa aldığı bir veya daha fazla tamamlama listesini oluşturur ve izler. Bunlar, yeni oluşturulan çalışan iş parçacıklarını ve daha önce bir sistem çağrısında engellenmiş olan iş parçacıklarını içerir ve bu engeller kaldırılmıştır.
- Sistemden gelen bildirimleri işlemek için bir zamanlayıcı giriş noktası işlevi sağlar. Sistem, bir zamanlayıcı iş parçacığı oluşturulduğunda, bir çalışan iş parçacığı sistem çağrısında blok oluşturduğunda veya bir çalışan iş parçacığı açıkça denetim oluşturduğunda giriş noktası işlevini çağırır.
- Çalışması tamamlanmış çalışan iş parçacıkları için temizleme görevleri gerçekleştirir.
- Uygulama tarafından istendiğinde zamanlayıcının düzenli olarak kapatılmasını gerçekleştirir.
UMS Planlayıcı İş Parçacığı
UMS zamanlayıcı iş parçacığı, EnterUmsSchedulingMode işlevini çağırarak kendisini UMS'ye dönüştüren sıradan bir iş parçacığıdır. Sistem zamanlayıcı, UMS zamanlayıcı iş parçacığının diğer hazır iş parçacıklarına göre önceliğine bağlı olarak ne zaman çalışacağını belirler. Zamanlayıcı iş parçacığının çalıştığı işlemci, UMS olmayan iş parçacıkları için olduğu gibi iş parçacığının benşimlerinden etkilenir.
EnterUmsSchedulingMode çağıranı, UMS zamanlayıcı iş parçacığıyla ilişkilendirilecek bir tamamlama listesi ve bir UmsSchedulerProc giriş noktası fonksiyonu belirtir. Sistem, çağıran iş parçacığını UMS'ye dönüştürmeyi bitirdiğinde belirtilen giriş noktası işlevini çağırır. Zamanlayıcı giriş noktası işlevi, belirtilen iş parçacığı için uygun sonraki eylemi belirlemekle sorumludur. Daha fazla bilgi için bu konunun ilerleyen bölümlerinde UMS Scheduler Giriş Noktası İşlevi'ne bakın.
Bir uygulama, UMS iş parçacıklarını çalıştırmak için kullanılacak her işlemci için bir UMS zamanlayıcı iş parçacığı oluşturabilir. Uygulama, her bir UMS zamanlayıcı iş parçacığının belirli bir mantıksal işlemciye bağımlılığını ayarlayabilir ve bu işlemciyi o zamanlayıcı iş parçacığı için etkili bir şekilde ayırarak, ilişkili olmayan iş parçacıklarını çalıştırmayı engelleyebilir. İş parçacığı bağlılığını bu şekilde ayarlamanın, sistemde çalışan diğer süreçleri kaynak açısından aç bırakmasıyla genel sistem performansını etkileyebileceğini unutmayın. İş parçacığı benşimi hakkında daha fazla bilgi için bkz. Birden Çok İşlemci.
UMS Çalışan İş Parçacıkları, İş Parçacığı Bağlamları ve Tamamlama Listeleri
PROC_THREAD_ATTRIBUTE_UMS_THREAD özniteliğiyle CreateRemoteThreadExçağrılarak ve UMS iş parçacığı bağlamı ve tamamlama listesi belirtilerek BIR UMS çalışan iş parçacığı oluşturulur.
UMS iş parçacığı bağlamı, bir çalışan iş parçacığının UMS iş parçacığı durumunu temsil eder ve UMS işlev çağrılarındaki çalışan iş parçacığını tanımlamak için kullanılır. CreateUmsThreadContextçağrılarak oluşturulur.
CreateUmsCompletionList işlevi çağrılarak bir tamamlama listesi oluşturulur. Tamamlanma listesi, çekirdekte çalışmasını tamamlamış ve kullanıcı modunda çalışmaya hazır olan UMS iş parçacıklarını alır. Yalnızca sistem çalışan iş parçacıklarını tamamlama listesine alabilir. Yeni UMS çalışan iş parçacıkları, iş parçacıkları oluşturulduğunda belirtilen tamamlanma listesine otomatik olarak kuyruğa alınır. Önceden engellenmiş olan çalışan iş parçacıkları, artık engellenmediklerinde tamamlanma listesine yerleştirilir.
Her UMS zamanlayıcı iş parçacığı tek bir tamamlama listesiyle ilişkilendirilir. Ancak, aynı tamamlanma listesi herhangi bir sayıda UMS zamanlayıcı iş parçacığıyla ilişkilendirilebilir ve zamanlayıcı iş parçacığı, işaretçisi olan herhangi bir tamamlama listesinden UMS bağlamlarını alabilir.
Sistem, bir veya daha fazla çalışan iş parçacığını boş bir listeye eklediğinde her tamamlama listesi ile ilişkili bir olayı sinyaller. GetUmsCompletionListEvent işlevi, belirtilen tamamlanma listesi için olaya bir tanıtıcı alır. Bir uygulama, uygulama için anlamlı olan diğer olaylarla birlikte birden fazla tamamlama listesi olayını bekleyebilir.
UMS Zamanlayıcı Giriş Noktası İşlevi
Uygulamanın zamanlayıcı giriş noktası işlevi UmsSchedulerProc işlevi olarak uygulanır. Sistem, uygulamanın zamanlayıcı giriş noktası işlevini aşağıdaki saatlerde çağırır:
- UMS olmayan bir iş parçacığı, EnterUmsSchedulingModeçağrılarak UMS zamanlayıcı iş parçacığına dönüştürüldüğünde.
- UMS çalışan iş parçacığı UmsThreadYieldçağırdığında.
- UMS çalışan iş parçacığı, sistem çağrısı veya sayfa hatası gibi bir sistem hizmetinde blokladığında.
UmsSchedulerProc işlevinin Reason parametresi, giriş noktası işlevinin çağrılma nedenini belirtir. Giriş noktası işlevi yeni bir UMS zamanlayıcı iş parçacığı oluşturulduğu için çağrıldıysa, SchedulerParam parametresi EnterUmsSchedulingModeçağıranın belirttiği verileri içerir. Giriş noktası işlevi bir UMS çalışan iş parçacığının üretildiği için çağrıldıysa, SchedulerParam parametresi UmsThreadYieldçağıranın belirttiği verileri içerir. Çekirdekte bir UMS çalışan iş parçacığı engellendiği için giriş noktası işlevi çağrıldıysa, SchedulerParam parametresi NULL olur.
Zamanlayıcı giriş noktası işlevi, belirtilen iş parçacığı için uygun sonraki eylemi belirlemekle sorumludur. Örneğin, bir çalışan iş parçacığı engellenirse zamanlayıcı giriş noktası işlevi bir sonraki kullanılabilir hazır UMS çalışan iş parçacığını çalıştırabilir.
Zamanlayıcı giriş noktası işlevi çağrıldığında, uygulamanın zamanlayıcısı DequeueUmsCompletionListItems işlevini çağırarak ilişkili tamamlama listesindeki tüm öğeleri almaya çalışmalıdır. Bu işlev, çekirdekte işlenmesi tamamlanmış ve kullanıcı modunda çalışmaya hazır UMS iş parçacığı bağlamlarının listesini alır. Uygulamanın zamanlayıcısı UMS iş parçacıklarını doğrudan bu listeden çalıştırmamalıdır çünkü bu, uygulamada öngörülemeyen davranışlara neden olabilir. Bunun yerine zamanlayıcının her bağlam için GetNextUmsListItem işlevini bir kez çağırarak tüm UMS iş parçacığı bağlamlarını alması, UMS iş parçacığı bağlamlarını zamanlayıcının hazır iş parçacığı kuyruğuna eklemesi ve yalnızca daha sonra hazır iş parçacığı kuyruğundan UMS iş parçacıklarını çalıştırması gerekir.
Zamanlayıcının birden çok olayda beklemesi gerekmiyorsa, işlevin geri dönmeden önce tamamlama listesi olayını beklemesi için sıfır olmayan bir zaman aşımı parametresiyle DequeueUmsCompletionListItems çağırmalıdır. Zamanlayıcının birden çok tamamlama listesi olayı için beklemesi gerekiyorsa, tamamlanma listesi boş olsa bile işlevin hemen döndürülmesi için DequeueUmsCompletionListItems sıfır zaman aşımı parametresiyle çağırması gerekir. Bu durumda zamanlayıcı, örneğin WaitForMultipleObjectskullanarak tamamlama listesi olaylarında açıkça bekleyebilir.
UMS İş Parçacığı Yürütme
Yeni oluşturulan UMS çalışan iş parçacığı belirtilen tamamlama listesine kuyruğa alınır ve uygulamanın UMS zamanlayıcısı onu seçip çalıştırana kadar çalışmaya başlamaz. Bu, sistem zamanlayıcısının, çağıran kişi iş parçacığını açıkça askıya almadıkça otomatik olarak çalıştırmak üzere zamanladığı UMS dışı iş parçacıklarından farklıdır.
Zamanlayıcı, iş parçacığının UMS bağlamını kullanarak ExecuteUmsThread çağırmak suretiyle bir çalışan iş parçacığını çalıştırır. UMS çalışan iş parçacığı, ya UmsThreadYield işlevini çağırarak ara verir, bloklanır ya da sonlandırılır.
UMS En İyi Uygulamaları
UMS uygulayan uygulamalar şu en iyi yöntemleri izlemelidir:
- UMS iş parçacığı bağlamları için temel alınan yapılar sistem tarafından yönetilir ve doğrudan değiştirilmemelidir. Bunun yerine QueryUmsThreadInformation ve SetUmsThreadInformation kullanarak UMS çalışan iş parçacığı hakkındaki bilgileri alın ve ayarlayın.
- Kilitlenmeleri önlemeye yardımcı olmak için UMS zamanlayıcı iş parçacığı, kilitleri UMS çalışan iş parçacıklarıyla paylaşmamalıdır. Buna hem uygulama tarafından oluşturulan kilitler hem de yığından ayırma veya DLL'leri yükleme gibi işlemler tarafından dolaylı olarak alınan sistem kilitleri dahildir. Örneğin, zamanlayıcının DLL yükleyen bir UMS çalışan iş parçacığı çalıştırdığını varsayalım. Çalışan iş parçacığı yükleyici kilidini ve bloklarını alır. Sistem zamanlayıcı giriş noktası işlevini çağırır ve ardından bir DLL yükler. Bu, bir kilitlenmeye neden olur çünkü yükleyici kilidi zaten tutulmuştur ve ilk thread engelini kaldırana kadar serbest bırakılamaz. Bu sorunun önlenmesine yardımcı olmak için, kilitleri UMS çalışan iş parçacıklarıyla paylaşabilecek işleri, özel bir UMS çalışan iş parçacığına veya UMS olmayan bir iş parçacığına devredin.
- UMS, çoğu işlem kullanıcı modunda yapıldığında en verimli şekilde gerçekleştirilir. Mümkün olduğunda, UMS çalışan iş parçacıklarında sistem çağrıları yapmaktan kaçının.
- UMS çalışan iş parçacıkları, sistem zamanlayıcının kullanıldığını varsaymamalıdır. Bu varsayımın ince etkileri olabilir; örneğin, bilinmeyen koddaki bir iş parçacığı iş parçacığı önceliğini veya bağlılığını ayarlarsa, UMS zamanlayıcı yine de bunu geçersiz kılabilir. Sistem zamanlayıcının kullanıldığını varsayan kod beklendiği gibi davranmayabilir ve UMS iş parçacığı tarafından çağrıldığında bozulabilir.
- Sistemin bir UMS çalışan iş parçacığının bağlamını kilitlemesi gerekebilir. Örneğin, çekirdek modunda bir zaman uyumsuz yordam çağrısı (APC), UMS iş parçacığının bağlamını değiştirebilir, bu yüzden iş parçacığı bağlamının kilitlenmesi gerekir. Zamanlayıcı kilitliyken UMS iş parçacığı bağlamını yürütmeye çalışırsa, çağrı başarısız olur. Bu davranış tasarım gereğidir ve zamanlayıcı UMS iş parçacığı bağlamı erişimini yeniden deneyecek şekilde tasarlanmalıdır.