CSAppという-1:ローミングコンピュータシステム

今週は最終的に始め、長期計画、CSAppという読書計画を開始しました。彼が読んで散乱される前に、この本は、持続支障がないことを言う農民は小さなパートナーを裏返し、このコードは一緒にこの本をパンチするために従わなければなりません。


CSAppという言うまでもなくその後、私たちはああを見ている、あなたはそれが自分の正しさとプログラマーのプログラムのパフォーマンスにどのように影響するかを理解するためにコンピュータのハードウェアとソフトウェアの仕事になる方法を知りたい場合は、この本は、間違いなくクラシックの古典である、と言っています。

我々は完全にコンピュータシステムとそのアプリケーションを説明するために、この本の影響を理解することができた場合は、おめでとう、あなたはいくつかの大きな牛の道路に着手しました。

我々が開始する前に、我々は、最も一般的な手順の一つを見てみましょう。

する#include <stdio.hの> int型のmain(){のprintf( "こんにちは、世界の\ n"); 0を返します。
}

本論文では、最も簡単なのhelloプログラムは、そのライフサイクルに沿って学習展開することは、上記から解かれます。

保存形式プログラム

上記の手順は、8ビットのグループに、実際には0と配列の1の値からハロー・ビット(すなわち、ビット)であり、バイトと呼ばれます。私たちは、各バイトを表すために使用されるのhello.cファイル内のテキスト文字を入力します(ほとんどのコンピュータシステムは、整数値に標準ASCII文字、すなわちバイトを表すために使用されています)。

要約:コンテキスト情報ビット+ =

どのようにプログラムが実行されます

C言語で書かれたハロープログラムを生まれ、利点は、人々が読むことができますが、システム上で実行するためには、まだ低レベルの機械語命令のシリーズに変換する必要があります。

Unixシステムでは、ソースファイルから目的地への変換コンパイラを頼って、コンパイラは、次の手順を記録します。

システムを構築

  1. hello.cのファイルシステムヘッダの内容を読み取り、一般.I拡張として、Cプログラムで得られた新たなプログラムテキストに挿入された前処理を通過する必要があります。

  2. コンパイラは、テキストファイルhello.iアセンブリ言語のテキストファイルhello.sに翻訳されます

  3. 次に、アセンブラの段階に関連して、アセンブリ言語では、それはバイナリファイルである場合には、機械語命令に変換し、ファイルをhello.oするためにそれを保存します

  4. リンク、私たちのプログラムに組み込まhello.oと呼ばれる関数c標準ライブラリプログラムの最後のステージは、結果をメモリにロードされ、システムで実行可能な実行可能ファイルです。

ハードウェアの構成

本当に理解で構成されるハードウェアシステムに最初にすべての、ときに、プログラムを実行する方法を理解するには:

  1. バス:システム全体を通して導管は、データバスに接続するすべてのデバイスとシステムとの間のデータフローとして理解することができます。

  2. I / Oデバイス:外の世界との通信路、例えばキーボード、マウス、ディスク、ディスプレイなど;

    すべてのI / Oアダプタが配置される/ Oバスは、コントローラまたはIを介して接続されています。

  3. メインメモリ:つまり、私たちはしばしば、メモリ、一時的な記憶装置は、であり、前記プロセッサは、データ処理プログラムを格納するプログラムを実行します。

  4. プロセッサ:私たちはしばしばCPUは、ストア命令がエンジンメインメモリに解釈されることを言う;コアのサイズは、1つのワード(バイト固定長、決意システムに応じて)であるレジスタは、プログラムカウンタと呼ばれます( PC)。プログラムの実行中に、PCはメインメモリ内の機械語命令を指しています。

    システムがパワーダウンされるまで、システムは最初から電力が供給され、プロセッサは次の命令を指すように、PCを更新し、一定の命令PCポイントにされています。

    ここで命令を実行中に、いくつかのCPUの動作が必要になることがあります:

    プロセッサは、現代のプロセッサは、プログラムの実行を加速するために非常に洗練されたメカニズムを使用し、その命令セット・アーキテクチャを実現するのは簡単であるように思われます。したがって我々は、プロセッサと理解したいときに、命令セットアーキテクチャ  およびプロセッサの  マイクロアーキテクチャの点:命令セットアーキテクチャは、各マシンコード命令の性能を説明し、マイクロアーキテクチャ記載のプロセッサが実装されています。

  • ロード:レジスタの元の内容がカバーされている、メインメモリからレジスタに単語をコピーします。

  • ストレージ:この位置の元の値をカバーする位置にメインメモリからコピーされた単語を登録します。

  • 処置:ALU(算術/論理ユニット)への2つのレジスタの内容をコピーし、これらの単語は、ALU演算を行い、その結果、古いコンテンツを上書きレジスタに格納されます。

  • ジャンプ:命令自体から単語を抽出し、単語がPCにコピーし、元の値をカバーするPC。

