后端知识点链接(二):操作系统、Linux

操作系统

  • 2.5w字 + 36 张图爆肝操作系统面试题,太牛逼了!

  • 32位系统和64位系统有什么区别?C++中32位和64位有什么区别?(同花顺提前批) 计算机基础----32位操作系统和64位操作系统的区别C++那些细节–32位64位数据类型的区别
    1)支持的内存不同
    a、32位:最多支持4G的内存
    b、64位:支持4G 8G 16G 32G 64G 128G 256G内存,理论上可以无限支持,只要主板上有足够的内存条
    2)支持的处理器和软件不同
    a、32位:能完全支持64位的处理,支持基于32位的软件,不能运行64位的软件
    b、64位:支持基于64位的处理器,两种类型软件都支持
    3)C++数据类型大小不同
    a、32位:指针大小为4byte,可以表示2^32,string类型为28byte
    b、64位:指针大小为8byte,可以表示2^64,string类型为32byte,相差了一个指向字符串开头的指针

  • 虚拟内存 20 张图揭开「内存管理」的迷雾,瞬间豁然开朗
    1)虚拟内存的作用?
    a、虚拟内存:我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
    b、物理内存:实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
    c、机制和作用:操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,这样不同进程访问地址不会冲突。
    2)页表在哪里?
    页表实际上存储在 CPU 的内存管理单元 (MMU)
    3)如何判断逻辑地址是否已经映射在物理地址上?
    无缺页中断

  • 缺页中断何时发生? 详解缺页中断-----缺页中断处理(内核、用户)
    1)编码错误:当内存管理单元(MMU)中确实没有创建虚拟物理页映射关系,并且在该虚拟地址之后再没有当前进程的线性区(vma)的时候,可以肯定这是一个编码错误,这将杀掉该进程。
    2)缺页中断:当MMU中确实没有创建虚拟页物理页映射关系,并且在该虚拟地址之后存在当前进程的线性区vma的时候,这很可能是缺页中断,并且可能是栈溢出导致的缺页中断。
    3)内存调用:当使用malloc或mmap等希望访问物理空间的库函数或系统调用后,由于linux并未真正给新创建的vma映射物理页,此时若先进行写操作,将产生缺页中断;若先进行读操作,将被映射给默认的零页,等再进行写操作时,仍会产生缺页中断,这次必须分配1物理页了,进入写时复制的流程。
    4)Fork函数:当使用fork等系统调用创建子进程时,子进程不论有无自己的vma,它的vma都有对于物理页的映射,但它们共同映射的这些物理页属性为只读,即linux并未给子进程真正分配物理页,当父子进程任何一方要写相应物理页时,导致缺页中断的写时复制。

  • 缺页中断处理流程? 缺页中断处理过程操作系统—(35)缺页中断与缺页中断处理过程
    1)保存现场:首先硬件会陷入内核,在堆栈中保存程序计数器,将当前指令的信息保存在CPU特殊的寄存器
    2)查找虚拟页面:当操作系统发现是一个页面中断时,查找出来发生页面中断的虚拟页面(进程地址空间中的页面)。这个虚拟页面的信息通常会保存在一个硬件寄存器中,如果没有的话,操作系统必须检索程序计数器
    3)查找空闲页框:操作系统查找一个空闲的页框(物理内存页面),如果没有则通过页面置换算法找到空闲页框,此时将页框置为忙状态,以防页框被其它进程抢占掉,如果找的页框中的内容被修改了,则需要将修改的内容保存到磁盘上,此时会引起一个写磁盘调用,发生上下文切换(在等待磁盘写的过程中让其它进程运行)
    4)复制磁盘内容:页框干净后,操作系统根据虚拟地址对应磁盘上的位置,将磁盘上的页面内容复制到空闲页框中,此时会引起一个读磁盘调用,发生上下文切换,当磁盘页面内容全部装入页框后,向操作系统发送一个中断。操作系统更新页表项,将虚拟页面映射的页框号更新为写入的页框,并将页框标记为正常状态
    5)恢复现场:恢复缺页中断发生前的状态,将程序指令器重新指向引起缺页中断的指令,调度引起页面中断的进程,操作系统返回汇编代码例程,汇编代码例程恢复现场,将之前保存在通用寄存器中的信息恢复。

  • 虚拟内存页面置换算法 【操作系统 - 5】虚拟内存页面置换算法
    1)先进先出页面置换算法(FIFO)
    a、定义:该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。
    b、实现:只需把页面按先后次序链接成一个队列,并设置一个替换指针,使它总是指向最老的页面。
    c、抖动现象(Belady):采用FIFO算法时,如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多,缺页率反而提高的异常现象。该算法与进程实际运行的规律不相适应,
    d、原因:因为在进程中,有些页面经常被访问,比如,含有全局变量、常用函数、例程等的页面,FIFO算法并不能保证这些页面不被淘汰。
    2)最佳置换算法(Optimal)
    a、定义:其所选择的被淘汰页面,将是以后永不使用的,或是在最长(未来)时间内不再被访问的页面。采用最佳置换算法,通常可保证获得最低的缺页率。
    b、缺点:目前还无法预知一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,因而该算法是无法实现的,但可以利用该算法去评价其它算法。
    3)最近最久未使用置换算法(LRU)
    LRU置换算法是选择最近最久未使用的页面淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问所经历的时间t,当须淘汰一个页面时,选择现有页面中其t值最大的,即最近最久未使用的页面淘汰。
    4)最少使用置换算法(LFU)
    在采用最少使用置换算法时,应为在内存中的每个页面设置一个移位寄存器,用来记录该页面被访问的频率。该置换算法选择在之前时期使用最少的页面作为淘汰页。

  • 引起上下文切换的原因有哪些?寄存器、上下文、栈 基本功:线程上下文切换线程切换是如何给 CPU 洗脑的?
    1)上下文切换类别
    a、进程切换,两个进程之间的切换
    b、线程切换,同一进程中的两个线程之间的切换
    c、模式切换,在给定线程中,用户模式和内核模式的切换
    d、地址空间切换,将虚拟内存切换到物理内存
    2)上下文切换原因
    a、时间片用完:当前执行任务(线程)的时间片用完之后,系统CPU正常调度下一个任务
    b、中断处理:其他程序”打断”了当前正在运行的程序。当CPU接收到中断请求时,会在正在运行的程序和发起中断请求的程序之间进行一次上下文切换。中断分为硬件中断和软件中断,软件中断包括因为IO阻塞、未抢到资源或者用户代码等原因,线程被挂起。
    c、用户态切换:对于一些操作系统,当进行用户态切换时也会进行一次上下文切换,虽然这不是必须的。
    d、多进程或多线程切换:多个任务抢占锁资源,在多任务处理中,CPU会在不同程序之间来回切换,每个程序都有相应的处理时间片,CPU在两个时间片的间隔中进行上下文切换
    3)解决方法
    a、无锁并发编程:多线程处理数据时,可以用一些办法来避免使用锁,如将数据的ID按照Hash取模分段,不同的线程处理不同段的数据
    b、CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
    c、使用最少线程或进程
    d、协程:单线程里实现多任务的调度,并在单线程里维持多个任务间的切换

  • 进程切换与线程切换的区别?为什么虚拟地址切换很慢? 送命题:进程切换与线程切换的区别?
    1)进程切换和线程切换的区别
    进程切换与线程切换的一个最主要区别就在于进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。
    2)为什么虚拟地址切换很慢?
    页表切换、页表查找慢、TLB失效
    现在我们已经知道了进程都有自己的虚拟地址空间,把虚拟地址转换为物理地址需要查找页表,页表查找是一个很慢的过程,因此通常使用Cache来缓存常用的地址映射,这样可以加速页表查找,这个cache就是TLB,Translation Lookaside Buffer,我们不需要关心这个名字只需要知道TLB本质上就是一个cache,是用来加速页表查找的。由于每个进程都有自己的虚拟地址空间,那么显然每个进程都有自己的页表,那么当进程切换后页表也要进行切换,页表切换后TLB就失效了,cache失效导致命中率降低,那么虚拟地址转换为物理地址就会变慢,表现出来的就是程序运行会变慢,而线程切换则不会导致TLB失效,因为线程线程无需切换地址空间,因此我们通常说线程切换要比较进程切换块,原因就在这里。

  • 了解协程吗?协程上下文切换实现?每个连接分配一个协程,开销会不会很大?要是每个连接分配一个内核级线程,可不可以?内核级线程切换的开销? linux进程-线程-协程上下文环境的切换与实现协程是什么?怎么来的?它有什么作用?协程不过是用户态的线程,这句话对吗?C语言实现协程(一)
    协程是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
    协程适合io密集型场景,处理完一个io立即切换,不用涉及用户态和内核态的切换,不适合计算密集型场景,一个协程处理过久导致其他协程等待过久。

  • 用户态和内核态的区别? 线程-用户态(也有叫协程的)和内核态的区别
    1)由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 :用户态和内核态
    2)用户态:只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取
    3)内核态:CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序

  • 用户态和内核态怎么切换?陷入内核态的方式有哪些? 操作系统用户态和内核态之间的切换过程
    1)系统调用
    这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作,比如前例中fork()实际上就是执行了一个创建新进程的系统调用。
    2)异常
    当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常
    3)外设中断
    当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,CPU会去执行与中断信号对应的处理程序,如果先前执行的指令是用户态下的程序,那么这个转换的过程发生了由用户态到内核态的切换。

  • 库函数和系统调用的区别? 库函数和系统调用的区别和联系
    -

  • read() 和 fread()区别?

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值