操作系统学习:进程线程与协程

进程VS线程

定义上:

  1. 进程是操作系统分配资源的基本单位
  2. 线程是任务调度和执行的基本单位

上下文切换:

  1. 进程需要切换CPU上下文和页表

    页表是虚拟内存到物理内存的映射表,保证进程间内存隔离和高效内存管理的核心数据结构。

  2. 线程只需要切换CPU上下文

资源共享上:

  1. 进程之间不共享资源,是互相隔离的
  2. 一个进程内的线程共享资源

安全性上:

  1. 一个进程挂掉不会影响其他进程
  2. 一个进程内的线程挂掉会导致进程挂掉

为什么需要线程

进程是分配资源的基本单位,如果需要一个视频播放器软件,需要获取视频文件,解压编码,播放三个功能,如果用单进程实现,会导致不连贯;多进程实现又浪费资源,所以需要一种能共享资源同时可以并发的实体,也就是线程

  1. 线程并发能力强
  2. 切换开销比进程小,只需要cpu切换上下文即可
  3. 通信方便,因为可以共享内存

僵尸进程;孤儿进程;守护进程的区别

  1. 僵尸进程:儿子死了,爸爸没收尸,儿子就成了僵尸
    子进程退出,但是父进程没有调用wait或waitpid挥手,就会导致死亡的进程仍然存在系统进程表里
    危害:占用进程号
  2. 孤儿进程:爸爸没了。
    某个进程的父进程先结束,系统会扫描子进程是否存在,如果有就用init进程调用wait回收。
    对系统无危害
  3. 守护进程:运行在后台的特殊进程,独立于控制终端,周期性地处理事件

写时复制

一个进程fork出子进程的时候,子进程的页表记录还是指向父进程,两者共享内存物理空间

不过如果父进程或者子进程发生写操作,就会触发写保护中断,进行物理内存的复制,然后修改页表的映射

协程

原本线程里的代码跑是需要三部分的

  1. 函数调用栈
  2. 函数执行,入栈,返回,出栈
  3. 操作系统恢复线程,同时保存/恢复线程上下文

协程就是自己用别的方式手动控制模拟出来,比如python里的yeild关键字

所以不需要用户态到内核态到切换,节省了很多资源开销

协程本身是协作式的,协程自身让出执行权,而不是被操作系统调控,减少了开销


操作系统学习:进程线程与协程
http://example.com/2024/06/10/操作系统学习:进程线程与协程/
作者
WoodQ
发布于
2024年6月10日
许可协议