网站有免费的域名和空间么,做美容仪器的网站,网站建设漂亮的模板,最好的wordpress主题文章目录 操作系统面试题引论1.什么是操作系统#xff1f;2.操作系统主要有哪些功能#xff1f; 操作系统结构3.什么是内核#xff1f;4.什么是用户态和内核态#xff1f;5.用户态和内核态是如何切换的#xff1f; 进程和线程6.并行和并发有什么区别#xff1f;7.什么是进… 文章目录 操作系统面试题引论1.什么是操作系统2.操作系统主要有哪些功能 操作系统结构3.什么是内核4.什么是用户态和内核态5.用户态和内核态是如何切换的 进程和线程6.并行和并发有什么区别7.什么是进程上下文切换8.进程有哪些状态9.什么是僵尸进程10.什么是孤儿进程11.进程有哪些调度算法12.进程间通信有哪些方式13.进程和线程的联系和区别14.线程上下文切换了解吗15.线程有哪些实现方式16.线程间如何同步17.什么是死锁18.死锁产生有哪些条件19.如何避免死锁呢20.活锁和饥饿锁了解吗 内存管理21.什么是虚拟内存22.什么是内存分段23.什么是内存分页24.多级页表知道吗25.什么是块表26.分页和分段有什么区别27.什么是交换空间28.页面置换算法有哪些 文件29.硬链接和软链接有什么区别 IO30.零拷贝了解吗31.聊聊**阻塞与⾮阻塞** **I/O **、 **同步与异步** **I/O**32.详细讲一讲I/O多路复用 常用的Linux命令1、绝对路径用什么符号表示当前目录、上层目录用什么表示主目录用什么表示? 切换目录用什么命令2、怎么查看当前进程怎么执行退出怎么查看当前路径3、怎么清屏怎么退出当前命令怎么查看当前用户 id查看指定帮助用什么命令4、ls命令执行什么功能 可以带哪些参数有什么区别5、查看文件有哪些命令6、列举几个常用的Linux命令。7、你平时是怎么查看日志的1)、tail2)、head3)、cat4)、more5)、sed6)、less 8、建立软链接(快捷方式)以及硬链接的命令9、目录创建用什么命令创建文件用什么命令复制文件用什么命令10、查看文件内容有哪些命令可以使用11、随意写文件命令怎么向屏幕输出带空格的字符串比如”hello world”?12、终端是哪个文件夹下的哪个文件黑洞文件是哪个文件夹下的哪个命令13、移动文件用哪个命令改名用哪个命令14、复制文件用哪个命令如果需要连同文件夹一块复制呢15、删除文件用哪个命令如果需要连目录及目录下文件一块删除呢删除空文件夹用什么命令16、Linux下命令有哪几种可使用的通配符分别代表什么含义17、用什么命令对一个文件的内容进行统计(行号、单词数、字节数)18、Grep命令有什么用 如何忽略大小写 如何查找不含该串的行?19、Linux中进程有哪几种状态在ps显示出来的信息中分别用什么符号表示的20、怎么使一个命令在后台运行?21、利用ps怎么显示所有的进程? 怎么利用ps22、哪个命令专门用来查看后台任务?23、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?24、终止进程用什么命令? 带什么参数?25、怎么查看系统支持的所有信号26、搜索文件用什么命令? 格式是怎么样的?27、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?28、使用什么命令查看用过的命令列表?29、使用什么命令查看磁盘使用空间空闲空间呢?30、使用什么命令查看网络是否连通?31、使用什么命令查看IP地址及接口信息32、查看各类环境变量用什么命令?33、查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?34、通过什么命令查找执行命令?35、怎么对命令进行取别名36、du和df的定义以及区别37、如果一个Linux新手想要知道当前系统支持的所有命令的列表他需要怎么做38、如果你的助手想要打印出当前的目录栈你会建议他怎么做39、你的系统目前有许多正在运行的任务在不重启机器的条件下有什么方法可以把所有正在运行的进程移除呢40、bash shell中的hash命令有什么作用41、怎样一页一页地查看一个大文件的内容呢42、数据字典属于哪一个用户的43、怎样查看一个linux命令的概要与用法假设你在/bin 目录中偶然看到一个你从没见过的的命令怎样才能知道它的作用和用法呢44、使用哪一个命令可以查看自己文件系统的磁盘空间配额呢 操作系统面试题
引论
1.什么是操作系统
可以这么说操作系统是一种运行在内核态的软件。
它是应用程序和硬件之间的媒介向应用程序提供硬件的抽象以及管理硬件资源。 2.操作系统主要有哪些功能
操作系统最主要的功能
处理器CPU管理CPU的管理和分配主要指的是进程管理。内存管理内存的分配和管理主要利用了虚拟内存的方式。外存管理外存磁盘等的分配和管理将外存以文件的形式提供出去。I/O管理对输入/输出设备的统一管理。
除此之外还有保证自身正常运行的健壮性管理防止非法操作和入侵的安全性管理。 操作系统结构
3.什么是内核
可以这么说内核是一个计算机程序它是操作系统的核心提供了操作系统最核心的能力可以控制操作系统中所有的内容
4.什么是用户态和内核态
内核具有很⾼的权限可以控制 cpu、内存、硬盘等硬件出于权限控制的考虑因此⼤多数操作系统把内存分成了两个区域
内核空间这个内存空间只有内核程序可以访问⽤户空间这个内存空间专⻔给应⽤程序使⽤权限比较小
⽤户空间的代码只能访问⼀个局部的内存空间⽽内核空间的代码可以访问所有内存空间。因此当程序使⽤⽤户空间时我们常说该程序在⽤户态执⾏⽽当程序使内核空间时程序则在内核态执⾏。
5.用户态和内核态是如何切换的
应⽤程序如果需要进⼊内核空间就需要通过系统调⽤来进入内核态 内核程序执⾏在内核态⽤户程序执⾏在⽤户态。当应⽤程序使⽤系统调⽤时会产⽣⼀个中断。发⽣中断后 CPU 会中断当前在执⾏的⽤户程序转⽽跳转到中断处理程序也就是开始执⾏内核程序。内核处理完后主动触发中断把 CPU 执⾏权限交回给⽤户程序回到⽤户态继续⼯作。
进程和线程
6.并行和并发有什么区别
并发就是在一段时间内多个任务都会被处理但在某一时刻只有一个任务在执行。单核处理器做到的并发其实是利用时间片的轮转例如有两个进程A和BA运行一个时间片之后切换到BB运行一个时间片之后又切换到A。因为切换速度足够快所以宏观上表现为在一段时间内能同时运行多个程序。
并行就是在同一时刻有多个任务在执行。这个需要多核处理器才能完成在微观上就能同时执行多条指令不同的程序被放到不同的处理器上运行这个是物理上的多个进程同时进行。 7.什么是进程上下文切换
对于单核单线程 CPU 而言在某一时刻只能执行一条 CPU 指令。上下文切换 (Context Switch) 是一种将 CPU 资源从一个进程分配给另一个进程的机制。从用户角度看计算机能够并行运行多个进程这恰恰是操作系统通过快速上下文切换造成的结果。在切换的过程中操作系统需要先存储当前进程的状态 (包括内存空间的指针当前执行完的指令等等)再读入下一个进程的状态然后执行此进程。 8.进程有哪些状态
当一个进程开始运行时它可能会经历下面这几种状态
上图中各个状态的意义
运⾏状态Runing该时刻进程占⽤ CPU就绪状态Ready可运⾏由于其他进程处于运⾏状态⽽暂时停⽌运⾏阻塞状态Blocked该进程正在等待某⼀事件发⽣如等待输⼊/输出操作的完成⽽暂时停⽌运⾏这时即使给它CPU控制权它也⽆法运⾏ 当然进程还有另外两个基本状态
创建状态new进程正在被创建时的状态结束状态Exit进程正在从系统中消失时的状态 9.什么是僵尸进程
僵尸进程是已完成且处于终止状态但在进程表中却仍然存在的进程。
僵尸进程一般发生有父子关系的进程中一个子进程的进程描述符在子进程退出时不会释放只有当父进程通过 wait() 或 waitpid() 获取了子进程信息后才会释放。如果子进程退出而父进程并没有调用 wait() 或 waitpid()那么子进程的进程描述符仍然保存在系统中。
10.什么是孤儿进程
一个父进程退出而它的一个或多个子进程还在运行那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程 (进程 ID 为 1 的进程) 所收养并由 init 进程对它们完成状态收集工作。因为孤儿进程会被 init 进程收养所以孤儿进程不会对系统造成危害。
11.进程有哪些调度算法
进程调度就是确定某一个时刻CPU运行哪个进程常见的进程调度算法有 先来先服务
非抢占式的调度算法按照请求的顺序进行调度。有利于长作业但不利于短作业因为短作业必须一直等待前面的长作业执行完毕才能执行而长作业又需要执行很长时间造成了短作业等待时间过长。另外对I/O密集型进程也不利因为这种进程每次进行I/O操作之后又得重新排队。 短作业优先
非抢占式的调度算法按估计运行时间最短的顺序进行调度。长作业有可能会饿死处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来那么长作业永远得不到调度。 优先级调度
为每个进程分配一个优先级按优先级进行调度。为了防止低优先级的进程永远等不到调度可以随着时间的推移增加等待进程的优先级。 时间片轮转
将所有就绪进程按 先来先服务的原则排成一个队列每次调度时把 CPU 时间分配给队首进程该进程可以执行一个时间片。当时间片用完时由计时器发出时钟中断调度程序便停止该进程的执行并将它送往就绪队列的末尾同时继续把 CPU 时间分配给队首的进程。
时间片轮转算法的效率和时间片的大小有很大关系因为进程切换都要保存进程的信息并且载入新进程的信息如果时间片太小会导致进程切换得太频繁在进程切换上就会花过多时间。而如果时间片过长那么实时性就不能得到保证。 最短剩余时间优先
最短作业优先的抢占式版本按剩余运行时间的顺序进行调度。当一个新的作业到达时其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少则挂起当前进程运行新的进程。否则新的进程等待。
12.进程间通信有哪些方式 管道
管道可以理解成不同进程之间的对白一方发声一方接收声音的介质可是是空气或者电缆进程之间就可以通过管道所谓的管道就是内核中的一串缓存从管道的一端写入数据就是缓存在了内核里另一端读取也是从内核中读取这段数据。
管道可以分为两类匿名管道和命名管道。匿名管道是单向的只能在有亲缘关系的进程间通信命名管道是双向的可以实现本机任意两个进程通信。
信号
信号可以理解成一种电报发送方发送内容指定接收进程然后发出特定的软件中断操作系统接到中断请求后找到接收进程通知接收进程处理信号。
比如kill -9 1050就表示给PID为1050的进程发送SIGKIL信号。
Linux系统中常用信号
1SIGHUP用户从终端注销所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。
2SIGINT程序终止信号。程序运行过程中按CtrlC键将产生该信号。
3SIGQUIT程序退出信号。程序运行过程中按Ctrl\键将产生该信号。
4SIGBUS和SIGSEGV进程访问非法地址。
5SIGFPE运算中出现致命错误如除零操作、数据溢出等。
6SIGKILL用户终止进程执行信号。shell下执行kill -9发送该信号。
7SIGTERM结束进程信号。shell下执行kill 进程pid发送该信号。
8SIGALRM定时器信号。
9SIGCLD子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号则子进程退出后将形成僵尸进程。
消息队列
消息队列就是保存在内核中的消息链表包括Posix消息队列和System V消息队列。有足够权限的进程可以向队列中添加消息被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少管道只能承载无格式字节流以及缓冲区大小受限等缺点。 共享内存
共享内存的机制就是拿出⼀块虚拟地址空间来映射到相同的物理内存中。这样这个进程写⼊的东西另外的进程⻢上就能看到。共享内存是最快的 IPC 方式它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制如信号量配合使用来实现进程间的同步和通信。 信号量
信号量我们可以理解成红绿灯红灯行绿灯停。它本质上是一个整数计数器可以用来控制多个进程对共享资源的访问。它常作为一种锁机制防止某进程正在访问共享资源时其他进程也访问该资源。因此主要作为进程间以及同一进程内不同线程之间的同步手段。
信号量表示资源的数量控制信号量的⽅式有两种原⼦操作
P 操作是⽤在进⼊共享资源之前V 操作是⽤在离开共享资源之后这两个操作是必须成对出现的。 ⼀个是 P 操作这个操作会把信号量减去 1相减后如果信号量 0则表明资源已被占⽤进程需阻塞等待相减后如果信号量 0则表明还有资源可使⽤进程可正常继续执⾏。另⼀个是 V 操作这个操作会把信号量加上 1相加后如果信号量 0则表明当前有阻塞中的进程于是会将该进程唤醒运⾏相加后如果信号量 0则表明当前没有阻塞中的进程
Socket
与其他通信机制不同的是它可用于不同机器间的进程通信。
优缺点
管道简单效率低容量有限消息队列不及时写入和读取需要用户态、内核态拷贝。共享内存区能够很容易控制容量速度快但需要注意不同进程的同步问题。信号量不能传递复杂消息一般用来实现进程间的同步信号它是进程间通信的唯一异步机制。Socket用于不同主机进程间的通信。
13.进程和线程的联系和区别
线程和进程的联系
线程是进程当中的⼀条执⾏流程。
同⼀个进程内多个线程之间可以共享代码段、数据段、打开的⽂件等资源但每个线程各⾃都有⼀套独⽴的寄存器和栈这样可以确保线程的控制流是相对独⽴的。 线程与进程的⽐较如下
调度进程是资源包括内存、打开的⽂件等分配的单位线程是 CPU 调度的单位资源进程拥有⼀个完整的资源平台⽽线程只独享必不可少的资源如寄存器和栈拥有资源线程同样具有就绪、阻塞、执⾏三种基本状态同样具有状态之间的转换关系系统开销线程能减少并发执⾏的时间和空间开销——创建或撤销进程时系统都要为之分配或回收系统资源如内存空间I/O设备等OS所付出的开销显著大于在创建或撤销线程时的开销进程切换的开销也远大于线程切换的开销。
14.线程上下文切换了解吗
这还得看线程是不是属于同⼀个进程
当两个线程不是属于同⼀个进程则切换的过程就跟进程上下⽂切换⼀样当两个线程是属于同⼀个进程因为虚拟内存是共享的所以在切换时虚拟内存这些资源就保持不动只需要切换线程的私有数据、寄存器等不共享的数据
所以线程的上下⽂切换相⽐进程开销要⼩很多。
15.线程有哪些实现方式
主要有三种线程的实现⽅式
内核态线程实现在内核空间实现的线程由内核直接管理直接管理线程。 ⽤户态线程实现在⽤户空间实现线程不需要内核的参与内核对线程无感知。 混合线程实现现代操作系统基本都是将两种方式结合起来使用。用户态的执行系统负责进程内部线程在非阻塞时的切换内核态的操作系统负责阻塞线程的切换。即我们同时实现内核态和用户态线程管理。其中内核态线程数量较少而用户态线程数量较多。每个内核态线程可以服务一个或多个用户态线程。 16.线程间如何同步
同步解决的多线程操作共享资源的问题目的是不管线程之间的执行如何穿插最后的结果都是正确的。
我们前面知道线程和进程的关系线程是进程当中的⼀条执⾏流程。所以说下面的一些同步机制不止针对线程同样也可以针对进程。
临界区我们把对共享资源访问的程序片段称为临界区我们希望这段代码是互斥的保证在某时刻只能被一个线程执行也就是说一个线程在临界区执行时其它线程应该被阻止进入临界区。 临界区不仅针对线程同样针对进程。
临界区同步的一些实现方式
1、锁
使⽤加锁操作和解锁操作可以解决并发线程/进程的互斥问题。
任何想进⼊临界区的线程必须先执⾏加锁操作。若加锁操作顺利通过则线程可进⼊临界区在完成对临界资源的访问后再执⾏解锁操作以释放该临界资源。
加锁和解锁锁住的是什么呢可以是临界区对象也可以只是一个简单的互斥量例如互斥量是0无锁1表示加锁。 根据锁的实现不同可以分为忙等待锁和和⽆忙等待锁。
忙等待锁和就是加锁失败的线程会不断尝试获取锁也被称为自旋锁它会一直占用CPU。
⽆忙等待锁就是加锁失败的线程会进入阻塞状态放弃CPU等待被调度。
2、信号量
信号量是操作系统提供的⼀种协调共享资源访问的⽅法。
通常信号量表示资源的数量对应的变量是⼀个整型 sem 变量。
另外还有两个原⼦操作的系统调⽤函数来控制信号量的分别是
P 操作将 sem 减 1 相减后如果 sem 0 则进程/线程进⼊阻塞等待否则继续表明 P操作可能会阻塞V 操作将 sem 加 1 相加后如果 sem 0 唤醒⼀个等待中的进程/线程表明 V 操作不会阻塞
P 操作是⽤在进⼊临界区之前V 操作是⽤在离开临界区之后这两个操作是必须成对出现的。
17.什么是死锁
在两个或者多个并发线程中如果每个线程持有某种资源而又等待其它线程释放它或它们现在保持着的资源在未改变这种状态之前都不能向前推进称这一组线程产生了死锁。通俗的讲就是两个或多个线程无限期的阻塞、相互等待的一种状态。 18.死锁产生有哪些条件
死锁产生需要同时满足四个条件
互斥条件指线程对己经获取到的资源进行它性使用即该资源同时只由一个线程占用。如果此时还有其它线程请求获取获取该资源则请求者只能等待直至占有资源的线程释放该资源。请求并持有条件指一个 线程己经持有了至少一个资源但又提出了新的资源请求而新资源己被其它线程占有所以当前线程会被阻塞但阻塞 的同时并不释放自己已经获取的资源。不可剥夺条件指线程获取到的资源在自己使用完之前不能被其它线程抢占只有在自己使用完毕后才由自己释放该资源。环路等待条件指在发生死锁时必然存在一个线程——资源的环形链即线程集合 {T0T1T2,…… Tn} 中 T0 正在等待一 T1 占用的资源Tl1正在等待 T2用的资源…… Tn 在等待己被 T0占用的资源。
19.如何避免死锁呢
产⽣死锁的有四个必要条件互斥条件、持有并等待条件、不可剥夺条件、环路等待条件。
避免死锁破坏其中的一个就可以。
消除互斥条件
这个是没法实现因为很多资源就是只能被一个线程占用例如锁。
消除请求并持有条件
消除这个条件的办法很简单就是一个线程一次请求其所需要的所有资源。
消除不可剥夺条件
占用部分资源的线程进一步申请其他资源时如果申请不到可以主动释放它占有的资源这样不可剥夺这个条件就破坏掉了。
消除环路等待条件
可以靠按序申请资源来预防。所谓按序申请是指资源是有线性顺序的申请的时候可以先申请资源序号小的再申请资源序号大的这样线性化后就不存在环路了。
20.活锁和饥饿锁了解吗
饥饿锁
饥饿锁这个饥饿指的是资源饥饿某个线程一直等不到它所需要的资源从而无法向前推进就像一个人因为饥饿无法成长。
活锁
在活锁状态下处于活锁线程组里的线程状态可以改变但是整个活锁组的线程无法推进。
活锁可以用两个人过一条很窄的小桥来比喻为了让对方先过两个人都往旁边让但两个人总是让到同一边。这样虽然两个人的状态一直在变化但却都无法往前推进。
内存管理
21.什么是虚拟内存
我们实际的物理内存主要是主存但是物理主存空间有限所以一般现代操作系统都会想办法把一部分内存块放到磁盘中用到的时候再装入主存但是对用户程序而言是不需要注意实际的物理内存的为什么呢因为有虚拟内存的机制。
简单说虚拟内存是操作系统提供的⼀种机制将不同进程的虚拟地址和不同内存的物理地址映射起来。
每个进程都有自己独立的地址空间再由操作系统映射到到实际的物理内存。
于是这⾥就引出了两种地址的概念
程序所使⽤的内存地址叫做虚拟内存地址Virtual Memory Address
实际存在硬件⾥⾯的空间地址叫物理内存地址Physical Memory Address。 22.什么是内存分段
程序是由若⼲个逻辑分段组成的如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的所以就⽤分段Segmentation的形式把这些段分离出来。
分段机制下的虚拟地址由两部分组成段号和段内偏移量。
虚拟地址和物理地址通过段表映射段表主要包括段号、段的界限。 我们来看一个映射虚拟地址段3、段偏移量500 ---- 段基地址7000段偏移量500 ---- 物理地址7500。 23.什么是内存分页
分⻚是把整个虚拟和物理内存空间切成⼀段段固定尺⼨的⼤⼩。这样⼀个连续并且尺⼨固定的内存空间我们叫⻚Page。在 Linux 下每⼀⻚的⼤⼩为 4KB 。
访问分页系统中内存数据需要两次的内存访问 一次是从内存中访问页表从中找到指定的物理页号加上页内偏移得到实际物理地址第二次就是根据第一次得到的物理地址访问内存取出数据。 24.多级页表知道吗
操作系统可能会有非常多进程如果只是使用简单分页可能导致的后果就是页表变得非常庞大。
所以引入了多级页表的解决方案。
所谓的多级页表就是把我们原来的单级页表再次分页这里利用了局部性原理除了顶级页表其它级别的页表一来可以在需要的时候才被创建二来内存紧张的时候还可以被置换到磁盘中。 25.什么是块表
同样利用了局部性原理即在⼀段时间内整个程序的执⾏仅限于程序中的某⼀部分。相应地执⾏所访问的存储空间也局限于某个内存区域。
利⽤这⼀特性把最常访问的⼏个⻚表项存储到访问速度更快的硬件于是计算机科学家们就在 CPU 芯⽚中加⼊了⼀个专⻔存放程序最常访问的⻚表项的 Cache这个 Cache 就是 TLBTranslation Lookaside Buffer 通常称为⻚表缓存、转址旁路缓存、快表等。 26.分页和分段有什么区别
段是信息的逻辑单位它是根据用户的需要划分的因此段对用户是可见的 页是信息的物理单位是为了管理主存的方便而划分的对用户是透明的。段的大小不固定有它所完成的功能决定页的大小固定由系统决定段向用户提供二维地址空间页向用户提供的是一维地址空间段是信息的逻辑单位便于存储保护和信息的共享页的保护和共享受到限制。
27.什么是交换空间
操作系统把物理内存(Physical RAM)分成一块一块的小内存每一块内存被称为页(page)。当内存资源不足时Linux把某些页的内容转移至磁盘上的一块空间上以释放内存空间。磁盘上的那块空间叫做交换空间(swap space),而这一过程被称为交换(swapping)。物理内存和交换空间的总容量就是虚拟内存的可用容量。
用途
物理内存不足时一些不常用的页可以被交换出去腾给系统。程序启动时很多内存页被用来初始化之后便不再需要可以交换出去。
28.页面置换算法有哪些
在分页系统里一个虚拟的页面可能在主存里也可能在磁盘中如果CPU发现虚拟地址对应的物理页不在主存里就会产生一个缺页中断然后从磁盘中把该页调入主存中。
如果内存里没有空间就需要从主存里选择一个页面来置换。
常见的页面置换算法 最佳⻚⾯置换算法OPT
最佳⻚⾯置换算法是一个理想的算法基本思路是置换在未来最⻓时间不访问的⻚⾯。
所以该算法实现需要计算内存中每个逻辑⻚⾯的下⼀次访问时间然后⽐较选择未来最⻓时间不访问的⻚⾯。
但这个算法是无法实现的因为当缺页中断发生时操作系统无法知道各个页面下一次将在什么时候被访问。
先进先出置换算法FIFO
既然我们⽆法预知⻚⾯在下⼀次访问前所需的等待时间那可以选择在内存驻留时间很⻓的⻚⾯进⾏中置换这个就是「先进先出置换」算法的思想。
FIFO的实现机制是使用链表将所有在内存的页面按照进入时间的早晚链接起来然后每次置换链表头上的页面就行了新加进来的页面则挂在链表的末端。 最近最久未使⽤的置换算法LRU
最近最久未使⽤LRU的置换算法的基本思路是发⽣缺⻚时选择最⻓时间没有被访问的⻚⾯进⾏置换也就是说该算法假设已经很久没有使⽤的⻚⾯很有可能在未来较⻓的⼀段时间内仍然不会被使⽤。
这种算法近似最优置换算法最优置换算法是通过「未来」的使⽤情况来推测要淘汰的⻚⾯⽽ LRU 则是通过历史的使⽤情况来推测要淘汰的⻚⾯。
LRU 在理论上是可以实现的但代价很⾼。为了完全实现 LRU需要在内存中维护⼀个所有⻚⾯的链表最近最多使⽤的⻚⾯在表头最近最少使⽤的⻚⾯在表尾。 困难的是在每次访问内存时都必须要更新整个链表。在链表中找到⼀个⻚⾯删除它然后把它移动到表头是⼀个⾮常费时的操作。
所以LRU 虽然看上去不错但是由于开销⽐较⼤实际应⽤中⽐较少使⽤。
时钟页面置换算法
这个算法的思路是把所有的⻚⾯都保存在⼀个类似钟⾯的环形链表中⼀个表针指向最⽼的⻚⾯。 当发⽣缺⻚中断时算法⾸先检查表针指向的⻚⾯
如果它的访问位位是 0 就淘汰该⻚⾯并把新的⻚⾯插⼊这个位置然后把表针前移⼀个位置
如果访问位是 1 就清除访问位并把表针前移⼀个位置重复这个过程直到找到了⼀个访问位为 0 的⻚⾯为⽌
最不常⽤置换算法
最不常用算法LFU当发⽣缺⻚中断时选择访问次数最少的那个⻚⾯将其置换。
它的实现⽅式是对每个⻚⾯设置⼀个「访问计数器」每当⼀个⻚⾯被访问时该⻚⾯的访问计数器就累加 1。在发⽣缺⻚中断时淘汰计数器值最⼩的那个⻚⾯。
文件
29.硬链接和软链接有什么区别
硬链接就是在目录下创建一个条目记录着文件名与 inode 编号这个 inode 就是源文件的 inode。删除任意一个条目文件还是存在只要引用数量不为 0。但是硬链接有限制它不能跨越文件系统也不能对目录进行链接。 软链接相当于重新创建⼀个⽂件这个⽂件有独⽴的 inode但是这个⽂件的内容是另外⼀个⽂件的路径所以访问软链接的时候实际上相当于访问到了另外⼀个⽂件所以软链接是可以跨⽂件系统的甚⾄⽬标⽂件被删除了链接⽂件还是在的只不过打不开指向的文件了而已。 IO
30.零拷贝了解吗
假如需要文件传输使用传统I/O数据读取和写入是用户空间到内核空间来回赋值而内核空间的数据是通过操作系统的I/O接口从磁盘读取或者写入这期间发生了多次用户态和内核态的上下文切换以及多次数据拷贝。 为了提升I/O性能就需要减少用户态与内核态的上下文切换和内存拷贝的次数。
这就用到了我们零拷贝的技术零拷贝技术实现主要有两种
mmap write
mmap() 系统调⽤函数会直接把内核缓冲区⾥的数据「映射」到⽤户空间这样操作系统内核与⽤户空间就不需要再进⾏任何的数据拷⻉操作。 sendfile
在 Linux 内核版本 2.1 中提供了⼀个专⻔发送⽂件的系统调⽤函数 sendfile() 。
⾸先它可以替代前⾯的 read() 和 write() 这两个系统调⽤这样就可以减少⼀次系统调⽤也就减少了 2 次上下⽂切换的开销。
其次该系统调⽤可以直接把内核缓冲区⾥的数据拷⻉到 socket 缓冲区⾥不再拷⻉到⽤户态这样就只有 2 次上下⽂切换和 3 次数据拷⻉。 很多开源项目如Kafka、RocketMQ都采用了零拷贝技术来提升IO效率。
31.聊聊阻塞与⾮阻塞 **I/O **、 同步与异步 I/O
阻塞I/O
先来看看阻塞 I/O当⽤户程序执⾏ read 线程会被阻塞⼀直等到内核数据准备好并把数据从内核缓冲区拷⻉到应⽤程序的缓冲区中当拷⻉过程完成 read 才会返回。
注意阻塞等待的是内核数据准备好和数据从内核态拷⻉到⽤户态这两个过程。 非阻塞I/O
⾮阻塞的 read 请求在数据未准备好的情况下⽴即返回可以继续往下执⾏此时应⽤程序不断轮询内核直到数据准备好内核将数据拷⻉到应⽤程序缓冲区 read 调⽤才可以获取到结果。 基于非阻塞的I/O多路复用
我们上面的非阻塞I/O有一个问题什么问题呢应用程序要一直轮询这个过程没法干其它事情所以引入了I/O 多路复⽤技术。
当内核数据准备好时以事件通知应⽤程序进⾏操作。 注意⽆论是阻塞 I/O、还是⾮阻塞 I/O、非阻塞I/O多路复用都是同步调⽤。因为它们在read调⽤时内核将数据从内核空间拷⻉到应⽤程序空间过程都是需要等待的也就是说这个过程是同步的如果内核实现的拷⻉效率不⾼read调⽤就会在这个同步过程中等待⽐较⻓的时间。
异步I/O
真正的异步 I/O 是内核数据准备好和数据从内核态拷⻉到⽤户态这两个过程都不⽤等待。
发起 aio_read 之后就⽴即返回内核⾃动将数据从内核空间拷⻉到应⽤程序空间这个拷⻉过程同样是异步的内核⾃动完成的和前⾯的同步操作不⼀样应⽤程序并不需要主动发起拷⻉动作。 32.详细讲一讲I/O多路复用 我们先了解什么是I/O多路复用 我们在传统的I/O模型中如果服务端需要支持多个客户端我们可能要为每个客户端分配一个进程/线程。
不管是基于重一点的进程模型还是轻一点的线程模型假如连接多了操作系统是扛不住的。
所以就引入了I/O多路复用 技术。
简单说就是一个进程/线程维护多个Socket这个多路复用就是多个连接复用一个进程/线程。 我们来看看I/O多路复用三种实现机制
select
select 实现多路复⽤的⽅式是
将已连接的 Socket 都放到⼀个⽂件描述符集合fd_set然后调⽤ select 函数将fd_set集合拷⻉到内核⾥让内核来检查是否有⽹络事件产⽣检查的⽅式很粗暴就是通过遍历fd_set的⽅式当检查到有事件产⽣后将此 Socket 标记为可读或可写 接着再把整个fd_set拷⻉回⽤户态⾥然后⽤户态还需要再通过遍历的⽅法找到可读或可写的 Socket再对其处理。
select 使⽤固定⻓度的 BitsMap表示⽂件描述符集合⽽且所⽀持的⽂件描述符的个数是有限制的在Linux 系统中由内核中的 FD_SETSIZE 限制 默认最⼤值为 1024 只能监听 0~1023 的⽂件描述符。 select机制的缺点 1每次调用select都需要把fd_set集合从用户态拷贝到内核态如果fd_set集合很大时那这个开销也很大比如百万连接却只有少数活跃连接时这样做就太没有效率。
2每次调用select都需要在内核遍历传递进来的所有fd_set如果fd_set集合很大时那这个开销也很大。
3为了减少数据拷贝带来的性能损坏内核对被监控的fd_set集合大小做了限制一般为1024如果想要修改会比较麻烦可能还需要编译内核。
4每次调用select之前都需要遍历设置监听集合重复工作。
poll
poll 不再⽤ BitsMap 来存储所关注的⽂件描述符取⽽代之⽤动态数组以链表形式来组织突破了select 的⽂件描述符个数限制当然还会受到系统⽂件描述符限制。
但是 poll 和 select 并没有太⼤的本质区别都是使⽤线性结构存储进程关注的Socket集合因此都需要遍历⽂件描述符集合来找到可读或可写的Socke时间复杂度为O(n)⽽且也需要在⽤户态与内核态之间拷⻉⽂件描述符集合这种⽅式随着并发数上来性能的损耗会呈指数级增⻓。
epoll
epoll 通过两个⽅⾯很好解决了 select/poll 的问题。
第⼀点epoll 在内核⾥使⽤红⿊树来跟踪进程所有待检测的⽂件描述字把需要监控的 socket 通过epoll_ctl() 函数加⼊内核中的红⿊树⾥红⿊树是个⾼效的数据结构增删查⼀般时间复杂度是O(logn) 通过对这棵⿊红树进⾏操作这样就不需要像 select/poll 每次操作时都传⼊整个 socket 集合只需要传⼊⼀个待检测的 socket减少了内核和⽤户空间⼤量的数据拷⻉和内存分配。
第⼆点 epoll 使⽤事件驱动的机制内核⾥维护了⼀个链表来记录就绪事件当某个 socket 有事件发⽣时通过回调函数内核会将其加⼊到这个就绪事件列表中当⽤户调⽤ epoll_wait() 函数时只会返回有事件发⽣的⽂件描述符的个数不需要像 select/poll 那样轮询扫描整个 socket 集合⼤⼤提⾼了检测的效率。 epoll 的⽅式即使监听的 Socket 数量越多的时候效率不会⼤幅度降低能够同时监听的 Socket 的数⽬也⾮常的多了上限就为系统定义的进程打开的最⼤⽂件描述符个数。因⽽epoll 被称为解决 C10K 问题的利器。
常用的Linux命令
1、绝对路径用什么符号表示当前目录、上层目录用什么表示主目录用什么表示? 切换目录用什么命令
答
绝对路径 如/etc/init.java
当前目录和上层目录./ …/
主目录 ~/
切换目录cd
2、怎么查看当前进程怎么执行退出怎么查看当前路径
答
查看当前进程ps
执行退出exit
查看当前路径pwd
3、怎么清屏怎么退出当前命令怎么查看当前用户 id查看指定帮助用什么命令
答
清屏clear
退出当前命令ctrlc (立即终止当前正在运行的命令)
执行睡眠 ctrlz挂起当前进程fg恢复后台
查看当前用户idid -g -G -n -r -u -help -version
参数说明
-g 或 --group 显示用户所属群组的ID。-G 或 --groups 显示用户所属附加群组的ID。-n 或 --name 显示用户所属群组或附加群组的名称。-r 或 --real 显示实际ID。-u 或 --user 显示用户ID。-help 显示帮助。-version 显示版本信息。
4、ls命令执行什么功能 可以带哪些参数有什么区别
答
ls执行的功能 列出指定目录中的目录以及文件哪些参数以及区别-a所有文件-l详细信息包括大小字节数可读可写可执行的权限等
5、查看文件有哪些命令
答
vi 文件名 #编辑方式查看可修改cat 文件名 #显示全部文件内容more 文件名 #分页显示文件内容less 文件名 #与more相似更好的是可以往前翻页tail 文件名 #仅查看尾部还可以指定行数head 文件名 #仅查看头部,还可以指定行数6、列举几个常用的Linux命令。
答
列出文件列表ls【参数 -a -l】
创建目录和移除目录mkdir rmdir
用于显示文件后几行内容tail例如 tail -n 1000显示最后1000行
打包tar -xvf
打包并压缩tar -zcvf
查找字符串grep
显示当前所在目录pwd
创建空文件touch
编辑器vim vi
7、你平时是怎么查看日志的
答
Linux查看日志的命令有多种tail、cat、tac、head、echo等本文只介绍几种常用的方法。
1)、tail
最常用的一种查看方式
命令格式: tail [必要参数] [选择参数] [文件]
-f 循环读取
-q 不显示处理信息
-v 显示详细的处理信息
-c数目 显示的字节数
-n行数 显示行数
-q, --quiet, --silent 从不输出给出文件名的首部
-s, --sleep-intervalS 与-f合用,表示在每次反复的间隔休眠S秒
例如
tail -n 10 test.log 查询日志尾部最后10行的日志; tail -n 10 test.log 查询10行之后的所有日志; tail -fn 10 test.log 循环实时查看最后1000行记录(最常用的)
一般还会配合着grep搜索用例如;
tail -fn 1000 test.log | grep ‘关键字’
如果一次性查询的数据量太大,可以进行翻页查看例如
tail -n 4700 aa.log |more -1000 可以进行多屏显示(ctrl f 或者 空格键可以快捷键
2)、head
跟tail是相反的head是看前多少行日志
head -n 10 test.log 查询日志文件中的头10行日志; head -n -10 test.log 查询日志文件除了最后10行的其他所有日志;
head其他参数参考tail
3)、cat
cat 是由第一行到最后一行连续显示在屏幕上
一次显示整个文件
$ cat filename
从键盘创建一个文件
$cat filename
将几个文件合并为一个文件
$cat file1 file2 file 只能创建新文件,不能编辑已有文件
将一个日志文件的内容追加到另外一个
$cat -n textfile1 textfile2
清空一个日志文件
$cat : textfile2
注意 意思是创建是追加。千万不要弄混了。
cat其他参数参考tail
4)、more
more命令是一个基于vi编辑器文本过滤器它以全屏幕的方式按页显示文本文件的内容支持vi中的关键字定位操作。more名单中内置了若干快捷键常用的有H获得帮助信息Enter向下翻滚一行空格向下滚动一屏Q退出命令。more命令从前向后读取文件因此在启动时就加载整个文件。
该命令一次显示一屏文本满屏后停下来并且在屏幕的底部出现一个提示信息给出至今己显示的该文件的百分比–More–XX%
more的语法more文件名
Enter 向下n行需要定义默认为1行
Ctrl f 向下滚动一屏
空格键 向下滚动一屏
Ctrl b返回上一屏 输出当前行的行号
:f 输出文件名和当前行的行号
v 调用vi编辑器
!命令调用Shell并执行命令
q退出more
5)、sed
这个命令可以查找日志文件特定的一段 , 根据时间的一个范围查询可以按照行号和时间范围查询按照行号
sed -n ‘5,10p’ filename这样你就可以只查看文件的第5行到第10行。
按照时间段
sed -n ‘/2014-12-17 16:17:20/,/2014-12-17 16:17:36/p’ test.log
6)、less
less命令在查询日志时一般流程是这样的
less log.log shift G 命令到文件尾部 然后输入 加上你要搜索的关键字例如 1213 按 n 向上查找关键字 shiftn 反向查找关键字 less与more类似使用less可以随意浏览文件而more仅能向前移动不能向后移动而且 less 在查看 之前不会加载整个文件。
less log2013.log 查看文件
ps -ef | less ps查看进程信息并通过less分页显示
history | less 查看命令历史使用记录并通过less分页显示
less log2013.log log2014.log 浏览多个文件
常用命令参数
-b 缓冲区大小 设置缓冲区的大小
-g 只标志最后搜索的关键词
-i 忽略搜索时的大小写
-m 显示类似more命令的百分比
-N 显示每行的行号
-o 文件名 将less 输出的内容在指定文件中保存起来
-Q 不使用警告音
-s 显示连续空行为一行
/字符串向下搜索字符串的功能
?字符串向上搜索字符串的功能
n重复前一个搜索与 / 或 ? 有关
N反向重复前一个搜索与 / 或 ? 有关
b 向后翻一页
h 显示帮助界面
q 退出less命令
一般本人查日志配合应用的其他命令
8、建立软链接(快捷方式)以及硬链接的命令
答
软链接 ln -s slink source
硬链接 ln link source
9、目录创建用什么命令创建文件用什么命令复制文件用什么命令
答
创建目录 mkdir
创建文件典型的如touchvi也可以创建文件其实只要向一个不存在的文件输出都会创建文件复制文件 cp7文件权限修改用什么命令格式是怎么样的
文件权限修改 chmod
格式如下
chmod ux file 给 file 的属主增加执行权限
chmod 751 file 给 file 的属主分配读、写、执行(7)的权限给 file 的所在组分配读、执行(5)的权限给其他用户分配执行(1)的权限
chmod urwx, grx, ox file 上例的另一种形式
chmod r file 为所有用户分配读权限
chmod 444 file 同上例
chmod a-wx, ar file 同上例
chmod -R ur directory 递归地给 directory 目录下所有文件和子目录的属主分配读的权限
10、查看文件内容有哪些命令可以使用
答
vi文件名 #编辑方式查看可修改
cat文件名 #显示全部文件内容
more文件名 #分页显示文件内容
less文件名#与 more 相似更好的是可以往前翻页
tail 文件名 #仅查看尾部还可以指定行数
head 文件名 #仅查看头部,还可以指定行数
11、随意写文件命令怎么向屏幕输出带空格的字符串比如”hello world”?
答
写文件命令vi
向屏幕输出带空格的字符串:echo hello world
12、终端是哪个文件夹下的哪个文件黑洞文件是哪个文件夹下的哪个命令
答
终端 /dev/tty
黑洞文件 /dev/null
13、移动文件用哪个命令改名用哪个命令
答
mv
14、复制文件用哪个命令如果需要连同文件夹一块复制呢
答
cp
cp -r
15、删除文件用哪个命令如果需要连目录及目录下文件一块删除呢删除空文件夹用什么命令
答
rm
rm -r
rmdir
16、Linux下命令有哪几种可使用的通配符分别代表什么含义
答
“?” 可替代单个字符。
“*” 可替代任意多个字符。
方括号 “ [charset]” 可替代charset集中的任何单个字符 如 [a-z] [abABC]
17、用什么命令对一个文件的内容进行统计(行号、单词数、字节数)
答
wc 命令
-c统计字节数
-l统计行数
-w统计字数。
18、Grep命令有什么用 如何忽略大小写 如何查找不含该串的行?
答
是一种强大的文本搜索工具它能使用正则表达式搜索文本并把匹配的行打印出来。
grep [string] filename
19、Linux中进程有哪几种状态在ps显示出来的信息中分别用什么符号表示的
答
1、不可中断状态进程处于睡眠状态但是此刻进程是不可中断的。不可中断指进程不响应异步信号。
2、暂停状态/跟踪状态向进程发送一个SIGSTOP信号它就会因响应该信号 而进入TASK_STOPPED 状态;当进程正在被跟踪时它处于 TASK_TRACED 这个特殊的状态。正被跟踪”指的是进程暂停下来等待跟踪它的进程对它进行操作。
3、就绪状态在 run_queue 队列里的状态
4、运行状态在 run_queue 队列里的状态
5、可中断睡眠状态处于这个状态的进程因为等待某某事件的发生比如等待socket 连接、等待信号量而被挂起
6、zombie 状态僵尸父亲没有通过 wait 系列的系统调用会顺便将子进程的尸体task_struct也释放掉
7、退出状态
D 不可中断 Uninterruptibleusually IO
R 正在运行或在队列中的进程
S 处于休眠状态
T 停止或被追踪
Z 僵尸进程
W 进入内存交换从内核 2.6 开始无效
X 死掉的进程
20、怎么使一个命令在后台运行?
答
一般都是使用 在命令结尾来让程序自动运行。(命令后可以不追加空格)
21、利用ps怎么显示所有的进程? 怎么利用ps
答
ps -ef (system v 输出)
ps -aux bsd 格式输出
ps -ef | grep pid
22、哪个命令专门用来查看后台任务?
答
job -l
23、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?
答
把后台任务调到前台执行fg
把停下的后台任务在后台执行起来bg
24、终止进程用什么命令? 带什么参数?
答
kill [-s 信息名称或编号] [程序] 或 kill [-l 信息编号]
kill -9 pid
25、怎么查看系统支持的所有信号
答
kill -l
26、搜索文件用什么命令? 格式是怎么样的?
答
find 指定目录 指定条件 指定动作
whereis 加参数与文件名
locate 只加文件名
find 直接搜索磁盘较慢。
find / -name “string*”
27、查看当前谁在使用该主机用什么命令? 查找自己所在的终端信息用什么命令?
答
查找自己所在的终端信息who am i
查看当前谁在使用该主机who
28、使用什么命令查看用过的命令列表?
答
history
29、使用什么命令查看磁盘使用空间空闲空间呢?
答
df -hl
30、使用什么命令查看网络是否连通?
答
netstat
31、使用什么命令查看IP地址及接口信息
答
ifconfig
32、查看各类环境变量用什么命令?
答
查看所有env
查看某个如homeenv $HOME
33、查找命令的可执行文件是去哪查找的? 怎么对其进行设置及添加?
答
whereis [-bfmsu] [-B 目 录 …] [-M 目 录 …] [-S 目 录 …] [文 件 …]
补充说明whereis指令会在特定目录中查找符合条件的文件。这些文件的烈性应属于原始代码二进制文件或是帮助文件。
-b只查找二进制文件。
-B 目录 只在设置的目录下查找二进制文件。
-f不显示文件名前的路径名称。
-m 只查找说明文件。
-M 目录 只在设置的目录下查找说明文件。
-s 只查找原始代码文件。
-S 目录 只在设置的目录下查找原始代码文件。
-u 查找不包含指定类型的文件。
w -h ich 指令会在 PATH 变量指定的路径中搜索某个系统命令的位置并且返回第一个搜索结果。
-n 指定文件名长度指定的长度必须大于或等于所有文件中最长的文件名。
-p 与-n 参数相同但此处的包括了文件的路径。
-w 指定输出时栏位的宽度。
-V 显示版本信息
34、通过什么命令查找执行命令?
答
which只能查可执行文件
whereis只能查二进制文件、说明文档源文件等
35、怎么对命令进行取别名
答
alias la‘ls -a’
36、du和df的定义以及区别
答
du显示目录或文件的大小
df显示每个文件所在的文件系统的信息默认是显示所有文件系统。
文件系统分配其中的一些磁盘块用来记录它自身的一些数据如i节点磁盘分布图间接块超级块等。这些数据对大多数用户级的程序来说是不可见的通常称为MetaData。
du命令是用户级的程序它不考虑Meta Data而df命令则查看文件系统的磁盘分配图并考虑Meta Data。
df命令获得真正的文件系统数据而du命令只查看文件系统的部分情况。
37、如果一个Linux新手想要知道当前系统支持的所有命令的列表他需要怎么做
答
使用命令compgen -c可以打印出所有支持的命令列表。
38、如果你的助手想要打印出当前的目录栈你会建议他怎么做
答
使用Linux命令dirs可以将当前的目录栈打印出来。
[rootlocalhost ~]# dirs /usr/share/X11
39、你的系统目前有许多正在运行的任务在不重启机器的条件下有什么方法可以把所有正在运行的进程移除呢
答
使用linux 命令’disown -r 可以将所有正在运行的进程移除。
40、bash shell中的hash命令有什么作用
答
linux命令’hash’管理着一个内置的哈希表记录了已执行过的命令的完整路径,用该命令可以打印出你所使用过的命令以及执行的次数。
[rootlocalhost ~]# hash hits command 2 /bin/ls 2 /bin/su
41、怎样一页一页地查看一个大文件的内容呢
答
通过管道将命令”cat file_name.txt” 和 ’more’ 连接在一起可以实现这个需要
[rootlocalhost ~]# cat file_name.txt | more
42、数据字典属于哪一个用户的
答
数据字典是属于’SYS’用户的用户‘SYS’ 和 ’SYSEM’是由系统默认自动创建的
43、怎样查看一个linux命令的概要与用法假设你在/bin 目录中偶然看到一个你从没见过的的命令怎样才能知道它的作用和用法呢
答
使用命令whatis可以先出显示出这个命令的用法简要比如你可以使用whatis zcat去查看‘zcat’的介绍以及使用简要。
44、使用哪一个命令可以查看自己文件系统的磁盘空间配额呢
答
使用命令repquota 能够显示出一个文件系统的配额信息
【附 】只有root用户才能够查看其它用户配额 。 资料来源 面试字节被操作系统问挂了 linux命令面试_linux常见命令面试-CSDN博客