1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE manualpage SYSTEM "./style/manualpage.dtd">
3 <?xml-stylesheet type="text/xsl" href="./style/manual.tr.xsl"?>
4 <!-- English Revision: 1058587:1174747 (outdated) -->
5 <!-- =====================================================
6 Translated by: Nilgün Belma Bugüner <nilgun belgeler.org>
7 Reviewed by: Yücel Haluk Bugüner <haluk buguner.name.tr>
8 ========================================================== -->
11 Licensed to the Apache Software Foundation (ASF) under one or more
12 contributor license agreements. See the NOTICE file distributed with
13 this work for additional information regarding copyright ownership.
14 The ASF licenses this file to You under the Apache License, Version 2.0
15 (the "License"); you may not use this file except in compliance with
16 the License. You may obtain a copy of the License at
18 http://www.apache.org/licenses/LICENSE-2.0
20 Unless required by applicable law or agreed to in writing, software
21 distributed under the License is distributed on an "AS IS" BASIS,
22 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 See the License for the specific language governing permissions and
24 limitations under the License.
27 <manualpage metafile="dso.xml.meta">
29 <title>Devingen Paylaşımlı Nesne Desteği</title>
32 <p>Apache HTTP Sunucusu modüler bir program olup, yönetici sadece bir
33 grup modül seçerek sunucuya işlevsellik ekleyebilir. Modüller, Devingen
34 Paylaşımlı Nesneler (DSO - Dynamic Shared Object) halinde
35 <program>httpd</program> programından ayrı olarak derlenir. DSO modülleri
36 sunucunun derlenmesi sırasında derlenebileceği gibi ayrı olarak derlenip
37 daha sonra Apache Eklenti Aracı (Apache Extension Tool)
38 <program>apxs</program> programı kullanılarak da sunucuya eklenebilir.</p>
40 <p>Bu belgede DSO modüllerinin kullanımının yanında teorisine de
45 <section id="implementation"><title>Gerçeklenim</title>
49 <module>mod_so</module>
52 <directive module="mod_so">LoadModule</directive>
56 <p>Apache httpd modüllerini yüklemek için DSO desteği, Apache httpd
57 çekirdeğine durağan olarak ilintilenerek derlenmiş olan
58 <module>mod_so</module> adında bir modül tarafından sağlanır.
59 <module>core</module> modülünden başka, bir DSO modülü olamayan tek modül
60 <module>mod_so</module> modülüdür. Apache ile dağıtılan hemen hemen tüm
61 diğer Apache modülleri bir DSO modülüne yerleştirilebilir. Derlenmiş
62 modüller <code>mod_filanca.so</code> biçeminde birer DSO ismi alırlar ve
63 her biri istenirse <code>httpd.conf</code> dosyasında
64 <module>mod_so</module> modülünün <directive module="mod_so"
65 >LoadModule</directive> yönergesiyle belirtilerek sunucu başlatılırken
66 veya yeniden başlatılırken sunucuya yüklenebilir.</p>
68 <p><a href="install.html">Kurulum belgesinde</a> açıklandığı gibi, her DSO
69 modülü <program>configure</program> programının
70 <code>--enable-mods-static</code> seçeneği ile devredışı bırakılabilir.</p>
72 <p>Apache httpd modülleri için (özellikle üçüncü parti modüller için) DSO
73 dosyası üretimini kolaylaştırmak amacıyla <program>apxs</program>
74 (<dfn>APache eXtenSion</dfn>) adında yeni bir destek programı
75 kullanılmaktadır. Bu program Apache httpd modüllerini Apache httpd kaynak
76 ağacından ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache
77 HTTP Sunucusu derlenirken DSO dosyalarını derlemek için platforma bağımlı
78 derleyici ve ilintileyici seçenekleri <program>apxs</program>
79 programının içine konur ve <code>make install</code> ile kurulum sırasında
80 Apache httpd C başlık dosyaları da kurulur. Böylece
81 kullanıcı Apache httpd dağıtımının kaynak ağacına ihtiyaç duymadan ve
82 platforma bağımlı derleyici ve ilintileyici seçeneklerini bilmek zorunda
83 kalmadan istediği Apache httpd modülünü <program>apxs</program>
84 programını kullanarak derleyebilir.</p>
87 <section id="usage"><title>Kullanım Özeti</title>
89 <p>Apache HTTP Sunucusu 2.x’in DSO özelliklerine bir giriş olarak burada
90 kısaca bir bilgi vermekle yetinilecektir:</p>
93 <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
94 <em>özgün</em> Apache htpd modülünü <code>mod_filanca.so</code> isminde
95 bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır:</p>
98 $ ./configure --prefix=/kurulum/yeri --enable-filanca<br />
103 <li><p>Apache HTTP Sunucusunu tüm modüller etkin ve paylaşımlı nesneler
104 yüklü olarak derleyebilir. Daha sonra <code>httpd.conf</code> içindeki
105 <directive module="mod_so">LoadModule</directive> yönergelerinden
106 istemediklerinizi açıklama satırları haline getirerek bunları iptal
110 $ ./configure --enable-mods-shared=all<br />
115 <li><p>Kaynak dosyası <code>mod_filanca.c</code> dosyasında dağıtılan bir
116 <em>üçüncü parti</em> Apache httpd modülü <code>mod_filanca.so</code>
117 isminde bir DSO modülü olarak Apache httpd kaynak ağacının dışında
118 <program>apxs</program> kullanarak derlemek ve kurmak için şöyle
122 $ cd /bir/kurulum/yeri<br />
123 $ apxs -c mod_filanca.c<br />
124 $ apxs -aci filanca mod_filanca.la
129 <p>Tüm durumlarda derlenen paylaşımlı modülü Apache httpd’nin etkin
130 kılabilmesi için <code>httpd.conf</code> dosyasında o modül için bir
131 <directive module="mod_so">LoadModule</directive> yönergesi
134 <p>Ayrıntılı bilgi için <a href="programs/apxs.html">apxs belgelerine</a>
138 <section id="background"><title>Artalan Bilgisi</title>
140 <p>Günümüzün Unix türevlerinde var olan bir mekanizma sayesinde
141 çalıştırılabilir bir programın adres uzayına çalışma anında yüklenmek
142 veya ilintilenmek üzere <em>Devingen Paylaşımlı Nesneler</em> (DSO -
143 Dynamic Shared Object) adı verilen, özel bir biçem kullanarak kodlanmış
144 program parçaları oluşturulabilir.</p>
146 <p>Bu yükleme normalde iki yolla yapılabilir: Ya çalıştırılabilir
147 programın başlatılması sırasında yüklenen <code>ld.so</code> adlı bir
148 sistem programınının devingen olarak yüklenmesi ile ya da
149 çalıştırılabilir programın içinden Unix yükleyicisine programsal sistem
150 arayüzü sağlayan <code>dlopen()/dlsym()</code> sistem çağrılarının elle
151 yapılması suretiyle.</p>
153 <p>İlk yöntemde kullanılan DSO’lara genelde <em>paylaşımlı
154 kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir ve
155 bunların dosyaları <code>libfilanca.so</code> veya
156 <code>libfilanca.so.1.2</code> biçiminde isimlendirilir. Belli bir
157 sistem dizininde (normalde <code>/usr/lib</code>) bulunurlar ve derleme
158 sırasında ilintileyici komutuna <code>-lfilanca</code> şeklinde
159 belirtilerek çalıştırılabilir programla ilintilenirler. Doğrudan
160 çalıştırılabilir koda eklenen bu kodlar Unix yükleyicisinin programın
161 başlatılması sırasında kütüphaneyi <code>/usr/lib</code> altında
162 <code>libfilanca.so</code> adıyla bulabilmesini sağlar. Kütüphanelerin
163 aranacağı yerler ya <code>-R</code> gibi bir ilintileyici seçeneği ile
164 koda eklenir ya da arama yolları <code>LD_LIBRARY_PATH</code> ortam
165 değişkeni aracılığıyla yapılandırılır. Böylece çalıştırılabilir
166 programda henüz çözümlenmemiş simgeler DSO içinde bulunarak
169 <p>Çalıştırılabilir program içindeki simgelere normalde DSO içinden
170 atıfta bulunulmaz (genel kod kütüphanesinin başka programlarca da
171 kullanılması nedeniyle). Bu bakımdan DSO tarafında böyle bir çözümleme
172 yapılmaz. Çalıştırılabilir program da DSO’daki simgeleri kendisi
173 çözümlemeye uğraşmaz, bu işlemlerden tamamen Unix yükleyicisi
174 (<code>ld.so</code>) sorumludur. (Aslında, <code>ld.so</code>’yu
175 çağıracak kod, her çalıştırılabilir programın içine ilintilenmiş
176 (durağan değil) başlatma kodunun bir parçasıdır.) Programlar tarafından
177 ortaklaşa kullanılan kütüphanelerin devingen olarak yüklenmesinin sebebi
178 basittir: Kütüphane kodu <code>libc.so</code> gibi bir sistem
179 kütüphanesine bir kere kaydedilip disk alanından yer kazanılmış
182 <p>İkinci yöntemde kullanılan DSO’lara yine <em>paylaşımlı
183 kütüphaneler</em> veya <em>DSO kütüphaneleri</em> adı verilir fakat
184 bunların dosyaları geçerli kabule göre <code>filanca.so</code> gibi
185 isimlendirilse de genelde keyfi olarak seçilen bir dosya uzantısı
186 kullanılarak isimlendirilirler. Bu dosyalar genellikle programa özel bir
187 dizinde dururlar ve bu dosyaları kullanacak olan çalıştırılabilir
188 programla aralarında özdevimli olarak bağ kurulmamıştır. Bunun yerine,
189 çalıştırılabilir program DSO’yu çalışma anında <code>dlopen()</code>
190 sayesinde kendi adres uzayına ekler. Çalıştırılabilir program için
191 DSO’daki simgeler bu sırada çözümlenmez. Özdevimli olarak devreye
192 giren Unix yükleyicisi, (varsa) artakalan simgeleri, çalıştırılabilir
193 ihraç edilen simge kümelerini (ve özellikle her yerde hazır ve nazır
194 <code>libc.so</code> içindeki tüm simgeleri) kullanarak çözümler. Bu
195 yolla DSO, çalıştırılabilir programın simge kümesi bilgilerini sanki
196 kendisine baştan durağan olarak ilintilenmiş gibi ulaşabilir.</p>
198 <p>Son olarak, DSO’nun programlama arayüzünün getirilerinden yararlanmak
199 amacıyla çalıştırılabilir program, daha sonra dağıtım tabloları vb.
200 yerlerde kullanmak üzere <code>dlsym()</code> üzerinden DSO’daki belli
201 simgeleri çözümlemek zorundadır. Başka bir deyişle: Çalıştırılabilir
202 program ihtiyaç duyduğu her simgeyi kullanmak için kendisi çözümleme
203 yapmak zorundadır. Böyle bir mekanizmanın getirisi, programın isteğe
204 bağlı parçalarının gerekli olana kadar yüklenmemesidir (böylece daha az
205 bellek alanı kullanılır). Gerektiği zaman programın işlevselliğini
206 arttırmak amacıyla bu parçalar devingen olarak programa
209 <p>DSO mekanizmasının bu basit gibi görünen işleyişinde zorluk içeren bir
210 adım şudur (başkaları da olabilir): Bir programın işlevselliğini
211 genişletmek için DSO kullanılırken (ikinci yöntem) çalıştırılabilir
212 programdan DSO için simgelerin çözümlenmesi. Zorluğun sebebi,
213 "tersine çözümleme" yapılmasıdır; çalıştırılabilir programın simge
214 kümesindeki DSO simgeleri kütüphane tasarımına aykırı bir şekilde
215 çözümlenir ve bu uygulama tüm platformlarda hazır olarak
216 desteklenmediği gibi standartlaşmış da değildir. Geçer uygulamada
217 çalıştırılabilir programın evrensel simgeleri çoğunlukla yeniden dışa
218 verilmez ve bu bakımdan bir DSO içinde kullanılmaları uygun değildir.
219 Esas sorun, çalıştırılabilir bir programın işlevselliğini çalışma
220 anında genişletmek için DSO kullanımı sırasında ilintileyicinin tüm
221 evrensel simgeleri dışa vermesini zorlamanın bir yolunu bulmaktır.</p>
223 <p>Paylaşımlı kütüphane yaklaşımı bu bakımdan türünün tek örneğidir,
224 çünkü DSO mekanizması özellikle bunun için tasarlanmıştır, dolayısıyla
225 işletim sisteminin sağladığı hemen hemen tüm kütüphaneler için
229 <section id="advantages"><title>Getiriler ve Götürüler</title>
231 <p>Yukarıda bahsedilen DSO’ya dayalı özelliklerin getirileri
235 <li>Sunucu paketi çalışma anında daha esnektir çünkü, sunucuyu
236 oluşturan parçalar derleme sırasında <program>configure</program>
237 seçenekleriyle birleştirilmek yerine <code>httpd.conf</code> içinde
238 <directive module="mod_so">LoadModule</directive> yönergeleri
239 sayesinde çalışma anında birleştirilebilmektedir. Bu yolla, örneğin
240 tek bir Apache kurulumuyla birbirinden farklı yapılandırmalara sahip
241 çok sayıda sunucu çalıştırmak mümkündür. (standart veya SSL sürümü;
242 basitleştirilmiş veya devingen sürümü [mod_perl, PHP3], vs.)</li>
244 <li>Sunucu paketi kurulumdan sonra bile üçüncü parti modüllerle kolayca
245 genişletilebilir. Bu özellikle, bir Apache temel paketinin yanında
246 PHP, mod_perl, mod_security gibi ek paketler oluşturan paket
247 dağıtıcılarına büyük yarar sağlar.</li>
249 <li>Yeni Apache httpd modülleri için daha kolay prototip
250 geliştirilebilir: Modül kaynak kodunu DSO/<program>apxs</program> çifti
251 sayesinde Apache httpd kaynak ağacının dışında derleyip modülün yeni
252 bir sürümünü bir <code>apxs -i</code> komutunun ardından
253 <code>apachectl restart</code> yaparak çalışan bir Apache HTTP
254 Sunucusunda denemek daha kolay hale getirilmiştir.</li>
257 <p>DSO kullanımının götürüleri ise şunlardır:</p>
260 <li>İlk yüklemede %20 yavaşlama: Unix yükleyicisi simgeleri çözümlemek
261 zorunda olduğundan sunucu ilk başlatılırken yaklaşık %20 daha yavaş
262 faaliyete geçer.</li>
264 <li>Çalışma sırasında % 5 yavaşlama: Konumdan bağımsız kodun (PIC -
265 Position Independent Code) göreli adresleme için karmaşık oyunlara
266 girmesi ve bunun mutlak adresleme kadar hızlı olmaması nedeniyle
267 sunucu bazı platformlarda çalışma anında yaklaşık %5 daha yavaş
270 <li>DSO'nun tüm modüller için uygun olmaması: DSO modülleri bazı
271 platformlarda diğer DSO temelli kütüphanelerle ilintilenemediğinden
272 (<code>ld -lfilanca</code>) DSO mekanizmasını tüm modül türleri için
273 kullanamazsınız (örneğin a.out temelli platformlar bu işlevselliği
274 ELF temelli platformlar kadar iyi sağlamaz). Başka bir deyişle, DSO
275 dosyaları olarak derlenmiş modüllerin kullanabileceği simgeler ya
276 Apache httpd temel kodunda vardır ya Apache httpd temel kodunun
277 kullandığı C kütüphanesinde (<code>libc</code>) ve diğer durağan ve
278 devingen kütüphanelerde vardır ya da konumdan bağımsız kodu içeren
279 durağan kütüphane arşivlerinde (<code>libfilanca.a</code>)
280 vardır. Diğer modülleri kullanmak için tek şansınız ya Apache httpd
281 çekirdeğinin modüle bir atıf içermesini sağlamak ya da modül kodunu
282 <code>dlopen()</code> vasıtasıyla yüklemektir.</li>