操作系统面试高频(线程)

线程

1 线程的定义⭐⭐⭐⭐⭐

在操作系统中,线程(Thread)是进程内的一个独立执行单元,也是 CPU 调度的最小单位。以下是线程的定义和简介:

1. 线程的定义

  • 轻量级执行单元:线程是进程的一部分,共享进程的内存空间、文件描述符等资源,但拥有独立的执行上下文(如程序计数器、寄存器、栈空间)。
  • 并发执行:同一进程中的多个线程可并发执行,充分利用多核 CPU 或提高 I/O 密集型任务的效率。

2. 线程的特点

  • 共享资源:同一进程内的线程共享内存、全局变量、文件句柄等,通信成本低。
  • 独立执行:每个线程有自己的栈、程序计数器和寄存器状态,可独立调度。
  • 轻量级:创建线程的开销远小于进程(无需复制内存空间),上下文切换更快。

3. 线程的应用场景

  • I/O 密集型任务:如 Web 服务器处理多个客户端连接、网络爬虫下载任务。
  • 任务协作频繁:如 GUI 程序中,主线程处理界面更新,子线程处理耗时操作(如文件加载)。
  • 并行计算:利用多核 CPU 加速计算任务(如矩阵运算、数据分析)。

4. 线程与进程的对比

维度

进程

线程

资源分配

独立的内存空间、文件描述符等

共享进程的资源

调度单位

由内核调度

内核调度的最小单位

创建开销

高(需复制内存)

低(仅复制执行上下文)

通信方式

需进程间通信(IPC)

直接共享内存

容错性

故障不影响其他进程

一个线程崩溃可能导致进程终止

5. 线程的同步机制

由于共享资源,多线程需通过同步机制避免数据竞争:

  • 互斥锁(Mutex):保证同一时间只有一个线程访问共享资源。
  • 信号量(Semaphore):控制同时访问资源的线程数量。
  • 条件变量(Condition Variable):协调线程间的执行顺序。

总结

线程适用于任务协作频繁需要高效并发的场景。通过共享资源,线程降低了通信成本,但需注意同步问题。与进程相比,线程更轻量,但隔离性较弱。

2 线程的实现⭐⭐⭐⭐⭐

线程的实现通常由操作系统提供支持,主要通过线程库来实现。操作系统提供了一些系统调用来创建、启动和管理线程,而线程库则提供了一些封装和抽象,使得程序员可以更方便地使用线程

线程库通常提供了一些函数接口,例如 pthread 库(POSIX 线程库)提供了一些创建、退出、调度、同步以及线程属性管理等函数

  • pthread_create: 创建线程
  • pthread_exit: 结束线程
  • pthread_join: 等待线程结束
  • pthread_mutex_lock/pthread_mutex_unlock: 互斥锁加锁/解锁操作
  • pthread_cond_wait/pthread_cond_signal: 等待条件变量/发送信号到条件变量

线程库的实现通常通过操作系统提供的原语,封装了一些有用的线程控制和同步功能,可以实现多线程执行和线程间的通信。通过线程库,程序员可以更加方便地使用线程,而不需要直接与操作系统底层的线程调度机制打交道。

3 什么时候用线程?⭐⭐⭐⭐⭐

在编程中,线程适用于需要并发执行任务且共享资源的场景。以下是使用线程的常见情况及简介:

适用场景

  1. 并发处理多任务当程序需要同时执行多个任务(如同时处理用户请求、数据下载、界面刷新),且任务间需要共享内存或其他资源时,线程能有效提高效率。例如:Web 服务器处理多个客户端请求、实时聊天软件的消息接收与发送。
  2. 提高资源利用率线程轻量级,上下文切换开销远小于进程。在 I/O 密集型任务(如文件读写、网络请求)中,线程能避免阻塞主线程,充分利用等待时间。例如:下载文件时,主线程可继续响应用户操作。
  3. 模块化分工将复杂任务拆分为独立子任务,通过线程分工协作。例如:视频播放软件中,解码、渲染、音频输出可分别由不同线程处理。
  4. 并行计算多核 CPU 环境下,多线程可并行执行计算任务(需注意线程安全)。例如:科学计算中的矩阵运算。

