Post

进程、线程、协程

异常进程

  • 孤儿进程:
    • 父进程退出,子进程仍在运行,子进程成了孤儿进程
    • 孤儿进程由init进程接管
  • 僵尸进程:
    • 子进程退出,父进程没有wait或waitpid,子进程描述还存在进程中,这个子进程就成了僵尸进程

并发、并行

  • 并发:一个CPU通过时间片轮询去调度多个程序,CPU同一时刻只能执行一个程序
  • 并行:多个CPU同一时刻执行多个程序,程序间互不抢占CPU资源。

进程、线程、协程

  • 进程
    • 是操作系统资源分配的基本单元
    • 三种状态:就绪、运行、阻塞
    • 拥有独立的堆栈,进程间数据不共享
    • 场景:CPU密集型
  • 线程(go中没有直接创建线程的操作,go关键字创建的协程依赖于线程)
    • 是CPU调度的基本单位
    • 存在于进程中,一个进程可以有多个线程
    • 共享堆空间、不共享栈空间
    • 由内核完成调度、上下文的切换
    • 场景:IO密集型
  • 协程
    • 用户基于线程去创建,由用户程序去实现调度
    • 共享堆空间、不共享栈空间
  • go协程
    • 本质上是协程,从语言层面上支持了协程
    • 独立的栈,用于保存其运行状态和局部变量
    • 共享堆,通过管道通信
    • 用户态,由GMP调度模型调度
    • 轻量级,开销小
    • go关键字创建

进程间通讯

  • 匿名管道

    • 命令行”
    • 父子进程间通信
  • 命名管道

    • 命令:mkfifo
    • 两个进程间通信
    1
    2
    3
    
    匿名、命名管道本质是在内核中一块缓冲区
    优点:简单方便
    缺点:随机进程生命周期结束而结束
    
  • 消息队列

    • 保存在内核中的消息链表
    • 优点:生命周期随核
    • 缺点:消息不及时
    • 缺点:用户态内核态频繁拷贝,效率低
  • 共享内存

    • 两个进程的一部分虚拟内存共同映射用一个块物理内存
    • 场景:键盘输入,打印进程打印
  • 信号量
    • 实现进程间互斥和同步,并不是实现进程间数据互通
    • 场景:值为1的互斥信号量
    • 场景:值为0的同步信号量
  • 信号
    • 异步通信机制
    • 如:kill
  • socket
    • 不同主机,进程间通信
    • 场景:TCP\UDP
  • 【参考】
    • https://www.cnblogs.com/xiaolincoding/p/13402297.html

线程分类

  • 内核线程:存在于内核态
    • 处理器竞争:可以在全系统范围内竞争处理器资源。
    • 使用资源:内核栈和上下文切换时保持寄存器的空间
    • 调度:调度开销和进程差不多
  • 轻量级线程:抽象于内核线程之上,仅保留上下文信息,和调度程序所需要的统计信息
    • 处理器竞争:与特定的内核线程关联,可以在全系统范围内竞争处理器资源。
    • 使用资源:与父进程共享进程地址空间
    • 调度:由内核管理,像普通进程一样调度
  • 用户线程:由用户创建、调度、同步、销毁,不需要内核参与
    • 处理器竞争:线程间竞争所属进程的资源
    • 使用资源:与所属进程共享进程地址空间和系统资源
    • 调度:由进程实现调度

进程间切换与线程间切换的区别

https://blog.csdn.net/xiangwanpeng/article/details/78196539?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-9-78196539.pc_agg_new_rank&utm_term=%E7%BA%BF%E7%A8%8B%E4%B9%8B%E9%97%B4%E6%80%8E%E4%B9%88%E5%88%87%E6%8D%A2&spm=1000.2123.3001.4430

  • 进程切换
    • 切换虚拟内存,切换页表
    • 刷新页表缓冲
  • 线程切换
    • 切换上下文,寄存器内容换出
  • 参考:
    • https://blog.csdn.net/dan15188387481/article/details/49450491
This post is licensed under CC BY 4.0 by the author.