一文讲透“进程、线程、协程”( 二 )
由于进程拥有自己独占的虚拟地址空间 , CPU通过地址翻译将虚拟地址转换成真实的物理地址 , 每个进程只能访问自己的地址空间 。 因此 , 在没有其他机制(进程间通信)的辅助下 , 进程之间是无法共享数据的
- 以python中multiprocessing为例
import multiprocessing
import threading
import time
n = 0
def count(num):
global n
for i in range(100000):
n += i
print("Process {0}:n={1},id(n)={2}".format(num, n, id(n)))
if __name__ == '__main__':
start_time = time.time
process = list
for i in range(5):
p = multiprocessing.Process(target=count, args=(i,)) # 测试多进程使用
# p = threading.Thread(target=count, args=(i,)) # 测试多线程使用
process.append(p)
for p in process:
p.start
for p in process:
p.join
print("Main:n={0},id(n)={1}".format(n, id(n)))
end_time = time.time
print("Total time:{0}".format(end_time - start_time))
- 结果
Process 1:n=4999950000,id(n)=139854202072440
Process 0:n=4999950000,id(n)=139854329146064
Process 2:n=4999950000,id(n)=139854202072400
Process 4:n=4999950000,id(n)=139854201618960
Process 3:n=4999950000,id(n)=139854202069320
Main:n=0,id(n)=9462720
Total time:0.03138256072998047
变量n在进程p{0,1,2,3,4}和主进程(main)中均拥有唯一的地址空间什么是线程线程-也是操作系统提供的抽象概念 , 是程序执行中一个单一的顺序控制流程 , 是程序执行流的最小单元 , 是处理器调度和分派的基本单位 。 一个进程可以有一个或多个线程 , 同一进程中的多个线程将共享该进程中的全部系统资源 , 如虚拟地址空间 , 文件描述符和信号处理等等 。 但同一进程中的多个线程有各自的调用栈和线程本地存储(如下图所示) 。
文章插图
系统利用PCB来完成对进程的控制和管理 。 同样 , 系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中 , TCB中通常包括:
- 线程标志符
- 一组寄存器
- 线程运行状态
- 优先级
- 线程专有存储区
- 信号屏蔽
进程和线程之间有许多相似的地方 , 那它们之间到底有什么区别呢?
进程 VS 线程
- 进程是资源的分配和调度的独立单元 。 进程拥有完整的虚拟地址空间 , 当发生进程切换时 , 不同的进程拥有不同的虚拟地址空间 。 而同一进程的多个线程是可以共享同一地址空间
- 线程是CPU调度的基本单元 , 一个进程包含若干线程 。
- 线程比进程小 , 基本上不拥有系统资源 。 线程的创建和销毁所需要的时间比进程小很多
- 由于线程之间能够共享地址空间 , 因此 , 需要考虑同步和互斥操作
- 一个线程的意外终止会影响整个进程的正常运行 , 但是一个进程的意外终止不会影响其他的进程的运行 。 因此 , 多进程程序安全性更高 。
- 一文看懂三星Galaxy S21系列发布会所有亮点
- 主板|主板名字带WiFi和不带有什么区别?一文读懂
- 微软发布新版Sysinternals组件Sysmon 13 可用于恶意软件进程篡改检测
- 一文读懂,书架箱和落地箱到底哪个好?
- 10nm进程受阻,芯片狂人梁孟松出走,中芯国际如何突破困境?
- 录音笔|科技解放生产力 录音笔的智能化进程
- 关闭一个进程 AMD锐龙CPU降温22.5℃
- 有史以来最大升级?一文看懂OriginOS带来的改变
- 超大杯来了!一文看懂OPPO Reno5 Pro+最大升级
- 简单一文教你制作多语言的Qlik Sense应用程序