オペレーティング・システムの開発、同期、非同期の非ブロッキングプロセスをブロック

オペレーティングシステムの開発の歴史

パンチカード

コンピュータルームには、唯一のパンチカードを使用することができ

短所:

  • CPU使用率が低く、

オンラインバッチ

これは、コンピュータ室を使用する複数のユーザーをサポートしています

オフラインバッチ処理システム

高速ディスク:

  • 読み取り速度ファイルを向上させます

利点:

  • CPUの使用率を向上させます

マルチチャネル技術(研究ベースのシングルコア)

  • シングルチャネル:CPUのシリアルを複数用いて
  • マルチチャンネル:
    • 空間多重化:CPUが使用する複数のユーザに提供することができます
    • 時間で多重化:保存のスイッチング状態+

時間多重記述に:

CPUは、IO操作が発生した場合(1)、プログラムはすぐに接続を切断するために、現在のCPU使用権実行され
、高いCPU使用率:利点を

プログラムがCPU時間が長すぎる使用する場合(2)、現在のCPUは直ちに切断プログラムを使用する権利を実行します

短所:実行レート削減プログラム

並行並列

同時:それは実行のように見える、状態は常に+スイッチング保存された複数のプログラムを指し、

パラレル:本当の意味で実行します

プロセス

手順とプロセス:

  • プログラム:コードの束
  • コード実行中のプロセスの束:プロセス

プロセスのスケジューリング:

現代のオペレーティングシステムは次のとおりです。ラウンドロビンキューフィードバック分別法+

  1. FCFSスケジューリング:

    、Bプログラム、プログラムは先着場合、最初のCPUを占有

    短所:最初にプログラムを使用すると、プログラムは、プログラムがCPUの終了後に使用することができ、Bの使用を待つ必要があります

  2. ショートオペレーティング優先スケジュール:

    その短い時間、優先スケジューリング第1のCPUを使用して、Bの手順

    短所:プログラムは最長の時間を使用している場合、Nはあるが、短い時間を使って、あなたがプログラムの終了後にすべての短い時間を使用することができます前に、あなたは待たなければなりません

  3. ラウンドロビン方式

    1秒、NプログラムローディングのCPU実行時間。Nのタイムスライスの第二のアリコートへ

  4. グレーディングフィードバックキュー
    への実行優先度レベルの多層

同期、非同期の非ブロッキングブロッキング

プロセスの三つの状態:

  • レディ状態:全てのプログラムが準備状態に入るために作成され、派遣への準備ができて
  • 状態の実行:プロセススケジューラの後、実行中の状態に入ります
  • ブロッキング状態は:IO操作処理に遭遇した者は、ブロッキング状態に入ります。IO側がレディ状態を再入力する必要がある場合

同期および非同期

これは、タスクの提出を指し、

  • 同期:最初のタスクの提出時に、提出するために必要な2つのタスクは、タスクの実行後に待機しなければならない場合は、提出し、2番目のタスクを実行し続けることができます。

  • 非同期:2つのタスクは、タスクの提出時に、提出するために必要な場合は、待つ必要はありませんし、すぐに提出し、2番目のタスクを実行することができます。

ブロッキングとノンブロッキング

  • 妨害:IOが障害物に遭遇します
  • ノンブロッキング:それは状態を実行している、準備完了状態を指し、

CPUの使用率を向上させる最大化:

不要なIO操作を最小限に抑えます

プロセスを作成します。

作成プロセス

窓は子プロセスを作成し、現在の親プロセスは、コードのリロード後に実行されます

Linuxでは/マックでは、現在の親プロセスは再コピーをし、実行に行きます

2つの方法で子プロセスを作成します。

from multiprocessing import Process
import time

# 定义一个任务
def task(name):
    print(f'{name}的任务开始执行')
    time.sleep(1)
    print(f'{name}的任务已经结束')


if __name__ == '__main__':
    p = Process(target=task, args=('cwz',))
    p.start()
    print('主进程')
    
'''
主进程
cwz的任务开始执行
cwz的任务已经结束
'''

# 自定义一个类,并继承Process
class MyProcess(Process):

    # 父类方法
    def run(self):
        print('开始执行任务')
        time.sleep(1)
        print('结束执行任务')

if __name__ == '__main__':
    p = MyProcess()
    p.start()
    print('主进程')

'''
主进程
开始执行任务
结束执行任务
'''

