これで作れる!?OS開発

Amebaでブログを始めよう!

論理回路-第3講(論理ゲート)(作成途中)

今回からは論理ゲートの話です。


論理ゲートとは第2講で説明した式や表の形で表現されていた論理関数を

結線の図の形で表現するための手段です。


簡単にいえば、トランジスタやダイオードのような電子回路のことです。


論理変数(A、B)がゲートの入力になり、論理関数 f が出力になります。




論理積(AND) f=A・B


入力は2~8入力が普通です。


論理和(OR) f=A+B


入力は2~8入力が普通です。

_

否定(NOT) f=A


インバータまたはインバータ・ゲートとも呼ばれます。

図の○が否定を表しています。












**************注意***************


現在、参考にさせていただいている書籍、サイトは以下になります。

問題がありましたら、大変申し訳ありませんが、ご指摘ください。

できる限り迅速に対応させていただきます。

1、基本論理ゲート

http://www.ie.u-ryukyu.ac.jp/~wada/digital/gate.html

*******************************

論理回路-第2講(作成途中)

続いてベン図です。

3つの円が重なったところをそれぞれの領域を1~8に分けます。


続いて、ベイチ図、カルノー図です。

カルノー図とは

「論理回路などにおいて論理式を簡単化するための表の中で正方形で構成された図のことです。


ベン図を


・ベイチ図

・カルノー図


に書き換えると

以下のようになります。


ベイチ図は論理回路で使いずらいので

カルノー図で今後は説明していきます。


ベイチ図


カルノー図


カルノー図はベイチ図若干変更して考案されたものです。



**************注意***************


現在、参考にさせていただいている書籍は以下になります。

問題がありましたら、大変申し訳ありませんが、ご指摘ください。

できる限り迅速に対応させていただきます。

1、論理回路の基礎

http://www.amazon.co.jp/gp/product/4769202040/249-1305084-6089106?v=glance&n=465392&camp=2025&dev-t=D3C79EA7EWG0HM&link%5Fcode=sp1


2、研究室の資料


3、『ウィキペディア(Wikipedia)』 カルノー図

http://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AB%E3%83%8E%E3%83%BC%E5%9B%B3

*******************************

フラクタルのアルゴリズム-2

それでは、

前回に引き続き、解説していきます。

http://ameblo.jp/meteor1231/theme-10002209945.html



import java.awt.*;
import java.applet.*;
import java.awt.event.*;
import java.awt.image.*;

