Linux(操作系统)面经——part2

1、请你说说进程和线程的区别

1.进程是操作系统资源分配和调度的最小单位,实现操作系统内部的并发;线程是进程的子任务,cpu可以识别、执行的最小单位,实现程序内部的并发。

2.一个进程最少有一个线程或有多个,一个线程只能属于一个进程,线程依赖于进程存在

3.进程有独立的地址空间,线程有自己的堆栈和局部变量,多个线程可以共享同一地址空间。

4.进程的创建、切换、销毁的系统开销都远大于线程。创建或销毁进程时,系统要分配或回收相应的地址空间和io资源。切换时要保存整个cpu环境,还要配置新环境。而线程切换只保留少量寄存器内容。

5.线程间的通信方式很简单,因为它们共享了地址空间。但是要保证互斥、同步的操作保证数据的一致性。

6.一般一个进程挂掉并不会影响别的进程,但是一个线程挂掉,它所在的进程也会挂掉。

2、请你说说线程和协程的区别(了解)

 1. 线程是操作系统的资源,线程的创建、切换、停止等都非常消耗资源,而创建协程不需要调用操作系统的功能,编程语言自身就能完成,所以协程也被称为用户态线程,协程比线程轻量很多;

 2. 线程在多核环境下是能做到真正意义上的并行,而协程是为并发而产生的;

 3. 一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行;

 4. 线程进程都是同步机制,而协程则是异步;

 5. 线程是抢占式,而协程是非抢占式的,所以需要用户自己释放使用权来切换到其他协程,因此同一时间其实只有一个协程拥有运行权,相当于单线程的能力;

 6. 操作系统对于线程开辟数量限制在千的级别,而协程可以达到上万的级别。

3、请你说说线程的同步(通信)方式

因为多线程共享了同一片地址空间,所以线程间通信很简单,只需要将数据复制到共享(全局或堆)变量中即可。不过要考虑同步和互斥,保证数据的一致性。用到的技术有:

1.信号:Linux 中使用 pthread_kill() 函数对线程发信号

2.互斥锁、读写锁、自旋锁。

互斥锁mutex——保证同一时间只能有一个线程访问共享资源,当锁被占用时别的线程试图加锁都会进入阻塞状态(释放cpu资源使其从运行进入阻塞状态,当锁被释放时,调度哪个线程取决于内核的调度)。

读写锁rwlock——读共享,写互斥。写模式加锁时,其他不论读写试图加锁都阻塞。读加锁时,读进程不阻塞,写进程阻塞。

自旋锁spinlock——自旋锁上锁受阻时它不会阻塞,而是循环中轮询是否能获得锁,所以它不涉及线程切换所以没有切换开销,但是它霸占了cpu会浪费cpu资源。所以自旋锁适合并行结构(多处理器),或者锁被短时间持有又不希望有线程切换开销的情况。

3.条件变量:条件变量始终与互斥锁一起使用。条件变量以原子的方式阻塞进程直到达到某一特定条件,对条件的判断也是在互斥锁的保护下进行的。

4.信号量:信号量实际是一个非负的整数计算器,用于对公共资源的控制。公共资源增加信号量加1,减少减1。并且只有信号量的值大于0的时候才可访问。

p是对信号量的值进行原子减一,代表获取资源,当信号量的值为0时,p操作会阻塞,意味着资源不可用。

v操作是对信号量的值进行原子加一,代表释放资源,v操作从不阻塞。

4、请你说说互斥锁和自旋锁(参考3)

5、请你说说写时拷贝

fork :在进行 fork 复制进程时,并不马上进行父进程的地址空间的完全拷贝。而是使用了写时拷贝 (Copy-On-Write )技术,即就是让父进程和子进程共享父进程的页面,当父进程或子进程中任意一个 进程试图修改某个页面时,再将其拷贝一份给子进程。这样可以延迟页面拷贝,提高 fork 复制的效 率。另外,通常 Linux 中的新进程都是通过 fork+exec 实现的,如果 fork 后需要执行 exec 那么直接就不需要拷贝了。
这里有一个小细节: fork 之后内核会将子进程排在队列的前面,以让子进程先执行,以免父进程执行导 致写时复制,而后子进程执行 exec 系统调用,因无意义的复制而造成效率的下降。
vfork :除了子进程必须要立刻执行一次对 exec 的系统调用,或者调用 _exit( ) 退出,对 vfork( ) 的成功调 用所产生的结果和fork( ) 是一样的。 vfork( ) 会挂起父进程直到子进程终止或者运行了一个新的可执行文 件的映像。通过这样的方式,vfork( ) 避免了地址空间的按页复制。在这个过程中,父进程和子进程共享 相同的地址空间和页表项。实际上vfork( ) 只完成了一件事:复制内部的内核数据结构。因此,子进程也 就不能修改地址空间中的任何内存。

