Linux操作系统面试题记录

news2024/11/24 9:38:36

一、进程与线程

1.并发和并行的区别

并发:一个cpu处理器处理多个任务;
并行:多个cpu处理器处理多个任务;

2.进程和线程是什么?区别?何时用线程何时用进程?

Linux中其实没有进程线程之分,fork和pthraed_create都会do_fork来创建,只是参数不同,pthread的参数会指定多个进程之间共享某些资源
进程:资源分配;独立的地址空间;进程之间的通信要用进程间通信;创建开销大,切换效率低,但资源管理和保护好
线程:程序执行;共享进程的地址空间和资源,但拥有独立的栈;线程通信方便(全局变量);创建开销小,切换效率高,适合频繁切换

3.为什么要用多线程?

解决负载均衡问题,提高CPU利用率,同时干几件事;

4.进程状态?转换图?

进程的状态有:创建,就绪,运行,阻塞,结束

linux系统通常将阻塞状态的进程,换出到硬盘,等到再次需要运行的时候再重新加载进内存;

5.僵尸进程?孤儿进程?

僵尸进程:子进程退出,但父进程没有getwait,为它清理;
孤儿进程:父进程退出,子进程还没退出,子进程将会被init领养;

6.守护进程?怎么实现?

守护进程:运行在后台的进程,只有需要才唤醒;
创建时有意将父进程退出,被init收养,进行setsid,chdir,umask,成为守护进程;

7.僵尸进程的危害?

子进程退出之后,PCB会维护退出信息,如果子进程退出越来越多,但父进程没wait清理,将会占用越来越多的内存,造成内存浪费,甚至会程序崩溃;

8.优先级如何修改?

PRI和NI加起来才是真正执行的优先级,修改优先级只需要修改top + r 修改NICE值就可以了;

9.进程的创建方式?过程?进程的控制结构?
进程的地址空间按低地址到高地址系统地讲述一下,为什么要用进程地址空间?

线程共享的资源是什么?

写时拷贝?为什么要写时拷贝?

9.进程上下文?线程上下文?中断上下文?

内核进程调度过程?

调度算法?

请问就绪状态的进程在等待什么?

空闲的进程和阻塞的进程状态会不会在唤醒的时候误判?

二、进程间通信方式

1.管道,匿名管道:父子间通信;管道是内核里的缓存,是特殊的文件,不在文件系统里面;匿名管道的生命周期,是随进程的创建而建立,随进程的结束而销毁。

