zoukankan      html  css  js  c++  java
  • 进程、线程、协程

    进程

    进程是系统资源分配的最小单位, 系统由一个个进程(程序)组成。一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。

    • 文本区域存储处理器执行的代码
    • 数据区域存储变量和进程执行期间使用的动态分配的内存;
    • 堆栈区域存储着活动过程调用的指令和本地变量。

    文件描述符表 : 进程每次打开一个文件,系统就会在该进程的用户文件描述符表中分配一个相应的表项,表项的索引返回给该进程,用于标志该文件,这个索引就是常说的文件描述符。每个进程都有它独立的描述符表。

    因此进程的创建和销毁都是相对于系统资源,所以是一种比较昂贵的操作。 进程有三个状态:

    1. 等待态:等待某个事件的完成;
    2. 就绪态:等待系统分配处理器以便运行;
    3. 运行态:占有处理器正在运行。

    进程是抢占式的争夺CPU运行自身,而CPU单核的情况下同一时间只能执行一个进程的代码,但是多进程的实现则是通过CPU飞快的切换不同进程,因此使得看上去就像是多个进程在同时进行。

    通信问题:    由于进程间是隔离的,各自拥有自己的内存内存资源, 因此相对于线程比较安全, 所以不同进程之间的数据只能通过 IPC(Inter-Process Communication) 进行通信共享.

    进程间的通信有:管道、消息队列、共享存储、信号、套接字

    线程

    • 线程属于进程
    • 线程共享进程的内存地址空间
    • 线程几乎不占有系统资源 通信问题:   进程相当于一个容器,而线程而是运行在容器里面的,因此对于容器内的东西,线程是共同享有的,因此线程间的通信可以直接通过全局变量进行通信,但是由此带来的例如多个线程读写同一个地址变量的时候则将带来不可预期的后果,因此这时候引入了各种锁的作用,例如互斥锁等。

    同时多线程是不安全的,当一个线程崩溃了,会导致整个进程也崩溃了,即其他线程也挂了, 但多进程而不会,一个进程挂了,另一个进程依然照样运行。

    • 进程是系统分配资源的最小单位
    • 线程是CPU调度的最小单位
    • 由于默认进程内只有一个线程,所以多核CPU处理多进程就像是一个进程一个核心

    线程和进程的上下文切换

    进程切换分3步:

    1. 切换页目录以使用新的地址空间
    2. 切换内核栈
    3. 切换硬件上下文

    而线程切换只需要第2、3步,因此进程的切换代价比较大

    协程

      Goroutine是一个与其他goroutines 并发运行在同一地址空间的Go函数或方法。一个运行的程序由一个或更多个goroutine组成。它与线程、协程、进程等不同。它是一个goroutine。

      创建的资源少(2K),使用的寄存器少;如同函数的 call/return 一样,有自己的调度器(G-P-M)进行协作式调度(不是抢占式);基于用户态线程执行,切换开销低;

                                                                                                                                         

      https://wudaijun.com/2018/01/go-scheduler/

  • 相关阅读:
    洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树
    洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树
    2017年NOIP普及组复赛题解
    洛谷P3957 跳房子 题解 二分答案/DP/RMQ
    2016年NOIP普及组复赛题解
    2015年NOIP普及组复赛题解
    2014年NOIP普及组复赛题解
    洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
    2013年NOIP普及组复赛题解
    第四章 选择结构(二)
  • 原文地址:https://www.cnblogs.com/linguoguo/p/11561179.html
Copyright © 2011-2022 走看看