八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
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程序就可以转载进来。
回收内存时,尽可能将相邻的空闲空间合并。
为什么分段式存储管理有外部碎片而无内部碎片?为什么固定分区分配有内部碎片而不会有外部碎片?
分段式分配是按需分配,而固定式分配是固定分配的方式。
进程、线程、协程
概念
进程的生命周期
- 进程创建:引起进程创建的3个主要方式:
- 系统初始化
- 用户请求创建一个新进程
- 正在运行的进程执行了创建进程的系统调用
- 进程运行:CPU内核选择一个就绪的进程,让他占用处理机并执行
- 进程等待(阻塞):在某些情况下,进程可能没有办法直接运行,
进程只能自己阻塞直接,因为只有进程自身才能知道何时需要等待某种事件的发生。
- 请求并等待系统服务,因为无法马上完成
- 启动某中操作,因为无法马上完成
- 需要的数据,没有到达
- 进程唤醒:被阻塞的进程需要的资源可被满足或者阻塞进程等待的事件到达时,进程被唤醒(
进程只能被别的进程或OS唤醒
) - 进程结束:以下情况进程结束
- 正常退出(自愿的)
- 错误退出(自愿的)
- 致命错误(强制性的)
- 被其他进程杀死(强制性的)
进程、线程和协程的区别和联系
- 进程:是资源调度的基本单位,一个可执行程序会创建一个或多个进程,进程就是运行起来的可执行程序。
- 线程:是程序执行的基本单位,是轻量级的进程,每个进程中都有唯一的主线程,且只能有一个,主线程和进程是相互依存的关系,主线程结束,进程也会结束。
- 协程:是用户态的轻量级线程,是线程内部调度的基本单位,使用协程无操作系统切换,只需要保存自己的寄存器和栈的上下文,因此切换速度非常快。
线程和进程的区别
- 调度 :进程是资源分配和拥有的基本单位(打开文件、堆、静态区、代码段等);线程则是调度的基本单位(状态码,通用寄存器,线程栈,栈指针)
- 并发性:一个进程内可以多个线程并发(最好和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异步请求获取动态数据。
- 集群和分布式:(集群是所有服务器都有相同的功能,请求哪台都可以,主要起分流的作用,分布式是将不同的业务放到不同的服务器中,处理一个请求可能需要使用多台服务器,起到加快请求处理的速度)。使用服务器集群和分布式架构,同时加快请求的处理速度
- 反向代理:在访问服务器的时候,服务器通过别的服务器获取资源或结果返回给客户端。
进程调度与通信
进程调度算法
-
先来先服务:
非抢占式的调度算法,按照请求的顺序进行调度。
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。 -
短作业优先
非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能会饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。 -
最短剩余时间优先
最短作业优先的抢占式版本,按剩余运行时间的顺序进行调度。 当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。 -
时间片轮转
将所有就绪进程按 FCFS(先来先服务) 的原则排成一个队列,每次调度时,把 CPU 时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
时间片轮转算法的效率和时间片的大小有很大关系:
因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小,会导致进程切换得太频繁,在进程切换上就会花过多时间。
而如果时间片过长,那么实时性就不能得到保证。
-
优先级调度
为每个进程分配一个优先级,按优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级。 -
多级反馈队列
一个进程需要执行 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
使用总线锁保证原子性
:如果多个处理器同时对共享变量进行读改写操作,那么共享变量就会被多个处理器同时进行操作,这样读改写操作就不是原子的,操作完之后共享变量的值会和期望的不一致。所谓总线锁,就是处理器提供的一个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双方相互对一个已加锁资源的等待,死锁产生。
理论上认为死锁产生有以下四个必要条件,缺一不可:
- 互斥条件:进程对所需求的资源具有排他性,若有其他进程请求该资源,请求进程只能等待。
- 不剥夺条件:进程在获得资源未释放前,不能被其他进程强行夺走,只能自己释放。
- 请求和保持条件:进程当前所拥有的资源在进程请求其他新资源时,由该进程继续占用。
- 循环等待条件:存在一种进程资源循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。
死锁处理方法
-
死锁预防:确保系统永远不会进入死锁
从死锁产生的特征出发来避免死锁发生,比如限制资源的申请方式,破坏互斥条件、不抢占资源,破坏保持条件,如果不能立即分配所需的全部资源,则释放当前已经占有的资源;对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请,破坏循环等待的条件。
-
死锁恢复:运行系统进入死锁,寻找恢复方法
-
忽略死锁:忽略该问题
银行家算法
银行家算法(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
相关文章:
八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令
layout: post title: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 description: 八股总结(三)操作系统内存管理、进程线程、进程同步与通信、中断与异常、常用命令 tag: 八股总结 文章目录操作…...
概率论小课堂:条件概率和贝叶斯公式(机器翻译的工作原理)
文章目录 引言I 条件概率1.1 条件概率的定义1.2 条件概率的计算II 贝叶斯公式2.1贝叶斯公式的本质2.2 机器翻译的原理引言 对于几乎所有的随机事件来讲,条件概率由于条件的存在,它通常不等于本身的概率。 贝叶斯公式的本质:在数学上条件和结果可以互换,通过这种互换,可以…...
流量与日志分析
文章目录1.流量与日志分析1.1系统日志分析1.1.1window系统日志与分析方法1.1.2linux 系统日志与分析方法1.2 web日志分析iis 日志分析方法apache日志分析**access_log****error_log**nginx日志分析tomcat 日志分析主流日志分析工具使用1.流量与日志分析 日志,是作为…...
英文论文写作常用例句整理汇总(持续更新)
ContentsGeneral introductionProblem definitionGaps in literatureProblems solutionStudy motivationAims & objectivesSignificance and advantages of your work参考资料General introduction Research on __ has a long tradition For decades, one of the most pop…...
[N0wayBack 练习题] My_enc,Euler,EasyLock,RRRRSA,EasyNumber,pwn
加入一个队,队里的练习题不少,还有WP真好My_enc原题from secret import flag import randomdef Cyber_key(LEN):Key [[] for i in range(row)]for x in range(row):for i in range(LEN):Key[x].append(random.randint(0, 2023))return Keydef Punk_enc(Key, msg):out []for l…...
网分线缆测试和dc-block
今天的好苹果和坏苹果 好苹果:是校准件和网分都是好的,又给了我一次复盘的机会 网分测试线缆: 1.网分直接复位,如果网分复位是校准状态,且解的是精密转接头,BNC的,可以不校准,结果差…...
Java创建线程的方式只有一种:Thread+Runnable
Java创建线程的方式其实只有一种👨🎓一、继承Thread👨🎓二、实现Runnable接口👨🎓三、实现Callable接口👨🎓四、通过线程池创建👨🎓五、总结一般我…...
数据加密--课后程序(Python程序开发案例教程-黑马程序员编著-第3章-课后作业)
实例6:数据加密 数据加密是保存数据的一种方法,它通过加密算法和密钥将数据从明文转换为密文。 假设当前开发的程序中需要对用户的密码进行加密处理,已知用户的密码均为6位数字,其加密规则如下: 获取每个数字的ASCI…...
【GO】K8s 管理系统项目33[前端部分–登录和登出]
K8s 管理系统项目[前端部分–登录和登出] 1. 登录登出流程 1.1 登录流程 登入流程总的分为5步: 账号密码验证token生成token验证验证成功进行跳转验证失败返回/login 1.2 登出流程 登出流程就相对简单,分为2步 删除Token跳转/login 2. 登录代码 src/views/login/Login.v…...
Vue 计算属性基础知识 监听属性watch
计算属性的概念 在{{}}模板中放入太多的逻辑会让模板内容过重且难以维护。例如以下代码: <div id"app">{{msg.split().reverse().join()}}</div><script>const vm new Vue({el: "#app",data: {msg:我想把vue学的细一点}})&…...
PAT:L1-004 计算摄氏温度、L1-005 考试座位号、L1-006 连续因子(C++)
目录 L1-004 计算摄氏温度 问题描述: 实现代码: L1-005 考试座位号 问题描述: 实现代码: 原理思路: L1-006 连续因子 问题描述: 实现代码: 原理思路: 过于简单的就不再写…...
Redis集群方案应该怎么做?
今天我们来跟大家唠一唠JAVA核心技术-RedisRedis是一款流行的内存数据库,适用于高性能的数据缓存和实时数据处理。当需要处理大量数据时,可以使用Redis集群来提高性能和可用性。Redis在单节点模式下,虽然可以支持高并发、快速读写、丰富的数据…...
连续点击返回键退出Android 应用
问题 业务需要,在主界面连续点击返回键退出应用,记录一下。 解决方案 先说结论,在主界面Activity中添加如下代码 /*** 记录上次点击返回键时间*/private long lastClickTime 0;/*** 两次回退点击时间间隔设置不小于2s*/public static fi…...
【PyTorch】教程:torch.nn.Hardswish
torch.nn.Hardswish 原型 CLASS torch.nn.Hardswish(inplaceFalse) 参数 inplace (bool) – 内部运算,默认为 False 定义 Hardswish(x){0if x≤−3,xif x≥3,x⋅(x3)/6otherwise\text{Hardswish}(x) \begin{cases} 0 & \text{if~} x \le -3, \\ x & \te…...
nacos源码入门
nacos官方文档地址:nacos官方文档 Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 简单来说,nacos就是一个注册中心、配置中心࿰…...
【记录】Samba|Windows 11的Samba连接切换用户
Samba是一个用于共享文件和打印机的网络协议,可以使不同的操作系统之间共享文件和资源变得容易。在Windows 11上,可以使用Samba来连接到网络共享。 如果您想在Windows 11上切换用户并连接到另一个Samba共享,可以按照以下步骤操作。 文章目录…...
vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用
vue hiprint vue使用hiprint打印控件VUE HiPrint HiPrint简单使用安装相关依赖安装Hi PrintJQuery引入依赖简单使用官方所有 打印示例安装相关依赖 安装Hi Print npm install vue-plugin-hiprintJQuery 因为 hi print 使用到了 JQuery 所以需要安装对应依赖 npm i jquery -…...
HBase常用Shell命令
HBase提供了一个非常方便的命令行交互工具HBase Shell。通过HBase Shell,HBase可以与MySQL命令行一样创建表、索引,也可以增加、删除和修改数据,同时集群的管理、状态查看等也可以通过HBase Shell实现。 一、数据定义语言 数据定义语言&…...
【阿里云】Apsara Clouder云计算专项技能认证-云服务器ECS入门,考试真题分享
以下是阿里云Apsara Clouder云计算专项技能认证-云服务器ECS入门真题汇总篇分享: 1.下列哪一个不是重置ECS密码的步骤? A. 查看实例详情 B.进入控制台 C.远程连接ECS D.点击控制台“概览” 2.针对云服务器ECS安全组说法正确的是 A.是一种物理防火墙 B.仅用于控制…...
怎样编写java程序
搭建好了Java开发环境之后,下面就来学习一下如何开发Java程序。为了让初学者更好地完成第一个Java程序,接下来通过几个步骤进行逐一讲解。 1.编写Java源文件 在D盘根目录下新建一个test文件夹,并在该文件夹中新建文本文档&#…...
面向对象设计模式:结构型模式之适配器模式
一、引入 Object Oriented Adapters 二、XX 模式 aka:Wrapper (包装器) 2.1 Intent 意图 Convert the interface of a class into another interface clients expect. 将一个类的接口转换成客户希望的另外一个接口. 作为两个不兼容的接口之间的桥梁 适配器模式使…...
Unity3D Shader系列之模板测试
一、 模板测试原理模板测试位于GPU渲染流水线的逐片元操作阶段,片元着色器完成之后就会进入模板测试,模板测试通过后再进入深度测试。我们的GPU中有一个模板缓冲区(Stencil Buffer)(Stencil即是模板的意思),其大小为整个屏幕大小*8位…...
机器学习中的数学——精确率与召回率
在Yolov5训练完之后会有很多图片,它们的具体含义是什么呢? 通过这篇博客,你将清晰的明白什么是精确率、召回率。这个专栏名为白话机器学习中数学学习笔记,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希…...
Oracle启动数据库报ORA-01102解决办法
1.机器启动之后登录服务器使用sqlplus / as sysdba 登录数据库发现数据库并没有启动之前把数据库服务添加过开机自启动 2.使用startup命令启动数据库报错了 SYSorcl>startup; ORACLE 例程已经启动。 Total System Global Area 2471931904 bytes Fixed Size 2255752 byt…...
Go 语言面向对象编程及实践
面向对象编程是计算机科学中的一种重要的编程方法,它将数据和处理它的代码组合成对象,并将这些对象组合成更大的程序。在 Go 语言中,我们同样可以使用面向对象编程的方式进行开发。本篇文章将介绍 Go 语言面向对象编程的概念、特性、使用方法以及实践技巧。 面向对象编程概…...
0102 MySQL05
1.约束 1.约束(constraint):在创建表时,可以给表中的字段加上一些约束,保证表中数据的完整性,有效性 常见的约束? 非空约束:not null 唯一性约束:unique 主键约束&am…...
[深入理解SSD系列 闪存2.1.3] 固态硬盘闪存的物理学原理_NAND Flash 的读、写、擦工作原理
2.1.3.1 Flash 的物理学原理与发明历程 经典物理学认为 物体越过势垒,有一阈值能量;粒子能量小于此能量则不能越过,大于此能 量则可以越过。例如骑自行车过小坡,先用力骑,如果坡很低,不蹬自行车也能 靠惯性过去。如果坡很高,不蹬自行车,车到一半就停住,然后退回去。 …...
洗地机哪家强?洗地机排行榜
随着清洁行业电器的开展,越来越多的新颖工具和电器开端进入消费者的生活之中。众所周知,面对美不胜收的清洁电器产品,选购也是一大头疼事,应该怎样选购洗地机等清洁电器呢,实在的用户体验和清洁效率莫过于消费者最看重…...
【Java基础 下】 029 -- 多线程
目录 一、为什么要有多线程? 1、线程与进程 2、多线程的应用场景 3、小结 二、多线程中的两个概念(并发和并行) 1、并发 2、并行 3、小结 三、多线程的三种实现方式 1、继承Thread类的方式进行实现 2、实现Runnable接口的方式进行实现 3、利用…...
R语言生物群落(生态)数据统计分析与绘图
查看原文>>>R语言生物群落(生态)数据统计分析与绘图 R 语言作的开源、自由、免费等特点使其广泛应用于生物群落数据统计分析。生物群落数据多样而复杂,涉及众多统计分析方法。本课程以生物群落数据分析中的最常用的统计方法回归和混…...
长沙县 网站建设/舆情危机公关公司
今日总结: 这两天都在为准备年货而忙碌着,处理各种事情。前段时间不是笔记本电脑不能连接手机开启的热点迈,现在自己突然又可以连接上了。不知道啥原因,估计是有时候手机网络信号不好,或者电脑系统不稳定的缘故造成的吧…...
wordpress优秀中文主题/怎样做一个网页
直播概要 直播演讲主题:远程办公有点上头?解锁云上应用现代化的奥秘 直播时间:5月31日19:00 直播地址:微信视频号、哔哩哔哩、知乎搜索亚马逊云科技,三大平台同步直播。 话题介绍 在新挑战频发的动荡变革时期&…...
会做网站的公司/2345网址导航智能主板
工具 window10 django2.2.2 mysql5.6 django默认使用mysqlclient连接mysql,但是在window下直接安装mysqlclient不容易成功,可以使用pymysql 代替。 但使用如下方式报错: #settings.py import pymysql pymysql.intall_as_MySQLdb()django 3.…...
提供网站建设工具的公司/酒店网络营销方式有哪些
一、前言 图像形态学操作(morphology operators)——基于形状的一系列图像处理操作的合集,主要是基于集合论基础上的形态学数学常用的形态学处理方法包括︰腐蚀、膨胀、开运算、闭运算等其中膨胀与腐蚀是图像处理中最常用的形态学操作手段,腐蚀和膨胀 &…...
番禺俊才网/seo自学教程推荐
【问题描述】 已知cosx的近似计算公式如下: cosx 1 - x2/2! x4/4! - x6/6! … (-1)nx2n/(2n)! 其中x为弧度,n为大于等于0的整数。编写程序根据用户输入的x和n的值,利用上述近似计算公式计算cosx的近似值,要求输出结果小数点…...
pc开奖网站开发/网址缩短在线生成器
来源是:Text at LEFT如何更改CSS以使两个DIV看起来像?----------------------|Text at LEFT | ####|| | ####|| | ####|| | || | |----------------------即。文本在左侧DIV左上角,图像在右侧DIV右上方对齐。更新:我使用的是&…...