八股文-Linux系统部分

目录

  • 权限掩码有什么作用? 直到粘滞位吗?
  • 怎样将程序停留在预处理过程/编译/汇编过程后?
  • 用过gdb吗?讲讲常见的热键
  • 谈谈你对整个计算机体系的认识
  • 什么是进程? 谈谈你自己的理解?
  • 进程在运行时可能会出现哪些状态?
  • Fork函数了解多少?
  • 了解过僵尸进程和孤儿进程吗?
  • 并行和并发的区别?
  • 当发生进程切换后再次被调度时, 怎样知道上次运行到哪儿了?
  • 了解过哪些环境变量
  • 什么是地址空间? 和物理内存是什么关系? 为什么要有它?
  • 谈谈你对整个文件系统的理解?
  • 聊聊软硬链接
  • 动静态库的区别
  • 了解哪些进程间通信的方式
  • 聊聊你对整个信号体系的理解
  • 了解过核心转储吗
  • 线程和进程的区别
  • 了解过协程吗
  • 用过哪些锁? 讲一讲死锁的原理
  • 讲讲线程安全和可重入的联系
  • 什么是线程同步
  • 什么是生产者消费者模型
  • 手撕一个线程池
  • 操作系统用户态和内核态有什么区别

权限掩码有什么作用? 直到粘滞位吗?

A.可通过设置权限掩码的方式来改变文件创建出来后的默认属性, 文件夹默认权限(775) 普通文件默认权限(664)
B.首先, 目录的读, 写, 可执行权限分别代表: 是否可以查看目录下的文件, 是否能创建或删除目录下的文件, 能否进入此目录, 在同一个目录下工作的成员可以随意的删除别人的文件, 若把目录的w权限关闭, 则也不能创建文件了, 所以给目录设置粘滞位后, 用户只能删除自己的文件, 而不能删除别人的文件.

怎样将程序停留在预处理过程/编译/汇编过程后?

(1)预处理后:gcc -E code.c 形成.i文件
(2)编译后:gcc -S code.i 形成.s文件
(3)汇编后:gcc -C code.s 形成.o文件

用过gdb吗?讲讲常见的热键

(1) gdb + 可执行程序进入调试模式, quit退出调试模式
(2)run(简写r), 类似于VS下的F5
(3)list(简写l), 会将附近的代码打印出来
(4)next(简写n), 向下走一步, 不进入函数内部, 类似于VS下的F10
(5)step(简写s), 向下走一步, 进入函数内部, 类似于VS下的F11
(6)b + 行号, 在任意行打断点, b + 函数名, 给函数打断点
(7)info + b 查看断点信息, d + 断点编号, 删除对应断点

谈谈你对整个计算机体系的认识

冯诺依曼体系: 由输入设备, 输出设备, CPU, 内存组成, CPU只能和内存进行交互, 数据不能由外设直接导入到CPU进行处理, 要先将数据搬到内存

什么是进程? 谈谈你自己的理解?

(1)课本概念: 进程就是一个正在运行的程序
(2)内核观点: 进程是担任系统资源分配的实体
(3)自己的理解: 进程就是可执行程序 + 内核数据结构(PCB)

进程在运行时可能会出现哪些状态?

A.运行状态: 只要在运行队列中或正在CPU中运行就处于运行状态
B.阻塞态: 进程在访问某些资源时, 若资源还没就绪, 进程会被放在等待队列中, 就从运行状态变成了阻塞状态
C.挂起状态: 若一个进程处于阻塞状态, 那么就代表它在一段时间内无法被调度, 恰好此时OS的内存资源已经严重不足了, OS会将这个进程对应的代码和数据暂时放到磁盘中, 为内存腾出空间, 这个进程就被挂起了
D.进程状态的本质就是PCB中的一个status字段, 进程状态改变的本质就是修改PCB中的字段并且将PCB链接到不同的队列中

Fork函数了解多少?

Fork函数用于创建子进程, 返回值大于0代表是父进程执行流, 返回值等于0代表是子进程执行流

