並行プログラミング:プロセス+スレッド+コルーチン

一つ以上のプロセッサ、メインメモリ、ディスク、プリンタ、キーボード、マウス、ディスプレイ、ネットワークインターフェース、および様々な他の入力による現代のコンピュータシステム
の出力装置からなる複雑なシステムは、各プログラマは、システムの実装のすべての詳細を把握することができませんこれらのコンポーネントの管理を最適化することは極めて困難である
タスク。だから、私たちはコンピュータソフトウェアの層をインストールする必要があり、オペレーティングシステムで、ユーザプログラムの使命は単純明快コンピュータモジュールを提供することである
タイプを、上記の機器のすべてを管理します。

定義があります:オペレーティングシステムは、調整、管理、およびハードウェアとアプリケーションとの間に配置されているシステムプログラムのコンピュータのハードウェアおよびソフトウェアリソースを制御するために使用されます。

(プログラムは、システムソフトウェア上で動作していることなど、ブラウザ、音楽プレーヤー、などいくつかの機能を持っています)

オペレーティングシステムのカーネルの定義:オペレーティングシステムのカーネルは、管理および制御手順である含め、すべての物理コンピュータリソースを管理する責任があります。ファイルシステムの
システム、メモリ管理、デバイス管理、およびプロセス管理。

プロセス:

ストリップ(またはカード)に対応するユニバーサルプログラマは、入力部穿孔プログラムやデータにロードし、コンピュータプログラムとデータに入力するマシンを起動された
メモリ、及び、プログラムデータを開始するためのコンソールスイッチを介して実行する。計算されプリンタは、計算結果を出力し、その結果、テープを除去するには、ユーザ(または削除
マシン上で次のユーザを許可する前に、カード)。

ポイントに注意してください:
プログラマが壁のクロノグラフに任命行う必要がある
CPUの呼び出しによってメモリ内の1つのプログラムだけを実行します(シリアル)

長所と短所:

利点:アプリケーションの全期間におけるプログラマ排他的なリソースを、リアルタイムでプログラムをデバッグ、バグがその場で処理することができれば、
欠点:それは、コンピュータ・プロバイダーのための廃棄物である(あなたがコンピュータ4000を買いますあなたが一日だけ使用した年は、間違いなく、コストを節約するよりも、365以上
)最高の使用を

世代コンピュータの問題:

あまりにも多くの人間とコンピュータの相互作用(入力--->計算--->入力出力--->計算--->入力出力--->計算--->出力)

溶液:
大きな波入力に人々の入力の束を保存する(問題があるが、第二世代の計算が解決されていない)計算のその後順序、次にその結果を保存するための
バッチシステムで大きな波出力、

オペレーティングシステムは、以前として知られています:

時間のバッチジョブをについて収集した後、カードはその後、テープが機械室に、テープに添付されたテープに読み込まれています。その後、テープがに送信された
エンジンルームやテープドライブに取り付けられています。その後、オペレータは、テープ最初からリードする責任がある、(最新のオペレーティングシステムの前身)の特別プログラムマウントする
第2の出力に書き込まれたジョブ(ジョブ、またはプログラムのセット)し、実行し、テープに、しかし、印刷されません。オペレーティングシステムからの各ジョブの完了後、自動的に
テープに次のジョブを読み込んで実行します。全体のバッチ操作はすべての上に、オペレータの入力と出力テープに、入力の数に次の話すためのテープとき
部門、および1台のマシン上でオフライン1041を取得するために、磁気テープを出力する(ホストコンピュータがオンラインではありません)を印刷

利点:バッチ
欠点:図1が二つの中間悪役計算順序は依然として2であるれています

 

 

 

第二世代コンピュータ用の2つの主要な問題

開発した技術をスプーリング:
カードはすぐにディスクカード、ジョブが終了し、その後の任意の時間から読み込まれたジョブの部屋を取得することができ、オペレーティングシステムは、磁気から作業することができます
読み取りベルト、それが空い置きます出力のためにもこの技術をスプーリング:オンライン操作をしながら、メモリ領域の操作は、この技術は、外部デバイスと呼ばれています。撮影したときに
、この技術を使用した後、マシンが必要IBM1401ではなく、また、オペレーティングシステムの機能を強化するために、あなたは(失業真ん中の2つの悪役)の周りに移動し、テープを持っています

