Aracılığıyla paylaş


CLR tümleştirme mimarisi - CLR barındırılan ortam

Şunlar için geçerlidir:SQL ServerAzure SQL Yönetilen Örneği

.NET Framework ortak dil çalışma zamanı (CLR) ile SQL Server tümleştirmesi, veritabanı programcılarının C#, Visual Basic .NET ve Visual C++ gibi dilleri kullanmasını sağlar. İşlevler, saklı yordamlar, tetikleyiciler, veri türleri ve toplamalar, programcıların bu dillerle yazabileceği iş mantığı türleri arasındadır.

CLR, atık olarak toplanan bellek, önleyici iş parçacığı oluşturma, meta veri hizmetleri (tür yansıması), kod doğrulanabilirliği ve kod erişimi güvenliği özelliklerine sahiptir. CLR, sınıfları bulmak ve yüklemek, örnekleri bellekte düzenlemek, yöntem çağrılarını çözümlemek, yerel kod oluşturmak, güvenliği zorlamak ve çalışma zamanı bağlam sınırlarını ayarlamak için meta verileri kullanır.

CLR ve SQL Server, bellek, iş parçacıkları ve eşitlemeyi işleme biçiminde çalışma zamanı ortamları olarak farklılık gösterir. Bu makalede, tüm sistem kaynaklarının tekdüzen yönetilmesi için bu iki çalışma zamanı nasıl tümleştirildiği açıklanmaktadır. Bu makale ayrıca CLR kod erişim güvenliği (CAS) ve SQL Server güvenliğinin, kullanıcı kodu için güvenilir ve güvenli bir yürütme ortamı sağlamak üzere nasıl tümleştirildiğine ilişkin bilgileri de kapsar.

CLR mimarisinin temel kavramları

.NET Framework'te programcı, yapısını (örneğin, sınıfın alanları veya özellikleri) ve yöntemlerini tanımlayan bir sınıf uygulayan üst düzey bir dilde yazar. Bu yöntemlerden bazıları statik işlevler olabilir. Programın derlenmesi, ortak ara dilde (CIL) derlenmiş kodu içeren derleme adlı bir dosya ve bağımlı derlemelere yönelik tüm başvuruları içeren bir bildirim oluşturur.

Not

Derlemeler, CLR mimarisinde önemli bir öğedir. .NET Framework'te uygulama kodunu paketleme, dağıtma ve sürüm oluşturma birimleridir. Derlemeleri kullanarak, uygulama kodunu veritabanının içine dağıtabilir ve tam veritabanı uygulamalarını yönetmek, yedeklemek ve geri yüklemek için tekdüzen bir yol sağlayabilirsiniz.

Derleme bildirimi, programda tanımlanan tüm yapıları, alanları, özellikleri, sınıfları, devralma ilişkilerini, işlevleri ve yöntemleri açıklayan derleme hakkındaki meta verileri içerir. Bildirim derleme kimliğini oluşturur, derleme uygulamasını oluşturan dosyaları belirtir, derlemeyi oluşturan türleri ve kaynakları belirtir, diğer derlemelerde derleme zamanı bağımlılıklarını listeler ve derlemenin düzgün çalışması için gereken izin kümesini belirtir. Bu bilgiler, başvuruları çözümlemek, sürüm bağlama ilkesini zorunlu kılmak ve yüklenen derlemelerin bütünlüğünü doğrulamak için çalışma zamanında kullanılır.

.NET Framework, meta verilerde uygulamanın yakalayabileceği ek bilgilerle sınıflara, özelliklere, işlevlere ve yöntemlere açıklama eklemek için özel öznitelikleri destekler. Tüm .NET Framework derleyicileri bu ek açıklamaları yorumlamadan kullanır ve bunları derleme meta verileri olarak depolar. Bu ek açıklamalar diğer meta verilerle aynı şekilde incelenebilir.

