当前位置: 首页 > Linux

操作系统面试准备系列

时间:2023-04-06 04:39:35 Linux

linux内存管理部分物理内存、虚拟内存、分段分页、mmu、页表、tlb的基本概念进程内存模型:栈、文件映射区、栈、数据段、bsssegment,Textsegment物理内存管理:buddy和slab,参考这篇文章虚拟内存管理:brk和mmap,参考这篇文章,申请虚拟内存的时候,物理内存还没有分配,发生pagefault时,申请用于物理内存并将其映射。标准库:malloc,通过brk和mmap向操作系统申请内存,为了减少不必要的系统调用,malloc也会管理内存,参考这篇文章用户层:malloc定位为通用内存管理器,必须平衡情况。在用户层,可以针对特殊场景定制内存池,减少开销(比如定长内存块申请,单线程管理),方便监控调试等。进程、线程、协程的区别和联系可以参考这篇文章。进程是资源管理的基本单位,线程是调度的基本单位。一个进程对应一个或多个线程。进程切换和线程切换简述进程切换过程:主动或被动进入内核:时钟中断或调用阻塞的系统调用(进入内核的操作会进行一次权限级切换,主要是从用户栈切换到内核栈,并保存必要的上下文到内核栈(如用户栈地址,下一条指令地址))检测是否需要调度:时间片耗尽或等待阻塞操作或更高优先级的任务需要被执行。从中断返回时,会检测是否需要调度,如果需要则进入调度流程。运行调度算法得到下一个要执行的任务对应的pcb,执行cpu上下文切换(包括页表,寄存器,内核栈,必要时刷新tlb,缓存失效等)中断返回,恢复上下文(如果一个进程发生切换,那么这里的回复就是被切换进程的用户态上下文),并继续执行新的任务。参考:https://www.cnblogs.com/ethan...线程切换的开销是否比进程切换低?如果有,成本低在哪里?如果是不同进程的线程切换,则相当于进程切换。如果是同进程的线程切换,对于共享资源(内存)是不需要切换的,也就是说不需要切换页表和tlb,也不需要使缓存失效。.如果体系结构支持ASID,则进程切换也不需要清理tlb。什么是协程?与异步代码、协同调度、用户态切换相比,协程的意义何在?在支付可控资源的情况下,写同步逻辑的异步代码,降低复杂度(情况复杂时,异步代码的状态太多,复杂度太高)。栈协程独立栈:分配太多浪费空间,分配少有栈溢出的风险。共享栈:切换时需要复制栈空间参考本题答案。Linux任务调度算法对于实时进程:FIFO或RoundRobin,对于普通进程:O(n)->O(1)->CFS参考这篇文章unix-多级反馈队列调度算法优点是的:可以同时满足交互任务和计算密集型任务的要求(交互类型要及时反馈,计算密集型要充分利用时间片),因为交互任务总是会按当前优先级排队slices不被消耗调度,而计算密集的会因为时间片耗尽而进入低优先级队列,时间片时间更长。为了防止计算密集型任务饥饿,所有任务都可以定期重置到高优先级队列。进程间通信参考这篇文章掌握了管道、命名管道、消息队列、共享内存、信号量、信号、套接字等各种进程间通信方式的优缺点。关于unix域套接字,参考这个回复过程同步什么是死锁?死锁造成的条件死锁是指多个进程持有一些互斥资源等待获取其他资源的情况,等待关系形成闭环,从而永久阻塞的情况。产生条件:资源互斥访问,一个资源只能同时被一个进程访问请求持有,当一个进程请求其他资源时,一直持有当前资源,不能抢占,当占用该资源的进程资源没有释放,不能被抢占Get循环等待。linux进程的状态是什么?R可执行状态S可中断睡眠状态D不可中断睡眠状态(不响应异步信号,响应硬件中断),这个状态的意义是保证内核的某些操作不被外界打断。TPause,track状态,通过向进程发送SIGSTOP进入该状态,典型:gdbdebuggingZZombie状态,进程占用的资源被释放,只有task_struct结构没有被释放,退出代码留给父进程获取。当父进程先于子进程退出时,子进程就被委托给1号进程,1号进程在死循环中等待自己子进程的退出事件。X不保留task_struct结构,直接退出,典型的像一个detach线程,这个状态很短暂。参考这篇文章Processmemorylayout-stackframestructurestack-filemappingarea-heap-bss-data-textparameterreturnaddressold_ebp<-ebpsomesavedregisterinformationlocalvariables...<-espreference《程序员的自我修养》本书的book文件iommap将内核中的页缓存(pagecache)映射到进程的逻辑地址空间(堆和栈之间的部分)。操作系统通过缺页异常负责从文件系统中读写数据,用户直接操作内存。一个典型的动态链接库是通过mmap映射到进程地址空间的。mmap也可用于在进程之间共享内存。通过匿名映射,可以在不打开文件的情况下在父子进程之间共享内存。参考这篇文章