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自动退出群视频。

猜你喜欢

转载自www.cnblogs.com/hzyimen/p/12199653.html