1、用户态和内核态的区别?
a、访问权限。用户态下,应用程序只能访问受限的的资源和执行受限的程序;而在内核态下,操作系统具有完全的访问权限,可以访问系统的所有资源和执行所有操作;
b、CPU指令集。用户态下,用户只能执行非特权指令,而内核态下,CPU可以执行特权指令,例如访问设备、修改系统状态;
c、中断和异常处理。用户态下,发生中断或者异常时,操作系统会进行中断处理,京控制权转移到内核态下的中断处理程序。内核态下,操作系统可以直接处理中断和异常,并进行相应的处理操作;
d、内存保护。用户态下,应用程序只能访问自己的内存空间,无法访问其他应用程序的内存空间和操作系统的内存空间;内核态下,操作系统可以访问所有的内存空间,包括应用程序的内存空间;
e、安全性。用户态的应用程序受到限制,操作系统系统可以对其进行隔离和保护,防止恶意更改代码对系统造成伤害;内核态下的操作系统具有更高的权限,需要对其进行严格的安全管理,防止非法访问和恶意操作。
2、进程调度算法有哪些?
a、先来先服务:每次从就绪队列中选择最先进入队列的进程,然后一直执行,直到进程退出或者阻塞,才会去选择下一个进程,适用于CPU繁忙型作业的系统,不适用与I/O繁忙型作业的系统;
b、最短作业优先调度:优先选择运行时间最短的进程来运行,提高系统吞吐量;
c、高响应比优先调度算法:每次进行进程调度时。先计算响应比。把响应比优先级最高的进程投入运行。
优先权=(等待时间+要求服务时间)/(要求服务时间)
d、时间片轮转调度算法:每个进程被分配一个时间片,在该时间段内执行对应的进程。时间片太短会导致过多的上下文切换,降低CPU效率;时间片太长可能会导致短作业进程的的响应时间边长。
e、最高优先级调度算法:从就绪队列中选择最高优先级的进程进行运行。
静态优先级:创建进程时,已经确立好优先级,在整个运行时间内优先级都不会改变。
动态优先级:根据进程的动态变化调整优先级,比如随着进程运行时间增加,则降低其优先级,随着进程等待时间增加,则升高其优先级。随着时间推移增加等待进程的优先级。
非抢占式:当就绪队列中出现优先级高的进程,运行完当前进程,再选择优先级高的进程。
抢占式:当就绪队列中出现优先级更高的进程,当前进程挂起,调度优先级更高的进程运行。
缺点:低优先级的进程永远不会被执行。
f、多级反馈队列:是优先级和时间片算法的融合。
(1)、设置多级就绪队列,各级优先队列优先级从高到底,时间片从小到大;
(2)、新进程到达时先进入第1级队列末尾。按先来新服务的原则排队等待被调度。如果第1mei级队列规定的时间片没运行完成,则将其转入到第2级队列的末尾,以此类推,直到完成;
(3)、当优先级高的队列为空时,才调用优先级低的队列中的任务执行,如果Sn队列中的进程执行时,S1-n中进入新的进程,则停止当前正在执行的进程,并将其放到原队列的末尾,接着执行高优先级的进程。
3、进程间的通信?
管道、消息队列、共享内存、套接字、信号量。
4、线程间的通信?
互斥量、信号量、条件变量、读写锁。
5、IO多路复用?
select、poll、epoll
6、select、poll、epoll的区别?
select实现多路复用的方式是,将已连接的socket都放在一个文件描述符集合中,然后调用select函数将文件描述符集合拷贝到内核里,让内核来检查是否由网络事件的发生,遍历所有的文件描述符,检查到有事件产生后,将socket标记为可读或可写,然后把文件描述符拷贝到用户态,用户态还需要遍历找到可读或可写的socket,再进行处理。
遍历2次文件描述符,拷贝两次文件描述符。
select使用BitsMap,表示文件描述符集合,linux下,内核中的FD_SETSIZE默认最大值为1024,只能监听0-1023的文件描述符。
poll不再使用BitsMap来存储所关注的文件描述符,使用链表来组织关注的文件描述符,同时监听的socket可以变得更多。
epoll在内核中使用红黑树来跟踪进程所有待检测的文件描述符,把需要监控的socket通过epoll_ctl()函数加入到内核中的红黑树里。每次操作时只需要传入一个待检测的socket,减少了用户态和内核态的数据拷贝和内存分配。
epoll使用事件驱动机制,内核里维护了一个链表来记录就绪事件,当某个socket有事件发生时,通过回调函数内核会将其加入到就绪链表中,用户调用epoll_wait(),只会返回这个就绪链表,不需要扫描整个文件描述符,提高效率。
7、为什么要有虚拟内存?
1、进程隔离。如果没有虚拟内存的话,在内存中同时运行两个程序会发生冲突,造成系统崩溃。例如在0x1024位置时,进程a写入x=100,进程b写入x=1000,这时候就会出现问题。
2、地址空间扩展。缓解物理内存不足的压力,将硬盘空间作为内存扩展,增加计算机可用的内存量。
8、进程和线程的区别?
线程是CPU调度的最小单位,进程是操作系统资源分配的最小单位。
进程的调度是操作系统内核进行的,切换进程需要进行上下文切换,设计用户态和内核态之间的切换,开销相对较大。线程的调度是在用户程序中完成的,切换线程可以在用户态下快速切换,减少系统调用开销。
通信方式不同。
一个线程挂掉,进程中的全部线程都要挂掉。一个进程挂掉不影响其他进程。
进程拥有自己的内存空间,线程共享进程的内存空间。
9、进程、线程、协程对比?
协程只是一个特殊的函数。
一个进程可以包含多个线程,一个线程可以包含多个协程。
进程的切换者是操作系统,切换时机是根据操作系统自己定义的切换策略来决定的。用户是无感的,进程的切换内容包括页全局目录、内核栈和硬件上下文,切换内容被保存在内存中。进程的切换过程是用户态–内核态–用户态,切换效率低;
线程的切换者是操作系统,切换时机是根据操作系统自己定义的切换策略来决定的,用户是无感的,线程的切换内容包括内核栈和硬件上下文。线程切换内容被保存在内核栈中,线程切换过程是用户态–内核态–用户态;
协程的切换者是用户,切换时机是用户自己的程序决定的。协程的切换内容是硬件上下文,切换内容被保存在自己的变量中,协程的切换过程只有用户态,切换效率高。