进程线程知识总结

1. 程序什么时候应该使用线程,什么时候单线程效率高

  • 使用线程:在I/O密集型或高并发的场景,例如网络服务、文件读写等。通过多线程可以同时处理多个任务,提高利用率。
  • 单线程效率高:在CPU密集型任务中,当任务逻辑复杂、开销大,频繁切换线程反而会增加开销,影响性能。

2. 惊群现象

惊群现象是指多个线程或进程被唤醒来处理某个事件,而实际上只有一个能完成工作,其余的线程再次被阻塞,造成资源浪费和性能下降。

3. C++函数内的静态变量初始化以及线程安全问题

  • 静态变量:首次调用时初始化,直到程序结束。
  • 线程安全问题:在多线程环境下,静态变量初始化如果发生在多个线程访问时,可能导致数据竞争。C++11后,可以使用局部静态变量(保证线程安全)进行初始化。

4. C++线程安全的单例类

cpp 复制代码
class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11确保线程安全
        return instance;
    }
private:
    Singleton() = default; // 私有构造函数
};

5. 多线程环境带有状态的对象的讨论

状态对象需要注意线程安全性。如果对象在多个线程之间共享,需使用适当的锁机制(如互斥锁)来避免数据竞争。

6. C++多线程加volatile的错误认识

volatile保证变量的可见性,但是不保证多线程间的原子性和条件约束,通常不足以处理线程安全问题。

7. 并行编程中多进程和多线程,什么情况下多进程能解决的多线程无法解决

  • 多进程适合CPU密集型任务,因为可以规避GIL(全局解释器锁),在多核CPU上更有效利用资源。
  • 适合于需要隔离或阻止共享内存中损坏的情况。

8. 如何证明一个数据结构是线程安全的

需要确认该数据结构在并发环境下的每个操作都是原子性的,且在多个线程同时访问时不会导致数据不一致。可以通过静态分析、单元测试、压力测试等方法验证。

9. lock-free的实现方式

Lock-free算法通过原子操作(如CAS)实现,无需使用互斥锁,确保至少一个线程能成功完成操作而不阻塞其他线程。

10. 锁的实现方式

  • 互斥锁:保护资源,确保同一时间只允许一个线程访问。
  • 读写锁:允许多个读操作并发进行,但写操作需要独占。
  • 自旋锁:线程在获取锁时会在循环中不断检查,适合保持时间短的临界区。

11. 多线程编程的时候,使用无锁结构会不会比有锁结构更加快

通常在高竞争场景中,无锁结构避免了上下文切换和锁竞争的开销,能'améliorer 性能。但无锁编程复杂,容易出错。

12. linux线程是如何进行切换的

Linux使用时间片轮转调度策略,线程切换时保存当前线程的上下文状态,并加载下一个线程的上下文状态。此过程涉及CPU寄存器、堆栈等。

13. Linux开发,使用多线程还是用IO复用select/epoll

  • 多线程适合处理大量独立、长时间阻塞的任务。
  • IO复用适合高并发情况下,需要快速响应和阻塞较短的任务。

14. 异步,多线程和并行的区别

  • 异步是指非阻塞的事件处理机制,不一定创建新线程。
  • 多线程指在多个线程间并发执行任务。
  • 并行是指在多核CPU上同时执行多个任务。

15. Linux下多线程和多进程程序的优缺点,各自适合什么样的业务场景

  • 多线程:开销小,适合共享内存场景,但易受单个线程崩溃影响。
  • 多进程:独立性强,适合需要稳定性和隔离性的场景,但开销大。

16. 开发多线程的程序应该注意哪些问题

  • 竞争条件、死锁、可见性、线程安全、调试复杂性等。

17. 如何测试线程池的性能

可以通过模拟不同负载,使用基准测试工具测量处理时间、吞吐量和响应时间等指标,以评估线程池的性能。

18. 死锁的原因和避免

  • 原因:互斥、请求与保持、不可剥夺、循环等待。
  • 避免:资源有序请求、请求前预先申请资源、引入超时机制等。