Yönetilen kod, doğrudan işletim sistemi tarafından değil, CLR'de yürütülen CIL'dir. Yönetilen kod uygulamaları otomatik çöp toplama, çalışma zamanı türü denetimi ve güvenlik desteği gibi CLR hizmetlerini alır. Bu hizmetler, yönetilen kod uygulamalarında tekdüzen platform ve dilden bağımsız davranış sağlamaya yardımcı olur.

CLR tümleştirmesinin tasarım hedefleri

Kullanıcı kodu SQL Server'da CLR tarafından barındırılan ortamda çalıştırıldığında (CLR tümleştirmesi olarak adlandırılır), aşağıdaki tasarım hedefleri geçerlidir:

Güvenilirlik (güvenlik)

Kullanıcı kodunun, kullanıcı yanıtı isteyen bir ileti kutusu açma veya işlemden çıkma gibi Veritabanı Altyapısı işleminin bütünlüğünü tehlikeye atan işlemler gerçekleştirmesine izin verilmemelidir. Kullanıcı kodu, Veritabanı Altyapısı bellek arabelleklerinin veya iç veri yapılarının üzerine yazamamalıdır.

Ölçeklenebilirlik

SQL Server ve CLR'nin zamanlama ve bellek yönetimi için farklı iç modelleri vardır. SQL Server, iş parçacıklarının düzenli aralıklarla veya kilitleri veya G/Ç'yi beklerken yürütmeyi gönüllü olarak gerçekleştirdiği işbirliğine dayalı, önleyici olmayan bir iş parçacığı modelini destekler. CLR, önleyici bir iş parçacığı modelini destekler. SQL Server içinde çalışan kullanıcı kodu işletim sistemi iş parçacığı temel öğelerini doğrudan çağırabiliyorsa, SQL Server görev zamanlayıcıyla iyi tümleştirilmez ve sistemin ölçeklenebilirliğini düşürebilir. CLR, sanal ve fiziksel bellek arasında ayrım yapmaz, ancak SQL Server fiziksel belleği doğrudan yönetir ve yapılandırılabilir bir sınır içinde fiziksel bellek kullanmak için gereklidir.

