九、2023.10.3.Linux(end).9

文章目录

  • 33、简述mmap的原理和使用场景?
  • 34、互斥量能不能在进程中使用?
  • 35、协程是轻量级线程,轻量级表现在哪里?
  • 36、说说常见信号有哪些,表示什么含义?
  • 37、说说线程间通信的方式有哪些?
  • 38、说说线程间同步的方式有哪些?
  • 39、说说什么是死锁,产生的条件,如何解决?
  • 40、有了进程,为什么还要有线程?
  • 41、单核机器上写多线程程序,是否要考虑加锁,为什么?
  • 42、说说多线程和多进程的不同?
  • 43、简述互斥锁的机制,互斥锁与读写的区别?
  • 44、说说什么是信号量,有什么作用?
  • 45、进程、线程的中断切换的过程是怎样的?

33、简述mmap的原理和使用场景?

原理:mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read, write等系统调用函数
相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。如下图:
在这里插入图片描述
使用场景:

  1. 对同一块区域频繁读写操作;
  2. 可用于实现用户空间和内核空间的高效交互
  3. 可提供进程间共享内存及相互通信
  4. 可实现高效的大规模数据传输

34、互斥量能不能在进程中使用?

能。
不同的进程之间,存在资源竞争或并发使用的问题,所以需要互斥量。
进程中也需要互斥量,因为一个进程中可以包含多个线程,线程与线程之间需要通过互斥的手段进行同步,避免导致共享数据修改引起冲突。可以使用互斥锁,属于互斥量的一种。

35、协程是轻量级线程,轻量级表现在哪里?

  1. 协程调用跟切换比线程效率高:协程执行效率极高。协程不需要多线程的锁机制,可以不加锁的访问全局变量,所以上下文的切换非常快。
  2. 协程占用内存少:执行协程只需要极少的栈内存(大概是4~5KB),而默认情况下,线程栈的大小为1MB。
  3. 切换开销更少:协程直接操作栈基本没有内核切换的开销,所以切换开销比线程少

36、说说常见信号有哪些,表示什么含义?

编号为1 ~ 31的信号为传统UNIX支持的信号,是不可靠信号(非实时的)。不可靠信号和可靠信号的区别于前者不支持排队,可能会造成信号丢失,而后者不会。编号为1 ~ 31的信号如下:
在这里插入图片描述
在这里插入图片描述
而常见信号如下:
在这里插入图片描述

37、说说线程间通信的方式有哪些?

线程间的通信方式包括临界区、互斥量、信号量、条件变量、读写锁!

  1. 临界区:每个线程中访问临界资源的那段代码称为临界区(Critical Section)(临界资源是一次仅允许一个线程使用的共享资源)。每次只准许一个线程进入临界区,进入后不允许其他线程进入。不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问。
  2. 互斥量:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  3. 信号量:计数器,允许多个线程同时访问同一个资源。
  4. 条件变量:通过条件变量通知操作的方式来保持多线程同步。
  5. 读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许一次多个线程读,这样效率就比互斥锁要高。

38、说说线程间同步的方式有哪些?

线程间的同步方式包括互斥锁、信号量、条件变量、读写锁:

  1. 互斥锁:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。
  2. 信号量:计数器,允许多个线程同时访问同一个资源。
  3. 条件变量:通过条件变量通知操作的方式来保持多线程同步。
  4. 读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许一次多个线程读,这样效率就比互斥锁要高。

