计算机发展史 进程

Posted zrh-960906

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机发展史 进程相关的知识,希望对你有一定的参考价值。

多道技术

1.空间上的复用: 多个程序共用一套计算机硬件

2.时间上的复用: 切换+保存状态

  1.当一个程序遇到IO操作,操作系统会剥夺该程序的cpu执行权限(提高了cpu的利用率 并且也不影响程序的执行效率)

  2.当一个程序长时间占用cpu 操作系统也会剥夺该程序的cpu执行权限(降低了程序的执行效率)

  并发:看起来像同时运行的就可以
       并行:真正意义上的同时执行
            单核的计算机能不能实现并行,但是可以实现并发

同步异步:表示的是任务的提交方式
        同步:任务提交之后 原地等待的任务的执行并拿到返回结果才走 期间不做任何事(程序层面的    表现就是卡住了)
        异步:任务提交之后 不再原地等待 而是继续执行下一行代码(结果是要的  但是是用过其他方式    获取)

阻塞非阻塞:表示的程序的运行状态
        阻塞:阻塞态
        非阻塞:就绪态 运行态

创建进程的两种方式

# 创建进程会将代码以模块的方式从上往下执行一遍
方式一
from multiprocessing import Process
import time
def test(name):
    print(%s%name)
    time.sleep(1)
    print(hi)
if __name__ == __main__:  #在创建进程时,在if __name__ == ‘__main__‘:内创建
    p = Process(target=test,args=(egon,))  #创建一个进程对象
    p.start()  #告诉操作系统,要创建一个进程
    time.sleep(1)
    print(hello)
方式二
from multiprocessing import Process
import time
class MyClass(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def test(self):
        print(%s%self.name)
        time.sleep(1)
        print(hi)
if __name__ == __main__:
    p = MyClass(egon)
    p.start()
    p.test()
    print(gun)

join方法是先执行完子程序之后. 在执行主程序

from multiprocessing import Process
import time
def test(name,i):
    time.sleep(i)
    print(hello)
if __name__ == __main__:

    # p_list = []
    # for i in range(3):
    #     p = Process(target=test,args=(‘进程‘,i))
    #     p.start()
    #     p_list.append(p)
    # for p in p_list:
    #     p.join()
    # print(‘gun‘)

    p = Process(target=test,args=(egon,1))
    p1 = Process(target=test,args=(jason,2))
    start_time = time.time()
    p.start()
    p1.start()
    p.join()
    p1.join()
    print(hi)
    print(time.time()-start_time)

进程对象的其他方法

from multiprocessing import Process,current_process
import os
import time
def test(name):
    print(%s%name,current_process().pid,子进程%s%os.getpid(),父进程%s%os.getppid())
    time.sleep(2)
    print(hello)
if __name__ == __main__:
    p = Process(target=test,args=(egon,))
    p.start()
    time.sleep(1)
    p.terminate()  # 杀死当前进程,本质是让操作系统帮你去杀死一个进程
    time.sleep(1)
    print(p.is_alive())  # 判断进程是否存活
    print(gun)

僵尸进程与孤儿进程
    
父进程回收子进程资源的两种方式
       1.join方法
       2.父进程正常死亡
 所有的进程都会步入僵尸进程
              
  孤儿进程
        子进程没死 父进程意外死亡           
          针对linux会有儿童福利院(init) 如果父进程意外死亡他所创建的子进程都会被福利院收养

守护进程

from multiprocessing import Process
import time
def test(name):
    print(%s%name)
    time.sleep(1)
    print(%s%name)
if __name__ == __main__:
    p = Process(target=test,args=(egon,))
    p.daemon = True   # 将该进程设置为守护进程
    p.start()
    time.sleep(1)
    print(bye)

互斥锁
        当多个进程操作同一份数据的时候 会造成数据的错乱
        这个时候必须加锁处理
            将并发变成串行
                虽然降低了效率但是提高了数据的安全
            注意:
                1.锁不要轻易使用 容易造成死锁现象
                2.只在处理数据的部分加锁 不要在全局加锁
        
        锁必须在主进程中产生 交给子进程去使用

from multiprocessing import Process,Lock
import time
import json
def search(i):
    with open(data,r,encoding=utf-8)as f:
        data = f.read()
    t_d = json.loads(data)
    print(用户%s查询余票%s%(i,t_d.get(ticket)))
def buy(i):
    with open(data,r,encoding=utf-8)as f:
        data = f.read()
    t_d = json.loads(data)
    time.sleep(1)
    if t_d.get(ticket) > 0:
        t_d[ticket] -= 1
        with open(data,w,encoding=utf-8)as f:
            json.dump(t_d,f)
        print(抢票成功)
    else:
        print(没票了)
def run(i,mutex):
    search(i)
    mutex.acquire()  # 抢锁
    buy(i)
    mutex.release()  #释放锁
if __name__ == __main__:
    mutex = Lock()   #生成一把锁
    for i in range(10):
        p = Process(target=run,args=(i,mutex))
        p.start()

data文本文档
"ticket": 0

 

以上是关于计算机发展史 进程的主要内容,如果未能解决你的问题,请参考以下文章

并发编程

(VIP-朝夕教育)2021-05-27 .NET高级班 12-异步专题(发展史,多线程,多进程,协程,单线程非阻塞)

并发编程基础之进程

进程线程协程篇

进程join方法守护进程互斥锁

进程的理论