了解过僵尸进程和孤儿进程吗?

A.僵尸进程: 当一个进程退出后, 退出信息还没有被父进程读取, 操作系统必然维护这个进程的PCB结构, 此时这个进程处于僵尸状态
B.孤儿进程: 当子进程还没退出而父进程先退出了, 这个子进程就是孤儿进程, 孤儿进程会被1号进程领养

并行和并发的区别?

A.并行: 多个进程在多个CPU下同时进行运行
B.并发: 多个进程在一个CPU下采用进程切换的方式, 在一段时间内多个进程都得以推进

当发生进程切换后再次被调度时, 怎样知道上次运行到哪儿了?

发生进程切换时, 会不断对自己的上下文进程保存和回复, 进程切走时, 会将寄存器的数据保存到PCB中, 而进程再次调度时, 会将PCB中的数据重新导入到内存. 程序计数器eip可以记录当前程序运行到哪个位置了

了解过哪些环境变量

环境变量是指在操作系统内用于指定某些运行环境的参数. 我接触过的环境变量有 PATH: 指定命令的默认搜索路径. HOME: 用户的主工作目录. PWD: 当前的路径

什么是地址空间? 和物理内存是什么关系? 为什么要有它?

A.本质是一种内核数据结构, 它至少包含了对各个区域的划分, 和某个特定的进程相关联.
B.站在系统角度, 地址空间我把它理解为OS为每个进程画的饼, 它是虚拟地址
C.虚拟地址通过页表映射到物理地址
D.虚拟地址和页表的存在保存了进程间的独立性, 每个进程都认为自己都有4GB的空间
E.代码申请和释放内存在虚拟地址中完成, 可以将物理内存的分配与进程的管理解耦.
F.保证了物理内存的安全, 凡是非法访问或映射都会在页表出被拦截下来

谈谈你对整个文件系统的理解?

(1)已被打开的文件(内存文件): 操作系统为了方便管理内存中所有已打开的文件, 会构建struct file 结构体, 充当一个被打开的文件, 再用链表将所有已打开的文件连接起来. 每个进程中有一个文件结构体数组, 代表此进程打开了哪些文件, fd的本质就是此数组的下标
(2)没有被打开的文件(磁盘文件): 首先, 磁盘分为盘面, 磁道和扇区, 每个分区会划分不同的块组, 块组中有inode用来存储文件的属性, datablock用来存储文件的内容, inode位图来标记该inode是否被占用. 目录文件会保存inode和文件名的映射关系, 可以通过这个映射在磁盘上找到你想要访问的文件

聊聊软硬链接

(1)硬链接没有独立的inode, 不是一个独立的文件, 只是在目录下建立了文件名和指定inode的映射关系, 相当于起别名, 创建硬链接时链接数目会增加
(2)软链接有独立的inode, 是一个独立的文件, 存放另一个文件的路径名指向, 类似于快捷方式, 创建软链接时连接数目不会增加

动静态库的区别

(1)静态库: 程序在编译链接时就把库的代码链接到可执行文件中, 一旦程序跑起来, 即时把静态库删除了也是没问题的, 静态库以.a结尾
(2)动态库: 程序在运行的时候才去链接动态库的代码, 多个程序共享使用, .so结尾

了解哪些进程间通信的方式

A.匿名管道: 单向的, 一个用于读取, 一个用于写入, 通常用于父子进程
B.命名管道: 调用mkfifo函数在当前目录下创建管道文件, 也是单向通信的
C.共享内存: 在物理内存申请一份空间, 将此空间与对应进程的上下文进行映射到地址空间的共享区. 两个进程使用的key, 就看见了相同的共享内存. 指令ipcs -m查看共享内存
D.信号量: 本质是一个计数器, 访问临界资源时, 必须先申请信号量(sem–, 预定资源),了使用完毕后再sem++, 释放资源.PV操作
E.信号: 用于通知进程发生了某种事情, 常用于异步通信
F.它们的区别: 共享内存进行通信是在进程的地址空间中属于内存的访问, 这些数据的接收与传递不会涉及到内核, 而管道的读写要使用read和write等系统调用进行通信, 要涉及到内核空间. 通信的本质都是不同的进程看见同一份资源