有名管道:创建了管道的设备文件,可以在不相关的进程之间进行通信;(无格式的字节流
2.消息队列;保存在内核的消息链表中,有固定的消息体大小(双态数据拷贝开销,消息体大小有限制
3.共享内存;不同进程分配一段虚拟内存空间,映射到相同的物理内存中;
4.信号量;不用于缓冲数据,而用于进程之间的同步和互斥;
5.信号;唯一的异步通知机制;进程有三种方式响应信号 1. 执行默认操作、2. 捕捉信号、3. 忽略信号
5.套接字;不同主机之间的通信;

3.进程和线程的资源?线程共享的资源是什么?

5.进程线程创建函数?进程的创建过程?

6.父子进程?通信?全局变量?

11.什么是进程调度?

12.进程调度的规则

13.进程调度的算法?

14.什么是上下文切换?

共享内存怎么实现?

三、同步与互斥

8.线程安全是什么?怎么实现?

线程安全就是多线程同时执行的时候和单个线程执行的时候,结果和变量不变,那就是线程安全的;
线程安全问题都是有全局变量和静态变量引起的,我们可以采取的方法有1.加锁互斥访问;2.线程本地化,为共享变量创建本地副本;3.非阻塞同步,没有其他线程争用才能操作成功;

9.同步与互斥?线程同步方法?

线程同步指的是多个线程安装预定的执行顺序去执行;
互斥指的是同一时间只能有一个线程去访问共享资源;
同步:信号量,事件通知;
互斥:互斥锁,临界区;

四、死锁

15.死锁?必要条件?如何解决?

16.如何预防死锁?

17.鸵鸟,银行家算法?

18.递归锁

用户态怎么进入内核态

系统调用和函数调用

五、堆和栈

堆和栈的区别?堆的作用?等

(见freertos章节)

六、内存

什么是虚拟内存?虚拟内存有什么作用?

虚拟内存是虚假的连续内存,需要通过mmu才能转换成真实的物理内存;
优点:
①扩大内存的地址空间,可以超过真实的物理内存;
②每个进程拥有自己独立的地址空间和独立的页表,相互独立,减少了多进程之间地址冲突的问题;
③页表项里记录了属性标志,例如读写权限,为os提供更好的安全性;
缺点:页表占内存,换入换出消耗时间,虚拟地址转换也消耗时间;

内存管理方式有几种?

主要有分块,分段,分页;和它们之间的结合
分块:把内存分为一块一块的,需要了就分配一大块;
分段:根据程序的逻辑,分成不同属性的段,栈段、堆段、数据段、代码段等
分页:分成大小固定的页,linux是4kb;

为什么要分页分段?

分块(内存碎片严重)——>分段(外部内存碎片和内存交换效率低)——>分页(维护页表数据结构占用内存大,页内部碎片)
每个段的长度不固定,所以多个段未必能恰好使用所有的内存空间;
硬盘读写比内存慢,如果读写大段的内存会导致卡顿;

分页的话一次性写入磁盘的也只有少数的一个页或者几个页,效率高很多;
分页我们可以不用一次性将程序加载入内存,我们建立完映射关系之后,可以等到用到的时候再加载到内存中去;

为什么使用多级页表?

页表一定要覆盖全部物理地址空间,如果单级页表就要100多万个页表项,而二级页表就只需要1024的项;当一级页表没有建立映射关系的时候,对应的二级页表项是可以不用建立的;
假设只有 20% 的一级页表项被用到了,4KB(一级页表) + 20% * 4MB(二级页表)= 0.804MB
节约内存!

解释下虚拟地址,逻辑地址,线性地址,物理地址?

程序在使用的地址,还未经段式内存管理单元映射的叫逻辑地址;
通过段式内存管理单元的映射的地址叫线性地址也是,虚拟地址;
在通过页式内存管理单元映射之后变成真实的物理地址;
补充:Linux 内核所采取的办法是使段式映射的过程实际上不起什么作用。linux每个段都是从0地址开始的整个4GB虚拟空间,相当于屏蔽了逻辑地址;

进程从上往下的地址空间是怎么样的?

内核空间,用户空间(env,栈,共享映射区,堆,bss,data,代码段)详见进程部分;

虚拟内存怎么转换为物理内存的?

①当CPU需要进行地址转换时,它会首先检查快表(TLB),如果找到了对应的映射关系,就不需要访问页表;
②否则就去查页表,但并不是所有虚拟页都有对应的物理内存,找不到会触发缺页中断,os会加载所需要的物理内存,并更新页表;
③然后用MMU转换为物理地址;

内存置换算法?

最佳(最来最长时间不被访问的页面),LRU(最不常用的页面),FIFO(最先加载进来的页面),clock(循环链表和指针,扫描访问位如果是0,置换,如果是1,变成0)

缺页中断?

malloc和mmap的时候只是申请的虚拟地址空间,并没有分配虚拟内存对应的物理内存;当进程访问没有建立映射关系的虚拟内存时,处理器自动触发缺页异常;然后操作系统会建立虚拟内存和物理内存之间的映射关系。

当访问的页面不在内存中时,会产生一次缺页中断;具体过程是:页表状态位,是否在内存里--》不在--》缺页中断--》如果内存没满,直接将对应的页调入内存(如果内存满了,同时还要调出一个页回收内存)

系统调用是什么?和库函数有什么区别?

系统调用:是通向操作系统内核的接口,面向底层硬件的;可以从用户态进入内核态;
库函数:把函数放到库里,方便其他人使用;
区别:①可移植性,依赖平台与否;②运行的用户地址空间还是内核地址空间;③开销大小;

malloc的底层是什么?

malloc分配的是虚拟内存;

1.通过brk()从堆分配 < 128k

malloc 通过 brk( 方式申请的内存,free 释放内存的时候,并不会把内存归还给操作系统,而是缓存在malloc 的内存池中,待下次使用:

为什么不全用brk?如果只使用brk,很容易产生越来越多的不可用碎片,导致内存泄漏;

2.通过mmap()从文件映射区分配 >128k

malloc 通过 mmap( 方式申请的内存,free 释放内存的时候,会把内存归还给操作系统,内存得到真正的释放。

为什么不只用mmap?全都用mmap的话每次申请都需要进行核态的变化和缺页中断,cpu消耗大;brk有内存池,直接取出可以减少核态变化和缺页中断的次数;

free() 函数只传入一个内存地址,为什么能知道要释放多大的内存?

在1G内存的计算机中能否malloc(1.2G)?为什么?

可以的,malloc仅与虚拟内存相关;malloc传入的参数是unsigned的,表示范围是超过1.2g的;

malloc能申请多大的内存?

32位的理论上能申请3g,但堆和映射区不是用户空间的全部,也受其他的影响;(还可以再精细)
64位可以申请很大,128tb,即使物理内存只有4GB,申请8GB也是没问题的;有swap分区的话能正常运行,否则会被oom;

内存满了会怎么样?

后台内存回收(kswapd):异步,不阻碍进程执行
直接内存回收(direct reclaim):同步
OOM (Out of Memory)机制:杀死占用物理内存比较高的进程

两类内存可以被回收:文件页和匿名页;
文件页:回收干净页直接释放内存,回收脏页写回磁盘再释放内存;
匿名页:linux的swap机制;
linux用活跃链表和非活跃链表来管理这些内存页,越尾的就越不常访问,优先回收不活跃的内存;

linux如何避免内存碎片?

伙伴系统;相邻的内存进行合并;

你自己编程的时候如何减少?

①使用智能指针;②避免频繁的小块内存分配和释放;③使用内存池技术;

设计一个内存池?

在对象使用非常频繁的情况下,我们可以预先在堆中实例化一些对象,在需要用的时候,我们直接在内存池里面拿,而不重新构造,释放的时候是返回给内存池,而不是给OS,这样就不用频繁的分配和回收内存,可以提升效率;

给你一个类,有static,virtual,讲讲这个类的内存分布?

static修饰的成员变量,在全局数据区分配内存
static修饰的成员函数,在代码区分配内存 多态分为静态多态,编译的时候确定;
动态多态执行的时候动态绑定;
如果一个类是局部变量则该类数据存储在栈区,如果一个类是通过new/malloc动态申请的,则该类数据存储在堆区。

为什么要有page cache?操作系统怎么设计的page cache?

减少IO操作,加快读取文件的速度;先从page cache(有一部分磁盘的缓存)里面找,命中了就不用去磁盘里面找了;
文件的每个数据块对应一个page cache项,利用双向链表和搜索树两种数据结构来管理,通过文件内偏移快速定位Cache项;

七、IO复用

++i是否原子操作?

一个进程可以创建多少个线程?

250开始看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2142868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试官:讲一讲Spring MVC源码解析

好看的皮囊千篇一律、有趣的灵魂万里挑一 文章持续更新&#xff0c;可以微信搜索【小奇JAVA面试】第一时间阅读&#xff0c;回复【资料】获取福利&#xff0c;回复【项目】获取项目源码&#xff0c;回复【简历模板】获取简历模板&#xff0c;回复【学习路线图】获取学习路线图。…

驱动器磁盘未格式化恢复实战

驱动器磁盘未格式化的深度剖析 在日常的数字生活中&#xff0c;驱动器作为数据存储的重要载体&#xff0c;承载着用户无数的珍贵资料。然而&#xff0c;当遇到“驱动器中的磁盘未被格式化”的提示时&#xff0c;这份平静往往会被瞬间打破。这一状况不仅让用户感到困惑和焦虑&a…

JZ2440开发板——S3C2440的UART的使用

以下内容源于韦东山课程的学习与整理&#xff0c;如有侵权请告知删除。 一、UART硬件简介 UART&#xff0c;全称是“Universal Asynchronous Receiver Transmitter”&#xff0c;即“通用异步收发器”&#xff0c;也就是我们日常说的“串口”。 它在嵌入式中用途非常广泛&…

LabVIEW提高开发效率技巧----VI服务器和动态调用

VI服务器&#xff08;VI Server&#xff09;和动态调用是LabVIEW中的两个重要功能&#xff0c;可以有效提升程序的灵活性、模块化和可扩展性。通过这两者的结合&#xff0c;开发者可以在运行时动态加载和调用VI&#xff08;虚拟仪器&#xff09;&#xff0c;实现更为复杂的应用…

【 html+css 绚丽Loading 】 000052 璇玑转轮

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

实时数仓3.0DWD层

实时数仓3.0DWD层 DWD层设计要点&#xff1a;9.1 流量域未经加工的事务事实表9.1.1 主要任务9.1.2 思路9.1.3 图解9.1.4 代码 9.2 流量域独立访客事务事实表9.2.1 主要任务9.2.2 思路分析9.2.3 图解9.2.4 代码 9.3 流量域用户跳出事务事实表9.3.1 主要任务9.3.2 思路分析9.3.3 …

全面掌握 Jest:从零开始的测试指南(下篇)

在上一篇测试指南中&#xff0c;我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性&#xff0c;包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…

办了房屋抵押经营贷,空壳公司不怕被查吗?续贷不上怎么办?

很多有房的朋友&#xff0c;想必都办理过抵押经营贷款。但是&#xff0c;当办完房屋抵押经营贷款之后&#xff0c;钱到手了&#xff0c;别光顾着乐呵&#xff0c;贷后管理可是门大学问&#xff0c;稍有不慎&#xff0c;麻烦就找上门了。咱得确保资金用得对路&#xff0c;征信亮…

windows 使用wsl安装docker

前言 很多情况下代码开发需要依赖 Linux 系统&#xff0c;比如安装 Docker 容器来实现代码隔离&#xff0c;然而问题是大部分同学的电脑都是 Windows 系统&#xff0c;这时就会出现大量报错&#xff0c;经历过的同学一定是边踩坑边落泪。 如何免费拥有一台 Linux 服务器呢&…

什么是即时通讯平台

在当今数字化时代&#xff0c;高效的沟通和协作是企业成功的关键。为了满足企业的沟通需求&#xff0c;即时通讯平台应运而生。WorkPlus作为一款企业级即时通讯平台&#xff0c;提供了丰富的功能和安全性&#xff0c;助力企业实现高效协作、数字化办公以及推动业务发展。本文将…

为什么直播要用RTMP?

为什么要选RTMP 直播使用RTMP&#xff08;Real-Time Messaging Protocol&#xff09;协议的原因主要有以下几点&#xff1a; 1. 低延迟特性 RTMP被设计为实时消息传递协议&#xff0c;通过优化传输机制&#xff0c;可以实现较低的传输延迟。这对于直播来说至关重要&#xff…

LeetCode_sql_day26(184,1549,1532,1831)

描述 184.部门工资最高的员工 表&#xff1a; Employee ----------------------- | 列名 | 类型 | ----------------------- | id | int | | name | varchar | | salary | int | | departmentId | int | -----------------…

22章 开发高效算法

1.编写一个程序&#xff0c;提示用户输入一个字符串&#xff0c;然后显示最大连续递增的有序子字符串。分析你的程序的时间复杂度。 import java.util.Scanner;public class Test {public static void main(String[] args) {System.out.println("请输入字符串&#xff1a…

这个公司可以做点什么呢?

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 屏蔽力是信息过载时代一个人的特殊竞争力&#xff0c;任何消耗你的人和事&#xff0c;多看一眼都是你的不…

国学盛典 致敬先贤 《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕

9月10日&#xff0c;《老子与道德经》纪录片研讨会在北京善品堂国学馆圆满落幕。中国著名表演艺术家、曾饰演央视86版电视剧《西游记》中“孙悟空”的六小龄童先生与两百余人传统文化传播者、践行者、爱好者齐聚一堂&#xff0c;共同交流。本次会议由中国文化促进会福文化工作委…

python-在PyCharm中使用PyQt5

文章目录 1. 安装 PyQt5 和QtTools2. QtDesigner 和 PyUIC 的环境配置2.1 在 PyCharm 添加 Create Tools2.2 添加 PyUIC 工具 3. 创建ui界面4. 使用python调用ui界面参考文献 1. 安装 PyQt5 和QtTools QT 是最强大的 GUI 库之一&#xff0c;PyQt5 是 Python 绑定 QT5 应用的框…

phpstudy 建站使用 php8版本打开 phpMyAdmin后台出现网页提示致命错误:(phpMyAdmin这是版本问题导致的)

报错提示&#xff1a; 解决方法&#xff1a;官网下载phpmyadmin 5.2.1版本。 下载地址&#xff1a;phpMyAdmin 将网站根目录phpMyAdmin4.8.5里面的文件换成 官网下载的5.2.1版本即可。 重启网站&#xff0c;打开phpMyAdmin后台即可&#xff08;若打不开更改 mysql密码即可&am…

传知代码-KAN卷积:医学图像分割新前沿

代码以及视频讲解 本文所涉及所有资源均在传知代码平台可获取 概述 在本文中深入探讨KAN卷积在医学图像分割领域的创新应用&#xff0c;特别是通过引入Tokenized KAN Block&#xff08;Tok Kan&#xff09;这一突破性设计&#xff0c;将深度学习中的图像分割技术推向了新的高…

代理导致的git错误

问题&#xff1a; 今天在clone时出现如下错误&#xff1a; fatal: unable to access https://github.com/NirDiamant/RAG_Techniques.git/: Failed to connect to 127.0.0.1 port 10089 after 2065 ms: Couldnt connect to server真是让人感到奇怪&#xff01;就在前天&#…

Typora安装,使用,图片加载全流程

文章目录 前言&#xff1a;安装&#xff1a;破解&#xff1a;使用typora&#xff1a;关于CSDN加载不出图片&#xff1a;创建OSS&#xff1a;设置PicGo&#xff1a; 前言&#xff1a; ​ Typora是一款非常流行的Markdown编辑器&#xff0c;简单来说就是可以方便我们写博客。拿我…