| <?xml version="1.0" encoding="UTF-8" ?> |
| <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd"> |
| <?xml-stylesheet type="text/xsl" href="./style/manual.tr.xsl"?> |
| <!-- English Revision: 587444 --> |
| <!-- ===================================================== |
| Translated by: Nilgün Belma Bugüner <nilgun belgeler.org> |
| Reviewed by: Yücel Haluk Bugüner <haluk buguner.name.tr> |
| ========================================================== --> |
| |
| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| --> |
| |
| <manualpage metafile="dso.xml.meta"> |
| |
| <title>Devingen Paylaşımlı Nesne Desteği</title> |
| |
| <summary> |
| <p>Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir |
| grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller sunucunun |
| derlenmesi sırasında doğrudan <program>httpd</program> programının |
| içinde derlenebileceği gibi Devingen Paylaşımlı Nesneler (DSO - Dynamic |
| Shared Object) halinde <program>httpd</program> programından ayrı |
| olarak da derlenebilir. DSO modülleri sunucunun derlenmesi sırasında |
| derlenebileceği gibi ayrı olarak derlenip daha sonra Apache Eklenti |
| Aracı (Apache Extension Tool) <program>apxs</program> programı |
| kullanılarak sunucuya eklenebilir.</p> |
| |
| <p>Bu belgede DSO modüllerinin kullanımının yanında teorisine de |
| değinilecektir.</p> |
| </summary> |
| |
| |
| <section id="implementation"><title>Gerçeklenim</title> |
| |
| <related> |
| <modulelist> |
| <module>mod_so</module> |
| </modulelist> |
| <directivelist> |
| <directive module="mod_so">LoadModule</directive> |
| </directivelist> |
| </related> |
| |
| <p>Apache modüllerini yüklemek için DSO desteği, Apache çekirdeğine |
| durağan olarak ilintilenerek derlenmiş olan <module>mod_so</module> |
| adında bir modül tarafından sağlanır. <module>core</module> modülünden |
| başka, bir DSO modülü olamayan tek modül <module>mod_so</module> |
| modülüdür. Hemen hemen tüm diğer Apache modülleri <a |
| href="install.html">kurulum belgesinde</a> de açıklandığı gibi |
| <program>configure</program> betiğinin |
| <code>--enable-<em>modül</em>=shared</code> seçeneği her modül için ayrı |
| ayrı belirtilerek birer DSO modülü olarak derlenebilir. Derlenmiş |
| modüller <code>mod_filanca.so</code> biçeminde birer DSO ismi alırlar ve |
| her biri istenirse <code>httpd.conf</code> dosyasında |
| <module>mod_so</module> modülünün <directive module="mod_so" |
| >LoadModule</directive> yönergesiyle belirtilerek sunucu başlatılırken |
| veya yeniden başlatılırken sunucuya yüklenebilir.</p> |
| |
| <p>Apache modülleri için (özellikle üçüncü parti modüller için) DSO |
| dosyası üretimini kolaylaştırmak amacıyla <program>apxs</program> |
| (<dfn>APache eXtenSion</dfn>) adında yeni bir destek programı |
| kullanılmaktadır. Bu program Apache modüllerini Apache kaynak ağacından |
| ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache |
| derlenirken DSO dosyalarını derlemek için platforma bağımlı |
| derleyici ve ilintileyici seçenekleri <program>apxs</program> |
| programının içine konur ve Apache’nin <code>make install</code> ile |
| kurulumu sırasında Apache C başlık dosyaları da kurulur. Böylece |
| kullanıcı Apache dağıtımının kaynak ağacına ihtiyaç duymadan ve |
| platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda |
| kalmadan istediği Apache modülünü <program>apxs</program> programını |
| kullanarak derleyebilir.</p> |
| </section> |
| |
| <section id="usage"><title>Kullanıcı Özeti</title> |
| |
| <p>Apache 2.x’in DSO özelliklerine bir giriş olarak burada kısaca bir |
| bilgi vermekle yetinilecektir:</p> |
| |
| <ol> |
| <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir |
| <em>özgün</em> Apache modülünü <code>mod_filanca.so</code> isminde bir |
| DSO modülü olarak derlemek ve kurmak için şöyle yapılır: |
| |
| <example> |
| $ ./configure --prefix=/kurulum/yeri --enable-filanca=shared<br /> |
| $ make install |
| </example> |
| </li> |
| |
| <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir |
| <em>üçüncü parti</em> Apache modülünü <code>mod_filanca.so</code> |
| isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır: |
| |
| <example> |
| $ ./configure --add-module=<var>modül-türü</var>:/bir/kurulum/yeri/mod_filanca.c \<br /> |
| <indent> |
| --enable-filanca=shared<br /> |
| </indent> |
| $ make install |
| </example> |
| </li> |
| |
| <li>Paylaşımlı modülleri <em>sonradan kurmak için</em> Apache şöyle |
| yapılandırılır: |
| |
| <example> |
| $ ./configure --enable-so<br /> |
| $ make install |
| </example> |
| </li> |
| |
| <li>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir |
| <em>üçüncü parti</em> Apache modülü <code>mod_filanca.so</code> |
| isminde bir DSO modülü olarak Apache kaynak ağacının dışında |
| <program>apxs</program> kullanarak derlemek ve kurmak için şöyle |
| yapılır: |
| |
| <example> |
| $ cd /bir/kurulum/yeri<br /> |
| $ apxs -c mod_filanca.c<br /> |
| $ apxs -i -a -n filanca mod_filanca.la |
| </example> |
| </li> |
| </ol> |
| |
| <p>Tüm durumlarda derlenen paylaşımlı modülü Apache’nin etkin kılabilmesi |
| için <code>httpd.conf</code> dosyasında o modül için bir <directive |
| module="mod_so">LoadModule</directive> yönergesi bulunmalıdır.</p> |
| </section> |
| |
| <section id="background"><title>Artalan Bilgisi</title> |
| |
| <p>Günümüzün Unix türevlerinde var olan şık bir mekanizma sayesinde |
| çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek |
| veya ilintilenmek üzere <em>Devingen Paylaşımlı Nesneler</em> (DSO - |
| Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış |
| program parçaları oluşturulabilir.</p> |
| |
| <p>Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir |
| programın başlatılması sırasında yüklenen <code>ld.so</code> adlı bir |
| sistem programınının devingen olarak yüklenmesi ile ya da |
| çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem |
| arayüzü sağlayan <code>dlopen()/dlsym()</code> sistem çağrılarının elle |
| yapılması suretiyle.</p> |
| |
| <p>İlk yöntemde kullanılan DSO’lara genelde <em>paylaşımlı |
| kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir ve |
| bunların dosyaları <code>libfilanca.so</code> veya |
| <code>libfilanca.so.1.2</code> biçiminde isimlendirilir. Belli bir |
| sistem dizininde (normalde <code>/usr/lib</code>) bulunurlar ve derleme |
| sırasında ilintileyici komutuna <code>-lfilanca</code> şeklinde |
| belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan |
| çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın |
| başlatılması sırasında kütüphaneyi <code>/usr/lib</code> altında |
| <code>libfilanca.so</code> adıyla bulabilmesini sağlar. Kütüphanelerin |
| aranacağı yerler ya <code>-R</code> gibi bir ilintileyici seçeneği ile |
| koda eklenir ya da arama yolları <code>LD_LIBRARY_PATH</code> ortam |
| değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir |
| programda henüz çözümlenmemiş simgeler DSO içinde bulunarak |
| çözümlenebilir.</p> |
| |
| <p>Çalıştırılabilir program içindeki simgelere normalde DSO içinden |
| atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da |
| kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme |
| yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi |
| çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi |
| (<code>ld.so</code>) sorumludur. (Aslında, <code>ld.so</code>’yu |
| çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş |
| (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından |
| ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi |
| basittir: Kütüphane kodu <code>libc.so</code> gibi bir sistem |
| kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış |
| olur.</p> |
| |
| <p>İkinci yöntemde kullanılan DSO’lara yine <em>paylaşımlı |
| kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir fakat |
| bunların dosyaları geçerli kabule göre <code>filanca.so</code> gibi |
| isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı |
| kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir |
| dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir |
| programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine, |
| çalıştırılabilir program DSO’yu çalışma anında <code>dlopen()</code> |
| sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için |
| DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye |
| giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir |
| ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır |
| <code>libc.so</code> içindeki tüm simgeleri) kullanarak çözümler. Bu |
| yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki |
| kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.</p> |
| |
| <p>Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak |
| amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb. |
| yerlerde kullanmak üzere <code>dlsym()</code> üzerinden DSO’daki belli |
| simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir |
| program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme |
| yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe |
| bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az |
| bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini |
| arttırmak amacıyla bu parçalar devingen olarak programa |
| yüklenebilir.</p> |
| |
| <p>DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir |
| adım şudur (başkaları da olabilir): Bir programın işlevselliğini |
| genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir |
| programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi, |
| "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge |
| kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde |
| çözümlenir ve bu uygulama tüm platformlarda hazır olarak |
| desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada |
| çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa |
| verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir. |
| Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma |
| anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm |
| evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.</p> |
| |
| <p>Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir, |
| çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla |
| işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için |
| kullanılabilir. Diğer taraftan, bir programın işlevselliğini |
| genişletmek için paylaşımlı nesne kullanımı çoğu program tarafından |
| kullanılan bir şey değildir.</p> |
| |
| <p>1998 itibariyle, DSO nesneleriyle çalışma anında çalıştırılabilir |
| program işlevselliğini genişleten başlıca birkaç yazılım paketi vardır: |
| Perl 5 (XS mekanizması ve DynaLoader modülü üzerinden), Netscape |
| Sunucusu, vd. 1.3 sürümünden itibaren Apache de bu gruba katıldı. Çünkü |
| Apache, modül kavramını zaten program işlevselliğini genişletmek için |
| kullanıyordu ve temel işlevselliğine dış modülleri ilintilemek için |
| dahili olarak dağıtım listesine dayalı bir yaklaşım kullanmaktaydı. |
| Dolayısıyla Apache, modüllerini çalışma anında yüklemek için DSO |
| kullanmaya baştan yazgılıydı.</p> |
| </section> |
| |
| <section id="advantages"><title>Getiriler ve Götürüler</title> |
| |
| <p>Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri |
| şunlardır:</p> |
| |
| <ul> |
| <li>Sunucu paketi çalışma anında daha esnektir çünkü, asıl sunucuyu |
| oluşturan parçalar derleme sırasında <program>configure</program> |
| seçenekleriyle birleştirilmek yerine <code>httpd.conf</code> içinde |
| <directive module="mod_so">LoadModule</directive> yönergeleri |
| sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin |
| tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip |
| çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü; |
| basitleştirilmiş veya güçlendirilmiş sürümü [mod_perl, PHP3], |
| vs.)</li> |
| |
| <li>Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca |
| genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında |
| PHP3, mod_perl, mod_fastcgi gibi ek paketler oluşturan paket |
| dağıtıcılarına büyük yarar sağlar.</li> |
| |
| <li>Yeni Apache modülleri için daha kolay prototip geliştirilebilir: |
| Modül kaynak kodunu DSO/<program>apxs</program> çifti sayesinde |
| Apache kaynak ağacının dışında derleyip modülün yeni bir sürümünü bir |
| <code>apxs -i</code> komutunun ardından <code>apachectl |
| restart</code> yaparak çalışan bir Apache sunucusunda denemek daha |
| kolay hale getirilmiştir.</li> |
| </ul> |
| |
| <p>DSO kullanımının götürüleri ise şunlardır:</p> |
| |
| <ul> |
| <li>Her platformda hazır olarak desteklenmeme: Tüm işletim sistemleri |
| bir programa devingen olarak kod yükleme becerisine sahip |
| olmadığından DSO mekanizması her platformda kullanılamaz.</li> |
| |
| <li>İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek |
| zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş |
| faaliyete geçer.</li> |
| |
| <li>Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC - |
| Position Independent Code) göreli adresleme için karmaşık oyunlara |
| girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle |
| sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş |
| çalışabilir.</li> |
| |
| <li>DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı |
| platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden |
| (<code>ld -lfilanca</code>) DSO mekanizmasını tüm modül türleri için |
| kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği |
| ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO |
| dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya |
| Apache temel kodunda vardır ya Apache temel kodunun kullandığı C |
| kütüphanesinde (<code>libc</code>) ve diğer durağan ve devingen |
| kütüphanelerde vardır ya da konumdan bağımsız kodu içeren |
| durağan kütüphane arşivlerinde (<code>libfilanca.a</code>) |
| vardır. Diğer modülleri kullanmak için tek şansınız ya Apache |
| çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu |
| <code>dlopen()</code> vasıtasıyla yüklemektir.</li> |
| </ul> |
| |
| </section> |
| |
| </manualpage> |