操作系统面试常见问题

1.进程调度算法

  1.先来先服务,从就绪队列里输出一个(非抢占)

  2.短服务优先,选择一个估计服务时间最短的进程放入就绪队列

  3.最短剩余时间优先,选择服务时间最短的占领CPU,当就绪队列第一个服务时间比它剩余的时间要短则抢占(抢占)

  4.响应比优先,作业响应比计算:(等待时间 + 服务时间) / 服务时间

  5.时间片,进程分一个片,各个进程都能执行

2.进程通信的方式

  (特殊的消息队列)管道,消息队列,共享内存,信号量,socket

3.进程与线程的区别

进程是资源分配的最小单位,线程是CPU调度的最小单位

线程在进程下行进(单纯的车厢无法运行)

一个进程可以包含多个线程(一辆火车可以有多个车厢)

不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)

同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)

进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)

进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)

进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)

进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-"互斥锁"

进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

 

4.父进程与子进程的区别

进程调用fork()函数创建子进程,并且时精确复制,只有pid不一样

并且在刚开始子进程会指向父进程的空间地址,只有修改了某个值之后会新开辟一个空间

子进程exit()会释放资源,保留进程表项,之后由父进程waitpid()收尸

如果父进程一直不waitpid(),子进程的信息会一直不能释放,则会成为僵尸进程

每个进程结束的时候,系统都会检查一下它有没有子进程,如果有则是孤儿进程,并且转交给init接管

 5.执行shell命令的三种方法

1.#bash test.sh(直接使用bash解释器执行)

hello world!

2. source test.sh

hello world!(当前默认解释器执行)

 

unset 变量名    删除变量

echo ${#变量名}   获取字符串长度

echo ${变量名:1:4}取出子字符串,第2个字符开始截取4个字符

 

 6.一段造成死锁的代码

func main()  {
    ch1 := make(chan int)
    ch2 := make(chan int)

    go func() { // 子 go 程
        for {
            select {
            case num := <-ch1: // 监听读取 ch1 的数据
                // 把读取到的 ch1 的数据,给 ch2 写数据
                ch2 <- num
            }
        }
    }()
    
    // 主 go 程
    for {
        select {
        case num := <-ch2: // 监听读取 ch2 的数据
            // 把读取到的 ch2 的数据,给 ch1 写数据
            ch1 <- num
        }
    }
}
A想取M,B想取N

 

7.死锁产生的四个必要条件

1.互斥,2.占有等待,3.不可抢占,4,循环等待:每个进程至少占有一个下个进程所需的资源

 

8.预防死锁

a、破坏“占有且等待”条件

     方法1:所有的进程在开始运行之前,必须一次性地申请其在整个运行过程中所需要的全部资源。

  方法2:该方法是对第一种方法的改进,允许进程只获得运行初期需要的资源,便开始运行,在运行过程中逐步释放掉分配到的已经使用完毕的资源,然后再去请求新的资源。

b、破坏“不可抢占”条件

      当一个已经持有了一些资源的进程在提出新的资源请求没有得到满足时,它必须释放已经保持的所有资源,待以后需要使用的时候再重新申请

c、破坏“循环等待”条件

     可以通过定义资源类型的线性顺序来预防,可将每个资源编号,当一个进程占有编号为i的资源时,那么它下一次申请资源只能申请编号大于i的资源。

9.避免死锁(银行家算法)

 

 

10.虚拟内存的优点

1.内存可以保留多个进程,系统的并发度提高

2。进程的空间可以比内存还大

 11.页面置换算法

最佳置换算法

先进先出算法

最近最久未使用置换算法:加载进来的页面,每个都有个时间标记,记录自从上次被访问到现在的时间

时钟置换算法:第一次进来的全置为1,之后被访问到的时候也置为1,寻找0的页面,其中遇到的1都置为0,某一页被替换时指针指向下一帧,

 
 3. 什么是硬链接?什么是软链接?
硬链接:指一个文件同时有多个文件名可能分布在不同的目录,修改其中一个那么其他都改变
软链接:AB指向了不同的节点,B指向了真正的文件,而A指向的数据块只是B的路径,所以B删了A依然存在,只不过无效路径
 
4.简单认识:静态链接与动态链接

编译,链接,执行
ABC三个程序文件,C引用AB,B引用A,
静态链接:先加载C,然后加载AB,运行B发现需要A,再加载A
动态链接:先加载C,然后加载AB,运行B发现需要A,此时内存里有A,则使用内存里的A映射到B
 
5.进程下线程共享

 

 6.了解进程与线程如何切换

(线程几乎不占资源所以切换快)

 

 

 

 

posted @ 2021-02-27 20:23  爱晒太阳的懒猫。。  阅读(33)  评论(0)    收藏  举报