プログラムを実行します。

我々は実行すると  ./hello 、実際の後に手続きをされて起こります。

まず、シェルプログラムは、我々が入力したとき、私たちは、コマンドを入力するのを待つ、その命令を実行./hello した後、レジスタに文字を読むためのシェルプログラムを、それがメモリに保存されています。

当你在敲回车时,shell程序就知道我们已经结束了命令的输入,然后shell执行一系列指令来加载可执行文件,将目前文件的代码和数据复制到主存。注:利用直接存储器(DMA)技术,数据可以不到处理器直接从磁盘到主存。

一旦加载到内存中,处理器就开始执行程序的main机器指令,这些指令将“hello,world\n” 字符串中字节从主存复制到寄存器文件。再从寄存器文件复制到显示设备,最终展示在屏幕上。

メモリから、表示する出力文字列

高速缓存

从上面的例子,我们可以总结出,hello程序经历了从开始在磁盘上,加载时被复制到主存,处理器运行时又从主存复制到处理器,最后又从处理器复制到显示器。

这里从我们程序员角度讲,这些复制就是开销,那么问题来了,如何减小开销提高处理器效率呢???

从机械原理角度来看,存储设备越大运行越慢;处理器读磁盘比读内存开销大1000万倍,而寄存器文件的读取速度又比内存块几乎100倍,加快处理器的运行速度比加快主存运行速度要容器的多。

针对处理器与主存之间的差异,系统设计采用了更小更快的存储设备,称之为高速缓存,存放处理器近期可能会需要的信息。这个其实和我们平时开发程序是一样的,采用多级缓存,存放热点数据,提高系统处理能力。 这里的原理是利用程序具有访问局部区域里的数据和代码的趋势,所以高速缓存中存放了可能经常访问的数据,这样大部分操作就能在告诉缓存中完成。

请看下面的存储器层次的结构,相信你会一目了然:

メモリ階層構造

如图所示,上一层存储器是下一层的高速缓存。

操作系统管理硬件

我们写的程序,没有直接访问键盘、显示器、磁盘等硬件,而是依赖操作系统提供的服务,所以可以把操作系统看成是应用程序和硬件之间一层软件。

コンピュータシステムの階層

操作系统有两大功能:

  1. 防止硬件被滥用;

  2. 对应用程序屏蔽底层复杂而通常又大不相同的硬件设备,提供简单一致的机制;

操作系统通常抽象出几个概念:进程、虚拟内存、文件;

进程

进程是操作系统对一个正在运行的应用程序的抽象,一个系统可以同时运行多个进程。

单核处理器一个时刻只能执行一个程序,而目前的多核处理器能同时执行多个程序。无论单核还是多核,一个CPU看上去都是在并发执行多个进程,这是通过处理器在进程间切换来实现的,这种切换被称为 上下文切换

