操作系统学习:进程线程与协程
进程VS线程
定义上:
- 进程是操作系统分配资源的基本单位
- 线程是任务调度和执行的基本单位
上下文切换:
- 进程需要切换CPU上下文和页表
页表是虚拟内存到物理内存的映射表,保证进程间内存隔离和高效内存管理的核心数据结构。
- 线程只需要切换CPU上下文
资源共享上:
- 进程之间不共享资源,是互相隔离的
- 一个进程内的线程共享资源
安全性上:
- 一个进程挂掉不会影响其他进程
- 一个进程内的线程挂掉会导致进程挂掉
为什么需要线程
进程是分配资源的基本单位,如果需要一个视频播放器软件,需要获取视频文件,解压编码,播放三个功能,如果用单进程实现,会导致不连贯;多进程实现又浪费资源,所以需要一种能共享资源同时可以并发的实体,也就是线程
- 线程并发能力强
- 切换开销比进程小,只需要cpu切换上下文即可
- 通信方便,因为可以共享内存
僵尸进程;孤儿进程;守护进程的区别
- 僵尸进程:儿子死了,爸爸没收尸,儿子就成了僵尸
子进程退出,但是父进程没有调用wait或waitpid挥手,就会导致死亡的进程仍然存在系统进程表里
危害:占用进程号 - 孤儿进程:爸爸没了。
某个进程的父进程先结束,系统会扫描子进程是否存在,如果有就用init进程调用wait回收。
对系统无危害 - 守护进程:运行在后台的特殊进程,独立于控制终端,周期性地处理事件
写时复制
一个进程fork出子进程的时候,子进程的页表记录还是指向父进程,两者共享内存物理空间
不过如果父进程或者子进程发生写操作,就会触发写保护中断,进行物理内存的复制,然后修改页表的映射
协程
原本线程里的代码跑是需要三部分的
- 函数调用栈
- 函数执行,入栈,返回,出栈
- 操作系统恢复线程,同时保存/恢复线程上下文
协程就是自己用别的方式手动控制模拟出来,比如python里的yeild关键字
所以不需要用户态到内核态到切换,节省了很多资源开销
协程本身是协作式的,协程自身让出执行权,而不是被操作系统调控,减少了开销
操作系统学习:进程线程与协程
http://example.com/2024/06/10/操作系统学习:进程线程与协程/