当前位置: 首页 > news >正文

网站建设服务ysaigo企业网站快速排名

网站建设服务ysaigo,企业网站快速排名,黄页88网,网站前端设计培训layout: post title: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 description: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 tag: 八股总结 文章目录操作…

layout: post
title: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
description: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
tag: 八股总结


文章目录

  • 操作系统概述
      • 冯诺依曼计算机体系结构?
  • 内存分层体系
    • 地址空间与地址生成
      • 逻辑地址与物理地址的区别与联系
      • 操作系统在对内存进行管理的时候需要做些什么?
      • 虚拟内存的目的是什么?
      • 内存覆盖技术是什么?有什么特点?
      • 内存交换技术是什么?有什么特点?什么时候会进行内存的交换?
      • 虚拟内存管理技术(虚存技术)是什么?
      • 抖动是什么?或者说颠簸现象
      • 什么是快表?
      • 地址转换中,有快表和没快表的区别是什么?
      • 内存碎片与外部碎片
      • 如何消除碎片文件
      • 为什么分段式存储管理有外部碎片而无内部碎片?为什么固定分区分配有内部碎片而不会有外部碎片?
  • 进程、线程、协程
    • 概念
      • 进程的生命周期
      • 进程、线程和协程的区别和联系
      • 线程和进程的区别
      • 一个进程可以创建多少线程,和什么有关?
      • 什么时候用多线程,什么时候用多进程?
      • 怎么回收线程?有哪些方法?
      • 服务器高并发的解决方案你知道多少?
    • 进程调度与通信
      • 进程调度算法
      • 优先级反转
      • Linux下进程间的通信方式?
      • 守护进程、僵尸进程和孤儿进程
      • Linux下同步机制?
      • 哲学家进餐问题
      • 介绍一下几种典型的锁?
      • 你知道哪几种线程锁?
      • 原子操作是如何实现的
      • 死锁产生原因和条件
      • 死锁处理方法
      • 银行家算法
      • 死锁检测
      • 死锁恢复
  • 中断与异常
      • Linux中异常和中断的区别与联系
  • Linux指令
    • 网络与防火墙
      • 网络端口
      • 防火墙
    • 进程管理
      • 查看进程状态
      • 杀死进程kill
      • 端口号查询进程号(PID)netstat 或 lsof
      • 进程监控TOP

操作系统概述

冯诺依曼计算机体系结构?

存储器、计算器、控制器、输入输出设备

内存分层体系

地址空间与地址生成

逻辑地址与物理地址的区别与联系

  • 物理地址:是硬件支持的、固定的地址空间
  • 逻辑地址:一个运行的程序所拥有的内存范围
  • 联系:两者可以通过CPU中的MMU(Memory Management Unit,内存管理单元)进行映射。应用程序中的变量和代码中的逻辑地址通过编译器分配和生成,这期间可能经过了多种编译转换,如C语言编译器,汇编语言编译器,等等。

操作系统在对内存进行管理的时候需要做些什么?

  • 操作系统负责内存空间的分配与回收
  • 操作系统需要提供某种技术从逻辑上对内存空间进行扩充
  • 操作系统需要提供地址转换功能,负责程序的逻辑地址与物理地址间的转换。
  • 操作系统需要提供内存保护功能,保证各个进程在各自存储空间内运行,互不干扰。

虚拟内存的目的是什么?

  • 虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存,从而让程序获得更多的可用内存。

  • 为了更好的管理内存,操作系统将内存抽象成地址空间,每个程序拥有自己的地址空间,这些地址空间被分割为多个块,每一块称为一页。

  • 这些页被映射到物理内存,但是不需要映射到连续的物理内存,也不需要所有的页都在物理内存中,当程序引用到不在物理内存中的页时,再由硬件执行必要的映射,将缺失的部分装入物理内存并重新执行访问指令。

内存覆盖技术是什么?有什么特点?

由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成为一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按照调用关系分段,首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统将其调入覆盖区,替换覆盖区中原有的段。

覆盖技术的特点:是打破了必须将一个进程的全部信息装入内存后才能运行的限制,但当同时运行程序的代码量大于主存时仍不能运行,再而,大家要注意到,内存中能够更新的地方只有覆盖区的段,不在覆盖区的段会常驻内存。