39、说说什么是死锁,产生的条件,如何解决?

  1. 死锁: 是指多个进程在执行过程中,因争夺资源而造成了互相等待。此时系统产生了死锁。比如两只羊过独木桥,若两只羊互不相让,争着过桥,就产生死锁。
  2. 产生的条件:死锁发生有四个必要条件:
    (1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到
    进程使用完成后释放该资源;
    (2)请求保持条件:进程获得一定资源后,又对其他资源发出请求,但该资源被其他进程占有,
    此时请求阻塞,而且该进程不会释放自己已经占有的资源;
    (3)不可剥夺条件:进程已获得的资源,只能自己释放,不可剥夺;
    (4)环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
  3. 如何解决:
    (1)资源一次性分配,从而解决请求保持的问题
    (2)可剥夺资源:当进程新的资源未得到满足时,释放已有的资源;
    (3)资源有序分配:资源按序号递增,进程请求按递增请求,释放则相反。

举个例子:
举个例子,比如:如果此时有两个线程T1和T2,它们分别占有R1和R2资源
此时,T1请求R2资源的同时,T2请求R1资源。
这个时候T2说:你把R1给我,我就给你R2
T1说:不行,你要先给我R2,我才能给你R1
那么就这样,死锁产生了。如下图:
在这里插入图片描述

40、有了进程,为什么还要有线程?

  1. 原因
    进程在早期的多任务操作系统中是基本的执行单元。每次进程切换,都要先保存进程资源然后再恢复,这称为上下文切换。但是进程频繁切换将引起额外开销,从而严重影响系统的性能。为了减少进程切换的开销,人们把两个任务放到一个进程中,每个任务用一个更小粒度的执行单元来实现并发执行,这就是线程。
  2. 线程与进程对比
    (1)进程间的信息难以共享。由于除去只读代码段外,父子进程并未共享内存,因此必须采用一些进程间通信方式,在进程间进行信息交换。但多个线程共享进程的内存,如代码段、数据段、扩展段,线程间进行信息交换十分方便
    (2)调用 fork() 来创建进程的代价相对较高,即便利用写时复制技术,仍然需要复制诸如内存页表和文件描述符表之类的多种进程属性,这意味着 fork() 调用在时间上的开销依然不菲。但创建线程比创建进程通常要快 10 倍甚至更多。线程间是共享虚拟地址空间的,无需采用写时复制来复制内存,也无需复制页表。

41、单核机器上写多线程程序,是否要考虑加锁,为什么?

在单核机器上写多线程程序,仍然需要线程锁。
原因:因为线程锁通常用来实现线程的同步和通信。在单核机器上的多线程程序,仍然存在线程同步的问题。因为在抢占式操作系统中,通常为每个线程分配一个时间片,当某个线程时间片耗尽时,操作系统会将其挂起,然后运行另一个线程。如果这两个线程共享某些数据,不使用线程锁的前提下,可能会导致共享数据修改引起冲突

42、说说多线程和多进程的不同?

(1)一个线程从属于一个进程;一个进程可以包含多个线程。
(2)一个线程挂掉,对应的进程挂掉,多线程也挂掉;一个进程挂掉,不会影响其他进程,多进程稳定。
(3)进程系统开销显著大于线程开销;线程需要的系统资源更少。
(4)多个进程在执行时拥有各自独立的内存单元,多个线程共享进程的内存,如代码段、数据段、扩展段;但每个线程拥有自己的栈段和寄存器组。
(5)多进程切换时需要刷新TLB并获取新的地址空间,然后切换硬件上下文和内核栈;多线程切换时只需要切换硬件上下文和内核栈。
(6)通信方式不一样。
(7)多进程适应于多核、多机分布;多线程适用于多核

43、简述互斥锁的机制,互斥锁与读写的区别?

  1. 互斥锁机制:mutex,用于保证在任何时刻,都只能有一个线程访问该对象。当获取锁操作失败
    时,线程会进入睡眠,等待锁释放时被唤醒。
  2. 互斥锁和读写锁:
    (1)读写锁区分读者和写者,而互斥锁不区分
    (2)互斥锁同一时间只允许一个线程访问该对象,无论读写;读写锁同一时间内只允许一个写
    者,但是允许多个读者同时读对象。
    互斥锁其实就是一个bool型变量,为true时表示锁可获取,为false时表示已上锁。这里说的是互斥锁,其实是泛指linux中所有的锁机制。我们采用互斥锁保护临界区,从而防止竞争条件。也就是说,一个线程在进入临界区时应得到锁;它在退出临界区时释放锁。函数 acquire() 获取锁,而函数 release() 释放锁,如图 :
    在这里插入图片描述
    每个互斥锁有一个布尔变量 available,它的值表示锁是否可用。如果锁是可用的,那么调用 acquire()会成功,并且锁不再可用。当一个线程试图获取不可用的锁时,它会阻塞,直到锁被释放。

44、说说什么是信号量,有什么作用?

  1. 概念:信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资源),使得资源在一个时刻只有一个进程独享。
  2. 原理:由于信号量只能进行两种操作等待和发送信号,即P(sv)和V(sv),具体的行为如下:
    (1)P(sv)操作:如果sv的值大于零,就给它减1;如果它的值为零,就挂起该进程的执行(信号量的值为正,进程获得该资源的使用权,进程将信号量减1,表示它使用了一个资源单位)。
    (2)V(sv)操作:如果有其他进程因等待sv而被挂起,就让它恢复运行,如果没有进程因等待sv而挂起,就给它加1(若此时信号量的值为0,则进程进入挂起状态,直到信号量的值大于0,若进程被唤醒则返回至第一步)。
  3. 作用:用于多进程对共享数据对象的读取,它主要是用来保护共享资源(信号量也属于临界资
    源),使得资源在一个时刻只有一个进程独享。

