前言
作者:小蜗牛向前冲
名言:我可以接受失败,但我不能接受放弃
如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正
分享常见的操作系统面试题
1、进程和线程用知道吗?二者有什么区别
答:
-
进程是操作系统分配资源的基本单位:进程拥有独立的内存空间和其他系统资源,如文件句柄、网络连接等。操作系统为每个进程分配资源,并且进程之间的资源是相互独立的。
-
线程是CPU调度的基本单位:线程是进程内的一个执行单元,一个进程可以包含多个线程,线程之间共享进程的地址空间和资源。CPU调度通常是以线程为单位进行的。
-
进程间相互独立,一个进程崩溃不会影响其他的进程;而一个线程崩溃,可能会导致整个进程崩溃:进程的独立性意味着一个进程的异常终止通常不会影响其他进程。但是,由于线程共享同一进程的资源,如果一个线程出错,可能会影响进程内的其他线程,甚至导致整个进程崩溃。
-
进程切换开销非常大,线程切换开销较小:进程切换涉及到上下文切换,包括切换内存空间、CPU寄存器等,因此开销较大。线程之间的切换,由于共享了进程的内存空间,通常只需要切换线程上下文(如寄存器、程序计数器等),因此开销相对较小。
2、进程间是如何进行通信的
答:
- 管道:用于可以在具有亲缘关系的进程间通信,分为匿名管道和命名管道,匿名管道只能在父子进程间使用,而命名管道可以在没有亲缘关系的进程间使用。
- 消息队列:通过消息的方法进行通信,消息可以在进程间异步传递。
- 共享内存:允许多个进程共享一块内存区域,进程间可以读写共享内存从而传递信息。
- 信号:用于通知进程发生了某种事件。
- 信号量:用于进程间同步,控制共享资源的访问,PV操作。
- 套接字:通过套接字进行通信,可进行网络通信也可以进行本地通信。
- 文件:进程间也可以读写文件内容进行通信。
3、僵尸进程知道吗?如何去解决。那孤儿进程呢?
答
僵尸进程指的是,子进程退出了,但是父进程没有调用wait或者waitpid函数来读取子进程回收的状态,导致子进程的资源一直没有被释放。
解决方法:
- 父进程及时回收子进程资源:及时调用
wait()
或waitpid()
函数来获取子进程的退出状态,从而清理掉僵尸进程 - 设置SIGCHLD的信号处理器:父进程捕抓到SIGHLD(子进程退出时,给父进程的发生的信号)这样,父进程不必阻塞在
wait()
调用中,能以异步方式处理子进程的退出
孤儿进程:指的是父进程在子进程之前退出, 子进程会被1号的进程给领养。
4、进程有哪些状态知道吗?
答:进程有6种状态
- 新建状态: 一个进程被创建时,操作系统为其分配必备的资源。
- 就绪状态:一个进程创建完毕,等待 CPU分配时间片来执行任务。
- 运行状态:进程在执行任务。
- 阻塞状态:进程在执行过程中等待某些事件发生,它会进入阻塞状态。等待事件的到来。
- 挂起状态:时系统可能会将一个进程挂起,即将其移到内存之外并保存其状态。
- 终止状态:进程执行完毕或被强制终止后,会进入终止状态。
5、进程是如何切换的?
答:当操作系统要将一个进程切换到另外一个进程,通常要执行以下操作
保存当前进程的上下文:如一些寄存器,当前进程的堆栈指针,其实这些信息都保存着进程控制快(PCB)中。
更新进程的状态: 把当前进程的状态更改为就绪或者阻塞状态。
选择新的进程:根据调度算法(如先来先服务,优先级调度等),从就绪队列选择一个进程交给CPU去调度。
恢复进程的上下文:操作系统需要重新加载新进程的上下文信息,如寄存器,堆栈指针。