操作系统整理

195 阅读6分钟

进程和线程

概念

  • 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态的概念,竞争计算机系统资源的基本单位

    系统进行资源分配和调度的一个独立单位

  • 线程:是进程的一部分,只有一个线程的进程可以看作是单线程的,拥有多个线程的进程被称为多线程程序,也可以将线程理解为程序(即进程)中的一个执行点,真正在处理机运行的是线程而不是进程

两者关系

  • 一个线程只能属于一个进程,一个进程可以有多个线程
  • 进程是资源分配的最小单位,线程是CPU调度的最小单位
  • 进程之间地址空间是独立的,所以进程间的数据会被存放在不同地方,访问时只能访问自己的地址空间,进程与进程之间不会产生相互影响;资源分配给进程,同一进程的所有线程共享该进程的所有资源,即线程之间的部分地址空间是共享的,他们共享代码段、数据段和堆,所以可能产生数据错乱的问题
  • 单线程的地址空间模型中只有一个栈,多线程中每个线程是独立运行的,所以每个线程都有一个独立的栈,每个线程运行时产生的变量、参数和返回值等都放在与它相关的那个栈中
  • 进程创建和销毁的代价较大,线程则小很多,因为除了栈区其他都是共享的
  • 一个进程挂掉了不会影响其他进程,而线程挂掉了会影响其他线程

加深理解

  • 以多进程形式,允许多个任务同时运行
  • 以多线程形式,允许单个任务分成不同的部分运行
  • 提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源
  • CPU的调度单位是线程,一次只能执行一个线程(当然多核的有几核就能同时执行几个线程),而不是一次执行一个进程
  • 多线程编程无法发挥多核计算机的优势(因此多线程也只是并发执行),只有多进程,即在多核CPU的每一个核上启动一个进程,进程内创建适量线程,这样才能最大限度的使用计算机资源,但也因为进程和进程有各自的内存空间,因此进程间的通信要麻烦的多

img

img

进程和线程理解

进程的三个状态

  • 就绪:进程已经处于准备好运行的状态,即进程已分配到除了CPU以外额所有必要资源,只要再获得CPU,就可立即执行
  • 执行:进程获得CPU,正在执行
  • 阻塞:正在执行的进程由于某些情况,暂时无法继续执行的状态

img

线程间哪些资源共享,哪些不共享

共享

  • 全局变量
  • 静态变量
  • 文件等公用资源

不共享

  • 寄存器

线程安全

每条线程都有自己独立的栈空间,但是他们公用了堆,所以他们可能同时访问同一块内存空间,因此造成数据冲突

进程同步和互斥

进程互斥:解决进程间竞争关系的手段

  • 指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到该占有资源的进程释放该资源

进程同步:解决进程间协作关系的手段

  • 指两个以上进程基于某个条件来协调它们的活动,一个进程的执行依赖于另一个协作进程的消息和信号,当一个进程没有得到来自另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒

进程互斥是一种特殊的进程同步关系,即逐次使用互斥共享资源,也是对进程使用资源次序上的一种协调

进程同步和互斥

  • 异步环境下的一组并发进程有效地共享资源和相互合作过程称为进程间的同步

  • 进程同步四个原则

    • 空闲让进
    • 忙则等待
    • 有限等待(有限等待时间,避免死锁)
    • 让权等待(当进程不能进入临界区时,释放处理机)

临界资源和临界区

  • 临界资源:在同一时间内只能被一个进程占用的资源(例如打印机)
  • 临界区:进程内访问临界资源的代码

对临界资源的访问必须是互斥的,也就是说当临界资源被占用时,另一个申请临界资源的进程会被阻塞,直到该临界资源被释放

死锁

什么是死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

(规范定义:集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的)

产生死锁的四个条件

  • 互斥:一个进程获得了资源其他进程不可获得
  • 请求和保持:进程持有了某资源,同时又在等待其他资源
  • 非抢占:进程获得某资源不可被其他进程抢占
  • 循环等待:进程之间存在一个进程--资源环路,环路上的每个线程都获得某资源,而这个资源又是下一个进程需要获取的

只要有一个条件就不成立,就不会产生死锁

预防死锁

  • 破坏请求条件:资源一次性分配,这样就不会再请求资源了
  • 破坏保持条件:只要有一个资源得不到分配,就不给这个进程分配其他资源
  • 破坏非抢占条件:当某进程获得了部分资源但得不到其他资源,就释放已占有的资源
  • 破坏循环等待:系统给每类资源赋予一个编号,每个进程按编号递增顺序请求资源,释放则相反

避免死锁

预防死锁会损害系统性能,因此我们更多选择避免死锁,在避免死锁的策略中是允许进程动态的申请资源的

系统在进行资源分配之前预先计算资源分配的安全性,若此次分配不会导致系统进入不安全的状态才会分配资源,否则等待 (银行家算法)