一. 什么是进程
一个正在运行的程序称之为进程
是一种抽象概念 表示一个执行某件事情的过程
进程的概念 起源于操作系统
二.多道技术
1空间复用
内存分割为多个区域 每个区域存储不同的应用程序
2时间的复用
1当一个程序遇到了I/O操作时 会切换到其他程序(切换钱需要保存当前运行状态 一边恢复执行)| 属于提高效率
2当你的应用程序执行时间过长 操作系统会强行切走 以保证其他程序也能正常运行
当然因为cpu速度非常快 用户感觉不到 |属于降低效率
3有一个优先级更高的任务需要处理 此时也会切走 |属于降低效率
CPU我们控制不了 我们只能控制编程程序时候减少I/O操作来提升效率
总的来说 有了多道技术之后 操作系统可以同时运行多个程序吧 这种情形称之为并发
但是本质好 这些程序还是一个一个排队执行
三 程序执行类型
并发
在同一个时间段内 发生的多个事情
并行
在同一时刻 同时进行多个事情(计算机存在多核的情况下会发生并行)
串行
许多任务排队执行
阻塞问题
第一个任务没执行完 第二个只能等待
此时不叫阻塞 因为CPU执行权还在手里 依然在执行你的代码
第一个任务做不下去 i/o操作 此时就是阻塞 因为cpu被分配给其他进程
总结一下:只要还拥有cpu的执行权 就不叫阻塞
四 进程和程序的区别
程序是什么?
1 本质就是一堆代码
2 一个车光绪正在被操作系统读取并执行 就变成了进程
一个程序只能有一个进程吗?
可以 启动一次就产生一个进程 当然可以用代码控制是否允许多进程
启动进程的方式
1.系统初始化 会产生一个根进程
2.用户的交互请求 鼠标双击某个程序
3.在一个进程中 发起了系统调用启动了另一个进程 ******
4.批处理作业开始 某些专用计算机可能还在使用
不同操作系统创建进程的方式不同
unix < centos mac linux
完全拷贝父进程的所有数据 子进程可以访问父进程的数据吗?不可以 但是可以访问拷贝过来数据副本
windows
创建子进程 加载父进程中所有可执行的文件
五.python如何使用多进程 ******
1.直接创建Process对象 同时传入要做的事情就是一个函数
2.创建一个类 继承自Process 把要做的任务放在run方法中
1from multiprocessing import Process
def task(name):
print(name," running")
time.sleep(3)
print(name," stop")
print(__name__)
# windows 开启子进程 必须放到if中 只要你的开启子进程的代码处于全局 范围 你就应该放到if判断中
if __name__ == '__main__':
# 为毛创建进程 为了帮父进程做事情
# 1.创建一个进程对象 需要传入你要做的任务 就是一个函数对象
p = Process(target=task,kwargs={"name":"jerry"})
# 2.启动它
p.start()
print(id(p))
print("我是主程序我的pid:%s 我的父进程是:%s" % (os.getpid(),os.getppid()))
print("我有一个儿子是 %s" % p.pid)
2from multiprocessing import Process
class MyProcess(Process):#procee内部有 run函数执行start时就会调用
# 当进程被执行时 其实执行的就是run函数
def run(self):
print("这是 run被执行了!")
def ttt():
print("11111")
if __name__ == '__main__':
mp = MyProcess()
mp.start()
p = Process(target=ttt)
p.start()
六.父进程与子进程间的执行顺序 ******
# 主进程一定是先是
# 一旦启动子进程 后续的代码就并发 没有先后顺序
6.1为什么要加if __name__ == '__main__':
父进程中所有可执行文件加载就需要导入而导入时如果有创建新进程的代码,
新进程又会执行导入,将导致循环导入所以windows必须加桑if __name__ == '__main__':
来保证与进程导入父进程代码是不会创建新的进程
from multiprocessing import Process
import time
def task(name):
print("%s start" % name)
time.sleep(3)
print("%s stop" % name)
if __name__ == '__main__':
p = Process(target=task,args=("jerry",))
p.start()
print("我是主进程!!!")
time.sleep(5)
print("我是主进程!!! over")
七 .常用属性
start 开启进程
join 父进程等待子进程
name 进程名称
is_alive是否存活
terminate 终止进程
pid 获取进程id
八.僵尸进程与孤儿进程
僵尸进程
一个进程任务执行完就死亡了 但是操作系统不会立即将其清理 为的是 开启这个子进程的父进程可以访问到这个子进程的信息
这样的 任务完成的 但是没有被操作系统清理的进程称为僵尸进程 越少越好
孤儿进程 无害!
没有爹的称为孤儿
一个父进程已经死亡 然而他的子孙进程 还在执行着 这时候 操作系统会接管这些孤儿进程