45、进程、线程的中断切换的过程是怎样的?

上下文切换指的是内核(操作系统的核心)在CPU上对进程或者线程进行切换。

  1. 进程上下文切换
    (1)保护被中断进程的处理器现场信息
    (2)修改被中断进程的进程控制块有关信息,如进程状态等
    (3)把被中断进程的进程控制块加入有关队列
    (4)选择下一个占有处理器运行的进程
    (5)根据被选中进程设置操作系统用到的地址转换和存储保护信息
    切换页目录以使用新的地址空间
    切换内核栈和硬件上下文(包括分配的内存,数据段,堆栈段等)
    (6)根据被选中进程恢复处理器现场
  2. 线程上下文切换
    (1)保护被中断线程的处理器现场信息
    (2)修改被中断线程的线程控制块有关信息,如线程状态等
    (3)把被中断线程的线程控制块加入有关队列
    (4)选择下一个占有处理器运行的线程
    (5)根据被选中线程设置操作系统用到的存储保护信息
    切换内核栈和硬件上下文(切换堆栈,以及各寄存器)
    (6)根据被选中线程恢复处理器现场

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

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

相关文章

关于使用 uniapp Vue3 开发分享页面 语法糖 setup 开发获取ref踩坑

上代码 前端代码 <!-- 分享弹出 --> <uni-popup ref"share" type"share" safeArea backgroundColor"#fff"><uni-popup-share></uni-popup-share> </uni-popup>处理函数 import {onNavigationBarButtonTap} from…

点击router-link时候会发生什么?

当你点击链接或按钮时&#xff0c;将会导航到 User 组件&#xff0c;就会显示相应的用户 ID。 这里说一下执行流程&#xff0c;当点击一个 router-link 时&#xff0c;Vue Router会执行以下流程&#xff1a; 1&#xff09;点击事件触发: 当你点击 router-link 组件时&#xf…

【Java 进阶篇】JDBC查询操作详解

在数据库编程中&#xff0c;查询是一项非常常见且重要的操作。JDBC&#xff08;Java Database Connectivity&#xff09;提供了丰富的API来执行各种类型的查询操作。本篇博客将详细介绍如何使用JDBC进行查询操作&#xff0c;包括连接数据库、创建查询语句、执行查询、处理结果集…

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django&#xff0c;只要很少的代码&#xff0c;Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容&#xff0c;并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

AttributeError: module ‘dgl‘ has no attribute ‘batch_hetero‘

DGLWarning: From v0.5, DGLHeteroGraph is merged into DGLGraph. You can safely replace dgl.batch_hetero with dgl.batch

MySQL索引:结构、语法、分类和优化

MySQL索引是数据库中非常关键的性能优化手段。它们提供了快速访问数据的方法&#xff0c;同时也可以极大地提高查询效率。本文将深入介绍MySQL索引的结构、语法、分类&#xff0c;以及如何使用Profile和EXPLAIN来优化查询性能&#xff0c;带有详细的实例演示。 索引结构 MySQ…

【Pytorch笔记】4.梯度计算

深度之眼官方账号 - 01-04-mp4-计算图与动态图机制 前置知识&#xff1a;计算图 可以参考我的笔记&#xff1a; 【学习笔记】计算机视觉与深度学习(2.全连接神经网络) 计算图 以这棵计算图为例。这个计算图中&#xff0c;叶子节点为x和w。 import torchw torch.tensor([1.]…

SpringMVC的@InitBinder的作用

一、前言 在SpringMVC中&#xff0c;InitBinder注解用于自定义数据绑定的方法。在使用表单提交数据时&#xff0c;SpringMVC会将请求参数绑定到Java对象中。但是&#xff0c;有些时候请求参数的数据格式可能与Java对象的属性格式不一致&#xff0c;这时就需要使用InitBinder注…