public class Mandelbrot extends Applet
implements Runnable,MouseListener,MouseMotionListener {
static double RAD=6;

int width,height,length;
int[] pixels;
MemoryImageSource mit;
Image image;
double[] z_re,z_im;
double min_re,max_re;
double min_im,max_im;
double red_re,green_re,blue_re;
double red_im,green_im,blue_im;
int last_x,last_y;
int dx,dy;
boolean running;

public void init() {
width=getSize().width;
height=getSize().height;
length=width*height;
pixels=new int[length];
mit=new MemoryImageSource(width,height,pixels,0,width);
mit.setAnimated(true);
image=getToolkit().createImage(mit);
z_re=new double[length];
z_im=new double[length];
addMouseListener(this);
addMouseMotionListener(this);
reset();
}

void reset() {
min_re=-2.0;
max_re=2.0;
min_im=-2.0*height/width;
max_im=2.0*height/width;
red_re=Math.random()*RAD;
green_re=Math.random()*RAD;
blue_re=Math.random()*RAD;
red_im=Math.random()*RAD;
green_im=Math.random()*RAD;
blue_im=Math.random()*RAD;
}

public void start() {
if (!running) {
running=true;
new Thread(this,"Plotter").start();
}
}

public void stop() {
running=false;
}

public void mousePressed(MouseEvent e) {
running=false;
last_x=e.getX();
last_y=e.getY();
}

public void mouseReleased(MouseEvent e) {
if (dx==0 && dy==0) {
double range_re=max_re-min_re;
double range_im=max_im-min_im;
double center_re=min_re+range_re*e.getX()/width;
double center_im=min_im+range_im*e.getY()/height;
max_re=center_re+range_re/4;
min_re=center_re-range_re/4;
max_im=center_im+range_im/4;
min_im=center_im-range_im/4;
} else {
double d_re=(max_re-min_re)*dx/width;
double d_im=(max_im-min_im)*dy/height;
max_re-=d_re;
min_re-=d_re;
max_im-=d_im;
min_im-=d_im;
dx=dy=0;
}
running=false;
synchronized (this) {
for (int i=0;i<length;i++) z_re[i]=z_im[i]=0;
start();
}
}

public void mouseClicked(MouseEvent e) {
if (e.getClickCount()==2) {
running=false;
synchronized(this) {
reset();
for (int i=0;i<length;i++) z_re[i]=z_im[i]=0;
start();
}
}
}

public void mouseExited(MouseEvent e) {}

public void mouseEntered(MouseEvent e) {}

public void mouseDragged(MouseEvent e) {
dx+=e.getX()-last_x;
dy+=e.getY()-last_y;
last_x=e.getX();
last_y=e.getY();
repaint();
}

public void mouseMoved(MouseEvent e) {}

public synchronized void run() {
int x,y,i;
double c_re,c_im;
double d_re=(max_re-min_re)/width;
double d_im=(max_im-min_im)/height;
int T=30;
while (running) {
for (c_im=min_im,y=0,i=0;y<height && running;c_im+=d_im,y++)
for (c_re=min_re,x=0;x<width;c_re+=d_re,x++,i++) {
double z_re=this.z_re[i],z_im=this.z_im[i];
for (int t=0;t<T;t++) {
double z2_re=z_re*z_re-z_im*z_im;
double z2_im=2*z_re*z_im;
z_re=z2_re+c_re;
z_im=z2_im+c_im;
}
int red=(int)((red_re*z_re+red_im*z_im)*128)+128;
int green=(int)((green_re*z_re+green_im*z_im)*128)+128;
int blue=(int)((blue_re*z_re+blue_im*z_im)*64)+128;
if (red<0) red=0; else if (red>255) red=255;
if (green<0) green=0; else if (green>255) green=255;
if (blue<0) blue=0; else if (blue>255) blue=255;
pixels[i]=0xff000000|red<<16|green<<8|blue;
this.z_re[i]=z_re;
this.z_im[i]=z_im;
}
mit.newPixels();
if (T<1000) T+=10;
}
}

public void update(Graphics g) {
paint(g);
}

public void paint(Graphics g) {
g.drawImage(image,dx,dy,this);
g.setColor(Color.gray);
g.fillRect(0,0,dx,height);
g.fillRect(width+dx,0,width,height);
g.fillRect(0,0,width,dy);
g.fillRect(0,height+dy,width,height);
}
}


**************注意***************


現在、参考にさせていただいている書籍は以下になります。

問題がありましたら、大変申し訳ありませんが、ご指摘ください。

できる限り迅速に対応させていただきます。

1、ねこいりねこ

http://homepage.mac.com/catincat/


*******************************

フラクタルのアルゴリズム-第1講

研究室で


☆スタックの実装

・アセンブラ

・ハード


☆フラクタル描写(マンデルブロ集合)

アルゴリズム

・アセンブリおこし

・通信:送ったデータの処理(ハード的に実装)

・PPM形式調べ


を課題として与えられたので、私はこの内、

フラクタル(マンデルブロ集合)のアルゴリズムの担当となりました。



まずは、フラクタルとは何かから解説していきたいと思います。


フラクタルの具体的な例としては海岸線の形などが挙げられます。


海岸線は巨視的にみると複雑に入り組んだ形状をしていますが、

これを拡大するとさらに細かい形状が見えてくるようになり、

結果として拡大しても同じように複雑に入り組んだ形状をしています。


つまり、フラクタルとは以下の図(海岸線に似てる)のように拡大しても、

また同じ図形が現れるもののことを言います(ちなみにコッホ曲線といいます)