6、请你说说分段和分页

1、段主要为了内存独立/隔离,有利于共享;

2、页与物理内存映射,解决碎片问题,提升效率;

3、找到段,找到页表起始地址,找到页帧号,得到物理地址

7、请你介绍一下 I/O 多路复用

io复用使得一个程序能监听多个文件描述符,提高程序的性能。

Linux系统实现io复用的技术有select,poll,epoll

8、说一说 select 、poll、epoll

1. 用户态将文件描述符传入内核的方式
2.
select :创建 3 个文件描述符集并拷贝到内核中,分别监听读、写、异常动作。这里受到单个进程可以打开的fd 数量限制,默认是 1024 。
poll :将传入的 struct pollfd 结构体数组拷贝到内核中进行监听。
epoll :执行 epoll_create 会在内核的高速 cache 区中建立一颗红黑树以及就绪链表 ( 该链表存储已经就绪 的文件描述符) 。接着用户执行的 epoll_ctl 函数添加文件描述符会在红黑树上增加相应的结点。
内核态检测文件描述符读写状态的方式
select :采用轮询方式,遍历所有 fd ,最后返回一个描述符读写操作是否就绪的 mask 掩码,根据这个掩码给fd_set 赋值。 poll :同样采用轮询方式,查询每个 fd 的状态,如果就绪则在等待队列中加入一项并继续遍历。epoll :采用回调机制。在执行 epoll_ctl 的 add 操作时,不仅将文件描述符放到红黑树上,而且也注册了回调函数,内核在检测到某文件描述符可读/ 可写时会调用回调函数,该回调函数将文件描述符放在就绪链表中。
3. 找到就绪的文件描述符并传递给用户态的方式
select :将之前传入的 fd_set 拷贝传出到用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。
poll :将之前传入的 fd 数组拷贝传出用户态并返回就绪的文件描述符总数。用户态并不知道是哪些文件描述符处于就绪态,需要遍历来判断。
epoll : epoll_wait 只用观察就绪链表中有无数据即可,最后将链表的数据返回给数组并返回就绪的数量。内核将就绪的文件描述符放在传入的数组中,所以只用遍历依次处理即可。这里返回的文件描述符是通过mmap 让内核和用户空间共享同一块内存实现传递的,减少了不必要的拷贝。
4. 重复监听的处理方式
select :将新的监听文件描述符集合拷贝传入内核中,继续以上步骤。
poll :将新的 struct pollfd 结构体数组拷贝传入内核中,继续以上步骤。
epoll :无需重新构建红黑树,直接沿用已存在的即可。
epoll 更高效的原因
1. select 和 poll 的动作基本一致,只是 poll 采用链表来进行文件描述符的存储,而 select 采用 fd 标注位来存放,所以select 会受到最大连接数的限制,而 poll 不会。
2. select 、 poll 、 epoll 虽然都会返回就绪的文件描述符数量。但是 select 和 poll 并不会明确指出是哪些文件描述符就绪,而epoll 会。造成的区别就是,系统调用返回后,调用 select 和 poll 的程序需要遍历监听的整个文件描述符找到是谁处于就绪,而epoll 则直接处理即可。
3. select 、 poll 都需要将有关文件描述符的数据结构拷贝进内核,最后再拷贝出来。而 epoll 创建的有关文件描述符的数据结构本身就存于内核态中,系统调用返回时利用mmap() 文件映射内存加速与内核空间的消息传递:即epoll 使用 mmap 减少复制开销。
4. select 、 poll 采用轮询的方式来检查文件描述符是否处于就绪态,而 epoll 采用回调机制。造成的结果就是,随着fd 的增加, select 和 poll 的效率会线性降低,而 epoll 不会受到太大影响,除非活跃的socket很多。
5. epoll 的边缘触发模式效率高,系统不会充斥大量不关心的就绪文件描述符虽然 epoll 的性能最好,但是在连接数少并且连接都十分活跃的情况下,select 和 poll 的性能可能比 epoll 好,毕竟 epoll 的通知机制需要很多函数回调。

9、请你说一说虚拟内存与物理内存

