【Linux】多线程相关问题
判断题
-
不论是系统支持线程还是用户级线程,其切换都需要内核的支持(F)
用户态线程的切换在用户态实现,不需要内核支持。 -
线程包含CPU现场,可以独立执行程序(F)
线程包含cpu现场,但是线程只是进程中的一个执行流,执行的是程序中的一个片段的代码,多个线程共同完成整体程序的运行。 -
线程和进程都可并发执行,线程的粒度小于进程,占用资源更少,因此通常多线程比多进程并发性更高(T)
-
ps命令用于查看进程信息,其中-L选项用于查看轻量级进程信息(T)
-
pthread_self() 用于获取轻量级进程ID(F)
pthread_self() 用于获取用户态线程的tid。 -
在有多个线程的情况下,主线程从main函数的return返回或者调用pthread_exit函数,则整个进程退出(F)
主线程调用pthread_exit只是退出主线程,并不会导致进程的退出。 -
在linux 中,进程比线程安全的原因是进程之间不会共享数据(F)
进程比线程安全的原因是每个进程有独立的虚拟地址空间,有自己独有的数据,具有独立性。不会数据共享这个太过宽泛与片面。 -
对于大量的计算优先使用多进程(F)
大量的计算使用多进程和多线程都可以实现并行/并发处理,多线程的资源消耗小于多进程,但稳定性较多进程有所不如,因此还要看具体更加细致的需求场景。 -
一个程序至少有一个进程,一个进程至少有一个线程(F)
程序是静态的,不涉及进程,进程是程序运行时的实体,是一次程序的运行。 -
线程自己不拥有系统资源(T)
进程是资源的分配单位,所以线程并不拥有系统资源,而是共享使用进程的资源,进程的资源由系统进行分配。 -
条件变量和信号量可用来实现线程间通知和唤醒(T)
线程间的通知和唤醒以及线程的等待,这些是线程间实现同步的基础,而信号量和条件变量通过提供使线程等待和唤醒的功能,而被用于实现线程间的同步。 -
在生产者与消费者模型中只需要一个条件变量就可以(F)
条件变量使用时,不同的角色需要等待在不同的条件变量等待队列中,防止角色被误唤醒。 -
银行家算法可以预防死锁(F)
银行家算法的思想在于将系统运行分为两种状态:安全/非安全(有可能出现风险的都属于非安全)。
银行家算法,在分配资源前进行风险判断,避免风险的发生。是避免出现死锁的一种算法(并非预防的方法)。主要是避免了出现“环路等待”的条件。 -
信号量允许多个线程同时使用共享资源(T)
信号量主要用于实现同步操作,只要信号量资源数大于0就表示可获取,可访问。
若要使用信号量模拟实现互斥,则需要初始化资源计数为1,表示资源只有一个,则只有一个执行流能访问。 -
如果只是在进程内部使用的话,使用临界区会带来速度上的优势并能够减少资源占用量(T)
临界区技术:实现串行化来访问共享资源的代码片段。速度比较快但是只能用于同一进程的线程间。
问答题
-
请简述什么是LWP?
LWP是轻量级进程,在Linux下进程是资源分配的基本单位,线程是cpu调度的基本单位,而线程使用进程pcb描述实现,并且同一个进程中的所有pcb共用同一个虚拟地址空间,因此相较于传统进程更加的轻量化。 -
请简述LWP与pthread_create创建的线程之间的关系?
pthread_create是一个库函数,功能是在用户态创建一个用户线程,而这个线程的运行调度是基于一个轻量级进程实现的。 -
简述轻量级进程ID与进程ID之间的区别?
因为Linux下的轻量级进程是一个pcb,每个轻量级进程都有一个自己的轻量级进程ID(pcb中的pid),而同一个程序中的轻量级进程组成线程组,拥有一个共同的线程组ID。 -
请简述什么是线程互斥,为什么需要互斥?
线程互斥指的是,在多个线程对临界资源进行争抢访问时有可能会造成数据二义,因此需要通过保证同一时间只有一个线程能够访问临界资源的方式,来实现线程对临界资源的访问安全性。 -
请简述什么是线程同步,为什么需要同步?
线程同步指的是线程间对数据资源进行获取,有可能在不满足访问资源条件的情况下就访问资源,而造成程序逻辑混乱。因此通过进行条件判断来决定线程在不满足条件时休眠等待或满足条件后唤醒的方式实现对资源访问的合理性。 -
请简述线程安全概念与实现?
线程安全指的是在多线程编程中,多个线程对临界资源进行争抢访问而不会造成数据二义或程序逻辑混乱的情况。
线程安全的实现,通过同步与互斥实现。 -
信号量与条件变量有什么区别?
条件变量:提供了一个pcb阻塞队列以及阻塞和唤醒线程的接口用于实现同步,但是什么时候该唤醒以及什么时候该阻塞线程由程序员进行控制,而这个控制通常需要一个共享资源的条件判断完成,因此条件变量还需要搭配互斥锁使用,来保护这个共享资源的条件判断及操作。
信号量:提供一个pcb等待队列,以及一个实现了原子操作的对资源进行计数的计数器,通过自身计数器实现同步的条件判断,因此不需要搭配互斥锁使用,而且信号量在初始化计数为1的情况下也可以模拟实现互斥操作。 -
请简述线程池的作用与实现原理?
线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其中的线程空闲后进行处理。
线程池可以避免大量线程频繁创建或销毁所带来的时间成本,也可以避免在峰值压力下,系统资源耗尽的风险;并且可以统一对线程池中的线程进行管理,调度,监控。 -
如何理解原语的原子性,在单机环境下如何实现原语的原子性,实现时应注意哪些问题?
所谓原语的原子性操作是指一个操作中的所有动作,要么成功完成,要么全不做。也就是说,原语操作是一个不可分割的整体。为了保证原语操作的正确性,必须保证原语具有原子性。在单机环境下,操作的原子性一般是通过关闭中断来实现的。由于中断是计算机与外设通信的重要手段,关闭中断会对系统产生很大的影响,所以在实现时一定要避免原语操作花费时间过长,绝对不允许原语中出现死循环。
程序题
完成两个线程通过条件变量实现交替打印的控制
要求:线程A打印-我是线程A;线程B打印-我是线程B; 最终实现交替打印,不能出现连续的相同打印。
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>// 互斥锁
pthread_mutex_t g_lock;// 同步
pthread_cond_t thread_a_cond;
pthread_cond_t thread_b_cond;int g_is_my_turn = 0;void *thread_a_start(void *arg)
{(void)arg;while (1){pthread_mutex_lock(&g_lock);while (g_is_my_turn == 1){pthread_cond_wait(&thread_a_cond, &g_lock);}printf("线程A打印-我是线程A\n");g_is_my_turn++;pthread_mutex_unlock(&g_lock);pthread_cond_signal(&thread_b_cond);}
}void *thread_b_start(void *arg)
{(void)arg;while (1){sleep(1);pthread_mutex_lock(&g_lock);while (g_is_my_turn == 0){pthread_cond_wait(&thread_b_cond, &g_lock);}printf("线程B打印-我是线程B\n");g_is_my_turn--;pthread_mutex_unlock(&g_lock);pthread_cond_signal(&thread_a_cond);}
}int main()
{pthread_mutex_init(&g_lock, nullptr);pthread_cond_init(&thread_a_cond, nullptr);pthread_cond_init(&thread_b_cond, nullptr);pthread_t thread_a, thread_b;int ret = pthread_create(&thread_a, nullptr, thread_a_start, nullptr);if (ret < 0){perror("pthread_create");return 0;}ret = pthread_create(&thread_b, nullptr, thread_b_start, nullptr);if (ret < 0){perror("pthread_create");return 0;}pthread_join(thread_a, nullptr);pthread_join(thread_b, nullptr);pthread_mutex_destroy(&g_lock);pthread_cond_destroy(&thread_a_cond);pthread_cond_destroy(&thread_b_cond);return 0;
}
相关文章:
【Linux】多线程相关问题
判断题 不论是系统支持线程还是用户级线程,其切换都需要内核的支持(F) 用户态线程的切换在用户态实现,不需要内核支持。 线程包含CPU现场,可以独立执行程序(F) 线程包含cpu现场,但是…...
GPS北斗卫星时空信号安全防护装置(授时)介绍
GPS北斗卫星时空信号安全防护装置(授时)介绍 GPS北斗卫星时空信号安全防护装置(授时)介绍 当前,我国电力系统普遍采用北斗卫星或者GPS卫星授时来实现时间同步,但不加防护的授时装置存在卫星信号被干扰或欺…...
redis:一、面试题常见分类+缓存穿透的定义、解决方案、布隆过滤器的原理和误判现象、面试回答模板
redis面试题常见分类 缓存穿透 定义 缓存穿透是一种现象,引发这种现象的原因大概率是遭到了恶意攻击。具体就是查询一个一定不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致这个数据的每次请求都需要查DB,数据库压力…...
智慧公交:提高城市出行效率的数字化之路
随着城市化进程的不断加速,公共交通成为人们日常出行的主要方式之一。为了提高公共交通的效率和服务质量,智慧公交应运而生。智慧公交是一种基于物联网、大数据、人工智能等技术,对公共交通进行数字化、智能化改造的新型公共交通系统。 以此为…...
Linux - 内存 - memblock 分配器
说明 memblock是Linux内核启动早期用于管理物理内存的机制,在伙伴系统(Buddy System)接管内存管理之前为系统提供物理内存分配、释放等功能。相对于伙伴系统,memblock功能和实现较为简单。本文基于:linux_5.10 arm64平…...
SQL、Jdbc、JdbcTemplate、Mybatics
数据库:查询(show、select)、创建(create)、使用(use)、删除(drop)数据库 表:创建(【字段】约束、数据类型)、查询、修改(alter *add)、删除 DML:增加(inse…...
四六级高频词组8
目录 词组 其他链接 词组 301. in fashion(stylish, most modern)时兴,流行 302. after the fashion (of) 依照… 303. find fault with(complain about;criticize)找…...
fastapi-amis-admin快速创建一个后台管理系统增加音乐管理功能(3)
感觉为了实现maui的效果。准备了一个后端及restful项目 ,如同想吃鱼就健个鲁塘一下,但还是写一下吧。 fastapi_amis_admin 是一个功能强大的框架,旨在帮助开发者在使用 FastAPI 进行 web 开发时,能够快速创建一个高效且易于管理的…...
全球化需要先搬离中国?中国公司出海不应失去“模式自信”
中国企业出海近期热闹非凡,其中以短剧为代表的文化内容产业和跨境电商产业都吸引了大量关注。例如亚马逊在12月12日公布一组最新数据,亚马逊过去一年销售额超过1000万美金的中国卖家数量,同比增长接近30%。中国跨境电商平台在刚刚过去的“黑五…...
三大维度解码剑南春“高质量发展”丨年度盘点
执笔 | 洪大大 编辑 | 扬 灵 2023年即将画上句点,当我们回首这一年为行业带来惊喜的品牌,剑南春是其中之一。 回顾剑南春今年一整年的动作,从新品频发到双节(618、双11)热销,从全国巡展到荣誉满载&…...
外包干了3个月,技术退步明显.......
先说一下自己的情况,大专生,18年通过校招进入武汉某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…...
思福迪运维安全管理系统 test_qrcode_b RCE漏洞复现
0x01 产品简介 思福迪运维安全管理系统是思福迪开发的一款运维安全管理堡垒机。 0x02 漏洞概述 由于思福迪运维安全管理系统 test_qrcode_b路由存在命令执行漏洞,攻击者可通过该漏洞在服务器端任意执行代码,写入后门,获取服务器权限&#…...
Salesforce×阿里云,影响几何?
实际上,从这个视角来看,Salesforce和阿里云的合作也恰在成为着这个市场的一个新催化剂。“期待Salesforce能给中国市场带来一些新的增量,包括对合作伙伴的态度,对产品的态度等等。”一位CRM相关人士告诉我们。 那么,阿…...
Qt对excel操作
Qt库中自带对excel操作的模块QAxObject,QAxObject是Qt提供给程序员从代码中访问Office的对象类,其本质上是一个面向微软操作系统的COM接口。 QAxObject将所有Office的工作簿、表格、文档等都作为其子对象,程序员通过调用querySubObject()这个…...
每日一练 | 华为认证真题练习Day148
1、关于RSTP协议提供的保护功能说法正确的有?(多选) A. Root保护功能只能在指定端口上配置生效 B. 环路保护功能只能在根端口或Alternate端口上配置生效 C. 启用防TC— BPDU报文攻击功能后,可以避免频繁的删除HAC地址表项 D. 交换设备上…...
ES6学习(二):解构赋值
前言 解构赋值是ES6中新提出的语法,简单并且实用,数组和对象都可以使用 数组解构赋值 规则 1.其实是按照顺序一一匹配的,就像排队领取物资一样,你领到什么就是什么,没有挑的份,你排的晚了什么都没领到,那就是undifined。 2.如果给分配的是一个数组,那可以在命名时外部嵌套…...
kubebuilder开发operator
安装kubebuilder前 需要有kubernetes环境和golang环境 官网:https://go.kubebuilder.io/ 安装kubebuilder #下载 wget https://go.kubebuilder.io/dl/latest/$(go env GOOS)/$(go env GOARCH) #改名kubebuilder后加权限 chmod x kubebuilder #放到环境变量里 mv k…...
docker中启动ES报错:AccessDeniedException: /usr/share/elasticsearch/data/nodes
一、K8S部署的elasticsearch 6.8版本 数据持久化到本地磁盘 今天做elasticsearch数据迁移,直接 SCP拷贝至另外一台服务器 原服务器处理好后拷贝回来,然后启动elasticsearch报错 {"type": "server", "timestamp": "2…...
java集成Nacos服务
1,添加依赖:首先,在你的 Java 项目中,你需要添加 Nacos 客户端 SDK 的依赖 <dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</ve…...
开源IPad Pro应用IDE:使用SSH远程连接服务器进行云端编程开发
🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
