Bu bölümde, süreçlerin bir prosedür çağrısı arayüzü aracılığıyla etkileşime girdiğini belirten bir IPC mekanizması olan uzak prosedür çağrılarından (diğer adıyla RPC ) bahsedeceğiz . RPC, çapraz adres alanı ve / veya makineler arası etkileşimlerin geliştirilmesini basitleştirmeyi amaçlamaktadır .
(2) Uzaktan Prosedür Çağrıları: İki Örnek
RPC'leri anlamak için iki örnek uygulamaya bakalım.
İlk örnek, bir istemcinin bir sunucudan bir dosya talep ettiği ve HTTP'ye benzer basit bir GETFILE protokolü kullandığı bir uygulamadır. Bu durumda yapacağız,
Bu nedenle, bu süreci basitleştirecek ve uzak süreçler arası iletişimle ilgili tüm genel adımları yakalayacak bir sistem çözümüne ihtiyacımız olduğu açıktı. Bu, RPC'lere yol açtı .
(3) RPC'nin Faydaları
RPC'ler, veri hareketinin ve iletişimin tüm yönlerini yakalayan üst düzey bir arayüz sunar ve bunu kullanmanın bazı avantajları vardır.
RPC'yi uygulamak istersek, bazı sistem yazılımı özellikleri vardır. Bu özellikler şunları içerir:
Şimdi RPC organizasyonu hakkında bir örnek görelim. Bir istemci ve sunucu sistemi düşünün. Müşteri bazı aritmetik işlemler yapmak istiyor, diyelim ki toplama, çıkarma, çarpma ama nasıl yapılacağını bilmiyor. Sunucu, hesap makinesi işlemidir ve tüm bu işlemlerin nasıl gerçekleştirileceğini bilir.
İstemcinin bazı aritmetik işlemler yapması gerektiğinde, mesajı sunucuya, yapmak istediği işlemin yanı sıra argümanların ne olduğunu belirten göndermesi gerekir. Sunucu, bu işlemin uygulanmasına sahip olandır, bu nedenle bu bağımsız değişkenleri alır, işlemi gerçekleştirir ve ardından sonuçları döndürür.
Soket oluşturma, argümanlar ve sonuçlar ve diğer tüm detaylar için arabellekleri ayırma ve yönetme gibi programlamanın iletişimle ilgili tüm yönlerini basitleştirmek için, bu iletişim modeli RPC'yi kullanacaktır.
Bu örnekte, RPC eklentisi çağrıldığında, programın yürütülmesi adres alanında başka bir konuma da atlayacaktır, ancak gerçek add uygulamasının olduğu yerde olmayacaktır. Bunun yerine, müşterinin işleminin geri kalanından bir istemci saplama uygulamasında olacak, tıpkı gerçek eklemeye benzeyecek, ancak dahili olarak saplamanın yaptığı şey tamamen farklı.
İstemci saplama sorumluluğu bir tampon oluşturmak ve gerekli bilgilerin tümü ile bu tampon doldurmak için ise, bu durumda, istemci sunucu, gerçekleştirmek istediği fonksiyonun açıklayıcısı var
addonun argümanları yanı sıra, tamsayılar i ve j. Saplama kodunun kendisi, RPC paketinin parçası olan bazı araçlar aracılığıyla otomatik olarak oluşturulur, böylece programcının bu kodu yazması gerekmez.
(6) RPC Adımları
Önceki videoda gördüğümüz örnekten genellemek için, şimdi bir istemci ile bir sunucu arasındaki bir RPC etkileşiminde gerçekleşmesi gereken adımları özetleyeceğiz.
(1) Arayüz Tanımlama Dilinin (IDL) Tanımı
RPC istemcisi ve sunucusunun aynı uygulamanın bir parçası olarak birlikte geliştirilmesi gerekmez. Farklı geliştiriciler tarafından yazılmış, tamamen farklı programlama dillerinde bile yazılmış tamamen bağımsız süreçler olabilirler.
Ancak bunun işe yaraması için bir tür anlaşma olması gerekir ve RPC sistemleri arayüz tanımlama dillerine (diğer adıyla IDL'ler ) dayanır . IDL'ler bu anlaşmanın nasıl ifade edileceğine dair bir protokol görevi görür.
(2) IDL Bilgileri
Bir IDL, belirli bir sunucunun dışa aktardığı arayüzü tanımlamak için kullanılır ve bu, en azından şunları içerecektir:
RPC sistemi, arayüz spesifikasyonu için önceden var olan programlama dillerinden tamamen bağımsız bir arayüz tanımı kullanabilir (örn . SunRPC'de XDR ) veya agnostik bir seçeneğimiz olabilir (örn. Java RMI'de Java), bu da bunun için IDL anlamına gelir. RPC, Java'ya benziyor.
Şimdi, IDL dili için seçim ne olursa olsun, bunun yalnızca sunucunun dışa aktaracağı arayüz için kullanıldığını bir kez daha yinelememe izin verin. IDL aslında hizmetin gerçek uygulaması için KULLANILMAZ .
3. RPC Tasarımı
(1) Marshalling
Sıralamayı anlamak için, ekleme örneğine tekrar bakalım. Değişkenler
ive
jistemci işlem adres alanı anısına bir yerde bulunmaktadır. İstemci RPC prosedürü (RPC eklenti) ve geçiş için çağrı yapan
ive
jbuna bağımsız değişken olarak. RPC çalışma zamanının en düşük seviyesinde, bunun bir şekilde bazı arabellekte depolanan ve soket API'si aracılığıyla uzaktaki bir sunucuya gönderilmesi gereken bir mesajla sonuçlanması gerekecektir. Manevra kodu bu değişkenleri alacak
ive
jdaha sonra bu tampon içine kopyalar. Prosedürün argümanlarını bu şekilde bitişik bir bellek konumuna serileştirecektir.
Bu, sıralama işleminin verileri, alıcı tarafta doğru şekilde yorumlanabilmesi için üzerinde anlaşılan bir formatta kodlaması gerektiği anlamına gelir .
(2) Hatasız
Aksine, unmarshalling'de, ağ protokolü tarafından sağlanan ve ardından prosedür tanımlayıcısına ve bu prosedür tanımlayıcısı için gerekli olduğunu bildiğimiz veri türlerine dayalı olarak sağlanan arabelleği alırız. Eşleştirme işleminin bir sonucu olarak, bunlar
ive
jsunucu adres alanında bir yere tahsis edilecektir.
Sıralama ve unmarshalling rutinlerinin, geliştiricinin açıkça yazması gereken bir şey olmadığını, ancak RPC sistemlerinin tipik olarak, sıralama ve unmarshalling rutinlerini oluşturmak için bir IDL spesifikasyonu alan özel bir derleyici içerdiğini unutmayın.
(3) Ciltleme
Bağlama , istemcinin karar vermek için kullandığı mekanizmadır.
(4) Sicil Tanımı
Kayıt sistemi yazılımı tarafından desteklenmektedir kullanılabilir hizmetlerin bir veri tabanıdır. Hizmet adını aramanız gereken sarı sayfalar olarak değerlendirilebilir ve ardından aşağıdakilere göre en iyi eşleşmeyi bulursunuz:
(5) Adlandırma Protokolü
Kayıt defterinin nasıl uygulandığına bakılmaksızın, bir tür adlandırma protokolü gerektirecektir (aka. Adlandırma kuralları ). Örneğin, en basit yaklaşım, bir müşterinin ihtiyaç duyduğu hizmetin tam adını ve sürümünü belirtmesini gerektirebilir
add. Veya daha karmaşık bir adlandırma şeması, aşağıdaki gibi kelimelerin
summation
sum
addition
Bu tür bir muhakemeye izin vermek, ontoloji veya diğer bilişsel öğrenme yöntemleri gibi şeyler için destek gerektirecektir , ancak bunu bu derste tartışmayacağız.
(6) Bir RPC Sorunu: İşaretçiler
RPC'ler söz konusu olduğunda zor bir konu, işaretçilerin prosedürlere argüman olarak kullanılmasıdır. Normal prosedürlerde, bu foo gibi iki argüman alan prosedürlere sahip olmak mükemmel bir anlam ifade eder, bir tamsayı ve ikinci bir argüman bir tamsayıya veya bir tamsayı dizisine bir göstericidir. Örneğin,
foo(int x, int *y);
(7) RPC İşaretçileri Sorunu: Çözümler
Bu sorunu çözmek için RPC sistemleri iki karardan birini verebilir,
RPC sürecinde birçok türde arıza olabilir. Bu başarısızlıklar şunları içerir:
Bu nedenle, RPC sistemleri tipik olarak yeni bir hata bildirimi türü veya bir RPC isteğinde neyin yanlış gittiğini tam ayrıntıyı sağlamayı iddia etmeden yakalamaya çalışan yeni bir tür sinyal veya istisna sunmaya çalışır . Bu, tüm hata türleri için, bir RPC çağrısı sırasında potansiyel olarak meydana gelebilecek tüm hata türleri için tümünü yakalama görevi görür ve ayrıca potansiyel olarak kısmi bir başarısızlığa işaret edebilir.
(9) RPC Tasarım Özeti
Son birkaç videoda, RPC mekanizmalarıyla ilgili bazı sorunları açıkladık ve şimdi bunları inceleyelim.
(1) Sun RPC Geçmişi
Sun RPC, 80'lerde Sun tarafından ağ dosya sistemleri veya UNIX sistemleri için NFS için geliştirilmiş bir RPC paketidir . Ancak popüler hale geldi ve şimdi diğer platformlarda yaygın olarak mevcut.
(2) Sun RPC Tasarımı
Sun RPC, aşağıdaki tasarım tercihlerini yapar,
Sun RPC istemcisi ve Sun RPC sunucusunun prosedür çağrısı arabirimi aracılığıyla etkileşim kurmasına izin verilir ve bu,
.xdosyada XDR dilinde belirtilir . Sun RPC
rpcgen,
.xdosyada belirtilen arabirimi dile özgü bir saplamada derleyen bir derleyici içerir . İstemci ve sunucu için ayrı saplamalar oluşturacaktır.
Sunucu işlemi başlatıldığında , kendisini yerel makinede bulunan kayıt defteri arka plan programına kaydedecektir. Makine başına kayıt defteri, hizmetin adını, sürümünü, hizmetle desteklenen herhangi bir protokolü ve ayrıca istemci tarafı RPC bir sunucuya istek. Bir istemci, sunucu işlemi hakkında bilgi almak için hedef makinedeki kayıt defterine açıkça başvurmalıdır.
Bağlama gerçekleştiğinde, istemci bir RPC tanıtıcısı oluşturur ve bu tutamaç, istemci herhangi bir RPC çağrısı yaptığında kullanılır ve bu şekilde çalışma zamanı, istemci başına RPC ile ilgili tüm durumları izleyebilir.
(4) Sun RPC ve TI RPC
Oracle, 2010'da Sun'ı satın aldığından, Sun RPC artık Oracle tarafından sürdürülüyor. Sun RPC için bir ONC + geliştirici kılavuzu bulabilir ve bu bağlantıda Sun RPC'nin aksine TI RPC'ye referanslar bulabilirsiniz .
TI RPC, Aktarımdan Bağımsız RPC anlamına gelir ve bu, istemci ve sunucu iletişimi için kullanılacak protokolün derleme zamanında belirtilmesi gerekmediği anlamına gelir. Çalışma zamanında dinamik olarak belirtilebilir . Bunun dışında dokümantasyon ve örnekler, orijinal SunRPC spesifikasyonunu ve XDR arayüz tanımlama dilini yakından takip eder.
(5) Bir XDR Örneği
Şimdi bir örnek kullanarak Sun RPC'nin çeşitli bileşenlerine bir göz atacağız. İstemci, hesaplama yapabilen bir sunucuyla tekrar iletişime geçecektir, ancak bu süre dışında istemci , sunucunun x ² kare değerini hesaplamasını isteyeceği tek bir x bağımsız değişkenini geçecektir .
.xSunucunun arayüzünü belirttiği bu örnek için dosya. Bu durumda, sunucu
SQUARE_PROG, türün bir bağımsız değişkenine sahip olan ve türün
square_inbir sonucunu döndüren bir yordamı destekler
square_out. Square_in ve square_out veri türlerinin her ikisi de
.xdosyada tanımlanmıştır . Onlara bakarsak, her ikisinin de tek bir elemanı olduğu ve bu bir int olduğu ve XDR'da bir int'in tıpkı C'deki tamsayılar gibi 32 bitlik bir tamsayı olduğu ortaya çıkıyor. Ayrıca, not Bu gösterimde olduğu
_in,
_outgiriş ve XDR çıktı veri türlerini belirtmek için gerekli sözdizimi her parçası değildir.
Bizim durumumuzda,
SQUARE_PROGhizmet tam olarak bir prosedürü destekliyor ve bu
SQUARE_PROCprosedür. Onunla ilişkili bir kimlik numarası var. Bu durumda bu 1'dir. Bu numara programcı tarafından kullanılmaz. Bunun
SQUARE_PROCyerine isim , bu 1 değerini referans olarak kullanacaktır.
Ayrıca bir sürüm kimliği ve bir hizmet kimliği de vardır. İlki, tüm sunucuları ve tüm istemcileri aynı anda koordine etmek ve yükseltmek zorunda kalmayacağımız şekilde tanımlanmıştır. İkincisi, RPC çalışma zamanının farklı hizmetler arasında ayrım yapmak için başvurabileceği şekilde tanımlanmıştır.
(6) XDR Dosyasını Derleme
Size aslında bir
.xdosya derlediğini gösterelim . Tartıştığımız
square.xdosyayı kullandığımızı varsayalım ve bu dosyayı, müşteri ve hizmet için kullanılan bir grup kodu otomatik olarak oluşturmak için derlemek istiyoruz. Örneğin,
-cile C kodu oluşturma seçeneğini kullanacağız
rpcgen,
$ rpcgen -c square.x
square.h: veri türlerinin ve işlev prototiplerinin dile özgü tanımları
square_svc.c: gerçek sunucunun iskeletini de içeren sunucu saplaması. Bu dosya iki bölümden oluşacaktır. Birincisi
main, kayıt ve temizlik işlemini gerçekleştiren kodu içerecek sunucu işlevidir. Diğeri,
square_prog_1RPC hizmetiyle ilgili tüm kodu içeren işlevdir. Bu, isteği ayrıştırmak için otomatik olarak oluşturulan kodu, bağımsız değişkenleri oluşturmayı, bağımsız değişken sıralama işlemlerini yürütmeyi ve diğer adımları içerecektir. Ek olarak, saplama dosyasında, otomatik olarak oluşturulan kod, adı verilen sunucu işleminde çağrılan gerçek prosedürün prototipini içerecektir
square_proc_1_svcve bu, programcı tarafından uygulanmalıdır.
square_clnt.c: müşteri saplaması. Adlı otomatik olarak oluşturulan bir prosedür içerecektir
square_proc_1. Ve bu, istemcinin hizmetin
square_proc_1_svcuygulanmasının gerçekte çağrıldığı sunucu tarafı işlemine yaptığı gerçek RPC çağrısı için bir sarmalayıcıyı temsil edecektir . Tüm bunlara sahip olduğumuzda, geliştirici daha sonra istemci uygulamasını yazar ve buna benzer bir şeye benzeyen bu sarmalayıcı işlevine bir çağrı yapar
y = square_proc_1(&x…). Bu, normal bir prosedür çağrısına çok benziyor, soket oluşturmaya, tampon oluşturmaya, verileri tamponlara kopyalamaya gerek yok ve RPC'yi çekici kılan da budur.
square_xdr.c: tüm veri türleri argümanları için sıraya koyma ve sıraya koyma yordamlarıyla ilgili bazı ortak kodlar ve hem istemcide hem de sunucu tarafında kullanılan sonuçlar.
Biz işaret olmalıdır
rpcgenyalnızca bayrağı ile kullanıldığında,
-cbir kod üretir parçacığı için güvenli değil . Derlemenin çıktısı, aşağıdaki gibi bir şeyle çağrılması gereken bir işlevle sonuçlanır:
y = squareproc_1(&x, client_handle);
İş parçacığı güvenli kod oluşturmak için, kod
-Mseçenekle derlenmelidir ve M, çok iş parçacıklı güvenli anlamına gelir ,
$ rpcgen -c -M square.x
status = squareproc_1(&x, &y, client_handle);
Solaris platformlarında başka bir seçenek var
-a. Gerçekten çok iş parçacıklı sunucu kodu oluşturan bu seçeneği kullanma . Ancak Linux'ta bu seçenek desteklenmez ve çok iş parçacıklı herhangi bir sunucunun başlangıç noktası olarak çok iş parçacıklı güvenli yordamlar kullanılarak manuel olarak oluşturulması gerekir.
Bunu square.x dosyasını indirerek deneyebilir ve ardından
rpcgenbu sınıfla sağlanan Ubuntu sanal makinesinde çalıştırabilirsiniz . Henüz Ubuntu VM'yi kurmadıysanız, Ubuntu VM Kurulum Talimatlarını izleyin .
(8) Sun RPC Kaydı
SunRPC'de kayıt arka plan programı , her makinede çalışan bir işlemdir ve buna portmapper denir . Bu işlemi Linux'ta başlatmak için yönetici iznine veya
sudoerişim ayrıcalıklarına sahip olmamız gerekiyor ve ardından aşağıdaki komutla başlatabiliriz
/sbin/portmap.
$ sudo /usr/sbin/portmap
$ /usr/sbin/rpcinfo -p
program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
(9) Sun RPC Bağlantısı
Şimdi Sun RPC bağlama sürecinden bahsedelim. Bağlama işlemi, müşteri tarafından aşağıdaki işlemler kullanılarak başlatılır,
CLIENT* clnt_handle = clnt_create(rpc_host_name, SQUARE_PROG, SQUARE_VERS, "tcp");
Bu işlemin dönüşü
clnt_handle, veri türünde bir değişkendir
CLIENT. Bu, istemcinin istediği her bir RPC işlemine dahil edeceği istemci tanıtıcısıdır ve bu tutamaç, aşağıdakiler gibi belirli bilgileri izlemek için kullanılacaktır:
Tüm girdi ve çıktı argümanlarının XDR dosyasında açıklanması gerektiğinden, XDR veri türlerini bilmemiz gerekir. Varsayılan XDR veri türlerinden bazıları, programlama C dillerinde yaygın olarak bulunanlardır (örn. Karakter, bayt, int ve float) ancak XDR, diğer birçok veri türünü destekler. Hepsini bu belgede bulabilirsiniz , ancak burada yaygın olanlardan bazılarını açıklayacağız. Örneğin,
const: bir
#definedeğer
hyper: 64 bitlik bir tam sayı
guadruple: 128 bitlik kayan nokta
opaque: yorumlanmamış ikili veriler (örneğin, görüntü verileri bir dizi
opaqueveri türü ile temsil edilebilir )
Diziler hakkında daha spesifik konuşalım çünkü XDR'da iki tür dizi belirleyebiliriz.
İlki , aşağıdaki gibi açıklanan sabit uzunluklu bir dizidir . Ve burada, dizideki öğelerin tam sayısı belirtilir. RPC çalışma zamanı, bu veri türündeki bağımsız değişkenler gönderildiğinde veya alındığında karşılık gelen bellek miktarını tahsis eder ve ayrıca bu türden bir diziden bir değişkeni doldurmak için gelen paket akışından kaç bayt okuması gerektiğini tam olarak bilir. .
int data[80];
int data<80>;
string line<80>;
XDR, RPC çalışma zamanına bazı yararlı rutinler sağlar .
Örneğin, bir XDR dosyasını derlemek sonra, derleyici için kullanılan rutinleri bir dizi üretecektir marshalling veya unmarshalling bulunabilir çeşitli veri türlerini
square_xdr.cdosyasına.
Ek olarak, derleyici , veri yapıları veya RPC işlemlerinde argümanlar için kullanılan bellek bölgelerini serbest bırakmak veya serbest bırakmak için kullanılanlar gibi bazı temizleme işlemleri oluşturacaktır
xdr_free. Bu rutinler tipik olarak, prosedürün adı tipik olarak biten bir prosedür içinde çağrılacaktır
_freeresult(örneğin
square_prog_1_freeresult). RPC çalışma zamanı, bir sonucu hesaplamayı tamamladıktan sonra bu prosedürü otomatik olarak çağırır.
(13) XDR Arabelleği
Geriye kalan bir soru, istemci ve sunucu arasında aktarım için geçen tamponlarda neyin sona erdiğidir ve burada cevabı hakkında konuşacağız. Tampon şunları içerecektir:
İşte XDR'nin bazı kodlama kuralları,
Bir XDR dosyasındaki veri türünün aşağıdaki gibi bir tanımına sahip olduğumuzu varsayalım,
string data<10>; data = "Hello";
len = 5)
Biçimsel bir sistem, temel sembollerden ve bu sembolleri manipüle etmek için bir dizi kuraldan oluşan bir mantık yapısıdır. Bu semboller “temeldir” çünkü içsel bir anlamları yoktur.
Bazen, Morgan Stanley'de çalışırken, bir çarşamba günü en iyi arkadaşınla yatmak isteyen Dalton adında bir adamla sarhoş olursun. Continental'den çıkıp St.
"Bozulma" terimi, nedensel mekanizma bilinmediğinde kullanılır ve bireyin altta yatan bilişinde ve nörobiyolojisinde bir işlev bozukluğunu ima eder. 1952'de, DSM 1, klinik kullanım için zihinsel bozuklukları kategorize eden APA Adlandırma ve İstatistik Komitesi tarafından yayınlandı.
Sathya Krishnan Suresh, Shunmupapriya P Bu yazıda, stili ve içeriği iki ayrı görüntüden gelen yeni görüntüler oluşturmak için kullanılabilecek bir yöntem olan “Nöral Stil Transferi” adlı ilginç bir konuyu tartışacağız. Bu makale Leon A Gatys ve arkadaşlarının A Neural Algorithm of Artistic Style (Sanatsal Stilin Sinirsel Algoritması) temel alınarak hazırlanmıştır; burada yazar, Evrişimsel Sinir Ağı (CNN) katmanlarını kullanarak yeni bir görüntünün oluşturulması hakkında ayrıntılı bir açıklama sunar.
Kedi Felix'in 9. doğum gününde, yetişkin hayatımın en büyük kayıplarından birini hatırlıyorum - 2013'teki Sophie'm. Bu makaleyi yazdım ve 2013'te bu platformda kısaca paylaştım.