聊聊你对整个信号体系的理解

A.信号的概念: 信号是进程之间的一种通知机制, 用户或OS通过发送信号通知进程某些事情已经发生, 进程要在后续进程处理
B.信号的产生: 终端按键(CTRLC), 调用系统函数(kill, abort), 软件条件产生信号(管道的读端关闭会产生SIGPIPE信号), 硬件异常产生信号(指针错误, 段错误)
C.信号的保存: 进程PCB中有block(信号是否被阻塞), pending(信号是否在未决状态)两位图结构和handler方法表(信号的处理方法)
D.信号的捕捉: signal函数可以自定义设置信号的捕捉方法. 从内核态返回用户态时可以进行信号的检测和处理, 当发生中断, 异常或执行系统调用时, 寄存器CR3中的权限会由用户态改为内核态, 调用完系统调用后会回到用户态, 若此时会进行信号的检测与处理

了解过核心转储吗

当进程出现某种异常时, 是否把当前进程在内核中的核心数据转移到磁盘上, 若信号对应的默认方法是core就会发生核心转储, 使用gdb调试时输入core file可以直接定位到出错的地方

线程和进程的区别

A.进程是资源分配的基本单位, 而线程是操作系统调度的基本单位.
B.进程拥有独立的地址空间和页表, 而线程则是共享进程的地址空间和其他资源
C.进程的栈由地址空间维护, 而线程的栈空间由线程库维护, 映射到共享区

了解过协程吗

我将协程理解为轻量级线程, 它不会像进程和线程一样进行上下文的切换, 省去了CPU的切换开销, 并且它更轻量, 更容易实现高并发

用过哪些锁? 讲一讲死锁的原理

A.互斥锁, 同一时间只允许一个线程获得这把锁并进入临界区, 其他线程只能阻塞等待
B.读写锁, 一次只有一个线程可以占有写模式的读写锁, 但是可以有多个线程同时占有读模式的读写锁
C.死锁是指在一组进程中的各个线程均占有不会释放的资源, 并且各个线程相互申请对方所占用的不会释放的资源而处于一种永久阻塞的状态

讲讲线程安全和可重入的联系

A.线程安全是指多个线程并发执行同一段代码时, 会出现不同的结果.
B.重入指同一函数被不同执行流调用, 当前流程还没执行完, 其他流程就进入了.
C.可重入的函数是线程安全的, 线程安全不一定可重入

什么是线程同步

A.在保证数据安全的前提下, 让线程能按照某种特定的顺序访问临界资源, 避免饥饿问题
B.让线程检测到临界资源不就绪时, 不要让线程再频繁检测了, 让线程等待. 当资源就绪后, 通知对应的线程再让它进行访问, 使用条件变量解决上面的问题

什么是生产者消费者模型

生产者消费者模型的本质就是利用一个阻塞队列作为缓冲区, 将生产者和消费者进行解耦, 消费者不从生产者中拿数据, 而是从缓冲区中拿, 同样生成者直接将数据扔给缓冲区

手撕一个线程池

用队列存储要执行的任务, 用nums表示要启动的线程数量, _mtx互斥锁, _cond条件变量实现push, pop, routine(线程要执行的函数), initThreadPool(启动线程池, 创建nums个线程)

操作系统用户态和内核态有什么区别

A.用户态是一种受限的状态, 它只能访问有限的资源, 并且执行有限的操作
B.内核态是具有完全的控制权和访问权的状态, 执行代码时不会受限
C.当调用系统调用, 程序发生异常时, 会由用户态转变到内核态, 在内核态的优先级会非常高
D.用户态和内核态互相切换的本质是, CR3寄存器中的值从3变为1

你可能感兴趣的:(八股文专栏,linux,服务器)