オーダーの実装の問題に対処するために、マルチチャンネルプログラミングを開発しました:

7094マシン(ランニングマシン)上で、現在のジョブがテープを待っている場合や一時停止、他のIO操作を待つIO操作がされるまで、CPUがアイドル状態にある
完成され、CPU集約型の科学技術計算、少ないIO操作のために、時間の無駄は、明らかにされていません商用データ処理のために、IOは80%〜90%に到達するのを待つ、それがされます
CPU現象の無駄を解決する必要があります。

溶液:メモリはいくつかの部分に分割され、図1-5に示される異なるジョブを格納するそれぞれの部分、。ジョブがIOの完全待っているときに別のジョブができ、
CPU、仕事を置くために十分なメモリを使用し、CPU使用率が100%に近づくことができます

このとき、コンピュータの第三世代は、大規模な科学技術計算や多忙なビジネスデータ処理に適しているが、本質的に、それはまだバッチシステムです。
上記のような問題を解決するが、より多くの仕事は、すべての最後に実行されている必要がありますが、多くの場合、仕事を取得するために、操作の結果を提出から結果を取得するには
、数時間まで。
デバッガ、間違ったコンマ一度王に、あなたがクマを参照して半日必要があるかもしれないがC 6月6月6月B 3人のプログラマ:シナリオを想像してみて
も、操作のうちBさんCさんの結果から、果物をA。時間が長くなります。一言で言えば:私たちは一緒に仕事を続ける、我々は(テープ)のデータに行ってきました

コンピュータプログラマの多くは第一世代は即座にあなたのプログラムをデバッグ、排他を欠場します。すぐに回答を得ることができ、プログラマーを満たすためには、タイムシェアリングオペレーティングシステムがあった

タイムシェアリングシステム:マルチチャンネルテクノロジーラインの複数の端末+

20台のクライアントが同時にによる一般的なクライアントに提出し、3回の実行、三つのプログラムでは、マルチチャンネルメモリモード処理の使用上のCPUで、メモリ、思考、17にロードされた
非可逆短く、いくつかの命令です期間は、インデックスコンピュータは、すべてのユーザーがメーターの自分自身に考えられている多くのユーザーのための高速双方向サービスを提供
するコンピュータのリソース

二つのプログラムのAとBがある場合、プロセスの半分に実行中のプログラムが、必要性は、入力データ(I / O動作)を大量に読むために、
しかし、CPUは待つことができます。この時間は静かに、タスクAを完了するために、データを読み取りますので、無駄なCPUリソースを継続します。
プログラムBは、プログラムがデータAを読み終えたとき、実行できるようにするようにプログラムは、データの読み出し処理中でない
プログラムはB、Aを一時停止し、その後、プログラムは継続しましょうか?
スイッチ:もちろん、問題ありませんが、キーワードがある
プログラムAとプログラムBに必要なシステムリソースと相まって、それはスイッチであるので、それは保存状態になると、回復状態、
ソースなど(メモリ、ハードディスク、キーボードは、 )と同じではありません。もちろん、あなたがプログラムAとプログラムBを記録するために何かを持っている必要があり
、それぞれ、必要とされているどのリソース、どのようにプログラムAとプログラムBを特定し、というように、とても抽象的と呼ばれるプロセスがありますします

プロセス定義:

プロセスは、データセットの動的プログラム実行したら。
プロセス制御ブロックは、一般的にプログラムの三つの部分、データセット、処理から成ります。
我々は、特徴と完了する方法のプロセスを達成するために使用される準備手順について説明し、
データセットを使用する必要が実行リソース中にプログラムされ、
外部の変更処理を行うことを特徴と記録プロセスのプロセス制御ブロック、プロセスの説明、システムあなたがコントロールしてプロセスを管理するために使用することができ、それがシステムである
システムは、プロセスの存在の唯一の兆候を感知します。

