zoukankan      html  css  js  c++  java
  • 2020年1月16日(多进程)

    1. 什么是进程,什么是线程

    1 什么是进程

    把一个程序执行一下,处于执行状态的程序,叫做进程。
    进程里面至少有一个线程,主线程
    不同进程使用的内存资源都是相互独立的,互不影响和干涉。
    操作系统分配资源的最小单位
    进程肯定比线程占用的资源更多一点

    2 什么是线程
    必须处于一个进程内,一个进程里面可以有多个线程,这些线程公用一个进程
    的地址空间(进程可以使用的内存)
    线程是调度的最小单位

    多进程和多线程:实现并发。
    想测试一个接口的压力。如果我用python写了一个程序,单线程的
    那么这个程序会对服务器有很大的压力么?
    没有很大压力,只能模拟单用户访问的情况,无法模拟双11,618。

    并发:同时向服务器发出请求,实现并发请求,并发计算,提升计算的效率。
    1)做个压力测试程序
    2)并发执行一些任务:爬虫

    IO:输入和输出
    针对磁盘io来说:
    输入:从磁盘读取
    输出:写到磁盘里

    针对网络io:
    输入:从网络读取到数据叫做输入
    输出:写数据到网络



    python:既可以多进程也可以支持多线程。
    (多线程无法使用多核cpu的并行计算能力,密集io型)
    (多进程可以使用多核cpu的并行计算能力,密集计算型)

    下个问题:为什么python的多线程不能利用多核cpu
    GIL锁:global interpreter lock 产生很多的同步操作,会减少并发的效果。

    Java 多线程

    什么是同步,异常,阻塞,什么是锁?

    同步:大象放到冰箱里面有几个步骤?

    1 打开冰箱

    2 放进 去大象

    3 关上门

    同步:

    有顺序的:1-3步,顺序不能错乱,且先完成第一步,在第二步,再第三步。

    异步:

    完成的任务是没有前后依赖关系 ,可以同时去执行的,县城完成的顺序也没有关系

    异常执行组件

    1 社区:注册到用户系统之后

    2 10个子系统也需要注册

    3 同步的情况同步的情况:顺序的从1-10完成子系统的注册。可能会耗时1分钟以上。

    4 异常系统 

    1)注册后立刻提示注册成功。  

    2)异常子系统自封以,且顺序(或并发)发给10个子系统,后台完成注册过程。

    4. 进程的几种状态

    1 新建:操作系统给你分配一些资源:进程号、内存

    2 就绪:具备了执行的条件,但是还没有被cpu选中执行

    轮询的是进程

    QQ ,开微信,开浏览器,CPU为了多进程的执行,同一时刻只能够最多执行一个程序。Cpu的轮询:轮询不会停止。CPU该跑哪个进程?怎么跑?跑哪些?

    操作系统的进度操作(调度算法)

    先进先出:你先进先跑你

    后进后出:

    权重:进程时间较长,需要来算

    看不到线程执行

    3 运行:占用cpu资源做计算了

    4 阻塞:等待完成事(读写文件、网络io、挂起、sleep),完成了之后,在转换为就绪

    5 cpu的组成

    运算器(计算)、控制器(控制各种硬件)和寄存器(存数据的)

    6 进程的上下文和进程调度

      cpu会产生中断,进程运算的数据,会存在寄存器里面,开始运算。

      当前进程在寄存器的数据,会保存到内存中。

      其他进程的数据会挪到cpu寄存器中,然后开始计算。

      进程切换,进程的上下文切换。

      关于进程的,存在寄存器中的各种相关数据,叫做上下文。

    7 进程的特点

    动态性:进程有生命周期。

    并发性:多个进程可同存于内存中

    独立性:资源分配和调度的基本单位。

    进程间通讯:两个程序之间进行交互

    制约性:并发进程间存在制约关系

    结构特征:进程由程序块 、数据块、进程控制块三部分组成。

    进程在cpu执行的时候,cpu寄存器存的是进程的上下文。

    cpu中断后,要把当前进程踢出去,那么cpu的寄存器中存储的进程上下文

    会转存到内存中的进程地址空间,等待下一次cpu轮训!

    程序块:代码

    数据块:局部变量、函数变量、命令行参数等

    进程控制块:调用栈、进程状态等。

    什么叫操作系统

    https://item.jd.com/12535621.html

    1. 
    父进程和子进程:
    如果进程A里面生成了一个新的进程B,新的进程B叫做进程A的子进程
    进程A叫进程B的父进程

    2. 多进程本质

    多进程编程本质:某个进程里面创新了一个子进程,来执行不同的任务

    一个或多个子进程来执行不同的任务。

    3. 编写进程的相关代码

    import os

    print ("process no:",os.getpid())

    pid = os.fork() # 创建一个子进程

    print (pid)  #子进程id0

    if pid == 0:

      print ('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))

    else:

      print ('I (%s) just created a child process (%s).' % (os.getpid(), pid))

    print ("*"*50)

    [root@iZ2zejbxp2btn9jh8knipuZ wxh]# python3 a.py

    process no: 30568

    30569

    0

    I (30568) just created a child process (30569).

    **************************************************

    I am child process (30569) and my parent is 30568.

    **************************************************

    import os

    print ("process no:",os.getpid())#此时只有一个主进程(主程序:当前程序)

    pid = os.fork() # 创建一个子进程,在此句存在了2个进程

    #1)主进程:pid变量的值是什么呢?是主进程的pid

    #2)子进程:pid变量的值是什么呢?是0

    #以此语句,会被主进程和子进程同时执行。

    print (pid)  #主进程:主进程pid   #子进程:0

    if pid == 0:#主进程和子进程都会执行此句,满足if的是子进程。

                #打印了一句话,os.getpid()---》子进程的pid

                #os.getppid()----》子进程的父进程pid

      print ('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))

    else:#被主进程触发了,os.getpid()---》主进程的pid

      print ('I (%s) just created a child process (%s).' % (os.getpid(), pid))

    print ("*"*50)#会被主进程打印一遍,子进程也一遍。

    fork那一句才会创建子进程,所以fork那一句和之后的所有语句,才会2个进程同事执行。

    QQ和QQ的群视频就是主进程/子进程的关系(对应的进程为:qq.exe/odapp.exe)。

    必须启动qq才可以使用群视频。如果退出qq自动退出群视频。

  • 相关阅读:
    Single Threaded Execution
    多线程(第三天)
    多线程(第二天)
    IE中float:right单独一行
    web.xml配置
    java调用asmx的webservice
    跨域访问
    jsp页面导入jstl标签
    搜索dwr做即时聊天的时候看到的问题
    LigerUI tree在ie下显示不出来/LigerUI 控件在ie下错乱
  • 原文地址:https://www.cnblogs.com/hzyimen/p/12199653.html
Copyright © 2011-2022 走看看