19. 如何理解互斥锁,条件锁,读写锁以及自旋锁

  • 互斥锁:用于保护临界区,单个线程访问。
  • 条件锁:用于线程间的条件等待与通知。
  • 读写锁:多个读同时访问,写时独占。
  • 自旋锁:线程忙等待获取锁。

20. 互斥锁,同步锁,临界区,互斥量,信号量,自旋锁之间联系是什么

它们都涉及同步和资源控制。互斥锁和互斥量用于确保对共享资源的互斥访问;信号量用于控制访问资源的数量。

21. pthread_cond_wait 为什么需要传递 mutex 参数

pthread_cond_wait需要释放互斥锁,允许其他线程访问共享资源,从而避免与条件变量相关的资源竞争。

22. 多线程网络编程中如何合理地选择线程数

根据任务的性质、硬件能力及系统负载情况进行调整,一般选择大于或等于CPU核心数的线程数。

23. malloc和free是线程安全的吗,在多线程开发时用这两个函数应该注意什么

mallocfree在现代的C标准库中通常是线程安全的,但并发调用时可能导致性能下降,最好使用线程安全的内存池。

24. 僵尸进程和孤儿进程有什么区别、如何处理

  • 僵尸进程:已结束但未被父进程收尸,保留了状态信息。
  • 孤儿进程:父进程已结束,但子进程仍在运行。
  • 处理 :使用wait()清理僵尸进程,孤儿进程通常被init进程收养。

25. Linux系统中进程、线程、时间片的关系

  • 进程:执行单元,独立地址空间。
  • 线程:共享进程资源,处于进程内的并发执行流。
  • 时间片:分配给线程或进程的CPU时间,为调度提供粒度。

26. 在Linux系统中,对于用户创建的进程(线程)来说,CPU分配时间片的单位是线程还是进程

时间片是以线程为单位分配的,线程在同一进程下共享时间片。

27. 内核级调度和用户级调度

  • 内核级调度:由操作系统调度程序控制,能够管理多个进程/线程。
  • 用户级调度:在用户空间管理线程,内核不知线程存在,切换更快。

28. Linux中进程具有父子层次结构,Windows中没有进程层次,这两种设计各有什么优劣

  • 优点(Linux):方便资源管理和组织,父子关系便于信号处理。
  • 缺点(Linux):更复杂的dad/child管理。
  • Windows:简单直接,资源管理透明。

29. linux用户级进程跟内核线程(进程)有什么差别

用户级进程在用户空间进行管理,内核线程由内核管理。用户级的切换速度快,但无法充分利用多核,内核线程可以更好地调度。

30. 为什么要区分用户态和内核态

区分用户态与内核态提供了内存保护和进程隔离,确保用户程序在不影响操作系统的情况下运行,避免崩溃和安全隐患。

31. 从用户空间到内核空间有以下触发手段

  • 系统调用、异常处理、信号、中断等。

32. 进程的内存空间布局

一页内存空间通常分为:代码段、数据段、堆、栈、共享内存等。

33. 进程间通信(IPC)方式

  • 管道、消息队列、共享内存、套接字、信号等。

34. 进程空间和内核空间对内存的管理不同

  • 用户空间有其独立的虚拟地址空间;内核空间则是全局共享的,用于存储内核级别的数据结构。

35. 虚拟内存的作用

提供每个进程独立的地址空间,隔离进程、实现内存保护和更高效的内存使用。

36. 虚拟内存的实现

通过页表映射虚拟地址到物理地址,使用换页算法和逻辑页存取管理。

37. Linux的slab层

Slab分配器管理对象的缓存,有效减少内存碎片,提供快速分配与释放。

38. fork与vfork区别

  • fork创建新进程并复制父进程的所有内存页面。
  • vfork创建新进程但不复制内存,父进程会被挂起,直到子进程执行完毕。

39. exit()与_exit()区别