进程之间的切换是由操作系统内核管理的,内核是操作系统常驻主存的部分。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条系统调用指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。 注意,内核不是一个独立的进程,它是系统管理所有进程所用代码和数据结构的集合。

线程

一个进程实际上是由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

优点:比进程之间更容易共享数据;一般来讲也比进程更高效;

虚拟内存

这是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在单独使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间,如下图所示,地址是从小往上增大的:

仮想アドレス空間

文件

文件就是字节序列,所有的I/O设备,甚至网络都可以看成是文件;

并发

多核处理器是将多个CPU集成到一个集成电路芯片上。多核处理器组织架构如下:

マルチコアプロセッサアーキテクチャ

超线程:称为同时多线程,允许一个CPU同时执行多个并发流的技术。Intel Core i7 处理器可以让每个核执行两个线程。

计算机系统中的抽象

在处理里,指令集架构提供了对实际处理器硬件的抽象,使用这个抽象,机器代码表现的好像运行在一个一次只执行一条指令的处理器上。不管底层多复杂精细,哪怕可以并发的执行多条指令,担又总是与那个简单有序的模型保持一致。只要模型一样,不同的处理器实现也能执行同样的机器代码,而又提供不同的开销和性能。这种抽象思想简直太重要了,在整个计算机科学中也随处可见,比如java类的生命和C语言的函数原型,以及计算机网络的分层。

郑州男人不孕不育医院:http://www.xbzztj.com/

コンピュータシステムは、抽象を提供します

看了上面这副图可以总结为:

  1. 文件是对I/O设置的抽象;

  2. 虚拟内存是对主存和磁盘的抽象;

  3. 进程是对处理器、主存和I/O设备的抽象;

至此,本章的学习就结束了,主要对计算机系统的组成和程序运行有了大框架的认知,后续继续进行深入学习。http://dalian.huodong.dqccc.com/exposition/detail-2237289.html

扩展问题

  1. 信息=位+上下文,什么是上下文?工作中有哪些例子?

每一段程序都有很多外部变量。只有像Add这种简单的函数才是没有外部变量的。一旦你的一段程序有了外部变量,这段程序就不完整,不能独立运行。你为了使他们运行,就要给所有的外部变量一个一个写一些值进去。这些值的集合就叫上下文。 比如:C++的lambda表达式里面,[写在这里的就是上下文](int a, int b){ ... }

  1. RISC指令集和CISC指令集有什么区别,它们的典型CPU有哪些?郑州不育医院:http://www.xbzztj.com/

  • CSIC(Complex Instruction Set Computer) 复杂指令集的CPU; CISC体系的设计理念是用最少的指令来完成任务(譬如计算乘法只需要一条MUL指令即可),因此CISC的CPU本身设计复杂、工艺复杂,但好处是编译器好设计。CISC出现较早,至今Intel还一直采用CISC设计;

  • RSIC(Reduced Instruction Set Computer) 精简指令集的CPU; RISC的设计理念是让软件来完成具体的任务,CPU本身仅提供基本功能指令集,即:指令集中指令的数量相对很少。这种设计理念相对于CISC的设计理念,CPU的设计和工艺简单了,但是编译器的设计变复杂了

  • 典型的なCPU:約300で一般的に典型的なCISC命令のCPUの数。CPUのARM命令の約30数に用いられる(典型的なRISC-CPUなど)。一般に、より高いCISC CPUの消費電力は、通常、PCおよびノートブックコンピュータで使用されます。相対的に言って、一般的に組み込みの分野で使用される低いRISC CPUの消費電力。

  1. 違いスタックベースのCPUとレジスタベースのCPUとは何ですか?

この問題は、JVMスタックベースのCPU、スタック命令コードは、これらの変数(即ち、プッシュおよびPOP)を移動させるために使用されなければならないときに実行されるプログラムとして見ることができます。


おすすめ

転載: blog.51cto.com/14510269/2442085