İş parçacığı oluşturma, zamanlama ve bellek yönetimine yönelik farklı modeller, binlerce eşzamanlı kullanıcı oturumunu destekleyecek şekilde ölçeklendirilen bir ilişkisel veritabanı yönetim sistemi (RDBMS) için tümleştirme sınaması sunar. Mimari, doğrudan iş parçacığı oluşturma, bellek ve eşitleme temel öğeleri için uygulama programlama arabirimlerini (API' ler) çağıran kullanıcı koduyla sistemin ölçeklenebilirliğinin tehlikeye girmediğinden emin olmalıdır.

Güvenlik

Veritabanında çalışan kullanıcı kodu, tablolar ve sütunlar gibi veritabanı nesnelerine erişirken SQL Server kimlik doğrulaması ve yetkilendirme kurallarına uymalıdır. Buna ek olarak, veritabanı yöneticilerinin veritabanında çalışan kullanıcı kodundan dosyalar ve ağ erişimi gibi işletim sistemi kaynaklarına erişimi denetleyebilmesi gerekir. Bu uygulama, yönetilen programlama dilleri (Transact-SQLgibi yönetilmeyen dillerin aksine) bu tür kaynaklara erişmek için API'ler sağladığı için önemli hale gelir. Sistem, kullanıcı kodunun Veritabanı Altyapısı işleminin dışındaki makine kaynaklarına erişmesi için güvenli bir yol sağlamalıdır. Daha fazla bilgi için bkz. CLR tümleştirme güvenliği.

Performans

Veritabanı Altyapısı'nda çalışan yönetilen kullanıcı kodu, sunucunun dışında çalıştırılan aynı kodla karşılaştırılabilir hesaplama performansına sahip olmalıdır. Yönetilen kullanıcı kodundan veritabanı erişimi yerel Transact-SQL kadar hızlı değildir. Daha fazla bilgi için bkz. CLR tümleştirme mimarisinin performansı.

CLR hizmetleri

CLR, SQL Server ile CLR tümleştirmesinin tasarım hedeflerine ulaşmalarına yardımcı olmak için çeşitli hizmetler sağlar.

Tür güvenliği doğrulaması

Tür güvenli kod, bellek yapılarına yalnızca iyi tanımlanmış yollarla erişen koddur. Örneğin, geçerli bir nesne başvurusu göz önüne alındığında, tür güvenli kod gerçek alan üyelerine karşılık gelen sabit uzaklıklarda belleğe erişebilir. Ancak kod, nesneye ait bellek aralığının içinde veya dışında rastgele uzaklıklarda belleğe erişiyorsa, tür açısından güvenli değildir. Derlemeler CLR'ye yüklendiğinde, CIL tam zamanında (JIT) derleme kullanılarak derlenmeden önce, çalışma zamanı türü güvenliğini belirlemek için kodu inceleyen bir doğrulama aşaması gerçekleştirir. Bu doğrulamayı başarıyla geçen kod, doğrulanabilir tür güvenli kod olarak adlandırılır.

Uygulama etki alanları

CLR, yönetilen kod derlemelerinin yüklenip yürütülebildiği bir konak işlemi içinde uygulama etki alanlarını yürütme bölgeleri olarak belirlemeyi destekler. Uygulama etki alanı sınırı, derlemeler arasında yalıtım sağlar. Derlemeler, statik değişkenlerin ve veri üyelerinin görünürlüğü ve kodu dinamik olarak çağırabilme açısından yalıtılır. Uygulama etki alanları ayrıca kodu yükleme ve kaldırma mekanizmasıdır. Kod bellekten yalnızca uygulama etki alanı kaldırılarak kaldırılabilir. Daha fazla bilgi için bkz. Uygulama Etki Alanları ve CLR Tümleştirme Güvenliği.

Kod erişim güvenliği (CAS)

CLR güvenlik sistemi, koda izinler atayarak yönetilen kodun gerçekleştirebileceği işlem türlerini denetlemenin bir yolunu sağlar. Kod erişim izinleri, kod kimliğine (örneğin, derlemenin imzası veya kodun kaynağı) göre atanır.

CLR, bilgisayar yöneticisi tarafından ayarlanabilen bilgisayar genelinde bir ilke sağlar. Bu ilke, makinede çalışan tüm yönetilen kodlar için izin vermelerini tanımlar. Ayrıca, yönetilen kodda ek kısıtlamalar belirtmek için SQL Server gibi konaklar tarafından kullanılabilecek bir konak düzeyi güvenlik ilkesi vardır.

.NET Framework'teki yönetilen bir API, kod erişim izniyle korunan kaynaklar üzerindeki işlemleri kullanıma sunarsa, API kaynağa erişmeden önce bu izni gerektirir. Bu talep, CLR güvenlik sisteminin çağrı yığınındaki her kod birimi (derleme) için kapsamlı bir denetim tetiklesine neden olur. Kaynağa erişim yalnızca çağrı zincirinin tamamının izni varsa verilir.

Reflection.Emit API'sini kullanarak yönetilen kodu dinamik olarak oluşturma özelliği, SQL Server'da CLR tarafından barındırılan ortamda desteklenmez. Bu tür kodun çalışması için CAS izinleri yoktur ve bu nedenle çalışma zamanında başarısız olur. Daha fazla bilgi için bkz. CLR tümleştirme Kodu Erişim Güvenliği.

Konak koruma öznitelikleri (HPA' lar)

CLR, .NET Framework'ün parçası olan yönetilen API'lere CLR'nin bir konağı için ilgi çekici olabilecek belirli özniteliklerle açıklama ekleme mekanizması sağlar. Bu tür özniteliklere örnek olarak şunlar verilebilir:

  • SharedState, API'nin paylaşılan durum oluşturma veya yönetme özelliğini (örneğin, statik sınıf alanları) kullanıma sununup sunmadığını gösterir.

  • Synchronization, API'nin iş parçacıkları arasında eşitleme gerçekleştirme özelliğini kullanıma sununup göstermediğini gösterir.

  • ExternalProcessMgmt, API'nin konak işlemini denetlemenin bir yolunu kullanıma sununup sunmadığını gösterir.

Bu öznitelikler göz önünde bulundurulduğunda konak, barındırılan ortamda izin verilmeyen SharedState özniteliği gibi bir HPA listesi belirtebilir. Bu durumda CLR, kullanıcı kodu tarafından yasaklananlar listesindeki HPA'lar tarafından ek açıklama ekleyen API'leri çağırma girişimlerini reddeder. Daha fazla bilgi için bkz. Konak koruma öznitelikleri ve CLR tümleştirme programlama.

SQL Server ve CLR birlikte nasıl çalışır?

Bu bölümde, SQL Server'ın SQL Server ve CLR'nin iş parçacığı oluşturma, zamanlama, eşitleme ve bellek yönetimi modellerini nasıl tümleştirip tümleştirdiğiniz açıklanır. Özellikle bu bölümde ölçeklenebilirlik, güvenilirlik ve güvenlik hedefleri ışığında tümleştirme incelenmektedir. SQL Server temelde SQL Server'da barındırıldığında CLR için işletim sistemi görevi görür. CLR, iş parçacığı oluşturma, zamanlama, eşitleme ve bellek yönetimi için SQL Server tarafından uygulanan alt düzey yordamları çağırır. Bu yordamlar, SQL Server altyapısının geri kalanının kullandığı temel öğelerle aynıdır. Bu yaklaşım çeşitli ölçeklenebilirlik, güvenilirlik ve güvenlik avantajları sağlar.

Ölçeklenebilirlik: Ortak iş parçacığı oluşturma, zamanlama ve eşitleme

CLR, hem kullanıcı kodunu çalıştırmak hem de kendi iç kullanımı için iş parçacığı oluşturmak için SQL Server API'lerini çağırır. CLR, birden çok iş parçacığı arasında eşitleme yapmak için SQL Server eşitleme nesnelerini çağırır. Bu uygulama, bir iş parçacığı eşitleme nesnesini beklerken SQL Server zamanlayıcısının diğer görevleri zamanlamasını sağlar. Örneğin, CLR çöp toplamayı başlattığında, tüm iş parçacıkları çöp toplama işleminin tamamlanmasını bekler. CLR iş parçacıkları ve bekledikleri eşitleme nesneleri SQL Server zamanlayıcı tarafından bilindiğinden, SQL Server CLR'yi içermeyen diğer veritabanı görevlerini çalıştıran iş parçacıklarını zamanlayabilir. Bu, SQL Server'ın CLR eşitleme nesneleri tarafından alınan kilitleri içeren kilitlenmeleri algılamasına ve kilitlenmeyi kaldırmaya yönelik geleneksel teknikleri kullanmasına da olanak tanır.

Yönetilen kod SQL Server'da önceden çalışır. SQL Server zamanlayıcı, önemli bir süre boyunca verim almayan iş parçacıklarını algılama ve durdurma özelliğine sahiptir. CLR iş parçacıklarını SQL Server iş parçacıklarına bağlama özelliği, SQL Server zamanlayıcısının CLR'deki "runaway" iş parçacıklarını tanımlayıp önceliklerini yönetebildiği anlamına gelir. Bu tür kaçak iş parçacıkları askıya alınır ve kuyruğa geri alınır. Sürekli olarak kaçak iş parçacıkları olarak tanımlanan iş parçacıklarının, diğer yürüten çalışanların çalışabilmesi için belirli bir süre boyunca çalıştırılmasına izin verilmez.

Uzun süre çalışan yönetilen kodun otomatik olarak verim aldığı bazı durumlar ve bu kodun verimsiz olduğu bazı durumlar vardır. Aşağıdaki durumlarda, uzun süre çalışan yönetilen kod otomatik olarak verir:

  • Kod SQL işletim sistemini çağırırsa (örneğin verileri sorgulamak için)
  • Çöp toplamayı tetikleme için yeterli bellek ayrılırsa
  • Kod işletim sistemi işlevlerini çağırarak önleyici moda giriyorsa

Yalnızca hesaplama içeren sıkı döngüler gibi bu eylemlerin hiçbirini yapmayan kod, zamanlayıcıyı otomatik olarak vermez ve bu da sistemdeki diğer iş yükleri için uzun beklemelere yol açabilir. Bu gibi durumlarda, .NET Framework'ün System.Thread.Sleep() işlevini çağırarak veya kodun uzun süre çalışması beklenen bölümlerine System.Thread.BeginThreadAffinity()ile önalımlı moda açıkça girerek açıkça verim elde etmek geliştiricinin görevidir. Aşağıdaki kod örnekleri, bu yöntemlerin her birini kullanarak el ile nasıl verim yapılacağını gösterir.

Örnekler

SOS zamanlayıcısına el ile verim

for (int i = 0; i < Int32.MaxValue; i++)
{
  // *Code that does compute-heavy operation, and does not call into
  // any OS functions.*

  // Manually yield to the scheduler regularly after every few cycles.
  if (i % 1000 == 0)
  {
    Thread.Sleep(0);
  }
}

Önceden çalıştırabilmek için ThreadAffinity kullanma

Bu örnekte CLR kodu, BeginThreadAffinity ve EndThreadAffinityiçinde önleyici modda çalışır.

Thread.BeginThreadAffinity();
for (int i = 0; i < Int32.MaxValue; i++)
{
  // *Code that does compute-heavy operation, and does not call into
  // any OS functions.*
}
Thread.EndThreadAffinity();

Ölçeklenebilirlik: Ortak bellek yönetimi

CLR, belleğini ayırmaya ve serbest bırakmaya yönelik SQL Server temel öğelerini çağırır. CLR tarafından kullanılan bellek, sistemin toplam bellek kullanımında hesaba katıldığından, SQL Server yapılandırılmış bellek sınırları içinde kalabilir ve CLR ile SQL Server'ın bellek için birbirleriyle rekabet etmediğinden emin olabilir. SQL Server ayrıca sistem belleği kısıtlandığında CLR bellek isteklerini reddedebilir ve diğer görevler belleğe ihtiyaç duyduğunda CLR'den bellek kullanımını azaltmasını isteyebilir.

Güvenilirlik: Uygulama etki alanları ve kurtarılamaz özel durumlar

.NET Framework API'lerinde yönetilen kod bellek yetersizliği veya yığın taşması gibi kritik özel durumlarla karşılaştığında, bu tür hatalardan kurtarmak ve bunların uygulanması için tutarlı ve doğru semantik sağlamak her zaman mümkün değildir. Bu API'ler, bu hatalara yanıt olarak bir iş parçacığı durdurma özel durumu oluşturur.

SQL Server'da barındırıldığında, bu tür iş parçacığı iptalleri şu şekilde işlenir: CLR, iş parçacığı durdurma işleminin gerçekleştiği uygulama etki alanında paylaşılan durumları algılar. CLR, eşitleme nesnelerinin varlığını denetleyerek bunu algılar. Uygulama etki alanında paylaşılan durum varsa, uygulama etki alanının kendisi kaldırılır. Uygulama etki alanının kaldırılması, o uygulama etki alanında çalışmakta olan veritabanı işlemlerini durdurur. Paylaşılan durumun varlığı, bu tür kritik özel durumların, özel durumu tetikleyen kullanıcı oturumları dışındaki kullanıcı oturumlarına etkisini genişletebileceğinden, SQL Server ve CLR paylaşılan durum olasılığını azaltmak için adımlar atmıştır. Daha fazla bilgi için bkz. .NET Framework.

Güvenlik: İzin kümeleri

SQL Server, kullanıcıların veritabanına dağıtılan kod için güvenilirlik ve güvenlik gereksinimlerini belirtmesine olanak tanır. Derlemeler veritabanına yüklendiğinde, derlemenin yazarı bu derleme için üç izin kümesinden birini belirtebilir: SAFE, EXTERNAL_ACCESSve UNSAFE.

Işlevsel -liği SAFE EXTERNAL_ACCESS UNSAFE
Code Access Security Yalnızca yürüt Dış kaynaklara + erişim yürütme Sınırsız
Programming model restrictions Evet Evet Kısıtlama yok
Verifiability requirement Evet Evet Hayır
Ability to call native code Hayır Hayır Evet

SAFE, izin verilen programlama modeli açısından ilişkili kısıtlamalara sahip en güvenilir ve güvenli moddur. SAFE derlemelere çalıştırma, hesaplama gerçekleştirme ve yerel veritabanına erişim izni verilir. SAFE derlemeleri doğrulanabilir tür güvenli olmalıdır ve yönetilmeyen kodu çağırmasına izin verilmez.

UNSAFE, yalnızca veritabanı yöneticileri tarafından oluşturulabilen yüksek oranda güvenilen kod içindir. Bu güvenilen kodun kod erişimi güvenlik kısıtlamaları yoktur ve yönetilmeyen (yerel) kodu çağırabilir.

EXTERNAL_ACCESS, kodun veritabanı dışındaki kaynaklara erişmesine izin veren ancak yine de SAFEgüvenilirlik garantilerine sahip olan bir ara güvenlik seçeneği sağlar.

SQL Server, SQL Server kataloglarında depolanan izin kümesine göre üç izin kümesinden birini veren bir konak ilkesi ayarlamak için konak düzeyinde CAS ilke katmanını kullanır. Veritabanının içinde çalışan yönetilen kod her zaman bu kod erişim izin kümelerinden birini alır.

Programlama modeli kısıtlamaları

SQL Server'da yönetilen kod için programlama modeli, genellikle birden çok çağrıda tutulan durum kullanımını veya birden çok kullanıcı oturumu arasında durum paylaşımını gerektirmeyen işlevler, yordamlar ve türler yazmayı içerir. Ayrıca, daha önce açıklandığı gibi, paylaşılan durumun varlığı, uygulamanın ölçeklenebilirliğini ve güvenilirliğini etkileyen kritik özel durumlara neden olabilir.

Bu konuları göz önünde bulundurursak, SQL Server'da kullanılan sınıfların statik değişkenlerin ve statik veri üyelerinin kullanılmasını önerilmez. SAFE ve EXTERNAL_ACCESS derlemeleri için SQL Server, derlemenin meta verilerini CREATE ASSEMBLY zamanda inceler ve statik veri üyeleri ile değişkenlerin kullanımını bulursa bu tür derlemelerin oluşturulmasında başarısız olur.

SQL Server ayrıca SharedState, Synchronizationve ExternalProcessMgmt konak koruma öznitelikleriyle ek açıklama ekleyen .NET Framework API'lerine yapılan çağrılara izin vermemektedir. Bu, SAFE ve EXTERNAL_ACCESS derlemelerinin paylaşım durumunu etkinleştiren, eşitleme gerçekleştiren ve SQL Server işleminin bütünlüğünü etkileyen API'leri çağırmasını önler. Daha fazla bilgi için bkz.CLR tümleştirme programlama modeli kısıtlamaları .

  • CLR tümleştirme güvenlik
  • CLR tümleştirme mimarisi Performansı