用户栈内核栈&&池化技术&&死锁相关

来源:互联网 发布:简述php的垃圾回收机制 编辑:程序博客网 时间:2024/05/22 15:18

一、用户栈和内核栈的区别,为什么不用一个栈

  操作系统中,每个进程会有会有两个栈,一个用户栈,一个内核栈,当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容是用户栈的地址,使用用户栈,当进程在内核空间运行时,CPU堆栈指针寄存器里面的内容是内核栈的地址,使用内核栈
  

  1. 内核栈的作用

    1. 保存中断现场,当进程由于中断进入内核态时,系统会把一些用户 态的数据信息保存到内核栈中,当返回到用户态时,取出内核栈中的信息,回复出来,返回到程序原来执行的地方。
    2. 保存操作系统子程序间相互调用的参数,返回值,及子程序的局部变量。
  2. 用户栈的作用

    用户栈是用户进程空间中的一块区域,其主要作用是用于保存用户子程序间相互调用的参数返回值,和局部变量等。

  3. 为什么要有两个栈

    1. 共享原因:
        内核栈的代码和数据是为所有的进程共享的,如果不为每一个进程设置对应的内核栈,那么就不能实现不同进程执行不同的代码
    2. 安全原因:
        如果只有一个栈,那么用户就可以通过修改栈里面的内容来突破内核安全保护。

二、进程池内存池线程池

  1. 池化技术

    一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用。池化技术应用广泛,如内存池,线程池,连接池等等。内存池相关的内容,建议看看Apache、Nginx等开源web服务器的内存池实现。
      由于在实际应用当做,分配内存、创建进程、线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作。因此,当程序中需要频繁的进行内存申请释放,进程、线程创建销毁等操作时,通常会使用内存池、进程池、线程池技术来提升程序的性能。

  2. 线程池:

    线程池的原理很简单,类似于操作系统中的缓冲区的概念,它的流程如下:先启动若干数量的线程,并让这些线程都处于睡眠状态,当需要一个开辟一个线程去做具体的工作时,就会唤醒线程池中的某一个睡眠线程,让它去做具体工作,当工作完成后,线程又处于睡眠状态,而不是将线程销毁。
    进程池与线程池同理。

  3. 内存池:

    内存池是指程序预先从操作系统申请一块足够大内存,此后,当程序中需要申请内存的时候,不是直接向操作系统申请,而是直接从内存池中获取;同理,当程序释放内存的时候,并不真正将内存返回给操作系统,而是返回内存池。当程序退出(或者特定时间)时,内存池才将之前申请的真正内存释放。

三、死锁的概念导致死锁的原因

  可以把死锁定义为一组相互竞争系统资源或进行通信的进程间的“永 久”阻塞。当一组进程中的每个进程都在等待某个事件(典型的情况是等待所请求的资源释放),而只有在这组进程中的其他被阻塞的进程才可以触发该事件,这时就称这组进程发生死锁。因为没有事件能够被触发,所以死锁是永久性的。

  1. 产生死锁的原因主要是:

    1. 因为系统资源不足。

    2. 进程运行推进的顺序不合适。

    3. 资源分配不当等

  2. 导致死锁的4个必要条件:

    1. 互斥条件
      一次只有一个进程可以使用一个资源。其他进程不能访问已分配给其他进程的资源。
    2. 请求与保持条件
      当一个进程等待其他进程时,继续占有已经分配的资源。
    3. 不可剥夺
      不能强行抢占进程已占有的资源。
    4. 循环等待
      存在一个封闭的进程链,使得每个进程至少占有此链中下一个进程所需要的一个资源。
  3. 处理死锁的方法

    1. 预防死锁
      1. 资源一次性分配—>破坏请求和保持条件
      2. 可剥夺资源:即当某进程新的资源未满足时,释放已占有的资源—>破坏不可剥夺条件
      3. 资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反—>破坏环路等待条件
    2. 避免死锁
        预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
    3. 检测死锁
        通过检测机制及时检测出死锁的发生,然后采取适当的措施,将进程从死锁状态中解脱出来
    4. 解除死锁
        当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
      1. 剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
      2. 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等.
  4. 银行家算法

    首先定义了状态和安全状态,系统的状态是指当前进程资源分配的情况。
    安全状态指有一个资源分配序列不会导致死锁当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态中,若是则同意该请求,若否则阻塞该请求。

原创粉丝点击