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)
- [[email protected] 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 自动退出群视频.
2020 年 1 月 16 日(多进程)
来源: http://www.bubuko.com/infodetail-3382744.html