【后端面试重点总结】操作系统篇(一)

一、进程、线程、协程的区别

进程:进程是系统进行资源分配的基本单位

线程:系统进行资源运算调度的最小单位,线程是进程的子任务,执行单元,一个进程可以有多个线程,共享一块内存。

协程:协程又被称为轻量级线程、用户态线程,本质是函数和函数运行状态的组合,和函数不同的是,协程可以执行到一半退出(yield),但协程并未结束,只是暂时让出CPU的执行权,后面适当的时候再恢复运行(resume)。

二、进程间通信方式(参考代码随想录八股)

匿名管道:数据只能从管道的⼀端写⼊,从另⼀端读出,只能在具有公共祖先的进程(⽗进程与⼦进程,或者两个兄弟进程,具有亲缘关系)之间使⽤。

读写的四种情况:

第一种:写端运行,管道中没数据,阻塞,管道中有数据,读出,没数据读时阻塞;

第二种:写端关闭,读进程读完管道中数据,返回0;

第三种:读端运行,管道满了,写端阻塞;

第四种:读端关闭,写端收到信号关闭;

有名管道(FIFO):命名管道(FIFO)提供了⼀个路径名与之关联,以FIFO⽂件形式存在于⽂件系统中,访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。

创建方式:通过命令创建有名管道(mkfifo fifo),通过函数创建有名管道:

共享内存:使⼀个磁盘⽂件与存储空间中的⼀个缓冲区相映射,当从缓冲区中取数据,就相当于读⽂件中的相应字节。将数据存⼊缓冲区,则相应的字节就⾃动写⼊⽂件。进程就可以直接通过读写内存来操作⽂件。

储存映射函数:mmap和munmap分别对应映射和释放。

消息队列:A 进程要给 B 进程发送消息,A 进程把数据放在对应的消息队列(消息队列是保存在内核中的消息链表,每个消息体都是固定⼤⼩的存储块。如果进程从消息队列中读取了消息体,内核就会把这个消息体删除)后就可以正常返回了,B 进程需要的时候再去读取数据就可以了。

信号:信号是软件中断,可以导致⼀个正在运⾏的进程被另⼀个正在运⾏的异步进程中断,转⽽处理某⼀个突发事件,可以直接进⾏⽤户空间进程和内核空间进程的交互。

三、守护进程、僵尸进程、孤儿进程区别

守护进程:守护进程是指在后台运⾏的,没有控制终端与它相连的进程。它独⽴于控制终端,周期性地执⾏某种任务。,Linux的⼤多数服务器就是⽤守护进程的⽅式实现的。

创建过程:①调⽤fork()产⽣⼀个⼦进程,然后使⽗进程退出。

②是调⽤setsid()使进程成为⼀个会话组长,进程成为新的会话组长和进程组长,并与原来的登录会话、进程组和控制终端脱离。

③经过12,进程已经成为⼀个⽆终端的会话组长,但是它可以重新申请打开⼀个终端。为了避免这种情况发⽣,可以通过使进程不再是会话组长来实现。再⼀次通过fork()创建新的⼦进程,使调⽤fork的进程退出。

④关闭不再需要的⽂件描述符,将当前⽬录更改为根⽬录

⑤处理SIGCHLD信号(子进程终止时会向父进程发送SIGCHLD信号,告知父进程回收自己,如果⼦进程等待⽗进程捕获状态,则⼦进程将成为僵⼫进程(zombie),从⽽占⽤系统资源。在Linux下可以简单地将SIGCHLD信号的操作设为SIG_IGN(忽略,使其会被init1号进程领养,成为孤儿进程这样,⼦进程结束时不会产⽣僵⼫进程。

僵尸进程:多进程程序,⽗进程⼀般需要跟踪⼦进程的退出状态,当⼦进程退出,⽗进程在运⾏,⼦进程必须等到⽗进程捕获到了⼦进程的退出状态才真正结束。在⼦进程结束后,⽗进程读取状态前,此时⼦进程为僵⼫进程。一个进程使用 fork 创建子进程,如果子进程退出,而父进程并没有调用 wait 或 waitpid 获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些子进程将成为孤儿进程。孤儿进程将被 init 进程(进程号为1)所收养,并由 init 进程对它们完成状态收集工作。

四、进程调度算法

先来先服务算法:按照作业/进程到达的先后顺序进行服务,非抢占式不会导致饥饿,有利于长作业不利于短作业,会造成短作业等待时间过长。

短作业优先调度算法:最短(服务时间最短)作业/进程优先服务,按估计运行时间最短的顺序进行调度,非抢占式,会导致饥饿,如果有源源不断的短作业进程到来,可能会使长作业一直得不到服务。

最短剩余时间优先:按剩余时间顺序进行调度,当新作业到达时,与当前进程剩余时间比较,如果新进程需要时间更少,挂起当前进程,服务新进程,否则新进程等待,抢占式算法,会导致饥饿。

优先级调度算法:每次从作业队列里选择优先级最高的一个或几个作业,将他们调进内存,分配必要的资源,创建进程放入就绪队列,可抢占可非抢占,会导致饥饿,如果一直有高优先级的作业过来就会导致饥饿。

时间片轮转调度算法:按照各进程到达就绪队列的顺序,轮转让各个进程执行一个时间片,若进程未在一个时间片内执行完毕,则剥夺,重新放到就绪队列尾部排队,抢占式,不会导致饥饿,适合分时操作系统。

高响应比优先调度算法:计算各个作业的响应比(等待时间 + 要求服务时间 / 要求服务时间),响应比高的作业优先服务,非抢占式,不会导致饥饿,避免了长作业饥饿的问题。

  • 27
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值