<?xml version="1.0" encoding="UTF-8" ?>
<!-- English Revision: 1199481 -->
<!-- =====================================================
Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
Reviewed by: Yücel Haluk Bugüner <haluk belgeler.org>
========================================================== -->
<!--
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
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, Devingen
Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde
<program>httpd</program> programından ayrı olarak derlenir. 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 da 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 httpd modüllerini yüklemek için DSO desteği, Apache httpd
ç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. Apache ile dağıtılan hemen hemen tüm
diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş
<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>
modülü <program>configure</program> programının
<code>--enable-mods-static</code> seçeneği ile devredışı bırakılabilir.</p>
<p>Apache httpd 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 httpd modüllerini Apache httpd kaynak
ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
HTTP Sunucusu 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 <code>make install</code> ile kurulum sırasında
Apache httpd C başlık dosyaları da kurulur. Böylece
kullanıcı Apache httpd 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 httpd modülünü <program>apxs</program>
programını kullanarak derleyebilir.</p>
</section>
<section id="usage"><title>Kullanım Özeti</title>
<p>Apache HTTP Sunucusu 2.x’in DSO özelliklerine bir giriş olarak burada
kısaca bir bilgi vermekle yetinilecektir:</p>
<ol>
bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:</p>
<example>
$ make install
</example>
</li>
<li><p>Apache HTTP Sunucusunu tüm modüller etkin olarak
derleyebilirsiniz. Fakat sunucunun başlatılması sırasında sadece temel
<directive module="mod_so">LoadModule</directive> yönergelerini etkin
veya etkisiz hale getirerek yüklenecek modülleri
değiştirebilirsiniz.</p>
<example>
$ /configure --enable-mods-shared=all<br />
$ make install
</example>
</li>
<li><p>Bazı modüller sadece geliştiriciler içindir ve bunlar tüm
modüllerin derlenmesini (<em>all</em>) seçseniz bile derlenmeyecektir.
Geliştirici modülleri dehil tüm modülleri derlemek isterseniz
<em>reallyall</em> kullanınız. Ek olarak, derlenmiş modüller için
kullanılan <directive module="mod_so">LoadModule</directive>
yönergelerinin tamamını <code>--enable-load-all-modules</code> derleme
seçeneği ile etkin kılabilirsiniz.</p>
<example>
$ /configure --enable-mods-shared=reallyall --enable-load-all-modules<br />
$ make install
</example>
</li>
isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında
<program>apxs</program> kullanarak derlemek ve kurmak için şöyle
yapılır:</p>
<example>
$ apxs -c mod_filanca.c<br />
$ apxs -aci filanca mod_filanca.la
</example>
</li>
</ol>
<p>Tüm durumlarda derlenen paylaşımlı modülü Apache httpd’nin etkin
<directive module="mod_so">LoadModule</directive> yönergesi
bulunmalıdır.</p>
bakınız.</p>
</section>
<section id="background"><title>Artalan Bilgisi</title>
<p>Günümüzün Unix türevlerinde var olan 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
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
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
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
ç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
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
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
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.</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ü, sunucuyu
oluşturan parçalar derleme sırasında <program>configure</program>
<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 devingen 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
PHP, mod_perl, mod_security gibi ek paketler oluşturan paket
dağıtıcılarına büyük yarar sağlar.</li>
<li>Yeni Apache httpd modülleri için daha kolay prototip
geliştirilebilir: Modül kaynak kodunu DSO/<program>apxs</program> çifti
sayesinde Apache httpd 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 HTTP
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>İ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 httpd temel kodunda vardır ya Apache httpd 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
vardır. Diğer modülleri kullanmak için tek şansınız ya Apache httpd
ç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>