08_01、进程
一、进程的理论
1、什么是进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
狭义定义:进程是正在运行的程序的实例(an instance of a computer program that is being executed)。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
2、进程的概念
- 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
- 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
线程:真正干活的人,而进程不是真正干活的人 一个进程中可以开多个线程 '''一个进程中至少要有一个线程''' # 进程和线程全部都是有操作系统来调度的 ps: 协程(程序员来调度的) # 进程 >>> 线程 >>> 协程 补充: ''' CPU的工作机制: 1. 当程序遇到i/o的时候,cpu会自动剥夺执行权限 i/o: 又称为i/o密集型,i: input, o:output import time print(123) time.sleep(3) print(1) 计算密集型:需要消耗CPU资源 2. 当程序占用时间过长的时候,也会剥夺执行权限 '''
二、进程的并行和并发
并行:是同一时刻,执行任务
并发:在一段时间内,看似同时执行
高并发:在一段极小的时间段内,涌进大量的任务。
""" 注意: 1. 单核CPU能不能实现并行? 肯定不行。 2. 在双十一时,淘宝的大量用户佣金网站,是并行还是并发? 并发 # 总结:要想实现并行,CPU必须具备多核。 """
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
三、同步和异步、阻塞和非阻塞
1、同步、异步
同步,就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
异步,是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列。
2、阻塞、非阻塞
阻塞,是除了等待消息通知之外不能做其它的事情
非阻塞, 等待消息通知时,可以同时做自己的事情
3、阻塞、非阻塞 和 同步、异步的区别
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
4、四种状态的效率问题:
1. 同步阻塞:效率最低的
2. 同步非阻塞
3. 异步阻塞
4. 异步非阻塞:效率是最高的
四、如何开启进程
from multiprocessing import Process def write_file(): with open('a.txt', 'w', encoding='utf-8') as f: f.write('hello') # 主动开启进程执行这个任务 '''注意事项:在windows系统中,开启进程必要要写在__main__中''' if __name__ == '__main__': # 1. 实例化进程对象 p = Process(target=write_file) # 2. 对象调用方法,真正的开启进程 p.start()
五、Process类中的参数使用
from multiprocessing import Process def write_file(a, b, c, name, age): # with open('a.txt', 'w', encoding='utf-8') as f: # f.write('hello') print('a: ', a) print('name: ', name) # 主动开启进程执行这个任务 '''注意事项:在windows系统中,开启进程必要要写在__main__中''' if __name__ == '__main__': # 1. 开启进程 ''' name=None, 用来修改进程名称 args=(), kwargs={} 参数 ''' p = Process(target=write_file, name='aaaaaa', args=(1, 2, 3), kwargs={'name':'ly', 'age':19}) # 2. 真正的开启进程 p.start() print(p.name) # Process-1 进程名称
六、Proces类的属性和方法
from multiprocessing import Process def write_file(a, b, c, name, age): # with open('a.txt', 'w', encoding='utf-8') as f: # f.write('hello') import time time.sleep(100) print('a: ', a) print('name: ', name) # 主动开启进程执行这个任务 '''注意事项:在windows系统中,开启进程必要要写在__main__中''' if __name__ == '__main__': # 1. 开启进程 ''' name=None, 用来修改进程名称 args=(), kwargs={} ''' p = Process(target=write_file, name='aaaaaa', args=(1, 2, 3), kwargs={'name':'ly', 'age':19}) # 2. 真正的开启进程 p.start() # print(p.name) # Process-1 进程名称 print(p.pid)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通