八股文之操作系统 高频知识点整理

1、进程和线程的区别

进程是资源(CPU、内存等)分配的基本单位
线程是进程的一个实体,是CPU调度和分配的基本单位(程序执行的最小单位)。线程自身不拥有系统资源,但可与同属一个进程的其他线程共享进程所拥有的全部资源。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程崩溃就等于整个进程崩溃,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

2、进程同步(通信)方法

  • 管道/有名管道:一个进程链接数据流到另一个进程,简单理解就是把一个进程的输出直接传递给另一个进程的输入。
    • 无名管道适用于父子进程间通信。
    • 管道是基于字节流的
    • 半双工,数据同一时间只能从一个方向传输
    • 自带同步机制,在保证数据安全前提下,按照特定顺序访问临界资源
  • 信号:处理异步事件的方式,用于通知接收进程有某种事件发生,也可发送信号给进程本身
  • 信号量:
    • 处理进程间同步和互斥的通信机制,类似于资源计数器,保证在任一时刻只能有一个进程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行
    • P操作:如果有可用的资源(信号量值>0),则此操作所在的进程占用一个资源(此时信号量值减1,进入临界区代码);如果没有可用的资源(信号量值=0),则此操作所在的进程被阻塞直到系统将资源分配给该进程(进入等待队列,一直等到资源轮到该进程)。
    • V操作:如果在该信号量的等待队列中有进程在等待资源,则唤醒一个阻塞进程;如果没有进程等待它,则释放一个资源(即信号量值加1)。
  • 消息队列:消息的链表,提供了一个进程向另一个进程发送数据块的方法,每个数据块都可被认为是有一个类型,接收者接收的数据块可以有不同的类型
    • 特点:生命周期随内核存在,需要显式调用或删除
    • 可以双向通信,且克服了管道只能承载无格式字节流的缺点
  • 共享内存:同一物理内存被映射到两个进程的地址空间,两个进程都可以访问这段空间,从而实现进程间通信
    • 最快的IPC形式,内存映射到共享进程的地址空间,进程数据传递不再涉及内核
    • 共享内存的生命周期随进程存在,需要显式删除
    • 没有互斥与同步机制
  • socket:套接字,应用层与传输层之间的一个抽象层,socket是一种“打开——读写——关闭”模式的实现,作为服务器和客户端之间维护的“文件”,在建立链接打开后,可以向文件写入内容供对方读取或读取对方内容,通讯结束时关闭文件。

3、线程间通信方法

(1)信号量
(2)互斥锁
(3)自旋锁
(4)读写锁
(5)条件变量

4、硬中断和软中断区别

  • 软中断是执行中断指令产生的,而硬中断是由外设引发的。
  • 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
  • 硬中断是可屏蔽的,软中断不可屏蔽。
  • 硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
  • 软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。 

5、死锁

死锁发生的四个必要条件
  • 互斥条件:进程要求对所分配的资源进行排他性控制,在一段时间内某资源仅为一进程所占用
  • 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放
  • 无法剥夺条件:进程已获得的资源在未使用完之前,无法剥夺,只能在使用完后由自己释放
  • 环路等待条件:发生死锁时,必然存在一个进程——资源的环形链路
预防死锁:
  • 资源一次性分配:破坏请求条件
  • 只要有一个资源得不到分配,不给这个进程分配其他的资源:破坏请求保持条件
  • 可剥夺资源:当进程获得了部分资源但得不到其他资源,则释放已占用资源:破坏不可剥夺条件
  • 资源有序分配法:进程按规定顺序请求资源,释放则相反:破坏环路等待条件

6、互斥锁和自旋锁的选择

利用加锁来实现互斥和同步的一般模型为,加锁→临界区:访问公共变量→解锁
当判断lock已被加锁,则有两种处理:一是调用系统函数将当前线程阻塞,二是使其一直处于循环判断的状态,即互斥和自旋。阻塞当前线程可以让出CPU资源去执行别的线程,通过减少CPU浪费来提高效率;但切换线程需要进行上下文切换,因此耗费时间较长。对于线程占用锁时间短的情况,自旋锁会更加高效。
对于单核和不可抢占内核,自旋锁会退化为空操作;对于单核和可抢占内核,自旋锁持有期间内内核的抢占将被禁止。
互斥锁所保护的临界区可包含可能引起阻塞的代码,如果自旋锁用于这种情况,则可能因进程切换而发生死锁

7、信号量和互斥量

互斥量只能用于一个资源的互斥访问,而信号量可以实现多个同类资源的多线程互斥和同步。
互斥量在任意时刻只允许一个线程访问某个共享资源,而信号量则允许固定数量的线程访问某个共享资源池,即互斥量是信号量n为1的特殊情况