线程 vs 进程

场景

推荐选择

原因

需要共享内存或资源

线程

线程共享进程内存,通信成本低

需要任务隔离(如容错)

进程

进程间内存独立,一个崩溃不影响其他进程

CPU 密集型任务

线程

避免频繁进程切换,但受限于 CPU 核心数

I/O 密集型任务

线程

利用等待时间,提升整体效率

总结

线程适合轻量级并发、资源共享的场景,而进程适合任务隔离、高可靠性的场景。实际开发中需根据任务类型、资源需求和系统特性综合选择。

4 一个线程占多大内存?⭐⭐⭐⭐⭐

一个线程在Linux系统中大约占用8MB的内存。这是因为Linux系统中的线程栈是通过缺页异常来进行内存分配的,不是所有的栈空间都会被实际分配内存。因此,8MB只是一个上限,实际的内存消耗会略微超过实际需要的内存。这个差额主要是由于内部损耗(每个线程内部的一些开销)所引起的,通常在4KB范围内.

5 进程、线程、协程是什么,区别是什么?⭐⭐⭐⭐⭐

进程、线程和协程都是并发编程中常用的概念,它们各自有自己的特点和用途,下面是它们的简单介绍和区别:

进程(Process)

  • 进程是操作系统中分配资源和调度的基本单位,它是正在运行的一个程序。每个进程拥有自己的地址空间、代码段、堆栈、数据段、进程控制块(PCB)等资源,进程之间内存独立,相互独立运行,进程间通信需要通过进程间通信(IPC)实现。

线程(Thread)

  • 线程是进程的执行单元,是比进程更轻量级的调度单位。一个进程可以包含多个线程,同一进程内的多个线程共享进程的地址空间和资源,但每个线程有自己的堆栈、程序计数器、局部变量等值。线程之间通过共享的变量或信息进行通信或同步。

