zoukankan      html  css  js  c++  java
  • 进程的创建 并发 继承 阻塞

    1.进程的创建,都需要有操作系统去管理,重要由操作系统,就有进程的概念.就需要有创建进程的方式,一些操作系统只为一个应用程序设计,比如微波炉中的控制器,一旦启动微波炉,所有的进程都已经存在.e而对于通用系统(跑很多应用程序),需要有系统运行过程中创建或撤销进程的能力,主要分为4种形式创建新的进程

      1.系统初始化(查看进程linux中用朴实命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件,web)

      2.一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等)

      3.用户的交互式请求,而创建一个新进程(如用户双机暴风影音)

      4.一批处理作业的初始化(只在大型机的批处理形同中应用)

    无论哪一种,新进程的创建都是由一个已经存在的进程执行了一个用于创建进程的系统调用而创建;

      1.在unix中改系统调用是:fork,fork会创建一个与父进程一模一样的副本,二者有相同的存储映像,同样的环境字符串和同样的发打开文件(在shell解释器进程中,执行一个命令就会创建一个子进程)

      2在windows中该系统调用是:createProcess,CreateProcess既处理进程的创建,也负责把正确的程序装入新进程.

    关于创建的子进程,unix和windows

      1.相同的是:进程创建后,父进程和子进程有个字不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程的在其地址空间中的修改都不会影响到另一个进程

      2.不同的是:在unix中,子进程的促使地址空间是父进程的一个副本,提示:子进程和父进程是可以有只读的共享内存区的.但对于windows系统来说,从一开始父进程与子进程的地址空间 就是不同的

    2.进程的结束

      1.正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess)

      2.出错退出(自愿,python a.py中a.朋友不存在)

      3.严重错误(非自愿,执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try....execpt

    ...)

      4.被掐进程杀死(非自愿,如kill-9)

    1.process模块介绍

      process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建

    Process([group[,target[,name[,args[,kwargs]]]]]),由该类实例化得到的对象,表示一个子进程中的任务(尚未启动)

    强调:

    1.需要使用关键字的方式来指定参数

    2.args指定的为传给target函数的位置参数,是一个元组 形式,必须由逗号

      我们写一个程序来看看

    当前文件名称为test.py
    # from multiprocessing import Process
    #
    # def func():
    #     print(12345)
    #
    # if __name__ == '__main__': #windows 下才需要写这个,这和系统创建进程的机制有关系,不用深究,记着windows下要写就好啦
    #     #首先我运行当前这个test.py文件,运行这个文件的程序,那么就产生了进程,这个进程我们称为主进程
    #
    #     p = Process(target=func,) #将函数注册到一个进程中,p是一个进程对象,此时还没有启动进程,只是创建了一个进程对象。并且func是不加括号的,因为加上括号这个函数就直接运行了对吧。
    #     p.start() #告诉操作系统,给我开启一个进程,func这个函数就被我们新开的这个进程执行了,而这个进程是我主进程运行过程中创建出来的,所以称这个新创建的进程为主进程的子进程,而主进程又可以称为这个新进程的父进程。
              #而这个子进程中执行的程序,相当于将现在这个test.py文件中的程序copy到一个你看不到的python文件中去执行了,就相当于当前这个文件,被另外一个py文件import过去并执行了。
              #start并不是直接就去执行了,我们知道进程有三个状态,进程会进入进程的三个状态,就绪,(被调度,也就是时间片切换到它的时候)执行,阻塞,并且在这个三个状态之间不断的转换,等待cpu执行时间片到了。
    #     print('*' * 10) #这是主进程的程序,上面开启的子进程的程序是和主进程的程序同时运行的,我们称为异步
    

      上面说了,我们通过主进程创建的子进程是异步执行的,那么我们就验证一下,并且看一下子进程和主进程(也就是父进程)的ID号(讲一下pid和ppid,使用pycharm举例),来看看是否是父子关系。

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/liurenli/p/10083336.html
Copyright © 2011-2022 走看看