进程、线程、协程
异常进程
- 孤儿进程:
- 父进程退出,子进程仍在运行,子进程成了孤儿进程
- 孤儿进程由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.