8、软中断、tasklet和工作队列

这三者都属于中断的下半部,区别在于:
  • 软中断可以并发运行在多个CPU上,因此必须设计为可重入函数,也需要使用自旋锁来保护其数据结构
  • 同一类型的tasklet只能运行在一个CPU上,只能串行执行;不同类型tasklet可以并行在多个CPU上
  • 软中断是静态分配的,内核编译完成后不能改变;tasklet可以在运行时改变(如添加模块时)
软中断和tasklet同属于可延迟函数,运行于中断上下文,中断上下文位于内核态,没有进程切换,因此不可睡眠、不可阻塞;工作队列运行于进程上下文,是可阻塞函数,也具有可延迟函数的特点(可用于磁盘数据访问)

9、Linux内核的组成部分

进程调度、内存管理、虚拟文件系统、网络接口、进程间通信

10、内核态和用户态的区别

操作系统的两种运行级别,以限制不同程序的访问权限。内核态可以访问所有数据,包括外围设备;用户态只能受限制地访问内存,且不允许访问外围设备。
三种方式由用户态切换到内核态
1、系统调用,如库函数malloc,调用brk()或者mmap()指令
2、异常,如缺页异常,调用内核中的缺页异常处理程序,选取PTE中的牺牲页以LRU算法替换其中内容
3、外设中断

11、什么是硬链接和软链接?

1)硬链接
由于Linux下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配inode。每添加一个硬链接,文件的链接数就加1。只有当该文件的所有链接都被删除后,文件才会从硬盘中被完全移除。
不足:1)不可以在不同文件系统的文件间建立链接;2)只有超级用户才可以为目录创建硬链接。
2)软链接
软链接又称符号链接,包含的是原文件inode的记录。没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。删除软链接不影响被指向的文件,但若原文件被删除,则软链接将失效

不足:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。  


实际场景下,基本是使用软链接。

总结区别如下: 

  • 软链接文件与原文件拥有不同的inode号,即表明是两个不同的文件;硬链接文件和原文件共用一个inode号;

  • 本质上硬链接文件和原文件是完全平等关系,而软链接则可理解为快捷方式

12、查看CPU使用情况

top指令,CPU占用率过高,排查方法为:top -H -p找到进程中消耗资源最高的线程的id,jstack | grep -A 查看线程的堆栈信息,排除死锁问题

13、文件权限与归属

每个文件都有归属的所有者和所有组,并规定了文件的所有者、所有组及其他人对文件所拥有的读、写、执行等权限
读read,r,4来表示;写write,w,2来表示;执行execute,x,1来表示
-rwx-rw-r--    1    root    root:第一个-表示文件类型,rwx-rw-r--表示访问权限,最后两个表示属主和属组
  • 文件类型:普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)、字符设备文件(c)
    • 普通文件包括:纯文本文件、服务配置信息、日志信息以及shell脚本
    • 块设备文件:块设备以块为单位存储数据,如磁盘设备。数据可被随机访问,传送任何数据块所需时间较少而且大致相同
    • 字符设备文件:字符设备是指IO过程中以字符为单位进行传输的设备,数据不可随机访问,或可随机访问但所需时间很大程度上依赖于数据在设备内位置
文件的特殊权限
  • SUID
    • 对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有属主的权限
  • SGID
    • 对二进制程序进行设置时,能够让执行者临时获取到文件所有组的权限;对目录进行设置时,让目录内新创建的文件自动继承该目录的原有用户组
  • SBIT
    • 确保用户只能删除自己的文件,而不能删除其他用户的文件;对目录设置SBIT粘滞位权限后,该目录中的文件只能被其所有者执行删除操作
rwsrwSrwt:7767
SUID+SGID+SBIT:第一位的7,以及s、S、t;其中小写表示有执行权限,大写表示没有执行权限
rwxrw-rwx:767

14、fork和vfork的区别

fork和vfork都是在已有的进程中创建一个新的进程,但所创建的子进程是有区别的:
fork父子进程的执行次序不确定,且子进程拷贝父进程的数据段和代码段。
vfork确保子进程先运行,在调用exec或exit之后,父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

15、gcc语法

预处理 -E;编译 -S;汇编 -c;
生成目标 -o
嵌入调试信息 -g
#面经##学习路径##笔经#
全部评论
感谢大佬
点赞 回复
分享
发布于 2022-05-06 09:31

相关推荐

6 97 评论
分享
牛客网
牛客企业服务