参加方法を使用します

私は子プロセスが親プロセスの終了後に終了するように、オペレーティングシステムに伝えるために使用されます

from multiprocessing import Process
import time

def task(name):
    print(f'{name} start...')
    time.sleep(2)
    print(f'{name} over...')


if __name__ == '__main__':
    p = Process(target=task, args=('neo', ))
    p.start()   # 告诉操作系统,开启子进程
    p.join()    # 告诉操作系统,结束子进程后,父进程再结束
    print('主进程')
    
    
'''
neo start...
neo over...
主进程
'''

プロセス間のデータが互いに分離されています

from multiprocessing import Process
import time

x = 100
def func():
    print('执行func函数')
    global x
    x = 200


if __name__ == '__main__':
    p = Process(target=func)
    p.start()
    print(x)   # 不能修改x的值
    print('主进程')
    
    
'''
100
主进程
执行func函数
'''

互いに分離プロセス間のデータ:
メインプロセスおよびサブプロセスの間には、独自の名前空間を有します

プロセスオブジェクトのプロパティ

  • p.daemon:Trueに設定されている場合、デフォルト値は、Falseで、Pの代表は、親プロセスpの終了が、またpは終了するバックグラウンドでデーモンを実行であり、真の設定した後、pは、独自の新しいプロセスを作成することはできません必要がありますでp.start()設定する前に
  • p.nameプロセスの名称:
  • p.pid:PIDプロセス
  • p.exitcode:ランタイムなしの処理は、-N場合、(理解する)信号の終了を表すN
  • p.authkey:によってアイデンティティの検証プロセスのキーは、デフォルトのos.urandom()32文字のランダムに生成された文字列。キーは、関連する基本的なネットワーク接続を使用することです
from multiprocessing import Process
from multiprocessing import current_process
import time
import os

def task(name):
    # current_process().pid 获取子进程号
    print(f'{name} start...', current_process().pid)
    time.sleep(2)
    print(f'{name} over...', current_process().pid)


if __name__ == '__main__':
    p = Process(target=task, args=('neo', ))
    p.start()
    print('主进程', os.getpid())
    print('主主进程', os.getppid())


'''
主进程 12576
主主进程 12476
neo start... 7772
neo over... 7772
'''

2つの条件の回復プロセスID:

  • 参加、メインプロセスの子プロセスに再循環させることができます
  • メインプロセスが正常に終了し、子プロセスはメインプロセスにリサイクルされます

ここでの主なプロセスは、Pythonインタプリタを指し、

主はプロセスを指しpycharm

p.is_aliveは、子どもの生存状況を見ることができます

from multiprocessing import Process
from multiprocessing import current_process
import time
import os

def task(name):
    # current_process().pid 获取子进程号
    print(f'{name} start...', current_process().pid)
    time.sleep(2)
    print(f'{name} over...', current_process().pid)


if __name__ == '__main__':
    p = Process(target=task, args=('neo', ))
    p.start()
    # p.join()

    print(p.is_alive())
    p.terminate()  # 直接告诉操作系统,终止子进程
    time.sleep(1)
    print(p.is_alive()) # 判断子进程是否存活
    print('主进程', os.getpid())
    print('主主进程', os.getppid())
    
    
'''
True
False
主进程 10708
主主进程 12476
'''

ゾンビプロセスと孤児プロセス(理解します)

ゾンビプロセス

これは、子プロセスが終了しているが、PID番号があり、破壊されないを指し

ゾンビプロセスは、PID番号、オペレーティングシステムリソースの占有を取り上げます

孤立

子プロセスを指しますが、まだ実行されているが、親プロセスが予期せず終了します。

内部オペレーティングシステムの最適化のメカニズム:自動的に親のなしに子供を回復

デーモン

主要プロセスの終わり、最後に従うことを作成したすべての子プロセスのメインプロセス、および回復を指し、

from multiprocessing import Process
from multiprocessing import current_process
import time

def task(name):
    print(f'{name} start...', current_process().pid)
    time.sleep(3)
    print(f'{name} over...', current_process().pid)
    print('子进程')

if __name__ == '__main__':
    p = Process(target=task, args=('cwz', ))
    p.daemon = True   # True表示该进程是守护进程
    p.start()
    print('主进程')
    
    
'''
主进程
'''

おすすめ

転載: www.cnblogs.com/setcreed/p/11716267.html