操作系统八股
1、进程和线程的区别
线程是进程内部最小的执行单元,是程序执行的最小的单位。一个进程至少有一个线程,可以有多个线程,这些线程共享同一片内存空间。
每个进程都具有不同的内存地址空间,进程之间的切换需要保存和恢复整个进程的状态,进行上下文切换的开销较大。同一个进程内的全部线程共享同一部分内存地址空间,线程之间的切换只需要保存和回复少量线程上下文,所以开销比较小。
由于进程与进程之间是相互隔离的,所以两个进程之间不能直接进行通信,必须通过一些特殊的机制进行通信,比如管道、消息队列、共享内存等等。但是线程共享内存地址空间,他们之间可以共享数据,线程之间通信更加方便。
由于进程之间是内存隔离的,所以一个进程出错了不会影响其他的进程。由于线程是共享内存地址空间,所以一个线程出现问题可能会对其他的线程造成影响。
2、并行和并发有什么区别
并行是指在同一时刻执行多个任务,每个任务处理在不同的处理单元上,比如多核处理器。
并发是指在同一时间段内执行多个任务,这些任务不是同时完成的,而是交替完成。由操作系统完成进程的调度和交替执行。
3、什么是用户态和核心态
用户态和核心态是操作系统为了保护系统资源和实现权限控制而设计的 CPU 的两种运行级别。可以控制进程对计算机资源的访问权限。
用户态下进程只能访问受限的资源和指令集,不能访问操作系统的核心部分,也不能直接访问硬件资源。
核心态下进程可以访问全部的操作系统核心资源和指令集。进程可以直接访问硬件资源,进行系统调用、管理内存和文件系统等操作。
4、什么场景下会发生用户态和核心态的切换
系统调用:用户程序主动请求操作系统内核服务,比如文件 I/O,进程管理,内存管理等。由用户程序主动发起,通过系统调用指令陷入内核。
中断:外部硬件设备异步通知 CPU,CPU 停止当前内核程序,进入内核态转去执行中断处理程序。执行之后再转换回用户态。比如时钟中断、I/O中断等。
异常:CPU 在执行指令的时候遇到错误,会强制陷入内核态处理。异常又分为故障、陷阱和终止。比如缺页异常、除0错误和断点等。
5、解释一下进程调度算法
先来先服务:先来的进程先进入 CPU 执行,后来的等待,会导致长作业阻塞短作业。
短作业优先:按进程执行时间的长短执行,较短时间的作业先执行,如果一直有源源不断的短作业到来,可能导致长作业发生“饥饿”现象。
最短剩余时间优先:按照剩余的运行时间进行排序,当一个作业到来,如果他的执行时间比当前正在处理的进程还需要运行的时间短,那么挂起当前进程运行新的进程。否则新的进程等待。
优先级调度:为每一个进程设置一个优先级,优先级高的进程优先执行。为了防止优先级低的进程“饥饿”,可以随着时间的增长为等待进程增加优先级。
时间片轮转:设置一个时间片,就绪队列按照 FIFO 排队,每个进程运行一个时间片的时间,然后发生进程调度,直到所有进程运行完。
多级队列:将就绪队列分成多个固定队列,每个队列有各自的进程调度算法。
多级反馈队列:新进来的进程在最高的优先级的队列。如果这个时间片用完之后进程还没有结束,那么就进入下一级优先级队列。进程可以在队列间迁移。
6、进程间有哪些通信方式
管道:是一种半双工的通信方式,数据只能单向流动,且只能在具有父子关系的进程之间建立管道。
消息队列:允许多个进程进行读写操作,也可以实现异步通信,消息可以设置优先级,按照优先级进行处理重要的消息。
信号:用来发送通知到某个进程,告知其发生了某种事件。
信号量:是一个计数器,主要用来控制多个进程对共享资源的访问,防止某个进程正在使用资源的时候,其他进程打断。也可以作为同一个进程内的不同的线程之间的同步访问。
共享内存:多个进程共同映射一块物理地址相同的内存为共享内存,多个进程可以访问,是最快的进程通信的方式。
7、解释一下进程同步和互斥,如何实现进程同步和互斥
进程的同步是指并发的多个线程之间,由执行先后的顺序,必须按照确定的顺序和时间执行。进程的互斥是指多个进程在运行时,某一时刻只允许一个进程访问共享资源,其他的进程不能访问,必须等待。
解决进程同步互斥的方法有很多种,常见的主要有信号量和 PV 操作。信号量是一种特殊的变量,他表示系统中某种资源的数量。PV 操作是一种用来对信号量进行操作的方法,可以用来控制进程之间的同步与互斥。
P 操作:相当于检查,在进程访问共享资源之前,先检查共享资源的数量,将信号量的数量减一,如果信号量数量 >= 0,进程可以进入访问。否则,进程必须阻塞等待,让出 CPU。
V 操作:相当于归还,当进程访问完资源后,将信号量的数量加一,如果信号量的数量 <= 0,表示当前还有进程正在等待该资源,于是唤醒一个正在阻塞的进程。否则表示没有阻塞进程。
也可以使用互斥锁(mutex)来实现同步机制,每个共享资源都会关联一个互斥锁,当有进程想要访问共享资源的时候,必须要先获取到这个互斥锁,使用完之后释放锁。
8、什么是死锁,如何避免死锁
当系统中存在这两个或多个资源的时候,当每个进程一边持有资源,并且又等待其他进程占用的资源,互相等待着对方的资源,就会造成死锁。
死锁必须满足以下四种条件:
互斥条件:多个进程访问的资源是互斥的,一个进程正在访问,其他的进程必须要等待。
请求并保持条件:一个进程在请求另一个互斥资源的时候,不会释放自己已经有的资源。
不可剥夺条件:资源不能被强制的从一个进程手中被剥夺,必须由持有者主动释放资源。
循环等待条件:多个进程互相循环等待对方的资源,都在等待其他进程释放资源。
死锁避免:通过破坏四个条件中的一个条件来避免死锁的形成,进程之间按照顺序进行资源的使用和释放。
死锁检测:通过检测系统中的资源分配情况来分辨是否发生了死锁,主要的方法有画出资源分配图和银行家算法。
死锁解除:用来检测出发生死锁后,解除死锁,可以终止某一个进程,或者抢占其他进程的资源来解除死锁。
9、介绍一下几种典型的锁
锁主要是分为互斥锁和自旋锁,其他的锁都是基于他们实现的。互斥锁是用来控制在同一时间只能有一个线程访问共享资源,其他进程必须阻塞等待,同时让出 CPU 的使用权。自旋锁主要是用忙等,如果获取锁失败就持续的等待,直到锁被释放。
读写锁:允许多个线程同时读多个资源,但是只能有一个线程进行写操作。分为读共享锁和写排他锁。读共享锁是指当一个线程持有读锁的时候,其他的线程也可以申请读锁,但不能持有写锁。写排他锁是指,当一个线程持有写锁的时候,其他的线程既不能读也不能写。
乐观锁和悲观锁:乐观锁是指在对共享资源的修改的时候,认为数据不会被更改,先不上锁,直到要对共享数据进行更新的时候,先检查数据是否被其他的线程更改过,如果被更改过就失败重试,通常可以使用版本号法和 CAS 机制来实现乐观锁。悲观锁通常认为数据一定会发生更改,所以在某个线程要修改数据的时候,先上锁,然后自己修改之后再释放锁,保证数据的一致性。
可重入锁:同一个线程在持有锁的时候,如果要再次访问这把锁,会直接成功,内部会记录一个重入次数,避免自己把自己锁死。
10、讲一讲你理解的虚拟内存
11、线程同步的方式有哪些
12、有哪些页面置换算法
常见的页面置换算法有:最佳置换算法 OPT,最近最久未使用 LRU,先进先出算法 FIFO,时钟算法 Clock 等。
最近最久未使用算法 LRU:根据页面的使用历史记录,选择最长时间没用被使用的页面进行替换。
先进先出 FIFO:最先进入内存的页面最先被替换出去。
最不经常使用 LFU:淘汰掉访问频率最低的页面。
最佳置换算法 OPT:选择未来最长时间不会被使用到的页面进行替换,但是操作系统并不知道未来会使用哪些页面,所以这个算法是理想情况下才会发生,根本无法实现。
时钟算法 Clock:算法通过一个指针,在环形链表上进行遍历,找到最近没有被使用过的页面。当需要进行页面替换的时候,算法从指针当前位置进行顺时针遍历,如果遇到页面当前的访问位为0,说明当前页面最久没有被访问过,于是替换出当前页,并将换进来的页面的访问位置为1;如果遍历当前位置为1,说明当前页面被访问过,处于活跃状态,于是将当前位置置为0。
13、熟悉哪些 linux 命令
文件操作:ls 列出文件目录;cd 进入指定目录;pwd 显示当前工作目录;cp 复制文件或目录;mv 移动文件;rm 删除文件或目录;touch 创建空文件
文件内容查看:cat 查看文件内容;head 查看文件的前几行; tail 查看文件的后几行
文件编辑:vi / vim 文本编辑器
权限管理:chmod 更改文件或目录的访问权限
磁盘管理:df 查看磁盘空间的使用情况
网络管理:ifconfig 查看和配置网络接口;ping 测试网络连接;ssh 安全远程登录
进程管理:ps 查看当前运行的进程;kill 杀掉进程
14、linux 中如何查看一个进程和杀死一个进程,如何查看某个端口有没有被占用
查看进程:主要使用 ps 命令,例如 ps qq,可以查看当前所有的 qq 进程的全部信息。
杀死进程:可以先使用 ps 或者 top 命令找到进程的 PID,然后通过 kill 指令来杀死对应进程 ID 的进程,比如 kill 12345。
查看端口占用:使用 lsof -i:8080 可以查看占用特定端口的进程。
15、说一下 select、poll、epoll
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)