プロセスは、一つの例を与える:
コンピュータ科学者のマーケティング担当者に良い料理は彼の娘のためにバースデーケーキを焼くことです想像してみてください。彼は、誕生日ケーキのレシピを持っていた、キッチンは必要あり
原材料:小麦粉、卵、砂糖、バニラジュースを。この同様に、プログラムは、ケーキレシピを作ることである(すなわち、適切なアルゴリズム記載形で)コンピュータ科学者は、プロセッサ(CPU)であり、
そして出発材料は、種々の入力データのケーキです。読み取りレシピを調理プロセスは、様々な原料や焼き菓子や一連のアクションの合計に連れて行きます。
今、コンピュータ科学者の息子が彼の頭は、蜂に刺されたことを言って、泣いて部屋に走っていることを前提としています。コンピュータ科学者は、彼の記録
処理刺されの指示に従って、(プロセスの現在の状態を保存する)それをやった輝くレシピをした後、救急マニュアルを思い付きます。これは、
各プロセスは、我々は一つのプロセスから切り替えるためのプロセッサを参照してここで別の高優先度処理に(医療の実装)(ケーキを作るために)
それ自身の手順(レシピや救急マニュアル)を有しています。蜂刺傷を処理すると、コンピュータ科学者は、彼からケーキを作るために戻ってきた
、それはそうし続ける離れるときステップ。

スレッドコンテキストスイッチの消費量を削減、システムの同時実行、および唯一の欠点同じことをやっての過程で突破口を改善するように見える
Shidaoの同時インプロセス可能。

テキストプログラムは、あなたがキーボード入力を受け入れるために必要があることを前提とし、画面に表示されるコンテンツは、また、あなたのハードドライブに情報を保存する必要があります。のみがある場合は
一つのプロセス、必然的に(あなたが保存すると、あなたはキーボードタイピングを渡すことはできません)だけで恥ずかしい同じことを行うことができ、同じ時間になります。以上の場合
、タスクは、キーボード入力を受信するための責任がある一つのプロセス、および各プロセスタスク、プロセス、プロセスBは、の画面に表示されたコンテンツを担当して
、タスク、プロセスCは、ハードディスクの内容を保存するタスクを担っています。ここでは通信の問題のプロセスに関与するA、B、Cの間のコラボレーションのプロセスが、
物事は-------テキストを持っている必要がある一般的な、パフォーマンスにスイッチング損失をノンストップ。作るためのメカニズムならば
、このような文脈などのタスクA、B、Cの共有リソースは、以下の内容を保存し、復元するために必要なスイッチ、通信を同時に低減することができもたらした
そんなに良く、パフォーマンスの損失に。はい、このメカニズムはスレッドです。

また、軽量プロセスとして知られているスレッドは、それが基本的なCPU実行ユニットは、スレッドID、プログラムによって、プログラム実行処理の最小単位であり
、レジスタセットカウンタと一緒にスタック。スレッドの導入は同時のオペレーティングシステム向上、同時実行手順のオーバーヘッドを低減する
性能を。スレッドには、独自のシステムリソースを持っていません。

プログラムプロセスが有する、少なくとも1つのプロセスを有する少なくとも1つのスレッド(スレッドを処理容器として理解することができる)、
プロセスが大幅プログラムの効率を高める、実装プロセスで別々のメモリユニット、及び共有メモリの複数のスレッドを有しています。
実装プロセスにおけるスレッドとプロセスが異なっています。各エントリには、実行順序の順番別のスレッドが実行されている
終了手続きを。しかし、スレッドは、アプリケーションによって制御される複数の実行スレッドを提供し、用途に応じて存在している必要があり、独立して実行することができません。
プロセスは、プロセスの活動に関するデータの一組で実行特定の別個の機能を有するプログラムが資源配分のためのシステムであり、転写
別々の単位度。
それは、スレッドは、物理的なプロセスであり、CPUスケジューリングとディスパッチの基本単位であります基本単位の処理が独立して動作することができるよりも小さくなっている。スレッドは
、それ自体は基本的にシステムリソースを持っていない、(例えばプログラムカウンタとして、レジスタ、スタックのセット)を必須リソースの操作で唯一時を有するが、
それに属していてもよいですが所有する他のスレッドのプロセス共有リソースの全体のプロセス
のスレッドが作成され、別のスレッドを破壊することができ、同じプロセス内で複数のスレッド間で同時に実行することができます。

あなたが開始どのように多くのスレッドどんなに、あなたは、CPUの数を持っている、Pythonは実行するための一つのスレッドのみを許可すると同時に、冷静の実装になります