协程(Coroutine

  • 协程是一种用户级的轻量级线程,也称为微线程。协程可以在同一个线程中,通过协作式任务切换实现多任务并发。一个协程可以暂停执行,保存其当前状态,稍后重新恢复执行,协程之间通过yield和resume等语义来协作执行,可以更加细粒度的控制程序执行顺序。

区别:

1 进程拥有独立的地址空间和全局变量等资源,线程和协程则可以共享资源;

2 进程是操作系统中资源分配的基本单位,线程是调度的基本单位,协程可以在用户态中实现调度;

3 进程之间通信需要通过进程间通信(IPC),线程之间通信可以通过共享变量或信息实现,协程之间通信也是共享变量或信息;

4 线程和协程通常比进程轻量级,创建和上下文切换的开销较小,因此在处理大量并发任务时,相较于进程更加高效。协程比线程更加轻量与灵活,可以避免锁竞争、上下文切换等开销。

6 协程是轻量级线程,轻量级表现在哪里?⭐⭐⭐⭐

协程调用跟切换比线程效率高:协程执行效率极高。协程不需要多线程的锁机制,可以不加锁的访问全局变量,所以上下文的切换非常快。

协程占用内存少:执行协程只需要极少的栈内存(大概是4~5KB),而默认情况下,线程栈的大小为1MB

切换开销更少:协程直接操作栈基本没有内核切换的开销,所以切换开销比线程少

7 线程间通信的方式有哪些?⭐⭐⭐⭐⭐

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

互斥量:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。

信号量:计数器,允许多个线程同时访问同一个资源。

条件变量:通过条件变量通知操作的方式来保持多线程同步。

读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许一次多个线程读,这样效率就比互斥锁要高。

8 线程同步方式有哪些?⭐⭐⭐⭐⭐

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

互斥锁:采用互斥对象机制,只有拥有互斥对象的线程才可以访问。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。

信号量:计数器,允许多个线程同时访问同一个资源。

条件变量:通过条件变量通知操作的方式来保持多线程同步。

读写锁:读写锁与互斥量类似。但互斥量要么是锁住状态,要么就是不加锁状态。读写锁一次只允许一个线程写,但允许一次多个线程读,这样效率就比互斥锁要高。

9 多线程的优缺点⭐⭐⭐⭐⭐

多线程的优点:

  • 轻量级:线程之间共享同一进程的内存空间和资源,创建和切换线程的开销较小。
  • 资源共享:线程直接访问进程的共享资源,数据共享更方便,提高系统效率。
  • 响应性:线程的创建和销毁速度快,可以更快地响应用户的请求。

多线程的缺点:

  • 安全性问题:多个线程共享数据时需考虑同步和锁机制,以避免数据竞争和不一致的结果。
  • 内存占用:每个线程都需要独立的栈空间和线程数据结构,增加内存消耗。
  • 上下文切换开销:线程切换需要保存和恢复上下文,增加系统开销。

10 什么是线程同步和互斥⭐⭐⭐⭐

线程同步是指通过一定的机制确保多个线程按照一定的顺序和规则共享资源或进行协调工作,以避免出现并发访问导致的问题,例如竞态条件、数据不一致等。

互斥是一种用于保护共享资源的机制,确保同一时间只有一个线程可以访问该资源,避免出现数据竞争和冲突。通过使用互斥锁(Mutex),只有获得锁的线程才能进入临界区(访问共享资源的代码段),其他线程需要等待锁的释放。

同步是一种更广泛的概念,它意味着协调多个线程间的执行顺序和行为,以确保它们按照一定的规则和顺序执行。同步可以通过互斥来实现,但也可以使用其他的同步机制,如信号量、条件变量、事件等。

  1. 线程A想要访问共享资源之前,它会尝试获取互斥锁。
  2. 如果互斥锁当前没有被其他线程占用,线程A成功获得锁,并进入临界区,开始执行操作。
  3. 同时,线程B也想要访问共享资源,但发现互斥锁已经被线程A占用,所以线程B需要等待。
  4. 当线程A完成操作后,它会释放互斥锁,而此时线程B会被唤醒并尝试获取锁。
  5. 如果没有其他线程占用互斥锁,线程B可以获取锁并进入临界区,开始执行自己的操作。
  6. 当线程B完成操作后,它也会释放互斥锁,以便其他线程可以获取锁并执行操作。

11 线程同步与阻塞的关系?同步一定阻塞吗?阻塞一定同步吗?⭐⭐⭐⭐

  • 线程同步是指协调多个线程之间的执行顺序和行为,以保证数据的一致性和正确性。同步可以通过使用互斥锁、条件变量、信号量等机制来实现。
  • 线程阻塞是指当线程遇到某些条件而无法继续执行时,暂时挂起线程的状态。具体而言,当线程发起一个阻塞式的操作(如等待I/O、获取锁、等待条件满足等)时,它会进入阻塞状态,暂停执行,直到条件满足或被唤醒。

同步机制在某些情况下可能会导致线程阻塞。例如,在互斥锁的场景中,当一个线程尝试获取互斥锁但锁已经被其他线程占用时,它会被阻塞,等待锁的释放。直到获取到锁之后,线程才能继续执行。

然而,并不是所有的同步操作都会导致线程阻塞。例如,在使用无锁数据结构或者

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

嵌入式/C++面试八股文 文章被收录于专栏

#承诺提供免费技术答疑# 本专栏主要是介绍嵌入式开发岗位相关知识和学习攻略。“C/C++软件开发岗位”也可以参考。 该专栏覆盖了嵌入式求职过程中99%常见面试题,详细讲解了嵌入式软件开发岗位、学习攻略、项目经验分享、面试心得,从技术面,HR面,主管面,谈薪一站式服务。订阅即赠送简历模板、内推机会,需要的同学点击我头像私信即可!

全部评论

相关推荐

04-19 05:00
已编辑
福州大学 C++
记录一下面经攒人品,18日更新  因为我直接和面试官讲了没准备js和前端的东西,面试官直接开始问我计算机基础。  计网:OSI七层模型               tcp在哪一层               tcp与udp区别               get和post               状态码说一些,301和302的区别               然后问了我个浏览器的我不会😰😰我也忘了是什么内容   操作系统:进程与线程区别,进程通信    hash表,hash冲突怎么解决                      最后问了分页和分段,作为408选手竟然把虚拟内存忘的干干净净😰😰   一道智力题,很easy,但是我没get到题意,后面面试官讲了我才懂这道题要问啥   两道手撕,一道括号匹配,一道字符串的**没刷多少不知道哪道题,我感觉都没啥难度。   但是第二道题调试的时候发现无法打印😰😰,我说用我自带的编译器搞一下,结果发现我的版本太低不能用动态容器😰😰,结果面试官人很好让我讲一下实现逻辑就好,然后结束了  接好运,什么时候可以上岸啊😫😫        
点赞 评论 收藏
分享
04-17 17:27
已编辑
门头沟学院 前端工程师
鼠鼠的春招告一段落了,整理一下面经回馈牛子们timeline:2.26投递3.19约面,部门成都crm3.24一面3.26二面六个工作日后收到感谢信4.7约面,部门深圳clc4.8一面4.10二面4.14三面4.15oc3.24一面1. 自我介绍2. vue中父子组件渲染/卸载/更新流程3. 闭包的应用4. 实现add(1)(2)(3)5. 路由的 hash 模式、history 模式6. 事件循环7. 事件循环输出8. vdom的理解9. vdom一定能提高性能吗10. aicoding的理解11. 实习相关12. 手写:实现call,要求在node和浏览器内通用13. call和apply哪个性能更好14. 反问3.26二面1. 自我介绍2. 主要是实习+聊天3. 手写flat函数4. 用ts重构,给函数补充类型,主要考察泛型5. 反问六天后挂4.8一面1. 无八股,纯实习2. rn的兼容性处理3. 介绍一些rn的最佳实践4. 手写:retry函数,要求传入promise,times。timeout,请求立刻发出,失败时进行不超过times次的重试,请求时间超过timeout,直接reject。主要考察promsie和race4.10二面1. 实习相关2. 开放性问题3. 平时喜不喜欢做技术分享4. 平时有没有写文档的习惯5. 在学校成绩排名6. 怎么学的前端7. 手写:传入一个数组['abc','abcd','abe'........],求出数组内所有字符串的最长子序列4.14三面1. 自我介绍2. 实习相关3. ai结合低代码怎么落地4. 低代码平台的原理   1. hoc   2. 低代码产物   3. 低代码产物怎么生成页面   4. 微前端在低代码页面的体现5. 微前端两种沙箱的实习原理6. https的加密机制   1. 对称加密   2. 非对称加密   3. https的加密时机7. rn爱马仕引擎   1. 说说你对爱马仕引擎的理解   2. 爱马仕引擎的优缺点8. webpack和vite   1. 介绍两者差别   2. vite优点   3. 为什么vite启动更快,热更新更快9. 你觉得当前低代码平台在使用上有什么问题10. react导航在移动端和pc的差异,怎么抹平,实践中遇到过因为差异引起的问题吗11. 手写:两两翻转,k个一组翻转12. 反问#春招进度记录##美团约面##美团求职进展汇总#
点赞 评论 收藏
分享
评论
点赞
5
分享

创作者周榜

更多
牛客网
牛客企业服务