台式机&硬件|什么是“进程、线程、协程”?( 二 )



  • 为每个进程提供了一致的地址空间 , 从而简化了存储器管理
  • 保护了每个进程的地址空间不被其他进程破坏
  • 由于进程拥有自己独占的虚拟地址空间 , CPU通过地址翻译将虚拟地址转换成真实的物理地址 , 每个进程只能访问自己的地址空间 。 因此 , 在没有其他机制(进程间通信)的辅助下 , 进程之间是无法共享数据的
    • 以python中multiprocessing为例
    import multiprocessingimport threadingimport 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)=139854202072440Process 0:n=4999950000,id(n)=139854329146064Process 2:n=4999950000,id(n)=139854202072400Process 4:n=4999950000,id(n)=139854201618960Process 3:n=4999950000,id(n)=139854202069320Main:n=0,id(n)=9462720Total time:0.03138256072998047
    变量n在进程p{0,1,2,3,4}和主进程(main)中均拥有唯一的地址空间
    什么是线程 线程-也是操作系统提供的抽象概念 , 是程序执行中一个单一的顺序控制流程 , 是程序执行流的最小单元 , 是处理器调度和分派的基本单位 。 一个进程可以有一个或多个线程 , 同一进程中的多个线程将共享该进程中的全部系统资源 , 如虚拟地址空间 , 文件描述符和信号处理等等 。 但同一进程中的多个线程有各自的调用栈和线程本地存储(如下图所示) 。
    台式机&硬件|什么是“进程、线程、协程”?
    本文插图

    系统利用PCB来完成对进程的控制和管理 。 同样 , 系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中 , TCB中通常包括:
    • 线程标志符
    • 一组寄存器
    • 线程运行状态
    • 优先级
    • 线程专有存储区
    • 信号屏蔽

    和进程一样 , 线程同样有五种状态:初始态、执行状态、等待(阻塞)状态、就绪状态和终止状态,线程之间的切换和进程一样也需要上下文切换 , 这里不再赘述 。
    进程和线程之间有许多相似的地方 , 那它们之间到底有什么区别呢?
    进程 VS 线程