1. 物理内存 以前,还没有虚拟内存概念的时候,程序寻址用的都是物理地址。程序能寻址的范围是有限的,这取决于 CPU 的地址线条数。比如在 32 位平台下,寻址的范围是 2^32 也就是 4G。并且这是固定的,如果没有虚拟内存,且每次开启一个进程都给 4G 物理内存,就可能会出现很多问题: - 因为物理内存是有限的,当有多个进程要执行的时候,都要给 4G 内存,很显然内存不够,这很快就分配完了,于是没有得到分配资源的进程就只能等待。当一个进程执行完了以后,再将等待的进程装入内存。这种频繁的装入内存的操作效率很低 - 由于指令都是直接访问物理内存的,那么任何进程都可以修改其他进程的数据,甚至会修改内核地址空间的数据,这是不安全的

2. 虚拟内存 由于物理内存有很多问题,所以出现了虚拟内存。虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

10、请你介绍一下死锁,产生的必要条件,产生的原因,怎么预防死锁

 死锁:两个或几个进程在运行时由于资源争夺处于互相等待的过程,如无外力干涉,它们都不会有改变。

产生的原因:系统资源不足、资源分配不合理、进程运行推进方式不合理

必要条件:

互斥条件——一个资源每次只能给一个进程使用

请求与保持条件——一个进程在请求资源时,对已获得的资源保持不变

不可剥夺条件——对于已获取资源的进程,不可强行剥夺其资源

循环等待条件——若干进程处于一种头尾相接的循环等待的过程

11、请你说说条件变量

条件变量是线程同步的一种方式,这种方式下有两种状态的线程:等待条件变量成立而挂起的线程和条件变量成立。为了避免竞争,所以条件变量总是和互斥锁一起使用。

条件变量可以以原子的方式阻塞线程,直到满足条件变量为真为止。

条件变量为假时线程阻塞并以原子方式释放等待条件变化的互斥锁。当另一个线程条件改变时,该线程可能会向相关原子变量发出信号,于是几个处于等待的线程将会唤醒,获取互斥锁,然后评估条件。

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

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

相关文章

C语言写的 mini版的 http 服务器 , 很详细

文章目录 效果展示整体架构流程技术细节完整代码 效果展示 例如:htpp://192.168.23.140/home.html -> 正确的请求格式 home.html 这个资源是放在我们服务器里面的 , 并不是随便访问的资源,当然我们可以放很多的资源进去. 整体架构流程 整个实现的流…

无心剑英译朱自清《匆匆》

匆匆 Vanished in Haste 朱自清 By Zhu Ziqing 燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢? Sw…

如何使用Docker进行容器的备份和恢复

一 简介: 在使用Docker进行应用程序的容器化部署时,我们经常需要对容器进行备份和恢复操作。备份容器可以保证数据的安全性,而恢复操作可以帮助我们快速恢复出现问题的容器。本文将介绍如何使用Docker进行容器的备份和恢复,同时提…

Buck电源设计常见的一些问题(二)MOS管炸机问题

MOS管炸机问题 1.概述2.MOS管的相关参数3.过电压失效4.过电流失效5.静电放电和热失效1.概述 在我们做电源产品或者电机控制器时候,经常会坏MOS管。我相信90%以上的硬件工程师在职场生涯中都会遇到这类问题。然而这类问题也总是让人防不胜防。经常我们都会开玩笑的说,没烧过管…

【JavaWeb】用注解代替配置文件

WebServlet("/query") public class QueryServlet extends HttpServlet {...}在Servlet类上写WebServlet("query"),就相当于在配置文件里写了↓ <servlet><servlet-name>query</servlet-name><servlet-class>QueryServlet</se…

Spring MVC与Spring Boot简单理解

假设你要制作一份披萨&#xff0c;那么可以将整个过程类比为开发一个Web应用程序。 Spring MVC比喻为制作披萨的过程&#xff1a; 摊饼皮&#xff1a;在制作披萨时&#xff0c;首先需要摊开饼皮作为基础。 准备配料&#xff1a;接下来&#xff0c;你会选择各种配料&#xff0…

【数据结构第 6 章 ④】- 用 C 语言实现图的深度优先搜索遍历和广度优先搜索遍历

目录 一、深度优先搜索 1.1 - 深度优先搜索遍历的过程 1.2 - 深度优先搜索遍历的算法实现 二、广度优先搜索 2.1 - 广度优先搜索遍历的过程 2.2 - 广度优先搜索遍历的算法实现 和树的遍历类似&#xff0c;图的遍历也是从图中某一顶点出发&#xff0c;按照某种方法对图中所…

壹基金瑞金东升社区儿童服务站上演“甜蜜冬日”亲子DIY蛋糕秀

12月9日上午&#xff0c;一场温情满溢的亲子DIY蛋糕活动&#xff0c;在壹基金瑞金东升社区儿童服务站拉开了帷幕&#xff0c;空气里有香甜的奶油味道&#xff0c;浓浓的温馨气息感染着在场的每一个人。 自己动手做的&#xff0c;才有意义&#xff0c;蛋糕DIY是一项很好的亲子活…