exit()执行清理(会调用atexit函数),而_exit()直接终止进程,不执行任何清理。

40. Linux是如何避免内存碎片的

使用动态分配算法和分页、合并算法(例如buddy system、slab allocator)减少或压制碎片。

41. 共享内存的实现原理

通过映射内存区域到多个进程的地址空间,允许进程间快速访问共享数据。

42. 银行家算法

用于死锁避免的资源分配算法,判断请求是否安全,以确保系统保持在安全状态。

43. linux中断响应机制

中断请求产生时,CPU暂停当前执行的任务,保存上下文,然后执行中断处理程序。

44. 如何实现守护进程

创建进程并将其转为会话领导,脱离控制终端、改变工作目录、关闭不必要的文件描述符等。

45. 32位系统一个进程最多有多少堆内存

在32位系统中,进程最大虚拟内存通常为4GB,但堆的实际大小取决于操作系统及内存分配方式,通常可达到几百MB到2GB不等。

46. 线程安全和不安全的讨论

  • 线程安全:数据结构能够在多个线程同时操作时保持一致性和正确性。
  • 不安全:导致数据竞争、状态不一致性。

47. 可重入函数与线程安全的区别与联系

  • 可重入函数:在多线程中即使发生中断也能安全调用,不依赖全局状态。
  • 线程安全:在多个线程同时调用时保持状态一致。

48. 双重检查锁定模式(DCLP)的风险

可能导致多个线程同时进入null判断,基本上绕过了多线程安全的保证。需要确保volatile关键字的使用。

49. 内存屏障详解

内存屏障(Memory Barrier)用于控制CPU内存操作的顺序,确保某些指令在其他指令前被执行。

50. 原子操作原理

原子操作是不可被中断的操作,保证在多线程环境下其执行是完整的,通常通过硬件支持提供。

51. Linux有内核级线程么

有,Linux支持内核级线程,它们可以被内核调度,采用内核的资源管理。

52. 使用线程是如何防止出现大的波峰

使用多线程可以处理多个并发请求,平稳负载,减少资源占用峰值,对短时间的请求高峰作出快速响应。

53. 操作系统中进程调度策略有哪几种

  • 先来先服务(FCFS)
  • 短作业优先(SJF)
  • 时间片轮转(RR)
  • 优先级调度

54. 线程与进程的区别和联系,线程是否具有相同的堆栈,dll是否有独立的堆栈

  • 区别:进程是资源分配的最小单位,线程是执行调度的最小单位。线程之间共享进程的堆栈。
  • DLL:每个线程通常有独立的堆栈。

55. 读者-写者问题

在并发系统中,多个读者可以同时访问,但当写者访问时需要独占,解决方案包括使用读写锁。

56. 哲学家进餐问题

模型描述了进程间的问题和资源竞争,主要关注如何合理分配资源,避免死锁解决方案。

57. 进程状态的切换图

进程状态有创建、就绪、运行、阻塞、终止等状态,各状态之间的转移代表了进程生命周期的管控。

相关推荐
晓数1 小时前
【硬核干货】JetBrains AI Assistant 干货笔记
人工智能·笔记·jetbrains·ai assistant
我的golang之路果然有问题1 小时前
速成GO访问sql,个人笔记
经验分享·笔记·后端·sql·golang·go·database
lwewan2 小时前
26考研——存储系统(3)
c语言·笔记·考研
搞机小能手2 小时前
六个能够白嫖学习资料的网站
笔记·学习·分类
nongcunqq3 小时前
爬虫练习 js 逆向
笔记·爬虫
汐汐咯3 小时前
终端运行java出现???
笔记
无敌小茶5 小时前
Linux学习笔记之环境变量
linux·笔记
帅云毅5 小时前
Web3.0的认知补充(去中心化)
笔记·学习·web3·去中心化·区块链
豆豆5 小时前
day32 学习笔记
图像处理·笔记·opencv·学习·计算机视觉
nenchoumi31196 小时前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln