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) #子进程id和0
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自动退出群视频。