油封在机械系统中不可或缺的作用

油封是众多机械系统中的基本组件。但我们到底为什么要使用油封呢?本文旨在阐明油封所发挥的关键作用及其广泛使用背后的原因。 油封的主要作用&#xff1a; 油封的主要功能是充当屏障。它可以防止润滑油从机器和轴承内部的缝隙中泄漏&#xff0c;确保机械部件的平稳运行。同…

Mysql的聚簇索引(聚集索引)和非聚簇索引的区别

MySQL中的索引分为两种主要类型&#xff1a;聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-clustered Index&#xff09;。这两种索引的主要区别在于它们如何组织数据和索引的方式。 聚簇索引&#xff08;Clustered Index&#xff09; 聚簇索…

Linux GPIO 应用编程

Linux GPIO 应用编程 嵌入式Linux应用开发中&#xff0c;系统经常会通过GPIO接入按键、各种感应开关等传感器&#xff0c;或控制电源开关、继电器等设备。 要在Linux应用层控制GPIO有两种方式&#xff1a; 通过sysfs控制通过API控制 通过sysfs控制GPIO 为了用户空间运行的…

FineReport 高级教程:深入数据分析与报表设计

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

想做游戏开发,我应该会点啥?

在知乎上&#xff0c;经常能看到类似“如何入门游戏开发”这样的问题&#xff0c;这篇文章&#xff0c;我试着概括性的对游戏开发所需要的技能做一个总结&#xff0c;希望大家对游戏开发能有一个基本的认识~ 游戏开发基础要求高么&#xff1f; 和其他程序猿一样&#xff0c;要…

前后端交互—开发一个完整的服务器

代码下载 初始化 新建 apiServer 文件夹作为项目根目录&#xff0c;并在项目根目录中运行如下的命令&#xff0c;初始化包管理配置文件: npm init -y运行如下的命令&#xff0c;安装 express、cors: npm i express cors在项目根目录中新建 app.js 作为整个项目的入口文件&a…

12V升18V4A同步升压恒压WT3210

12V升18V4A同步升压恒压WT3210 WT3210 是一款高功率密度的全集成同步升压转换器&#xff0c;内部集成的功率MOSFET管导通电阻为上管8mΩ和下管15mΩ。可为便携式系统提供空间小尺寸 解决方案。WT3210具有 2.7V 至 20V 的宽输入电压范围&#xff0c;应用在单节或两节锂电池的便携…

Go语言运行时与自家平台对比后认识

引子 以前就了解Go语言&#xff0c;因为其天生为并发、并行而生&#xff0c;且在语言层面就进行了内秉设计。 总想对比于我们自研的分布式并发、并行平台&#xff0c;以利于得到一些新认识 &#xff1a;&#xff09; Go官网资料 在Go的官网资料提供了很好的资料和知识库 初…

关于嵌入式开发的一些信息汇总:嵌入式C开发人员、嵌入式系统Linux

关于嵌入式开发的一些信息汇总&#xff1a;嵌入式C开发人员、嵌入式系统Linux 1 关于嵌入式 C 开发人员1.1 嵌入式 C 开发人员必须具备的一些基本技能是&#xff1a;1.2 嵌入式C开发的应用案例 2 如何学习用于嵌入式系统的 Linux2.1 如何学习Linux2.1.1 第一步&#xff1a;创建…

漏刻有时百度地图API实战开发(12)(切片工具的使用、添加自定义图层TileLayer)

TileLayer向地图中添加自定义图层 var tileLayer new BMap.TileLayer();tileLayer.getTilesUrl function (tileCoord, zoom) {var x tileCoord.x;var y tileCoord.y;return images/tiles/ zoom /tile- x _ y .png;}var lockMap new BMap.MapType(lock_map, tileLaye…

【MySQL】MySQL 在 Centos 7环境安装教程

文章目录 1.卸载不要的环境2.检查系统安装包3.获取mysql官方yum源4.安装mysql yum 源&#xff0c;对比前后yum源5.安装mysql服务6.查看配置文件和数据存储位置7.启动服务和查看启动服务8.登录9.配置my.cnf 1.卸载不要的环境 先检查是否有mariadb存在 ps ajx |grep mariadb如果…

【StarRocks-1.简介】

一、简介: starRocks起源于开源软件Doris,其相对Doris的社区环境&#xff0c;starRcoks有商业团队维护、快速版本迭代和dockerHub高支持,让我在生产环境中更加偏向于starRocks&#xff0c;而不是拥抱Doris开源社区。StarRocks的版本更新速度、学习文档和论坛都让小白更加容易入…