JavaScript内置对象 - Array数组(四)- 序列生成器

序列生成器是生成一个指定起始值和结束值的序列&#xff0c;并且根据指定间隔长度&#xff0c;生成序列数组。 完成此功能需要使用到Array内置对象的from()对象&#xff0c;以及类数组相关知识&#xff0c;前面几篇有相关案例进行演示。 地址一&#xff1a;JavaScript内置对象…

基于.Net Core实现自定义皮肤WidForm窗口

前言 今天一起来实现基于.Net Core、Windows Form实现自定义窗口皮肤&#xff0c;并实现窗口移动功能。 素材 准备素材&#xff1a;边框、标题栏、关闭按钮图标。 窗体设计 1、创建Window窗体项目 2、窗体设计 拖拉4个Panel控件&#xff0c;分别用于&#xff1a;标题栏、关…

【Redis】基础数据结构-字典

Redis 字典 基本语法 字典是Redis中的一种数据结构&#xff0c;底层使用哈希表实现&#xff0c;一个哈希表中可以存储多个键值对&#xff0c;它的语法如下&#xff0c;其中KEY为键&#xff0c;field和value为值&#xff08;也是一个键值对&#xff09;&#xff1a; HSET key…

基于SSM农产品商城系统

基于SSM农产品商城系统的设计与实现&#xff0c;前后端分离&#xff0c;文档 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 农产品列表 产品详情 个人中心 登陆界面 管…

以太网基础学习(二)——ARP协议

一、什么是MAC地址 MAC地址&#xff08;英语&#xff1a;Media Access Control Address&#xff09;&#xff0c;直译为媒体访问控制位址&#xff0c;也称为局域网地址&#xff08;LAN Address&#xff09;&#xff0c;MAC位址&#xff0c;以太网地址&#xff08;Ethernet Addr…

【算法训练-字符串 三】字符串相加

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【字符串相加】&#xff0c;使用【字符串】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

电脑突然提示mfc140u.dll丢失,缺失mfc140u.dll无法运行程序的解决方法

在当今信息化社会&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。然而&#xff0c;随着技术的不断发展&#xff0c;电脑也会出现各种问题。其中&#xff0c;最常见的问题之一就是“mfc140u.dll丢失”。那么&#xff0c;当我们遇到这个问题时&#xff0c;应该如何解…

ISP图像信号处理——白平衡校正和标定介绍以及C++实现

从数码相机直接输出的未经过处理过的RAW图到平常看到的JEPG图有一系列复杂的图像信号处理过程&#xff0c;称作ISP&#xff08;Image Signal Processing&#xff09;。这个过程会经过图像处理和压缩。 参考文章1&#xff1a;http://t.csdn.cn/LvHH5 参考文章2&#xff1a;htt…

WebSocket实战之四WSS配置

一、前言 上一篇文章WebSocket实战之三遇上PAC &#xff0c;碰到的问题只能上安全的WebSocket&#xff08;WSS&#xff09;才能解决&#xff0c;配置证书还是挺麻烦的&#xff0c;主要是每年都需要重新更新证书&#xff0c;我配置过的证书最长有效期也只有两年&#xff0c;搞不…

【数据结构】排序(2)—冒泡排序 快速排序

目录 一. 冒泡排序 基本思想 代码实现 时间和空间复杂度 稳定性 二. 快速排序 基本思想 代码实现 hoare法 挖坑法 前后指针法 时间和空间复杂度 稳定性 一. 冒泡排序 基本思想 冒泡排序是一种交换排序。两两比较数组元素&#xff0c;如果是逆序(即排列顺序与排序后…

定时任务管理平台青龙 QingLong

一、关于 QingLong 1.1 QingLong 介绍 青龙面板是支持 Python3、JavaScript、Shell、Typescript 多语言的定时任务管理平台&#xff0c;支持在线管理脚本和日志等。其功能丰富&#xff0c;能够满足大部分需求场景&#xff0c;值得一试。 主要功能 支持多种脚本语言&#xf…

explicit关键字

目录 修饰构造函数 修饰转换运算符 主要用于修饰构造函数或者转换运算符&#xff0c;为了增强类型安全性和防止意外的类型转换&#xff0c;防止他们被编译器隐式地用于类型转换。 修饰构造函数 class MyString { public:MyString(const char* str) { /*...*/ }// ... };voi…