计算机基础之操作系统与网络

本文深入解析操作系统中的关键概念,包括用户态与内核态的区别、零拷贝技术、缓冲区的作用、虚拟内存的优势、进程与线程的区别及调度算法、常见IO模型、同步与异步的概念、阻塞与非阻塞的区别、多级缓存结构下的数据一致性保障、CPU指令执行的乱序现象、内存屏障的类型、纤程与线程的差异、内存池的工作原理以及线上服务器的优化配置建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 用户态和内核态有什么区别?为什么要设计这么设计?
  • 用户空间指的是用户可以访问和操作的空间;内核空间指的是操作系统内核才能操作的空间。
  • 程序在用户空间下执行的状态叫用户态;程序在内核空间下执行的状态叫做内核态。
  • 当发生系统调用或者是应用程序异常中断时,程序会由用户态ring3切换到内核态ring0。
  • 用户不能随意调用内核空间的数据和程序,出于安全保护的考虑,所以这么设计。
  1. 生产服务器越来越慢,如何排查问题点?
  • 针对一个服务器,从宏观的角度,无非是要从CPU、内存、磁盘和IO这几个方面去着手分析。IO分磁盘IO和网络IO。
  • 首先,可以使用top命令查看一下服务器的整体状况。top命令可以查看系统的负载、进程状况、资源使用情况、内存使用情况等等。
  • vmstat命令用来详细了解CPU使用情况。
  • 查看内存使用情况使用free命令。
  • 查看磁盘使用状况使用df命令。
  • 查看磁盘IO状况使用iostat命令。
  • 查看网络IO状况使用sar命令。
  1. 进程间是如何进行通信的?
  • 首先进程间的通信分为同一台机器上的进程间通信和跨机器上的进程间通信。进程间的通信常见的通信方式有6种。其中socket通信是用于跨机器之间的进程通信。同一机器上进程间通信的方式有:管道pipe、FIFO、信号量、消息队列和共享内存。
  • 每个进程的用户空间是独立的,但是内核空间是共享的。故进程间通信需要依靠内核来完成。
  • 管道pipe,管道有两种类型:匿名管道和命名管道。缺点:效率低,不适合进程间频繁地交换数据。优点:简单。匿名管道只存在于内存中,不存在于文件系统中。匿名管道是通过父进程fork出子进程,然后关闭相应的写端和读端。管道本质上是内核空间中的一段缓存。
  • 消息队列:有格式。缺点:非实时,大小受限,不适合大数据的传输,存在内核态和用户态之间拷贝数据的开销。
  • 共享内存:不同进程的一块虚拟内存映射到相同的物理内存中。缺点:多进程同时操作共享内存。
  • 信号量:整型计数器,实现进程间的互斥与同步。有点像锁的概念。信号量可以保证在任何时刻只有一个进程在访问共享内存,提供了共享内存的保护机制。
  • 信号:linux系统中提供了很多种信号。异步通信机制。异常情况。
  • socket:跨网络,远程。
  1. 什么叫零拷贝?零拷贝有什么好处?有哪些场景应用了零拷贝?是怎么用的?
  • 零拷贝就是经过CPU拷贝的次数为零,也就是用户态与内核态之间的拷贝。
  • 零拷贝的好处是减少了CPU拷贝时间,避免了用户态与内核态之间的切换。
  • 零拷贝的应用场景有:kafka、netty、rocketmq、nginx、apache、java中的NIO中也应用了零拷贝。
  • kafka中索引文件使用的是mmap + write方式,数据文件使用的是sendfile方式。
  • netty中的零拷贝技术是基于java用户态的。
  • 其实到目前为止,零拷贝的定义得到了扩展,不再局限于操作系统层面,而是只要是采取了一些优化的手段减少了不必要的拷贝次数,便可以说是采取了零拷贝的思想。
  1. 缓冲区有什么用?
  • 在计算机系统中,CPU、内存和硬盘的运行速度是不在一个量级上的。那么当进程当操作系统发起IO操作的时候,为了解决硬盘和内存的速度不一致的问题,就在中间加一个缓冲区。
  • 用户空间和内核空间都分别有自己的缓冲区。用户空间的读写IO只与内核空间的缓冲区打交道。而内核空间才与外界(如磁盘、网卡)打交道。
  1. 虚拟内存有什么好处?
  • 多个虚拟内存地址可以指向同一个物理内存地址
  • 虚拟内存空间可以大于实际可用的物理内存空间
  1. 零拷贝的两种技术mmap + write 和 sendfile有什么区别?
  • mmap + write技术省掉了从内核read缓冲区拷贝数据到用户缓冲区和省掉了从用户缓冲区拷贝数据到内核socket缓冲区,但是还是有一次从内核read缓冲区到内核socket缓冲区的拷贝。
  • sendfile直接讲内核read缓冲区中的数据描述信息(内存地址、偏移量)记录到相应的socket缓冲区中,这样不但避免了从内核态到用户态的上下文切换,也省掉了从内核read缓冲区到内核socket缓冲区的一次拷贝。
  • sendfile with DMA scatter/gather copy
  • splice
  1. DMA技术是什么?有什么好处?
  • DMA的全称是Direct Memory Access, 直接内存访问,可以使得外部设备和存储器之间直接读写数据,绕过CPU的干预和参与。好处是提高效率。
  1. 有了进程,为什么还需要有线程?
  • 进程缺点:进程在执行的过程中被阻塞时,该进程中的等待资源得不到执行
  • 线程粒度比进程更加细。
  • 进程是系统资源分配的最小单位;线程是系统资源调度的最小单位。
  • 线程的引入可以减少程序在并发执行时的时间和空间的开销,提高并发性能,提高系统资源利用率和吞吐量。
  1. 进程的调度算法有哪些?
  • 先来先服务调度算法
  • 时间片轮转调度算法
  • 短作业优先调度算法
  • 最短剩余时间优先调度算法
  • 高响应比优先调度算法
  • 优先级调度算法
  • Linux下进程分为5种类别,分别是停止类、截止类、实时类、公平类和空闲类,每种类别都有一个运行队列,每次调度时,就是先按照类别优先级排序,再按照每个类别内的最高优先级任务调度运行。
  1. 常见的IO模型有哪些?
  • 同步阻塞IO
  • 同步非阻塞IO
  • IO多路复用select/epoll
  • 异步IO
  1. 同步与异步的概念是什么?
  • 同步IO和异步IO描述的是一种用户空间与内核空间的IO发起方式。同步IO指的是用户空间是主动发起IO请求的一方,内核空间是被动接受方。异步IO指的是内核空间是主动发起IO请求的一方,而用户空间是被动接受方。
  • 同步与异步是对应于调用者与被调用者,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
  1. 阻塞与非阻塞的概念是什么?
  • 阻塞和非阻塞描述的是用户空间程序的执行状态。阻塞IO指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。非阻塞IO指的是用户空间的程序不需要等待内核IO操作彻底完成,只需要得到内核空间返回的一个状态值,就可以立即继续执行用户空间的操作。
  • 阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
  1. 计算机中存储器的层次结构是怎样的?
  • L0:通用寄存器堆
  • L1:指令与数据缓冲栈SRAM
  • L2:高速缓冲存储器SRAM
  • L3:高速缓存SRAM
  • L4:主存储器(DRAM),内存
  • L5:联机外部存储器(硬磁盘机),外存
  • L6:脱机外部存储器(磁带、光盘存储器等),远程二级存储,如分布式文件系统等
  1. 在CPU多级缓存的结构下,多线程访问的时候,如何保证数据的一致性?
  • 总线锁,效率低。
  • 一致性协议,如intel的MESI,还有其他的协议。
  • 有些无法被缓存的数据或者跨越多个缓存行的数据依然必须使用总线锁。
  • 总之,目前CPU数据一致性实现是靠缓存锁(MESI、MSI等协议)加上总线锁实现
  1. 何为MESI协议?
  • 给每一个缓存的内容做了标记,标记读进来的这个数据相比于主存有没有更改过。
  • 更改过标记为m,modified
  • 独享,标记成exclusive
  • 如果该内容我读的时候别人也在读,标记成shared
  • 如果该内容在我读的时候被别的线程改过,标记成invalid
  1. CPU指令执行为什么会出现乱序?
  • 其实是CPU在执行的时候采取的一种优化策略,为了提高执行效率。
  • CPU会分析,在不影响执行效果的前提下,会对CPU指令执行的顺序进行重排。这样,在执行一个相对耗时的指令时,不至于无谓等待。
  • 写指令也可能会出现乱序,WCBuffer合并写缓存使得写操作可以进行合并
  1. 操作系统的内存屏障有哪些?
  • sfence:store,写操作屏障
  • lfence:load,读操作屏障
  • mfence:modify,mix,读写操作屏障
  1. 线程和纤程有什么区别?
  • 纤程可以看作轻量级的线程
  • 线程的创建需要经过内核空间,而纤程的创建不需要经过内核空间。
  1. 内存池是什么?
  • 一种内存分配方式,又称固定大小区块规划。
  • 与new、malloc等内存分配方式有什么区别?new、malloc等内存分配方式因为所申请的内存区块大小不固定,所以在频繁使用的情况下,会造成大量的内存碎片,从而降低性能。而内存池解决了内存碎片这个问题。内存池适合于递归和迭代这种层次结构化程序。
  1. 关于线上服务器的配置有什么优化建议?(摘抄自阿里规范)
  • 高并发服务器建议调小TCP协议的time_wait超时时间。默认是240秒,也就是4分钟,才会关闭处于time_wait状态的连接。在高并发场景下,服务器可能会因为处于time_wait状态的连接数过多而无法建立新的连接,因此在高并发场景下线上服务器需要调小此值。在服务器/etc/sysctl.conf文件中配置net.ipv4.tcp_fin_timeout = 30。
  • 调大服务器所支持的最大文件句柄数。主流的linux服务器默认所支持最大fd数量为1024。当并发连接数很大时容易因fd不足而导致"open too many files",导致新的连接无法建立。所以建议将linux服务器所支持的最大句柄数调高数倍,当然这个得考虑服务器的内存大小。
  • 给JVM环境参数增加设置-XX:+HeapDumpOnOutOfMemoryError参数,这样当JVM碰到OOM的场景时会输出dump信息。
  • 在线上生产环境,JVM的Xms和Xmx设置一样大小的内存容量,避免在GC后调整堆大小带来的压力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值