内存交换技术是什么?有什么特点?什么时候会进行内存的交换?

交换(对换)技术的设计思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘间动态调度)

换入:把准备好竞争CPU运行的程序从辅存移到内存。 换出:把处于等待状态(或CPU调度原则下被剥夺运行权力)的程序从内存移到辅存,把内存空间腾出来。

内存交换通常在许多进程运行且内存吃紧时进行,而系统负荷降低就暂停。例如:在发现许多进程运行时经常发生缺页,就说明内存紧张,此时可以换出一些进程;如果缺页率明显下降,就可以暂停换出。

虚拟内存管理技术(虚存技术)是什么?

  • 虚存技术能像覆盖技术那样不把所有内容都放在内存中,但它无须程序员干涉。
  • 能像交互技术那样,实现进程在内存与外存之间的交换,可用做得更好,只对进程的的部分内容在内存和外存之间交换。

大部分虚拟存储系统都采用虚拟页表存储管理技术,在基本页式管理基础上,增加了请求调页和页面置换功能。其基本思路是:
当一个用户程序调入内存运行时,不是将该程序的所有页面都装入内存,而是装入部分的页面即可启动程序。运行过程中,如果发现运行程序要访问的数据不在内存,则向系统发出缺页中断请求,系统在处理这个中断时,将外存中相应的页面调入内存。

虚存管理的常用页面置换算法有:

  • 最优页面置换算
  • 先进先出算
  • 最久未使用算法(LRU缓存)
  • 时钟页面置换算法
    在这里插入图片描述

抖动是什么?或者说颠簸现象

刚刚换出的页面马上又要换入内存,刚刚换入的页面马上又要换出外存,这种频繁的页面调度行为,会持续触发缺页中断,使得进程运行的速度变得很慢,这种状态被称为抖动,或颠簸。产生抖动的主要原因是进程频繁访问页面数目高于可用物理块数(分配给进程的物理块不够)

为进程分配的物理块太少会使得进程发生抖动现象。为进程分配的物理块太多,又会降低系统整体的并发度,降低某些资源的利用率。

在这里插入图片描述

什么是快表?

快表,又称 转换转换后备缓冲表(Translation Look-aside Buffer,TLB),是一种访问速度比内存快很多的高速缓冲存储器,用来存放当前访问的若干表项,以加速地址转换的过程,与此对应,内存中的页表常称为慢表。

页表可能非常大,导致访问一个内存单元需要两次内存访问(一次用于获取页表项(因为页表也在内存中),一次用于访问数据)。

TLB快表,利用缓存的思想,将经常使用的页表项存在TLB缓冲(动态内存),从而缩减了页表查询的耗用时间。

地址转换中,有快表和没快表的区别是什么?

在这里插入图片描述

内存碎片与外部碎片

  • 内碎片:分配给某些进程的内存区域中有些部分没用上,常见于固定分配方式
  • 外碎片:内存中某些空闲区,由于比较小,而难以利用上。

如何消除碎片文件

对于外部碎片,通过紧凑技术消除,就是操作系统不时地对进程进行移动和整理,但是这需要动态重定位寄存器的支持,且相对费时,紧凑地过程实际上类似于Windows系统中磁盘整理程序,只不过后者是对外存空间的紧凑。

解决外部内存碎片问题的方法就是内存交换
例如可以把音乐程序占用的那256MB内存写到硬盘上,然后再从硬盘上读回来到内存里。不过再读回的时候,我们不能装载回原来的位置,而是紧紧跟着已经被占用的512MB内存后边,这样就能空缺出连续的256MB空间,于是新的200MB程序就可以转载进来。

回收内存时,尽可能将相邻的空闲空间合并。

为什么分段式存储管理有外部碎片而无内部碎片?为什么固定分区分配有内部碎片而不会有外部碎片?

分段式分配是按需分配,而固定式分配是固定分配的方式。

进程、线程、协程

概念