一般的な例としては(リンク付き)


  • カントール集合
  • シェルピンスキーのギャスケット
  • コッホ曲線
  • マンデルブロ集合
  • ジュリア集合
  • メンガーのスポンジ

    があげられます。


    そのほかには


    http://www.cssa.chs.nihon-u.ac.jp/~szklab/hura3.html


    のようなおもしろい例があげられます。


    日常的にも株価の動向などもフラクタルな性質を持っているので、

    見つけてみるのも楽しいかもしれません。


    では、私が調べるマンデルブロ集合ですが、

    まずはマンデルブロの解説から入ります。


    参照項目の2によると


    1975年マンデルブロ(Mandelbrot)が「砕けた石」という意味のラテン語から命名した、非整数次元を持った図形、構造。特徴としては自己相似性が挙げられる。


    とあります。

    確かに以下の図をみるとそう見えますね。


    マンデルブロ集合


                 マンデルブロ集合



    それでは、続いてアルゴリズムの説明です。


    JAVAのソースがあったので、

    これを解説することによって理解していこうと思います。



    **************注意***************


    現在、参考にさせていただいている書籍は以下になります。

    問題がありましたら、大変申し訳ありませんが、ご指摘ください。

    できる限り迅速に対応させていただきます。

    1、ねこいりねこ

    http://homepage.mac.com/catincat/


    2、フラクタルとは

    http://momi.jwu.ac.jp/~physm/buturi01/fra01/fractal.html


    3、 『ウィキペディア(Wikipedia)』:フラクタル

    http://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%AB


    4、フラクタル

    http://www.cssa.chs.nihon-u.ac.jp/~szklab/hura3.html

    *******************************




  • 論理回路-第1講

    OSを製作するのはマザーボードの知識も必要です。

    今回はまず、基本的な論理回路の知識をまとめていきます。


    始めのうちはうまくまとまりませんが、そのうちに

    改善されていくと思います。

    以下の6つの表は真理値表です。


    真理値表とは論理関数を表す方法です。

    (論理関数とは論理変数(AとかBなど)と論理記号(・ とか +など ))


    まずは基本的な論理関係である論理積、論理和、否定です。



    A、Bがともに1のときのみ論理関数 f は1となります。


    A、Bいずれか1つでも1のときに論理関数 f は1となります。



    反対の状態を表します。


    以上が、最も基本的な論理機能です。

    以下の回路もこれら3つで分解することができます。

    ただ、実用上、あると便利ですので単独のゲートとして

    使用されることが多いです。


    1が奇数個あるときに論理関数 f は1となります。

    NOT AND このことです。

    つまりA・Bの否定ですね。


    NOT ORのことです。

    つまり、A+Bの否定ですね。


    これらから、ド・モルガンの定理という話がでてきます。


    これからの良く使っていくと思われるので、

    とりあえず、書いておきます。





    **************注意***************


    現在、参考にさせていただいている書籍は以下になります。

    問題がありましたら、大変申し訳ありませんが、ご指摘ください。

    できる限り迅速に対応させていただきます。

    1、論理回路の基礎

    http://www.amazon.co.jp/gp/product/4769202040/249-1305084-6089106?v=glance&n=465392&camp=2025&dev-t=D3C79EA7EWG0HM&link%5Fcode=sp1


    2、研究室の資料


    *******************************

    ファイルシステム論-第1講

    本ブログは主にUNIX系(Linux)の構造を解説するのが

    主題となっております。


    適宜、BSD系、Solaris、Windows等は解明しだい

    ご紹介していきたいと思っています。



    それでは、今回のテーマであるファイルシステム論(第1講)に入っていきます。

    ここでのキーワードは

    1、セクター

    2、ファイルシステム
    3、VFS
    4、iノード
    5、パス名探索

    6、インデックス化ディレクトリ

    の6つです。

    まずは、以下の図1を見てください。

    mapping
          図1


    図1はLinuxの場合、
    ある情報(a.txt)をハードディスクに保存したい時にはどうすれば
    保存できるのか?

    を示しています。
    これは本題の本質的な理解にも繋がっていきますので、
    この事を頭の片隅に置いて以下を見ていってください。

    では、まずは

    1、セクター の説明から初めていきたいと思います。
    一般にデータが保存される際には一定のサイズにデータは
    分割されて保存されます。
    この一定サイズのことをデータ・ブロックと呼びます。

    ハードディスクではセクターという一定サイズの小さな記憶領域に
    分割されています。
    セクターにはアドレス(セクター番号)が割り当てられ
    書き込み、読み込みともこのアドレスで管理されます。
    図1の赤い1つ扇形がこれに当たります。
    そして、ハードディスクでは、データ・ブロックが何にあたるのかと
    言えば、セクター×(2,4,8)というものになります。
    少し、わかりにくいかもしれませんね。
    もう少し、具体的に書き直していこうと思います。
    先ほどのセクターというのは一般にセクター一つで512バイトとなって
    います(物理フォーマットの際に指定できる)

    また、Linuxの標準ファイルシステムであるext2ファイル・システムでは
    1データ・ブロックのサイズはセクター×(2,4,8)、つまりは
    512バイト×2,4,8 = 1024、2048、4096バイト
    のいずれかとなっています。

    例えば、データ(a.txt)が
    ---------------a.txt-------------------
    はじめまして、Linuxの構造を勉強中の
    N沢と申します。
    --------------------------------------
    ならば、一般的に
    半角の英数字や記号、半角カタカナなどは1バイト
    全角のひらがな漢字などは2バイト
    なので、a.txtのファイルサイズは100バイトもいきません。
    ※参照記事:Hitachi Systems
    そのため、a.txtを保存する場合はデータ・ブロックを一つだけ使うだけで済むのです。
    しかし、1つのデータ・ブロックのサイズの越えた場合は複数のデータ・ブロックに記録されます。

    この際にその分割されたデータができるだけ、近いところに配置される
    ように調節されます。この事によって、データ(a.txt)を
    読み込む時には高速に読み込むことができるのです。

    2、ファイルシステム
    このデータ・ブロックですが、実際のファイルとの対応付けは
    OS(カーネル)が行います。
    この対応付けの仕組みのことをファイルシステムと呼びます。

    3、VFS
    Linuxのファイルシステムにはさまざまなファイルシステムがあります。
    ext2
    ext3
    iso9660
    ReiserFS
    NFS
    XFS
    などなど
    新しいファイルシステムが次々に作られていっています。
    一般にファイルシステムを作成する時は
    以下のコマンドを使用しますが、
    # mkfs -t ext2 /dev/hda
    # mkfs -t xfs /dev/hdb
    この際に、hdaとhdbはファイルシステムが異なります。
    つまりは全く、データの保存形式が違うのです。
    これは、
    大雑把に言えば、
    $ cp 「/dev/hdaの中のファイル」 「/dev/hdbの中のファイル」
    とはできないことを意味します。
    でも、現実的にはこういったことが許されています。
    これはVFS(Virtual File System)という機構を導入していること
    によって実現しています
    ----------------------------
    カーネルからのアクセス
    VFS
    ext2 or xfs
    ローカルファイルシステム
    ハードディスクドライバ
    ハードディスク上のデータ
    ----------------------------
    参照:mkfsのmanページ


    ※注
    今のところはローカルファイルシステムとハードディスクドライバの
    部分は気にしないでください。

    4、iノード


    mapping2
    図2
    今までは漠然と図1のように書きましたが、
    ファイルを管理する上で重要な点を
    はずしています。
    それはiノードです。
    ファイルは「iノード」と「データ・ブロック」に分けられています。
    つまり、ファイルにはそのファイル固有のiノード番号というものが
    つけられています。
    図2でいえば、青い部分ですね。このiノード番号を頼りに
    ハードディスク上のデータ(データブロック)を探すのです。
    ここで少しだけ、ファイルシステム全体を俯瞰してみようと思います。
    まずは
    ブートブロック:1ブロック目はブートセクタ用に予約されています。
    ブロックグループ:データ保存時に関係の深いデータを同じブロック・グループ内に
    確保するようにすれば、ディスク・ヘッドの移動を最小限に抑えられるためにグループ化
    してあります。
    スーパーブロック:iノードの総数、ブロックの総数、空きブロック数、空きiノード数、
    使用可能な最初のブロック番号、ブロックサイズ、最初の未予約iノード番号、このスーパーブロックの
    グループ番号
    グループディスクリプタ:全部のブロックグループの管理情報が格納されている
    データブロックビットマップ:ブロックグループ内の空きデータブロックを管理するための
    ビットマップ
    iノードビットマップ:ブロックグループ内の空きiノードを管理するためのビットマップ
    iノードテープル:iノードの情報を格納する。
    データブロック:データ本体
    そして、iノートテーブルの部分を今回は解説します。
                         
                          図3
                          図4
    iノードテーブルとは図4のようになっています。
    と言っても何のことを言っているのかわからないと思いますので
    解説いたします。
    ext2のiノードには、ファイルの中身を格納するデータ・ブロックのアドレス情報が
    記載されています。
    iノードには12個までのデータブロックのアドレスを格納でき、
    ブロックサイズが4096Bの場合なら、
    4096B=1024×4B=4KBなので
    4K×12個=48KBのデータをファイルに格納することができます。
    このようにiノードから直接参照されるデータブロックを「直接ブロック」と呼びます。
    これに加えてext2では「間接ブロック」を3つ使って一度に書き込める
    ファイルサイズを上げています。

                          図5
    上記の計算は以下の表を参考に考えます。                                      
    以下、1段間接、2段間接、3段間接の場合の計算式を載せておきます。



    ((4096/ + 11) * 4) / 1 024 = 4.04296875 MB

    { (4 096 / 4)^2 + ((4 096 / 4) + 11) }* 4 / (1 024^2) = 4.00394821 GB

    { (4 096 / 4)^3 + (4 096 / 4)^2 + (4 096 / 4) + 11) }* 4 } / (1 024^3) = 4.00391011 TB


    この中で、はアドレス情報が32ビット(4バイト)であることから来ています。

    はブロックサイズを表しています。


    ここで、最後の4TBですが、実際に保存できるのは約2TBである。

    これはi_sizeメンバーとi_dir_aclメンバーが原因である(詳細は省略)。

    ファイル(a.txt)作成、削除の手順


    【作成】


    カーネルがファイルの作成開始

    iノードを確保

    iノードをディレクトリに登録(ディレクトリと同じブロック・グループから確保)

    親ディレクトリのデータブロックにファイル名とiノード情報を登録

    データブロックを確保(ディレクトリと同じブロック・グループから確保)

    書き込み


    【削除】


    親ディレクトリのエントリから削除

    リンク・カウントを減らす

    リンク数が0の場合のみiノードとデータブロックを解放

    (ハードリンク時)


    5、パス名探索

                         図7

    パス名探索を/home/nozawa/part3/b.txtとして


    $ cat /home/nozawa/part3/b.txt


    でファイルの中身を見ようとした時、カーネルはどのようにして、

    b.txtのiノード番号を知り、b.txtのiノードに行き着くことができるのかを解説したいと思います。


    実はかなり簡単なシステムになっており図7にあるとおり、

    地道に一番上から探索していくことになるのです。


    つまりは


    /     ディレクトリのiノード番号を調べる

    home  ディレクトリのiノード番号を調べる

    nozawa ディレクトリのiノード番号を調べる

    part3  ディレクトリのiノード番号を調べる

    b.txt   のiノード番号を調べる


    6、インデックス化ディレクトリ
    しかし、ディレクトリエントリの検索は、最初から1つずつみていくものなので
    登録されるエントリ(ファイル)が増えると非常に効率が悪くなります。
    ext2では大きなディレクトリのアクセス効率を挙げるために
    インデックス化ディレクトリという機構をサポートしています。
    具体的にどのようにアクセス効率をあげているかというと、
    ファイル名から計算されるハッシュ値によって、どのブロックにあるか
    分かる仕組みになっています。
    同一のディレクトリに同名ファイルを作成できないのもここからきています。

    **************注意***************


    現在、参考にさせていただいている書籍は以下になります。

    問題がありましたら、大変申し訳ありませんが、ご指摘ください。

    できる限り迅速に対応させていただきます。

    1、Linuxカーネル

    http://www.amazon.co.jp/gp/product/4873111331/249-8164456-1521107?v=glance&n=465392

    2、オぺレーティングシステム

    http://www.amazon.co.jp/gp/product/4274132501/249-8164456-1521107?v=glance&n=465392

    3、日経Linux 2004年 3、5、6月号

    http://www.nikkeibpm.co.jp/mag/computer/fra_lin.html

    4、UNIX USER 2005年 5、9月号

    http://www.unixuser.jp/


    5、基本単位

    http://www2.nsknet.or.jp/~azuma/ta/ta0038.htm

    *******************************