存储器通过什么和CPU进行数据交互?
计算机存储数据寻址数据的内存单位是多少?
32位操作系统和64位操作系统到底什么区别?
任务调度
linux调度的对象是什么?
task_struct
软中断和硬中断
应该先说硬中断再说软中断
什么是中断,中断是谁产生的,谁接收中断并进行什么操作?
网卡接收到数据包,将数据包方法内存之后,通过什么方法通知内核有数据包到达?
硬件触发中断——操作系统执行前部分的硬中断处理程序,快速处理中断——内核触发软中断执行软中断处理程序,处理本次中断没完成的处理。
也就是说由硬件产生的一个中断要分两部分中断处理程序完成。
操作系统为什么需要内存管理?
内存管理方式:分段和分页。
1,充分利用有限的内存:内存是有限的,使用内存管理可以更好的使用有限的内存,比如分页可以减少外部内存碎片;
2,更安全的管理内存:内存管理的方式,比如段表中的段大小可以内存越界,页表中的读写权限可以提高内存的访问的安全性;
3,虚拟内存可以防止进程之间的地址冲突。
虚拟内存有什么作用?
1,进程之间有各自的虚拟内存,可以防止进程地址冲突,比如数据覆盖;
2,虚拟内存中的段表中的段大小,页表中的读写权限,为地址访问提供了更好的安全性。
多级页表为什么可以减少占用物理内存空间?
如果使用了二级分页,一级页表就可以覆盖整个 4GB 虚拟地址空间,但如果某个一级页表的页表项没有被用到,也就不需要创建这个页表项对应的二级页表了,即可以在需要时才创建二级页表,那么页表占用的内存就会更小。
单级页表中每一个页表项保存的是什么:每一个内存页的起始地址。
多级页表中,一级页表保存的是什么:存储的是二级页表的每一个页的起始地址。
二级页表保存的是什么:存储的是内存页的起始地址。
二级页表和单级页表的一级页表的关系:
存储的页表项都是一样的,也就是存储的都是内存页的起始地址作为一个页表项,只是二级页表是多个页表,32位系统下是4MB/4KB=1024,也就是有1024个二级页表(不一定都创建)。
malloc中brk和mmap内存开辟和释放的区别
free怎么知道要释放多大的内存 16
堆和栈的三种区别
1,用户还是操作系统开辟释放内存;
2,数据进出方式;
3,内存开辟从高到低或者从低到高。
当进程运行CPU填充页表分配物理内存时,如果没有足够的空闲物理内存,内核会怎么办?
后台线程异步回收——不够——内核直接听不回收——还是不够——OOM
哪些物理内存可以被回收
在4GB的物理内存上申请8GB的内存会怎么样?
首先要明白申请的是什么内存,再谈能不能申请
32位系统可以分配吗,64位呢?为什么系统只有4G物理内存,64位系统却可以分配呢?
linux怎么查看一个进程使用的虚拟内存的大小和物理内存的大小
那64位系统可以申请128TB内存吗?
不一定,还得看你自己的物理内存够不够大,因为申请虚拟内存时也会使用到物理内存,如果物理内存使用完了还没有分配好虚拟内存就会触发OOM。
swap机制
swap out
swap in
申请的虚拟内存大于物理内存也没关系,只要使用虚拟内存时不是全部使用,映射的物理内存足够就不会出现问题,如果映射的物理内存不够就会OOM。
你知道为什么磁盘沙沙响吗?
IO频率太高
mysql从磁盘读取的页存储在buffer pool中,linux从磁盘读取的页存储在哪?
什么是预读原理:
本来只需要读一个页,但是这个页附近的多个页都一起读了。
linux和mysql都是以页作为IO的单位。
linux和mysql缓存污染的相同点和区别。
PCB是什么
进程切换时,CPU此时的上下文保存在哪?
CPU上下文切换需要切换至少哪两部分:
CPU寄存器和程序计数器。
CPU上下文切换包括存储和读取两个过程。
CPU上下文切换分为哪三种:
进程的上下文切换
线程上下文切换
中断上下文切换
进程切换和线程切换的区别:
1,进程切换要切换的资源很多,用户空间的虚拟内存,变量等,内核空间的资源。
2,线程切换如果是不同进行的线程就是进程切换,如果是同一个进程的线程,只要切换线程私有数据,切换简单。
线程的切换分为同进程线程切换和不同进程线程切换
进程每发生一次状态转换,操作系统就会发生一次调度
同步和互斥的区别:
互斥:一个运行,其他的旧不能运行;
同步:一个线程运行的条件受到另一个线程的约束;
进程通信的5种方式;
线程同步和互斥的4种方式;
自旋锁的实现原理,怎么编程实现?---CAS
原子变量值变换的函数参数——指针,新值
自旋锁的缺点:
互斥锁=自旋锁+进程阻塞
占占互等
读写锁=读锁+写锁
读锁=共享,写锁=独占
悲观锁和乐观锁的区别:
悲观锁:先避免冲突,再修改数据。
乐观锁:先改数据,再比较冲突,比如git的版本对比。
乐观锁其实没有加锁
一个进程可以创建多少线程?
4种进程调度算法?
硬链接和软连接
阻塞和非阻塞I/O,同步和异步I/O
多路I/O复用解决了什么问题?
1,解决了需要用户线程不断检测内核是否有数据可读的问题;
2,实现一个进程可以维护多个套接字;
描述一下键盘输入字母A到显示A的整个过程
什么是DMA技术,代替CPU从磁盘控制器将数据开呗到内存,让CPU有空闲事件处理其他任务。
通过两次中断告诉CPU准备好的数据。
为什么要有DMA技术?
CPU一次IO的过程
什么是零拷贝技术:
就是不需要再将数据从内核缓冲区拷贝到用户缓冲区,同时不需要CPU上下文切换。
mmap原理:用户空间映射内核空间,不需要在用户空间和内核空间进行数据拷贝。
read和write执行拷贝发送网络数据的过程?
线程池的运行原理:
线程池是一种用于多线程编程的技术,它的主要原理是将多个线程预先创建并放入一个池子中,当有新的任务需要处理时,就会从池子中取出一个空闲线程来执行任务;当任务执行完毕后,该线程并不被销毁,而是再次回到池子中变为空闲状态,等待下一个任务的分配。
线程池的运行过程
线程个数:一个进程可以创建的线程数量取决于操作系统对线程数量的限制。
多线程怎么操作
线程池的作用:
1. 提高程序性能:线程池可以提高程序的性能和响应速度,通过重复利用已经创建的线程,避免了每次执行任务时新建线程所带来的性能开销,提高了程序的相应速度。
2. 减少资源的浪费:线程池可以避免过多创建线程,降低了系统资源的占用,避免了资源的浪费。
3. 统一管理:线程池可以统一管理创建的多个线程,提高了线程的可控性和可管理性,避免了多个线程之间相互干扰的问题,方便了复杂程序的协调和调试。
三个线程A、B、C分别打印1-100,A打印3的倍数,B打印5的倍数,C打印其他数。不能重复
单核CPU最多创建多少个线程?
一个相同创建的线程数量和这个操作系统的内存大小和系统参数有关;
一个进程能打开多少个文件句柄
一个进程能打开的文件句柄数量取决于操作系统和文件系统等因素,一般来说,它可以由系统管理员通过修改系统参数进行调整。以下是一些常见操作系统的默认值:
- Linux:默认每个进程可以打开最多1024个文件句柄,可以通过修改 /etc/security/limits.conf 和 /etc/sysctl.conf 等配置文件来扩大此限制。
- Windows:默认每个进程可以打开最多2048个文件句柄,可以通过修改注册表中的 MaxUserPort 和 TcpTimedWaitDelay 等键值来扩大此限制。
服务器可以和多少个客户端建立连接
乐观锁跟悲观锁
悲观锁假定同时只有一个线程可以访问共享资源,因此在访问之前先获取锁,然后进行操作,在操作完成后才释放锁。如果其他线程尝试访问同一资源,它们必须等待锁被释放。悲观锁的协调机制由操作系统提供,开销较大,但是在竞争激烈的环境中,能够保证数据的完整性和一致性。
乐观锁假定同时有多个线程可以访问共享资源,并尝试执行操作,如果没有竞争情况,则操作成功完成;如果发生竞争,则操作失败,需要重新尝试。乐观锁的协调机制由应用程序提供,开销较小,但是在竞争激烈的环境中,容易发生操作失败的情况。
sleep和wait的区别
sleep---线程循环等待,占用CPU资源
wait----线程阻塞,不占用CPU资源
sleep 和 wait 都是用于线程操作的函数,但它们的含义和使用方式有很大不同。
1. sleep
sleep 函数让当前线程休眠一段指定的时间,调用它的线程会停止执行,等到要等待的时间过去后,会被重新唤醒,重新执行。在休眠时间内,线程会占用 CPU 资源,因此不能让其他线程进展。
2. wait
wait 函数常常与条件变量(condition variable)结合使用,用于实现线程间的同步。调用 wait 的线程会立即阻塞,直到其他线程调用了同一个条件变量的 signal 或 broadcast 函数,通知被阻塞的线程可以继续执行。与 sleep 不同的是,wait 不会占用 CPU 资源,在等待的过程中,系统会把调用它的线程挂起,直到被唤醒。
总的来说,sleep 更适用于简单的时间控制,如延迟执行、定时任务等,而 wait 适用于线程之间的同步和协调,如资源互斥、生产者消费者问题等。
需要注意的是,wait 函数调用前需要先加锁,wait 函数内部会释放锁,被唤醒后再次加锁,因此使用 wait 要配合锁使用,确保线程的同步和数据的安全。
NIO和传统IO的区别
NIO (Non-blocking I/O) 和传统 IO (Blocking I/O) 的主要区别如下:
1. 阻塞模式 vs 非阻塞模式
传统 IO 模型是阻塞式 IO,即当数据还没有准备好,线程会一直等待直到数据准备完成。这种方式会导致线程的资源浪费和系统的响应速度较慢。而 NIO 引入了非阻塞式 IO,即线程不会阻塞在 IO 操作上,而是可以同时处理多个 IO 操作,提高了系统的并发性和响应能力。
2. 缓存模式 vs 直接读写模式
传统 IO 模型的读写是基于缓存的,即每次读写时会将数据先放入到缓存区中,再由应用进行操作。这种方式会导致频繁的数据拷贝,降低了数据读写的效率。NIO 引入了直接读写模式,即数据可以直接从文件或网络中读取,而不需要经过缓存,提高了数据读写的效率。
3. 通道操作 vs 流操作
传统 IO 模型是基于流的操作,即数据从一个流中读取或写入到一个流中。而 NIO 引入了通道的概念,即数据可以直接从通道中读取或写入,通道可以双向地读写数据,提高了数据的灵活性和处理效率。
总之,NIO 更适合高并发、高吞吐量的场景,而传统 IO 模型则适合于传输量较小的场景。NIO 的使用也较为复杂,需要考虑到线程、缓存、通道等多个因素,因此在使用时需要充分考虑系统的实际情况和要求。
IO密集型的线程数配置过多会对CPU有什么影响。
什么是CPU密集型任务,什么是I/O密集型任务
CPU密集型任务:任务运行过程中,CPU占用率高,需要进行大量的运算;
IO密集型任务:任务运行过程种CPU占用率小,但是需要大量进行I/O操作。
链接
CPU密集型任务适合使用多进程实现,I/O密集型任务适合用多线程实现,因为
大家一起算;
一致性缓存和一致性哈希
缓存一致性怎么解决
链接
什么是一致性哈希
链接
内存
在物理内存为4G的系统上可以读取16G的文件吗
一次性读取16G大小的文件是读取不了的;解决办法:
1,分批读取,一次读取一小部分,分多次读取即可;
2,开启swap机制。
swap机制
swap机制是用来解决物理内存不足的情况的,不是用来解决虚拟内存不足的情况。
当物理内存不足时:
1,操作系统没有开启swap机制,这个进程就会因为OOM而被kill掉;
2,操作系统开启了swap机制,程序就可以正常运行。
swap机制存在的意义:使得进程可以使用的物理内存远远超过系统的物理内存大小。
swap机制的存在是不是可以使用无限内存
不是,有限制的,当系统回收的内存赶不上进程需要的内存的时候就会OOM,kill进程。
swap的缺点
因为swap机制内存会和磁盘进行数据交换,也就是会阐述IO,而磁盘IO性能又是很低的,所以系统swap时性能不好。
内核态和用户态的进程切换哪个消耗大
内核态,内核态进程需要进行的工作更多,所以切换时需要保存和切换的数据也就更多,兄啊好就更大。文章来源:https://www.toymoban.com/news/detail-691144.html
内核态需要进行IO这些操作。文章来源地址https://www.toymoban.com/news/detail-691144.html
到了这里,关于操作系统面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!