[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
始めまして(Documentation/kernel/vfork.html)
このMLでははじめまして。
3時間ほど前に www-changes-jaに参加しました大阪大学の齊藤と申します。
WWWによると、翻訳にとりかかる前にメーリングリストでその旨
宣言することとなっていますが、短い文章だったので
いきなり送ります。
Documentation/kernel/vfork.html の訳です。
要求されている qualityのレベルが分からないのでとりあえず
こんな完成度で投げてみます。
齊藤 明紀 <saitoh@ics.ES.osaka-u.ac.jp>(saitoh@rd.ecip.osaka-u.ac.jp)
====================================================
<html>
<head>
<!-- Copyright (c) 1998
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED. -->
<link rev="made" href="mailto:www@jp.NetBSD.ORG">
<title>なぜ伝統的な vfork()を実装したのか</title>
</head>
<body bgcolor="#FFFFFF" text="#000000">
<table><tr><td>
<a href="../../Misc/daemon-copy.html">
<img align="center" src="../../images/BSD-demon.gif" alt="BSD demon"></a>
</td><td align=center>
<h1>なぜ伝統的な <code>vfork()</code>を実装したのか</h1>
</td></tr></table>
<p>
<hr>
<code>vfork()</code>
は、子プロセスがいずれ他のプログラムを <code>exec()</code>し、
かつ親プロセスはそれが起きるまで待っているという、特別な状況で
用いるために設計されたものです。
伝統的な <code>fork()</code> では、子プロセスに親プロセスの
すべてのページを複製するという著しいオーバーヘッドが生じます。
<p>
COW (コピーオンライト)が追加された
Mach VM システムでは
<code>fork()</code> の負荷が大変軽くなり、
BSD 4.4では <code>vfork()</code>は <code>fork()</code> と
同義のものとされました。
NetBSD 1.3 以降では、伝統的な <code>vfork()</code> が再実装されました。
<p>
<a href="uvm.html"><strong>UVM</strong></a>で COWが
うまく動くようにするにはかなりの努力が必要と思われ、
しかしアドレス空間を共有する <code>vfork()</code>が <em>いまだに</em>
勝ることが分かったのです。
これにより、200MHz PPro での libcのビルドの所要時間を
数秒削ることができます。
<p>
<strong>
4.4BSDの
<code>vfork()</code>/<code>exec()</code> を使った
<code>vfork()</code> と COW の処理
:
</strong>
<ul>
<li>
親の vm_map をたどって、アドレス空間の書き込み可能な部分を COW とマークする。これは、 pmapを呼び出し、 PTEを修正し、 TLBをフラッシュすることを意味します。
<li> 子プロセスの vm_map を生成し、親の vm_map エントリーを子の vm_mapにコピーします。
場合によっては、 pmapを呼び出して親のページテーブルから
このページテーブルに PTE をコピーします。
<li> 親をブロックします。
<li> 子が走ります。 PTEがコピー <em>されてない</em>場合には、
ページフォルトが起きて現在プログラムカウンタのある
テキストページの物理マッピングが得られます。
<li> 子は exec し、そして 作られたばかりのアドレス空間全体を unmapして
新しく作ります。
これは、親の vmapを辿って COWとマークされた部分を
非COWにする作業を伴います。
<li> 親のブロックを解きます.
<li> 親が走り、以前には R/W であって COWにするために R/Oとマークしたデータを
変更するとページフォルトを起こします(この時点ではデータのコピーは行なわれません
</ul>
アドレス空間共有を用いた
<strong>3.0BSD/NetBSD の <code>vfork()</code>
の処理
:</strong>
<ul>
<li> 親プロセスの vmspace構造体への参照を得ます。
<li> 親をブロックします。
<li> 子が走ります。 親のページテーブルが用いられるので、 PTEは既に
有効でありページフォルトは起こりません。
<li> 子が exec し、親のもの(vmspace構造体)に対して持っていた参照を削除し、
新しいものを作ります。
<li> 親のブロックを解きます。
<li> 親が走ります。(親の vm_mapは変更されていないので、
ページフォルトは起こりません。)
</ul>
このように、fork してさらに execするような場合には、
明らかに後者がより高速です。
たとえ
たとえ良い COWアルゴリズムを使っているとしても、仮想空間を共有する
場合と比べて大変多くの作業を行なわねばなりません!
<hr>
<a href="index.html"> <em>NetBSD Documentation: Kernel</em>に戻る</a>
<hr>
<table width="100%"><tr>
<td>
<table><tr>
<td>
<a href="../../index.html">
<img src="../../images/NetBSD-banner.gif" alt="NetBSD Home"></a>
</td><td>
<a href="../../index.html">Home Page</a>
</td>
</tr></table>
</td><td>
<table><tr>
<td>
<a href="index.html">
<img src="../../images/NetBSD-banner.gif"
alt="NetBSD Documentation"></a>
</td><td>
<a href="index.html">Documentation top level</a>
</td>
</tr></table>
</td>
</tr></table>
<hr>
<address>
www@jp.NetBSD.ORG<br>
$NetBSD: vfork.html,v 1.3 1998/10/19 07:30:04 abs Exp $<br>
<a href="../../Misc/disclaimer.html">Copyright © 1998
The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.</a>
</address>
</body>
</html>
====================================================