多线程:原理分析整理

4,260 阅读5分钟

操作系统的设计,可以归结为三点:

  • (1)以多进程形式,允许多个任务同时运行;
  • (2)以多线程形式,允许单个任务分成不同的部分运行;
  • (3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。

多核多处理器(多CPU)多线程

  • 多核:几核就是真的有几个物理核心。CPU的性能主要靠提高核心工作频率来提高,由于物理限制,不能把频率无限提高,所以发展出多核心的CPU。即一枚处理器上集成多个计算引擎(内核),共享缓存、内存、寄存器。A8处理器是一款双核处理器。
  • 多处理器:包含多个CPU,CPU之间共享内存、I/O设备、控制器、外部设备,整个硬件系统由统一的操作系统控制,在处理器和程序之间实现作业、任务、程序、数组及其元素各级的全面并行。目前主流的服务器架构,超级计算机,都是多CPU多核架构。
  • 多线程:线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”,拥有最小系统资源,共享进程资源的基本调度单位。核是物理的,线程是虚拟的,双核4线程,看起来很像4核,但比真实的4核4线程慢,却比双核双线程快。

进程VS线程

进程

就是进行中的程序(一组指令的有序集合),当一个程序被加载到内存中之后就变成了进程(进程=程序+执行)。进程有独立的地址空间,在保护模式下自己出了问题不会对其他进程产生影响。进程是操作系统分配资源的基本单位。 进程的三种状态:

  • 阻塞态:等待某个事件的完成
  • 就绪态:等待系统分配CPU以便运行
  • 执行态:占有CPU正在运行

线程

是进程的一个实体,是CPU调度和分派的基本单位,自己拥有一点运行必不可少的资源(如程序计数器、一组寄存器和堆栈)与同属进程的其他线程共享进程的拥有的全部资源。

进程与线程区别

  • 进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。
  • 一个程序至少有一个进程,一个进程至少有一个线程。线程依赖于进程才能运行
  • 线程本身拥有很少资源(线程标识符、程序计数器、一组寄存器的值、堆栈),与同属进程的其他线程共享进程拥有的资源(代码段、数据段、打开的文件、I/O设备等)。
  • 线程开销小,但一个线程死掉等于整个进程死掉,不利于资源管理和保护。而进程正好相反,开销大,但相对线程安全。

引入线程带来的主要好处:

以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程线程是建立在进程的基础上的一次程序运行单位。

  • 在进程内创建、终止线程比创建、终止进程快
  • 同一进程内切换线程比切换进程要快,尤其是用户级的线程切换。

线程操作系统来说就是一段代码+运行时数据(主要是寄存器数据,还有线程中与资源相关的数据,比如打开的文件句柄)。多线程实现主要是靠硬件CPU(中央处理器)件来实现的,CPU有一个很重要的特性时间片,每一段获得CPU的代码只能运行一个时间片限定的时间,时间到后CPU就会把正在运行的代码暂停,接着发生一个中断,然后按照一定的规则选择另一段代码获得CPU来运行。

时间片设得太短会导致过多的进程切换,降低了CPU效率;而设得太长又可能引起对短的交互请求的响应变差。将时间片设为100毫秒通常是一个比较合理的折衷。

线程越多越好吗

线程多了,可以提高程序的执行效率,但并不是越多越好。

  • 虽然线程本身拥有很少的资源(在iOS中,默认主线程1M,子线程512K),但是更多的线程意味着更多的内存开销。创建线程也是需要CPU开销的。
  • 如果线程比核的数量多,则同一时间只能执行与核数量相等的线程数,线程过多会导致频繁的切换,消耗过多的CPU时间,降低了程序性能。
  • 使用多线程就可能出现线程安全问题,为了解决线程安全需要使用锁,进而可能会出现死锁问题。过多的线程会增加程序设计的复杂性,浪费更多精力去处理多线程通信和数据共享(多线程安全、多线程死锁)。

参考博客

浅析操作系统的进程、线程区别

操作系统核心原理-3.进程原理(上):进程概要

多线程-概述及底层实现机制浅析

操作系统面试总结—进程线程

腾讯面试题04.进程和线程的区别?