进程的生命周期

  1. 进程创建:引起进程创建的3个主要方式:
    • 系统初始化
    • 用户请求创建一个新进程
    • 正在运行的进程执行了创建进程的系统调用
  2. 进程运行:CPU内核选择一个就绪的进程,让他占用处理机并执行
  3. 进程等待(阻塞):在某些情况下,进程可能没有办法直接运行,进程只能自己阻塞直接,因为只有进程自身才能知道何时需要等待某种事件的发生。
    • 请求并等待系统服务,因为无法马上完成
    • 启动某中操作,因为无法马上完成
    • 需要的数据,没有到达
  4. 进程唤醒:被阻塞的进程需要的资源可被满足或者阻塞进程等待的事件到达时,进程被唤醒(进程只能被别的进程或OS唤醒
  5. 进程结束:以下情况进程结束
    • 正常退出(自愿的)
    • 错误退出(自愿的)
    • 致命错误(强制性的)
    • 被其他进程杀死(强制性的)

进程、线程和协程的区别和联系

在这里插入图片描述

  • 进程:是资源调度的基本单位,一个可执行程序会创建一个或多个进程,进程就是运行起来的可执行程序。
  • 线程:是程序执行的基本单位,是轻量级的进程,每个进程中都有唯一的主线程,且只能有一个,主线程和进程是相互依存的关系,主线程结束,进程也会结束。
  • 协程:是用户态的轻量级线程,是线程内部调度的基本单位,使用协程无操作系统切换,只需要保存自己的寄存器和栈的上下文,因此切换速度非常快。

线程和进程的区别

  • 调度 :进程是资源分配和拥有的基本单位(打开文件、堆、静态区、代码段等);线程则是调度的基本单位(状态码,通用寄存器,线程栈,栈指针)
  • 并发性:一个进程内可以多个线程并发(最好和CPU核数相等);多个进程可以并发。
  • 拥有资源:线程不拥有系统资源,但一个进程的多个线程可以共享隶属进程的资源;进程是拥有资源的独立单位。
  • 系统开销:线程创建销毁只需要处理PC值,状态码,通用寄存器值,线程栈及栈指针即可;进程创建和销毁需要重新分配及销毁task_struct结构。

一个进程可以创建多少线程,和什么有关?

这个要分不同系统去看:

  • 如果是32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
  • 如果是64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。

顺便多说一句,过多的线程将会导致大量的时间浪费在线程切换上,给程序运行效率带来负面影响,无用线程要及时销毁。

什么时候用多线程,什么时候用多进程?

  • 频繁修改:需要频繁创建和销毁的优先使用多线程
  • 计算量:需要大量计算的优先使用多线程,因为需要消耗大量的CPU资源且切换频繁,所以多线程好一点。
  • 相关性:任务相关性比较强的用多线程,相关性比较弱的用多进程,因为线程之间的数据共享和同步比较简单。
  • 多分布:可能要拓展到多级分布的用多进程,多核分布的用多线程。

实际中更常见的是进程加线程结合的方式,并不是非此即彼的。

怎么回收线程?有哪些方法?

  • 等待线程结束:主线程调用 int pthread_join(pthread_t tid, void* retval),等待子线程退出并回收其资源,类似于进程中wait/waitpid回收僵尸进程,调用pthread_join的线程会被阻塞

    • tid:创建线程时通过指针得到的tid的值
    • retval:指向返回值的指针
  • 结束线程:子线程执行void pthread_exit(void* retval),用来结束当前线程并通过retval传递返回值,该返回值可以通过pthread_join获得。

  • 分离线程:主线程、子线程均可调用int pthread_detach(pthread_t tid)主线程、子线程均可调用。其中主线程的参数是要分离的子线程的id,子线程结束的是自己本身。调用后和主线程分离,子线程结束后立即回收资源。

服务器高并发的解决方案你知道多少?

  • 应用数据与静态资源分离:将静态资源(图片、视频、js、css等)单独保存到专门的静态资源服务器中,在客户端访问的时候从静态资源服务器
    中返回静态资源,从主服务器中返回应用数据。
  • 客户端缓存:因为效率最高,消耗资源最小的就是纯静态的HTML页面,所以可以把网站上的页面尽可能用静态的来实现,在页面过期或者有数据更新之后再将页面重新缓存。或者先生成静态页面,然后用ajax异步请求获取动态数据。
  • 集群和分布式:(集群是所有服务器都有相同的功能,请求哪台都可以,主要起分流的作用,分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要使用多台服务器,起到加快请求处理的速度)。使用服务器集群和分布式架构,同时加快请求的处理速度
  • 反向代理:在访问服务器的时候,服务器通过别的服务器获取资源或结果返回给客户端。

进程调度与通信

进程调度算法

  1. 先来先服务:
    非抢占式的调度算法,按照请求的顺序进行调度。
    有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

  2. 短作业优先
    非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
    长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

  3. 最短剩余时间优先
    最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

  4. 时间片轮转
    将所有就绪进程按 FCFS(先来先服务) 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实时性就不能得到保证。

在这里插入图片描述

  1. 优先级调度
    为每个进程分配一个优先级,按优先级进行调度。
    为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。

  2. 多级反馈队列
    一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。
    多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,…。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
    可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

优先级反转

在下图的例子中,T1-T3优先级依次下降,T3从t1到t2后执行了访问共享资源,但此时到t3时刻被优先级更高的T1进程打断,转而执行T1,T1执行到t4时刻,发现自己也需要刚刚T1访问的那个恭喜资源,于是切换为T3,让它释放那个占用的共享资源,但是在释放期间t5时刻,T1被优先级更高的T2再次打断,转而执行T2,等待T2执行完毕,才会到T3释放共享资源,释放完毕后,执行T1。这期间,优先级更低的T2抢在了优先级更高的T1之前完成了任务,称为优先级反转。造成优先级反转的主要原因是低进程影响了高优先级进程的运行,解决方案是T3在释放共享资源时应该继承T1的优先级,以避免被进程T2抢占。
在这里插入图片描述

Linux下进程间的通信方式?

  • 管道:
    • 无名管道(内存文件):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程之间使用。进程的亲缘关系通常是指父子进程关系。
    • 有名管道(FIFO文件,借助文件系统):有名管道也是半双工的通信方式,但是允许在没有亲缘关系的进程之间使用,管道是先进先出的通信方式。
  • 共享内存:共享内存就是映射一段能够被其他进程所访问的内存,这段共享内存由一个进程创建,但是多个进程都可以访问。共享内存是最快的IPC(Innerprocess Communication 进程间通信)方式,它是针对其他进程间通信方式效率低而专门设计的,它往往与信号量配合使用,从而实现进程间的同步和通信
  • 消息队列:消息队列是有消息的链表,存放在内核中并由消息队列标识符,标识,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  • 套接字(socket):适用于不同机器间的进程通信,也可以在本机作为两个进程的通信方式。
  • 信号:用于通知接收进程某个事件已经发生,比如Ctrl + C就是信号。
  • 信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问,它常作为一种锁机制,实现进程、线程的对临界区的同步及互斥访问。
  • 管程:信号量是一种进程同步机制,但是每个要访问临界资源的进程都必须自备同步操作wait(S)和signal(S),这样大量同步操作分散到各个进程中,可能会导致系统管理问题和死锁,在解决上述问题的过程上,提出了新的进程间同步工具——管程。
    管程相对于锁又增加了很多的条件变量,用于确定某些共享资源是否得到满足。进入管程后就可以操作各种条件变量,当某些条件无法得到满足时,会进入等待(wait),当再次满足时会唤醒(signal)。
    在这里插入图片描述

守护进程、僵尸进程和孤儿进程

  • 守护进程
    也称为精灵进程,是运行在后台的一种特殊进程,他独立于控制终端,并且可以周期性的执行某种任务或者等待处理某些发生的事件。
    当前大多数web服务器用的都是守护进程。
    可以Linux指针ps ajx来查看系统中的进程

a代表不仅列出当前用户的进程并且其他用户的进程也会被列出
参数x表示不仅列出所有控制终端的进程也列出所有无控制终端的进程
参数j表示列出也作业控制相关的进程

  • 孤儿进程
    如果父进程先退出,子进程还没退出,那么子进程的父进程将变为init进程(注:任何一个进程都必须有哦父进程)。
    一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程,孤儿进程将被init进程所收养,并由init进程对它们完成状态收集工作。

  • 僵尸进程
    如果子进程先退出,父进程还没退出,那么子进程必须等到父进程捕获到子进程的退出状态才真正结束,否则这个时候子进程就成为僵尸进程。
    设置僵尸进程的目的是为了维护子进程的信息,以便父进程在以后的某个时刻获取,这些信息至少包括进程ID、进程的终止状态,以及该进程使用的CPU时间,所有当子进程的父进程调用wait或waitpid时就可以得到这些信息,如果一个进程终止,而该进程有子进程处于僵尸状态,那么它的所有僵尸子进程的父进程ID将被重置为1(init进程)。继承这些子进程的init进程将清理它们。

Linux下同步机制?

  • POSIX信号量:可以用于进程同步,也可以用于线程同步
  • POSIX互斥锁 + 条件变量:只能用于线程同步

哲学家进餐问题

在这里插入图片描述
为了防止死锁的发生,可以设置两个条件:

  • 必须同时拿起左右两根筷子;
  • 只有在两个邻居都没有进餐的情况下才允许进餐。

介绍一下几种典型的锁?

  • 读写锁

  • 互斥锁

  • 条件变量

  • 自旋锁

你知道哪几种线程锁?

  • 互斥锁(mutex)
    一次只能一个线程拥有互斥锁,其他线程只有等待
    互斥锁是在抢锁失败的情况下主动放弃CPU进入睡眠状态,直到锁的状态改变时再唤醒,而操作系统负责线程调度,为了实现锁的状态发生改变时唤醒阻塞的线程或者进程,需要把锁交给操作系统管理,所以互斥锁在加锁操作时涉及上下文的切换。互斥锁的效率还是可以让人接受的,加锁的时间大概100ns左右,而实际上互斥锁的一种可能实现是先自旋一段时间,当自旋时间超过阈值之后再将线程投入到睡眠中,因此在并发运算中使用互斥锁的效果可能不亚于自旋锁。

  • 条件变量(cond)
    互斥锁的一个明显的缺点是他只有两种状态,锁定和非锁定,而条件变量通过允许线程阻塞和等待另一个线程发送信号的方法,弥补了互斥锁的不足。它常和互斥锁一起使用,以免出现竟态条件,当条件不满足时,线程往往解开相应的互斥锁并阻塞线程,然后等待条件发生变化。一旦其他的某个线程改变了条件变量,他将通知相应的条件变量唤醒一个或多个正在被此条件变量堵塞的线程。总的来说互斥锁是线程间互斥的机制,条件变量则是同步机制

  • 自旋锁(spin)
    如果进线程无法取得锁,进线程不会立刻放弃CPU时间片,而是一直循环尝试获取锁,直到获取为止,如果别的线程长时期占有锁,那么自旋就是在浪费CPU做无用功,但是自旋锁一般应用在加锁时间很短的场景,这个时候效率比较高。

原子操作是如何实现的

处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。
首先处理器会自动保证基本的内存操作的原子性,处理器保证从系统内存中读取或者写入一个字节是原子的,意思是当一个处理器读取一个字节时,其他处理器不能访问这个字节的内存地址。

CPU1    CPU2i=1     i=1i+1     i+1i=2     i=2
  1. 使用总线锁保证原子性:如果多个处理器同时对共享变量进行读改写操作,那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。所谓总线锁,就是处理器提供的一个LOCK信号,当一个处理器在总线上输出此信号时,其他处理器的请求将被阻塞住,那么该处理器可以独占共享内存

2. 使用缓存锁保证原子性:频繁使用的内存会缓存在处理器的L1、L2和L3高速缓存里,那么原子操作就可以直接在处理器内部缓存中进行,并不需要声明总线锁。所谓缓存锁定是指内存区域如果被缓存在处理器的缓存中,并且在lock操作期间被锁定,那么它执行锁操作回写到内存时,处理器不在总线上声明lock信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性。因为缓存一致性机制会阻止同时修改由两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使得缓存行无效,在如上图所示的例子中,当CPU1修改缓存行中的i时使用了缓存锁定,那么CPU2就不能使用同时缓存i的缓存行

死锁产生原因和条件

两个线程A和B,两个数据1和2。线程A在执行过程中,首先对资源1加锁,然后再去给资源2加锁,但是由于线程的切换,导致线程A没能给资源2加锁。线程切换到B后,线程B先对资源2加锁,然后再去给资源1加锁,由于资源1已经被线程A加锁,因此线程B无法加锁成功,当线程切换为A时,A也无法成功对资源2加锁,由此就造成了线程AB双方相互对一个已加锁资源的等待,死锁产生。

理论上认为死锁产生有以下四个必要条件,缺一不可:

  1. 互斥条件:进程对所需求的资源具有排他性,若有其他进程请求该资源,请求进程只能等待。
  2. 不剥夺条件:进程在获得资源未释放前,不能被其他进程强行夺走,只能自己释放。
  3. 请求和保持条件:进程当前所拥有的资源在进程请求其他新资源时,由该进程继续占用。
  4. 循环等待条件:存在一种进程资源循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。

死锁处理方法

  • 死锁预防:确保系统永远不会进入死锁
    从死锁产生的特征出发来避免死锁发生,比如限制资源的申请方式,破坏互斥条件、不抢占资源,破坏保持条件,如果不能立即分配所需的全部资源,则释放当前已经占有的资源;对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请,破坏循环等待的条件。

  • 死锁恢复:运行系统进入死锁,寻找恢复方法

  • 忽略死锁:忽略该问题

银行家算法

银行家算法(Banker’s Algorithm)是一个死锁避免的著名算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础。判断并保证系统的安全运行。

死锁检测

在这里插入图片描述
上图为资源分配图,其中方框表示资源,圆圈表示进程。资源指向进程表示该资源已经分配给该进程,进程指向资源表示进程请求获取该资源。

图 a 可以抽取出环,如图 b,它满足了环路等待条件,因此会发生死锁。

每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。

注意:死锁一定有环,有环不一定死锁

死锁恢复

  • 利用抢占恢复
  • 利用回滚恢复
  • 通过杀死进程恢复

中断与异常

Linux中异常和中断的区别与联系

  • 中断:是由硬件设备产生的,通过中断控制器发送给CPU,接着CPU判断收到的中断来自于哪个硬件设备(这在内核中有定义),最后由CPU发送给内核,有内核处理中断。

在这里插入图片描述

  • 异常:例如,CPU处理程序的时候,一旦程序不在内存中,就会产生缺页异常;当运行除法程序时,除数为0时,又会产生0异常。因此异常是由CPU产生的,同时,它会发送给内核,要求内核处理这些异常在这里插入图片描述

  • 相同点:最后都是由CPU发送给内核,交由内核处理;处理程序的流程设计上是相似的

  • 不同点:

    • 产生的源不同,异常是由CPU产生的,而中断是由硬件设备产生的;内核需要根据是异常还是中断调用不同的处理程序。
    • 内核根据是异常还是中断,调用不同的处理程序
    • 中断不是时钟同步的,这意味着中断可能随时到来;异常由于是CPU产生的,所以他是时钟同步的。
    • 当处理中断时,处于中断上下文中,当处理异常时,处于进程的上下文中。

Linux指令

网络与防火墙

网络端口

显示或设置网络设备
ifconfig
ip address
持续监控网络设置状态
ip monitor
查看数据报到主机的路由线路
tracerouter www.baidu.com
查看网络层是否可达目的地址
ping www.baidu.com
查看域名相关信息
dig www.baidu.com
获取特定主机的ip地址
host www.baidu.com
也可以通过ip获取主机名
host 8.8.4.4
列出所有监听和非监听的TCP连接
ss -at
列出所有监听和非监听的UDP连接
ss- au
netstat列出端口
netstat -a
列出所有TCP端口
netstat -at
列出所有UDP端口
netstat -au
列出所有Unix端口
netstae -ax
端口占用查看
netstat -lnpt

防火墙

Ubuntu
显示或设置网络设备
ifconfig
ip address
持续监控网络设置状态
ip monitor
查看数据报到主机的路由线路
tracerouter www.baidu.com
查看网络层是否可达目的地址
ping www.baidu.com
查看域名相关信息
dig www.baidu.com
获取特定主机的ip地址
host www.baidu.com
也可以通过ip获取主机名
host 8.8.4.4
列出所有监听和非监听的TCP连接
ss -at
列出所有监听和非监听的UDP连接
ss- au
netstat列出端口
netstat -a
列出所有TCP端口
netstat -at
列出所有UDP端口
netstat -au
列出所有Unix端口
netstae -ax
端口占用查看
netstat -lnpt

iptables系列
查看防火墙状态
service iptables status
启动|停止|重启防火墙
service iptables statrt|stop|restart
防火墙开发指定端口(以80为例)
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
service iptables save
设置指定ip访问指定端口

进程管理

查看进程状态

ps(process status)查看进程状态
– 查看进程状态,默认列出当前用户的进程
– 选项 a:列出带有终端的所有用户进程
– 选项 x:列出当前用户的所有进程,包括没有终端的进程
– 选项 u:面向用户友好的显示风格
– 选项 -e:列出所有进程
– 选项 -u:列出某个用户关联的所有进程
– 选项 -f:显示完整格式的进程列表
ps [选项]

– 常用命令
– 查看系统中的所有进程
ps aux

– 查看子父进程之间的关系
ps -ef

杀死进程kill

kill终止进程
– 通过进程ID终止进程
– 选项 -9:强迫进程立即停止
kill [选项] 进程ID
– 通过进程名称终止所有相关进程,支持通配符
killall 进程名称

端口号查询进程号(PID)netstat 或 lsof

根据端口号查看进程号
1.使用lsof命令
lsof 是“list open files”的缩写,在linux系统中,一切可是为文件,网络连接也可视为文件,因此,我们可以通过lsof命令查看占用某个端口号的进程。
示例:
lsof -i :8080
或者
lsof -i | grep 8080
参数解释:-i 是Internet的缩写,它表示选择网络地址与[i]表示的内容匹配的所有文件(网络连接)。
2. 使用netstat命令
netstat是用于打印网络连接、路由表、接口统计信息等。目前官方文档是这是一个过时的命令,因此推荐使用其他命令,如netstat大部分的功能都可以通过ip命令实现。在这里,我们仍给出使用netstat命令实现通过端口号查找进程号的示例。
示例:

netstat -nlp | grep 8080
参数解释:
-n --numeric的缩写,即通过数值展示ip地址
-l --listening的缩写,只打印正在监听中的网络连接
-p --program,打印相应端口号对应进程的进程号

进程监控TOP

将进程号为1303的系统赋值每20s刷新一次
top -d 20 -p 1303

每隔20s,一共执行3次,统计结果写入test.txt

top -d 20 -n 3 -b -> test.txt

http://www.rdtb.cn/news/21599.html

相关文章:

  • 网站开发用了什么平台网站制作费用一览表
  • 三维家是在网站上做还是在app上网络营销模式下品牌推广研究
  • 淘宝做网站费用深圳货拉拉
  • 服务器里怎么建设网站关键词投放
  • 泰州网站建设与网页制作营销策略有哪些有效手段
  • adobe做网站的是哪个软件世界杯32强排名
  • 手机网站导航菜单营销型网站的公司
  • 徐州玉龙湾旅游开发公司seo优化公司
  • 曲阜做网站哪家好b2b网站平台有哪些
  • 好用的土木建筑网站推广软件赚钱的app
  • 黄骅做网站的电话seo整站优化费用
  • 怎么做网页设计稿seo网站优化经理
  • 网站开发的工具某网站seo诊断分析和优化方案
  • 云主机怎么做网站十大网络营销经典案例
  • 网站网页设计百度文库官网
  • 游戏网站建设毕业论文推广普通话活动方案
  • 如何在app上做网站竞价托管哪家便宜
  • 建一个网站需要哪些人分类信息网站平台有哪些
  • 网站制作公司 深圳谷歌浏览器app下载
  • 大型网站订单系统怎么设计长春网站快速排名提升
  • 做网站的商标是哪类做网站哪家公司比较好而且不贵
  • 怎么做用户调研网站推广app平台有哪些
  • 济南网站技术个人推广app的妙招
  • 陕西网站开发公司哪家好seo关键词排名优化怎样
  • 搭建网站服务外贸平台app
  • 网站后台素材宁波网站快速优化
  • 网站开发技术创业计划b站推广
  • 怎么做百度口碑网站营销型网站建设公司价格
  • 嘉祥网站建设友情链接交换平台源码
  • 普陀区建设和交通委员会网站优化大师的三大功能