threadモジュールの上に構築されたモジュールをスレッド。下糸モジュール、スレッドを処理及び制御するために、元の方法、第二のパッケージによってモジュールを通すための糸、

これは、スレッドに対処するためのより便利なAPIを提供します。

ダイレクトコール:

インポートスレッディング
インポート時間

DEF sayHi(NUM)を:#は、実行するために、各スレッドの関数を定義する

( "ナンバーを実行するON:%S" %NUM)印刷を

time.sleepを(3)

__name__ == '__main__'の場合:

T1 =スレッディング。スレッド(目標= sayhi、引数= (1))#は、 スレッドインスタンス生成
T2 = threading.Thread(目標= sayhi、引数=(2))# 別のスレッドインスタンス生成

t1.startを()#は、スレッド開始
T2を.start()#開始、別のスレッドの

印刷(t1.getName())#取得スレッド名を
プリント(t2.getName())

コールの継承

輸入スレッドの
インポート時


クラスMyThread(threading.Thread):
デフ__init __(自己、NUM):
threading.Thread .__のinit __(自己)
self.num = NUM

デフ(自己)を実行します。#は、それぞれ実行するためのスレッドと関数を定義

印刷( "番号で実行されている:%s" は%のself.num)

time.sleep(3)

__name__ == '__main__' の場合:

T1 = MyThread(1)
T2 = MyThread(2)
t1.start()
t2.start()

プリント( "終了......")

参加&デーモン方法

インポートスレッディング
時間インポートCTIME、スリープからの
インポート時

デフListenMusic(名):

印刷( "%sに聞いて開始します。%s"は%(名前、CTIME()))
睡眠(3)
印刷(%関数ctime() "%sのリスニング終了")

デフRecordBlog(タイトル):

印刷( "%sの記録を開始!%s"は%(タイトル、CTIME()))
睡眠(5)
プリント( '末端記録%s'は%関数ctime())


スレッド= []


T1 = threading.Thread(目標= ListenMusic、引数=( '水手'))
T2 = threading.Thread(目標= RecordBlog、引数=( 'Pythonの线程'))

threads.append(T1)
threads.append(T2)

__name__ == '__main__' の場合:

tはスレッドで用:
#t.setDaemon(真)#注:開始前に設定する必要があります
t.start()
#t.join()
のt1.join()
t1.setDaemon(真)

これら三つの下の位置に参加することを考慮#########のt2.join()?
印刷( "%sのオーバーすべて" %関数ctime())

参加する():子スレッドの実行が完了する前に、子スレッドスレッドの親がブロックされます。

setdaemon(真):

         あなたがデーモンスレッドを設定しない場合、このメソッドは、スタート(呼び出される前に、デーモンスレッドが設定されなければならないとスレッド)が宣言され、プログラムが無制限になりハングアップします。この方法は、基本的なものとは逆に参加します。

         我々はプログラム、メインスレッドの実装を実行すると、彼らは子スレッドを作成する場合は、メインスレッドが完了すると、メインスレッドは、二つの力のメインスレッドと子スレッドは、その後、それぞれが実行して、分割しました

         あなたが終了したい場合は、子スレッドが完了するかどうかをテストします。子スレッドが完了していない場合は、メインスレッドが終了する前に完了するために、子スレッドを待ちます。しかし、時には私たちはメインスレッドである必要があります

         かかわらず、子スレッドが完了するかどうかの、完了し、メインスレッドが終了する必要があります一緒に、あなたはそれを使用することができますは、setdaemon方法

#ファイル名を指定して実行():スレッドのrunメソッドは、スレッドオブジェクトのCPUスケジューリング後に自動的に実行される
)(#開始:スレッドの活動を開始。
#IsAliveのは():スレッドがアクティブで返します。
#関連項目GetNameは():スレッド名を返します。
#のSetNameメソッド():スレッド名を設定します。

:多くの方法を提供するモジュールをスレッド
)#1 threading.currentThreadする(:現在のスレッドの変数を返します。
#Threading.enumerateは():実行中のスレッドのリストを返します。実行を開始、終了する前に、それは開始前と終了後に糸が含まれていないスレッドを指します。
#Threading.activeCountは():実行中のスレッドの数を返します、とlen(threading.enumerate())と同じ結果を持っています。

 

おすすめ

転載: www.cnblogs.com/zhang-da/p/11457438.html
おすすめ