zoukankan      html  css  js  c++  java
  • 进程基础复习01

    操作系统的作用:

    1,隐藏丑陋复杂的硬件接口,提供良好的抽象接口

    2,管理、调度进程,并且将多个进程对硬件的竞争变得有序。

    程序 是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态概念。
    进程 是程序在处理机上的一次执行过程,它是一个动态的概念。
    程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
    程序是永久的,进程是暂时的。
    注意:同一个程序执行两次,就会在操作系统中出现两个进程,所以
    我们可以同时运行一个软件,分别做不同的事情也不会混乱。

    进程调度=====
    先来先服务调度算法
    短作业优先调度算法
    时间片轮转法
    多级反馈队列:分成好几个层级  最高一级为最高优先级,他执行一个时间片,执行
    完一个时间片 如果没执行完,就给他降一个优先级,接着在执行一个时间片。
    这样短作业会在第一层就执行完,长作业本来就不着急 所以就让他慢慢执行就行。

    进程的并行与并发
    并行:并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(并行必须是多核的)

    并发:并发是指资源有限的情况的下,两者交替轮流使用资源,比如一段路(单核CPU资源)同
    时只能过一个人,A走一段后,让给B,B用完继续给A,交替使用,目的是提高效率。

    同步 异步 阻塞 非阻塞====

    进程的三状态图:创建----》就绪-----》运行-----(三角)遇到阻塞---》回到就绪-----》再走运行----》退出


    同步:(同一时间,只能做一件事情)所谓同步  就是一个任务的完成需要依赖
    另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,
    这是一种可靠地任务序列。要么成功都成功,要么失败都失败,两个任务的状态可以保持一致。
    有一定的先后顺序

     
    异步:(同一时间,能做多件事情) 所谓异步,就是不需要等待被依赖的任务
    完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要
    自己完成了整个任务就算完成了。至于被依赖的任务最终是否正真完成,依赖
    他的任务无法确定,所以他是不可靠的任务序列。

    例子:比如我去银行办理业务,可能会有两种方式:
    同步阻塞  第一种:一直排队等候,中间你不能做其它的事情,这就是同步  
    异步阻塞  第二种:可以选取一张小纸条上面有号码,我不用一直在这里排队等候,可以去做其他事情,等到我的时候,有人过来通知我。

     1 import os
     2 import time
     3 from multiprocessing import Process
     4 def func(args,args2):
     5     print(args,args2)
     6     time.sleep(1)
     7     print("子进程:",os.getpid())
     8     print("子进程的父进程:",os.getppid())
     9     print(12345)
    10 
    11 if __name__== "__main__":  # 在Windows上需要这句话,Linux与mac不需要这句话
    12     p = Process(target=func,args=(54321,"参数"))  # 把func注册到这个进程里 
    13 # (这里是主进程)
    14                                 # 传一个参数 必须得有逗号,args 必须是元祖
    15     # p是一个进程对象,还没有启动进程
    16     p.start()  # 这里是一个子进程
    17     print("*"*10)
    18     print("父进程:",os.getpid(5))  # 查看当前的进程号
    19     print("父进程的父进程:",os.getppid())  # 查看当前进程的父进程
    # 进程的生命周期
    # 主进程
    # 子进程
    # 开启了子进程的主进程:
    # 主进程自己的代码如果长,等待自己的代码执行结束,
    # 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束。
     1 # 多进程当中的方法
     2 
     3 import time
     4 from multiprocessing import Process
     5 
     6 def func(arg1,arg2):
     7     print("*"*arg1)
     8     time.sleep(5)
     9     print("*"*arg2)
    10 
    11 if __name__ == "__main__":
    12     p = Process(target=func,args=(10,20))
    13     p.start()
    14     print("login")
    15     p.join()  # 将异步的程序变成了同步
    16     print("=====:运行完了")
     1 # 开启多个子进程
     2 # import time
     3 # from multiprocessing import Process
     4 #
     5 # def func(arg1,arg2):
     6 #     print("*"*arg1)
     7 #     time.sleep(5)
     8 #     print("*"*arg2)
     9 #
    10 # if __name__ == "__main__":
    11 #     p_list = []
    12 #     for i in range(10):
    13 #         p = Process(target=func,args=(10*i,20*i))
    14 #         p_list.append(p)
    15 #         p.start()
    16 #         for p in p_list:
    17 #             p.join()
    18 #         print("运行完了")
    19 
    20 
    21 import os
    22 import time
    23 from multiprocessing import Process
    24 def func(filename,content):
    25     with open(filename,"w") as f:
    26         f.write(content*"*")
    27 
    28 if __name__ == "__main__":
    29     p_list = []
    30     for i in range(10):
    31         p = Process(target=func,args=("info%s"%i,i))
    32         p_list.append(p)
    33         p.start()
    34     for p in p_list:p.join()  # 这句话的意思,是等待所有进程执行完,
    35                                           # 在执行下面的语句。
    36     print(os.walk(r"E:Python daima3.开启多个子进程.py"))  # 查看当前
    37                                                              #文件夹里的所有文件
     1 # 开启多进程的第二种方式
     2 
     3 # import os
     4 # from multiprocessing import Process
     5 #
     6 # class MyProcess(Process):  #定义一个类 并继承Process
     7 #     def run(self):
     8 #         print(self.pid)   # 进程号
     9 #         print(self.name)  # 当前进程的名字
    10 #         print(os.getpid())  # 查看进程号  pid 与它一样
    11 #
    12 # if __name__ == "__main__":
    13 #     print("主:",os.getpid())
    14 #     p1 = MyProcess()
    15 #     p1.start()
    16 #     p2 = MyProcess()
    17 #     p2.start()
    18 
    19 
    20 # import os
    21 # from multiprocessing import Process
    22 #
    23 # class MyProcess(Process):
    24 #     def run(self):
    25 #         print(self.pid)
    26 #         print(self.name)
    27 #
    28 # if __name__ == "__main__":
    29 #     print("主:",os.getpid())
    30 #     p1 = MyProcess()
    31 #     p1.start()  # 在这调用start方法,就会在start内部创建一个进程,
    32 #                  # 并会把run方法里的内容放到进程中去执行。
    33 #     p2 = MyProcess()
    34 #     p2.start()
    35 # 自定义类(MyProcess) 继承Process类
    36 # 必须实现一个run方法,run方法中是在子进程中执行的代码
    37 
    38 
    39 
    40 # 如何传参数
    41 # import os
    42 # from multiprocessing import Process
    43 # class MyProcess(Process):
    44 #     def __init__(self,arg1,arg2):
    45 #         super().__init__()
    46 #         self.arg1 = arg1
    47 #         self.arg2 = arg2
    48 #
    49 #     def run(self):
    50 #         print(self.pid)
    51 #         print(self.name)
    52 #         print(self.arg1)
    53 #         print(self.arg2)
    54 #
    55 # if __name__ == "__main__":
    56 #     p1 = MyProcess(1,2)
    57 #     p1.start()
    58 #     p2 = MyProcess(3,4)
    59 #     p2.start()
    60 
    61 # 如果需要传参数,你就重写一个__init__方法,并在括号里写上需要传的参数,
    62 #  然后把参数帮给self,不要忘了父类的__init__的方法。
     1 # 进程之间的数据是完全隔离的
     2 import os
     3 from multiprocessing import Process
     4 
     5 def func():
     6     global n
     7     n = 0
     8     print("pid:%s"%os.getpid(),n)
     9 
    10 if __name__ == "__main__":
    11     n = 100
    12     p = Process(target=func)
    13     p.start()
    14     p.join()
    15     print(os.getpid(),n) 
    16 
    17 # 没有 join()
    18 # 5984 100
    19 # pid:22804 0
    20 
    21 # 有 join()
    22 # pid:17472 0
    23 # 23148 100
     1 # 使用多进程实现socket服务端的并发效果
     2 
     3 # client端
     4 import socket
     5 
     6 sk = socket.socket()
     7 sk.connect(("127.0.0.1",8080))
     8 
     9 msg = sk.recv(1024).decode("utf-8")
    10 print(msg)
    11 msg2 = input(">>>").encode("utf-8")
    12 sk.send(msg2)
    13 
    14 sk.close()
    15 
    16 # server端
    17 
    18 import socket
    19 from multiprocessing import Process
    20 def serve(conn):
    21     ret = "你好".encode("utf-8")
    22     conn.send(ret)
    23     msg = conn.recv(1024).decode("utf-8")
    24     print(msg)
    25     conn.close()
    26 
    27 if __name__ == "__main__":
    28     sk = socket.socket()
    29     sk.bind(("127.0.0.1",8080))
    30     sk.listen()
    31     while True:
    32         conn,addr = sk.accept()
    33         p = Process(target=serve,args=(conn,))
    34         p.start()
    35     sk.close()
    36 
    37 # 多进程的方式实现并发了
    38 # 可以开启多个client端
     1 # 守护进程
     2 
     3 import time
     4 from multiprocessing import Process
     5 
     6 def func():
     7     while True:
     8         time.sleep(0.2)
     9         print("我还活着")
    10 
    11 def func2():
    12     print("in func2 start")
    13     time.sleep(8)
    14     print("in func2 finished")
    15 
    16 if __name__ == "__main__":
    17     p = Process(target=func)
    18     p.daemon = True  # 设置子p进程为守护进程
    19     p.start()
    20     p2 = Process(target=func2)
    21     p2.start()
    22     p2.terminate()  # 结束一个子进程
    23     print(p2.is_alive())
    24     time.sleep(1)
    25     print(p2.is_alive())
    26     print(p2.name)
    27     # i = 0
    28     # while i < 5:
    29     #     print("我是socket server")
    30     #     time.sleep(5)
    31     #     i += 1
    32 
    33 # 守护进程 会 随着 主进程的代码执行完毕 而 结束
    34 # 在主进程内结束一个子进程 p.terminate()
    35    # 结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程
    36 # 检验一个进程是否活着的状态 p.is_alive()
    37 # p.name p.pid  进程名字 与进程号
     1 #
     2 # 火车票
     3 import json
     4 import time
     5 from multiprocessing import Process
     6 from multiprocessing import Lock
     7 
     8 def show(i):
     9     with open("ticket") as f:
    10         dic = json.load(f)
    11     print("余票:%s"%dic["ticket"])
    12 
    13 def buy_ticket(i,lock):
    14     lock.acquire()  # 拿钥匙进门
    15     with open("ticket") as f:
    16         dic = json.load(f)
    17         time.sleep(0.1)
    18     if dic["ticket"] > 0:
    19         dic["ticket"] -= 1
    20         print("33[32m%s买到票了33[0m"%i)
    21     else:
    22         print("33[31m%s没有买到票33[0m"%i)
    23     time.sleep(0.1)
    24     with open("ticket", "w") as f:
    25         json.dump(dic, f)
    26     lock.release()  # 还钥匙
    27 
    28 if __name__ == "__main__":
    29     for i in range(10):
    30         p = Process(target=show,args=(i,))
    31         p.start()
    32     lock = Lock()
    33     for i in range(10):
    34         p = Process(target=buy_ticket,args=(i,lock))
    35         p.start()

     # 注:本文是根据老男孩课程内容整理而成的,本文仅供个人笔记使用,如果有侵犯,请联系我,我立即撤销。

  • 相关阅读:
    多线程创建方式四种

    归并排序
    Spark调优之--资源调优、并行度调优
    多线程中的上下文切换
    守护线程和本地线程
    线程和进程的区别
    3. 无重复字符的最长子串
    [蓝桥杯][历届试题]连号区间数
    [蓝桥杯][历届试题]蚂蚁感冒
  • 原文地址:https://www.cnblogs.com/pioneerLee/p/10305910.html
Copyright © 2011-2022 走看看