操作系统

Posted by 石坤 on 2019-01-05

1. 基础

1.1 进程与线程的本质区别, 以及各自的使用场景

进程是资源分配的基本单位, 而线程是独立调度的基本单位; 一个进程中可以有多个线程, 它们共享进程资源.

区别:

  1. 拥有资源

    进程是资源分配的基本单位, 但是线程不拥有资源, 线程可以访问隶属进程的资源

  2. 调度

    线程是独立调度的基本单位, 在同一进程中, 线程的切换不会引起进程切换, 从一个进程中的线程切换到另一个进程中的线程时, 会引起进程切换

  3. 系统开销

    创建或撤销进程, 开销大, 因为涉及到分配或者回收资源; 切换线程开销小, 只需保存和设置少量寄存器内容

  4. 通信方面

    线程间可以通过直接读写同一进程中的数据进行通信, 但进程通信需要借助IPC

进程状态: 就绪状态; 运行状态; 阻塞状态

1.2 进程调度算法的特点以及使用场景

1. 批处理系统

批处理系统没有太多用户操作, 算法的目的是保证吞吐量和周转时间

1.1 先来先服务(FCFS)

短作业需要等前面的长作业完成后, 方可以执行.

1.2 短作业优先(SJF)

长作业有可能会饿死

1.3 最短剩余时间优先(SRTN)

按估计剩余时间最短顺序调度

2. 交互式系统

该系统中有大量用户操作, 算法目的是快速地相应

2.1 时间片轮转
2.2优先级调度
2.3多级反馈队列

3. 实时系统

实时系统要求一个请求在一个确定时间内得到相应.

分为硬实时和软实时, 前者必须满足绝对的截止时间, 后者可以容忍一定的超时

1.3 进程通信方法的特点以及使用场景

1.4 死锁必要条件 , 解决死锁策略, 能写出和分析死锁的代码, 能说明在数据库管理系统或者Java中如何解决死锁

1.5虚拟机内存的作用, 分页系统实现虚拟内存原理

1.6页面置换算法的原理, 特别是LRU的实现原理, 最好能手写, 再说明它在Redis等作为缓存置换算法

1.7比较分页与分段的区别

1.8 分析静态链接的不足, 以及动态链接的特点

2. Linux

###1.1 硬链接与软链接的区别

前提知识:

文件的组成部分:

  • inode: 一个文件占用一个inode, 记录文件属性, 同时记录此文件的内容所在的block编号
  • block: 记录文件的内容, 文件很大时, 会占用多个block

为了解决文件的共享问题, Linux系统引入了两种链接: 硬链接(hard link)和软链接(又称符号链接, 即soft link或symbolic link).

若一个inode号对应多个文件名, 则称这些文件为硬链接. 换言之, 硬链接就是同一个文件使用了多个别名. 硬链接可以由命令link或ln创建

link oldfile newfile

硬链接特点:

  • 文件有相同的inode及data block;
  • 只能对已存在的文件进行创建;
  • 不能交叉文件系统进程硬链接的创建
  • 不能对目录进程创建, 只可对文件创建;
  • 删除一个硬链接文件并不影响其他有相同inode号的文件

若文件用户数据块中存放的内容是另一文件的路径名的指向, 则该进程就是软链接. 软链接的创建与使用没有类似硬链接的诸多限制.

详细

1.2 僵尸进程与孤儿进程的区别, 从SIGCHLD分析产生僵尸进程的原因

进程的状态: R, S, D, T, Z, X

R: 可执行状态

S: 可中断的睡眠状态

D: 不可中断的睡眠状态

T: 暂停状态或跟踪状态

Z: 退出状态, 进程成为僵尸进程(zombie, terminated but not reaped by its parent)

进程的三种基本状态:

就绪(Ready) 执行(Running) 阻塞(Blocked)

SIGCHLD

当一个子进程改变了它的状态时, 会发生:

  • 得到SIGCHLD信号
  • waitpid()或者wait()调用会返回

在子进程退出时, 它的进程描述符不会立即释放, 这是为了让父进程得到子进程信息, 父进程通过wait()和waitpid()来获得一个已经退出的子进程信息

孤儿进程

一个父进程退出, 而它的一个或者多个子进程还在运行, 那么这些子进程将成为孤儿进程.

孤儿进程将被init进程(进程号为1)所收养, 并由init进程对它们完成状态收集工作.

由于孤儿进程会被init进程收养, 所以孤儿进程不会对系统造成危害

僵尸进程

一个子进程的进程描述符在子进程退出时不会释放, 只要当父进程通过wait()或waitpid()获取了子进程信息后才会释放. 如果子进程退出, 而父进程并没有调用wait()或waitpid(), 那么子进程的进程描述符仍然保存再系统中, 这种进程被称为僵尸进程

僵尸进程通过ps命令显示出来的状态为Z(zombie)

系统所能使用的进程号是有限的, 如果产生大量僵尸进程, 将因为没有可用的进程号而导致系统不能产生新的进程

要消灭系统中大量的僵尸进程, 只需要将其父进程杀死, 此时僵尸进程就会变成孤儿进程, 从而被init所收养, 这样init就是释放所有僵尸进程所占有的资源, 从而结束僵尸进程.

1.3能够使用常用的命令, 比如cat文件内容查看, find搜索文件, 以及cut, sort等管线命令. 了解 grep 和 awk 的作用

使用find命令搜索文件
1
2
3
find [basedir] [option]
实例: find . -name "shadow*"
返回当前目录下, 文件名匹配"shadow"的路径

管道指令

管道是将一根命令的标准输出作为另一个命令的标准输入, 在数据需要经过多个步骤的处理之后才能得到我们想要的内容时就可以使用管道

在命令之间使用 |分隔各个管道命令

1. 提取指令

cut可以对数据进行切分, 得到想要的部分

1
2
3
-d  分隔符
-f 通过-d分割后, 使用-f n 取出第 n 个区间
-c 以字符为单位取出数据

实例

1
2
3
4
5
last | cut -d ' ' -f 1
说明: last显示登入者的信息, 使用分隔符 -d 用空格" "把信息分割开, 使用 -f 取出第 1 块区间

export | cut -c 12-
说明: 取出第 12 字符以后的字符串
2. 排序指令
1
2
3
4
5
6
7
8
9
sort用于排序
参数:
-f 忽略大小写
-b 忽略最前面的空格
-n 使用数字
-r 反向排序
-u unique, 重复的内容只出现一次
-t 分隔符, 默认为tab
-k 指定排序区间

正则表达式

grep, 使用正则表达式进行全局查找并打印

1
2
3
4
5
grep [-acinv] 要搜寻的字符串 filename
-c 统计个数
-i 忽略大小写
-n 输出行号
-v 反向选择
1
2
实例:
grep -n "the" filename

注意: {}在shell中有特殊意义, 所以必须使用转义字符