並行プログラミング - オペレーティング・システム、マルチチャネル技術の歴史、プロセス
オペレーティング・システムの歴史
パンチカード1.1
- 非常に遅い読み出しデータ
- CPU使用率が非常に低いです
- シングルユーザー(コード)を使用して、
1.2バッチ
- 非常に遅い読み出しデータ
- CPU使用率が低く、
- 使用してオンライン(複数のコード)
1.3オフラインバッチ(最新のオペレーティングシステムの設計原則)
- 読み取り速度
- CPU使用率が増加しました
(単球の背景に基づいて)マルチチャネル技術
シングルチャネル:1つの方法(シリアル)
例えば:、CPUを使用する必要性、最初に使用し、B bを使用CPUに、Bを待った後に使い切ります。
マルチチャンネル:GOを割り当てる方法
例えば:、Bの必要性は、(+状態の保存スイッチ)、そしてbは使用されているCPUすることができますが、「IOまたは実行時間が長すぎる」に入るまで、Bを待って、CPU、最初の使用を使用するように、「Bの実装に遭遇しますIOや実行時間は、2つのプログラムが終了するまでに実行権限をCPU」、長すぎます
空間で多重化
CPUを複数使用しています
時間上で多重化
保存状態の切り替え+
①:IO遭遇したプログラムを実行すると、オペレーティングシステムは、権限のCPUの剥奪を実行します。
利点:
CPUの高効率
②:プログラムの実行時間を実行すると、あまりにも長い間、オペレーティングシステムは、許可カップを拒否されます
短所:
低効率化プログラム
並行並列
並行性:このようなAlのみながら道路のセクション上などのリソースを使用して、限られたリソースの両方を交互にターンを指し、AはBを与えるために、期間が終了した後、Bは、Aを介してこの代替使用に行き続ける、改善することを目的と効率
パラレル:人種、実装、両方を意味し、二人は常に彼の前にしています
違い:
並行して実行され、唯一の複数のCPUを並列で達成することができます
並行処理が同時に実行のような擬似的な並列表情で、単一のマルチチャンネルCUP +技術は(も同時パラレル)同時ことができます
プロセス
プロセスとは何ですか?
プロセスは、リソースユニットで実行中のプロセスまたはタスクを指し
プロセスおよび手順の間の差
プログラムコードのちょうど束であるが、むしろプロセスは、プログラムを実行するプロセスを意味します。
プロセスのスケジューリング
①:先着順スケジューリングアルゴリズム
サービスが完了するまで、第1、役立っ来るべき人は、次のサービス
短所:低効率
②:短い運転優先度スケジューリングアルゴリズム
短い時間を実行し、優先度スケジューリングは誰
短所:プログラムの実施につながった長い期間の後に、すべての手続きが完了し、短い時間を待つためにすべての必要性、あなたが行うことができます
③:ラウンドロビン方式
したがって、各プロセスは、レディキューと時間に比例したサービスを享受するための時間に待っていること。ラウンドロビン方式では、CPUのタイムスライスの要求の処理時間は、例えば、数十ミリ秒数百ミリ秒に、固定されたサイズに分割します。プロセスは、スケジュールを選択された後、タイムスライス規定のシステムから実行されますが、タスクを完了するために必要でない場合、それは彼らの自己占有CPUのリリースであり、次のスケジューリングを待って、レディキューの最後に排出されます。同時に、プロセススケジューラは、レディキューに現在のプロセスのスケジューリング行ってきました。
④:マルチレベルフィードバックキュー
同期非同期
同期非同期ぜひ「提出課題」
同期(シリアル):
唯一のタスクの完了に依存するのを待って、別のタスクに依存するタスクの必要性が完了すると、タスクは、このタスクの完了に依存して考えることができる信頼性のシーケンスです。成功に障害が発生したか、失敗した、タスクの2つの状態が一貫することができ、成功しています。
非同期(同時):
タスクの完了に依存するのを待つが、通知は限り彼らは、タスクが完了すると完了して、すぐに実行されるタスクに応じて、完全にどのような仕事のタスクに依存してする必要はありません。最後のタスクは、その使命に応じて、かどうか、本当に完全に依存していたとして、それは信頼性の低いタスクシーケンスであるので、決定することはできません。
ブロッキングとノンブロッキング・
ブロッキング(待機中):
IOはすべて満たさをブロックします。
入力()
time.sleep(3)
出力()
......
ノンブロッキング(ウェイトなし):
すべてのノンブロッキングIOに加え、
プロセスの三つの状態
- レディ状態
- Runnableを
- ブロッキング状態
二つの方法のプロセスで作成
# 方式一:直接调用process
from multiprocessing import Process
import time
def task():
print("start...")
time.sleep(3)
print("end...")
# 注意:要把创建子进程的部分放在 if __name__ == "__main__": 保护起来 否则在import时会造成无限递归
if __name__ == "__main__":
# target=任务 ---> 创建一个子进程
p_obj = Process(target=task)
# start() ---> 告诉操作系统,去创建一个子进程
p_obj.start()
# join() ---> 告诉主进程,等待子进程结束后,再结束
p_obj.join()
print("正在执行当前主进程...")
# 方式二:继承 Process 类,并重写它的 run() 方法来创建进程类,程序创建 Process 子类的实例作为进程。
class MyProcess(Process):
def run(self):
print(f"{self.name}的子进程start...")
time.sleep(3)
print(f"{self.name}的子进程end...")
if __name__ == "__main__":
list1 = []
for line in range(10):
obj = MyProcess()
obj.start()
list1.append(obj)
for obj in list1:
obj.join()
print("主进程...")