1.有哪些页面置换算法?
参考
程序执行期间,若程序所要访问的页面未在内存时,便发出缺页中断,中断处理程序首先保留CPU环境,转入缺页中断处理程序。查找页表,得到该页在外存的物理块后,如果内存未满,则将缺页调入内存并修改页表。
如果内存已满,则按照某种置换算法从内存中选出一页换出;如果该页未被修改过,可不必将该页写回磁盘;但如果此页已被修改,则必须将它写回磁盘,然后再把所缺的页调入内存,并修改页表中的相应表项,置其存在位为“1”,并将此页表项写入快表中。
最佳置换(OPT)算法选择的被淘汰页面,将是以后永不使用的,或许是在最长(未来)时间内不再被访问的页面;采用最佳置换算法可保证获得最低的缺页率。但是由于无法预知哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的;
先进先出(FIFO)算法淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
最近最久未使用(LRU)算法根据页面调入内存后的使用情况进行决策,选择最近最久未使用的页面予以淘汰;该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问一来所经历的时间T,当需要淘汰一个页面时,选择现有页面中T值最大的,即最近最久未使用的页面予以淘汰。
CLCOK算法又称为最近未使用算法(NUR) 每页设置一个访问位,再将内存中的所有页面都通过链接指针链接成一个循环队列;当某个页面被访问时,其访问位置1。淘汰时,检查其访问位,如果是0,就换出;若为1,则重新将它置0;再按FIFO算法检查下一个页面,到队列中的最后一个页面时,若其访问位仍为1,则再返回到队首再去检查第一个页面。
2.线程间的同步方式有哪些?
参考
参考2
同一进程内的多个线程共享同一地址空间,为了避免多个线程同时访问数据造成的混乱,需要考虑线程之间的同步问题,所谓同步,即协同步调,按预定的先后次序访问共享资源,以免造成混乱。
线程同步的实现方式主要有6种:互斥锁、自旋锁、读写锁、条件变量、屏障、信号量。
1 互斥锁。互斥锁在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量进行解锁。对互斥量加锁以后,任何其他试图再次对互斥量加锁的线程都会被阻塞,直至当前线程释放该互斥量。
2 自旋锁。自旋锁与互斥量类似,但它不使线程进入阻塞态,而是在获取锁之前一直占用CPU,处于忙等自旋状态。自旋锁适用于锁被持有的时间短且线程不希望在重新调度上花费太多成本的情况。
3 读写锁。读写锁有三种状态:读模式加锁、写模式加锁和不加锁,一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。读写锁非常适合对数据结构读的次数远大于写的情况。
4 条件变量。条件变量允许线程睡眠,直到满足某种条件,当满足条件时,可以向该线程发送信号,通知并唤醒该线程。条件变量通常与互斥量配合一起使用。条件变量由互斥量保护,线程在改变条件状态之前必须首先锁住互斥量,其他线程在获得互斥量之前不会察觉到条件的改变,因为必须在锁住互斥量之后它才可以计算条件是否发生变化。
5 屏障。屏障是用户协调多个线程并行工作的同步机制。屏障允许每个线程等待,直到所有的合作线程都到达某一点,然后从该点继续执行。
6 信号量。信号量本质上是一个计数器,用于为多个进程提供共享数据对象的访问。编程时可根据操作信号量值的结果判断是否对公共资源具有访问的权限,当信号量值大于 0 时,则可以访问,否则将阻塞。PV 原语是对信号量的操作,一次 P 操作使信号量减1,一次 V 操作使信号量加1。
3.熟悉哪些LInux命令?
参考
ls:列出目录内容。
cd:改变当前目录。
pwd:显示当前工作目录。
cp:复制文件或目录。
mv:移动或重命名文件。
rm:删除文件或目录。
cat:查看文件内容。
chmod:更改文件或目录的访问权限。
chown:更改文件或目录的所有者和/或所属组。
df:查看磁盘空间使用情况。
ifconfig 或 ip addr:查看和配置网络接口。
ping:测试网络连接。
netstat:查看网络状态和统计信息。
ps:查看当前运行的进程。
kill:发送信号给进程。
4.如何查看某个端口有没有被占用?
root用户可用:lsof -i:端口号
普通用户:sudo netstat -tulnp | grep 端口号,这会显示监听在该端口的服务及其进程ID。
5.说一下select、poll、epoll
参考
阻塞 I/O,是指进程发起调用后,会被挂起(阻塞),直到收到数据再返回。如果调用一直不返回,进程就会一直被挂起。因此,当使用阻塞 I/O 时,需要使用多线程来处理多个文件描述符。
多线程切换有一定的开销,因此引入非阻塞 I/O。非阻塞 I/O 不会将进程挂起,调用时会立即返回成功或错误,因此可以在一个线程里轮询多个文件描述符是否就绪。但是非阻塞 I/O 的缺点是:每次发起系统调用,只能检查一个文件描述符是否就绪。当文件描述符很多时,系统调用的成本很高。
因此引入了 **I/O 多路复用,可以通过一次系统调用,检查多个文件描述符的状态。**这是 I/O 多路复用的主要优点,相比于非阻塞 I/O,在文件描述符较多的场景下,避免了频繁的用户态和内核态的切换,减少了系统调用的开销。
以下完全来自:select poll epoll 的区别和联系 以及 应用场景 看了很多博客,只有这个写得最清楚了。
select、poll 和 epoll 是 Linux 操作系统中常见的 I/O 多路复用机制,主要用于处理大量并发连接或 I/O 事件。它们的区别、联系及应用场景如下:
- select
工作机制:select 通过将一组文件描述符(FD)加入集合,并通过不断轮询这些描述符来检查是否有 I/O 事件发生。它会阻塞直到某个描述符变为就绪或超时。应用程序需要手动设置和检查描述符集。
优点:
跨平台支持广泛,几乎在所有 Unix 和 Windows 系统上都可以使用。
缺点:
文件描述符上限:每个进程能够监控的文件描述符数量是有限的(通常为 1024)。对于高并发场景,这个限制是非常明显的瓶颈。
效率低下:select 每次调用时都需要将整个文件描述符集合拷贝到内核,并且内核需要遍历整个集合来检查事件,因此效率较低,尤其在处理大量文件描述符时。
应用场景:适用于小规模并发场景或需要兼容更多平台的情况。 - poll
工作机制:poll 与 select 类似,但不再使用固定大小的描述符集合,而是用一个动态的数组结构。每个文件描述符的状态以结构体的方式进行管理,能够处理任意数量的文件描述符。
优点:
没有文件描述符上限限制,允许更灵活地处理大规模连接。
数据结构相对更加灵活,便于管理大量文件描述符。
缺点:
效率仍然较低:poll 每次调用时也需要遍历整个文件描述符数组,即使仅有少数描述符有事件发生,性能也容易下降。
重复遍历:程序需要每次调用后重新初始化整个文件描述符数组,导致性能开销较大。
应用场景:适用于中等规模的并发连接处理,相比 select 适用于处理更多文件描述符,但仍在性能上有局限。 - epoll
工作机制:epoll 是 Linux 专有的 I/O 多路复用机制,设计用于高效处理大规模并发连接。它引入了一个内核事件表,程序只需在事件发生时通知内核。当文件描述符的状态发生变化时,内核将其加入到就绪列表中,应用程序可以快速获取到发生事件的文件描述符。
优点:
高效性:相比于 select 和 poll,epoll 不需要遍历整个文件描述符集合。它通过事件通知机制,使得只处理那些有事件发生的描述符,性能提升显著。
没有描述符上限:和 poll 一样,epoll 没有文件描述符上限限制。
两种模式:支持水平触发(LT)和边缘触发(ET)。ET 模式下可以进一步减少系统调用的次数,进一步提高效率。
缺点:
复杂性较高:epoll 的 API 相对较复杂,特别是在边缘触发模式下,需要开发者更细致地处理事件。
仅限 Linux:由于是 Linux 特有的系统调用,跨平台兼容性不如 select。
应用场景:适用于高并发、大规模连接的场景,尤其是服务器端处理数万或数十万并发连接时。
区别和联系
联系:
三者都是 I/O 多路复用机制,允许应用程序同时监听多个文件描述符,以避免阻塞在某个 I/O 操作上。
poll 和 select 的机制比较类似,都需要遍历文件描述符集合,性能上较为接近。
epoll 作为 Linux 特有的机制,是对 select 和 poll 的一种改进,旨在提高处理大量并发连接时的性能。
区别:
select 和 poll 都会遍历所有的文件描述符,epoll 只关注发生事件的文件描述符,因此在高并发情况下,epoll 的性能明显优于 select 和 poll。
select 有文件描述符数量限制,poll 和 epoll 没有。
epoll 引入了更复杂的事件驱动机制,适合大规模并发场景。
适用场景总结
select:适用于少量并发连接,且需要跨平台支持的场景。
poll:适用于中等规模并发连接,或者需要灵活处理动态文件描述符数量的场景。
epoll:适用于高并发、大规模连接,特别是需要处理成千上万个连接的服务器端应用,如 web 服务器、消息推送服务等。