Jialong's Blog
沉潜 自由 追寻幸福
八股文——操作系统相关

进程和线程的区别

  • 进程是资源(CPU、内存等)分配的基本单位

  • 线程是进程的一个实体,是CPU调度和分配的基本单位(程序执行的最小单位)。线程自身不拥有系统资源,但可与同属一个进程的其他线程共享进程所拥有的全部资源。

  • 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响;线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程崩溃就等于整个进程崩溃,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。

进程同步(通信)方法

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

线程间通信方法

  • 信号量
  • 互斥锁
  • 自旋锁
  • 读写锁
  • 条件变量

硬中断和软中断的区别

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

死锁

死锁发生的四个必要条件

  • 互斥条件:进程要求对所分配的资源进行排他性控制,在一段时间内某资源仅为一进程所占用

  • 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放

  • 无法剥夺条件:进程已获得的资源在未使用完之前,无法剥夺,只能在使用完后由自己释放

  • 环路等待条件:发生死锁时,必然存在一个进程——资源的环形链路

预防死锁

  • 资源一次性分配:破坏请求条件

  • 只要有一个资源得不到分配,不给这个进程分配其他的资源:破坏请求保持条件

  • 可剥夺资源:当进程获得了部分资源但得不到其他资源,则释放已占用资源:破坏不可剥夺条件

  • 资源有序分配法:进程按规定顺序请求资源,释放则相反:破坏环路等待条件

互斥锁和自旋锁的选择

利用加锁来实现互斥和同步的一般模型为:

  • 加锁$\rightarrow$临界区:访问公共变量$\rightarrow$解锁

当判断lock已被加锁,则有两种处理方式:

  • 调用系统函数将当前线程阻塞(互斥)
  • 使其一直处于循环判断的状态(自旋)

阻塞当前线程可以让出CPU资源去执行别的线程,通过减少CPU浪费来提高效率;但切换线程需要进行上下文切换,耗费时间较长。对于线程占用锁时间短的情况,自旋锁会更加高效。

信号量和互斥量

互斥量只能用于一个资源的互斥访问,而信号量可以实现多个同类资源的多线程互斥和同步。

互斥量在任意时刻只允许一个线程访问某个共享资源,而信号量则允许固定数量的线程访问某个共享资源池,即互斥量是信号量n为1的特殊情况。

软中断、tasklet和工作队列

这三者都属于中断的下半部,区别在于:

  • 软中断可以并发运行在多个CPU上,因此必须设计为可重入函数,也需要使用自旋锁来保护其数据结构
  • 同一类型的tasklet只能运行在一个CPU上,只能串行执行;不同类型tasklet可以并行在多个CPU上
  • 软中断是静态分配的,内核编译完后不能改变;tasklet可以运行时改变

Linux内核的组成部分

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

内核态和用户态的区别

操作系统的两种运行级别,以限制不同程序的访问权限。内核态可以访问所有数据,包括外围设备;用户态只能受限地访问内存,不允许访问外围设备。

三种方式由用户态切换到内核态:

  • 系统调用,如库函数malloc,调用brk()或mmap()指令
  • 异常
  • 外设中断

硬链接和软链接

硬链接

Linux下的文件是通过索引节点(i-node)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配i-node。每添加一个硬链接,文件的链接数就加1,只有当该文件的所有链接都被删除后,文件才会从硬盘中被完全移除。

不足:

  • 不可以在不同文件系统的文件间建立链接
  • 只有超级用户才能为目录创建硬链接

软链接

又称符号链接,包含的是原文件的i-node记录。没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。删除软链接不影响被指向的文件,但若源文件被删除,则软链接将会失效。

不足:

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

实际场景下,一般使用软链接。

文件权限与归属

每个文件都有归属的所有者和所有组,并规定了文件的所有者、所有组以及其他人对文件所拥有的读、写、执行等权限。

  • 读: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粘滞位权限后,该目录中的文件只能被其所有者执行删除操作

rwxrw-rwx:767

fork和vfork的区别

fork和vfork都是在已有的进程中创建一个新的进程,但所创建的子进程是有区别的:

fork父子进程的执行次序不确定,且子进程拷贝父进程的数据段和代码段。

vfork确保子进程先运行,在调用exec或exit之后,父进程才可能被调度运行。如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁。

gcc语法

预处理 -E;编译 -S;汇编 -c;

生成目标 -o

嵌入调试信息 -g

参考

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


最后修改于 2022-01-08