并发编程应知概念详解

导读:本篇文章讲解 并发编程应知概念详解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

程序、进程、线程的基本概念

image-20211227102715168

  • operating system: 操作系统是包含多个进程的容器,而每个进程又是包含多个线程的容器。
  • process: 进程就是程序(这里可以理解为我们写的代码)的真正运行实例,是资源分配的基本单位。
  • thread:线程是CPU的基本调度单位,每个线程的执行都是进程代码的某个片段

程序

是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程

是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如:CPU 时间,内存空间,文件,输入输出设备的使用权等等。

线程

线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

进程与线程的关系与区别

进程与线程的关系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
  • 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
  • 处理机分给线程,即真正在处理机上运行的是线程。
  • 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。

进程与线程的区别

  • 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
  • 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
  • 地址空间:线程共享本进程的地址空间,而进程之间是独立的地址空间。
  • 资源:线程共享本进程的资源如内存、I/O、CPU 等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护。
  • 健壮性: 多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。
  • 执行过程:每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小。
  • 切换时:进程切换涉及到虚拟地址空间的切换而线程切换则不会。因为每个进程都有自己的虚拟地址空间,而线程是共享所在进程的虚拟地址空间的,因此同一个进程中的线程进行线程切换时不涉及虚拟地址空间的转换。

总结一下,可以归纳为如下理解:

  1. 进程是运行中的程序,线程是进程的内部的一个执行序列。
  2. 进程是资源分配的单元,线程是执行行单元。
  3. 进程间切换代价大,线程间切换代价小。
  4. 进程拥有资源多,线程拥有资源少。
  5. 多个线程共享进程的资源。

进程间通信的方式

  1. 管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系的父子进程间的通信,有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信。
  2. 信号(signal):信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。
  3. 消息队列(message queue):消息队列是消息的链接表,它克服了上两种通信方式中信号量有限的缺点,具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息。
  4. 共享内存(shared memory):可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。
  5. 信号量(semaphore):主要作为进程之间及同一种进程的不同线程之间得同步和互斥手段。
  6. 套接字(socket):这是一种更为一般得进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。

进程与线程占用的资源

进程占有的资源

  1. 地址空间;
  2. 全局变量;
  3. 打开的文件;
  4. 子进程;
  5. 信号量;
  6. 账户信息;

线程占有的资源

  1. 栈;
  2. 寄存器;
  3. 状态;
  4. 程序计数器;

线程共享的内容

  1. 代码段 code segment
  2. 数据段 data section (利用这些共享的数据,线程很容易的实现相互的通讯);
  3. 进程打开的文件描述符;
  4. 信号的处理器;
  5. 进程的当前目录和;
  6. 进程用户ID和进程组ID;

线程独有的内容

  1. 线程ID;
  2. 寄存器组的值;
  3. 线程的堆栈
  4. 错误返回码;
  5. 线程的信号屏蔽码;

什么是多线程?

在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

多线程作用

  1. 发挥多核CPU的优势;
  2. 防止阻塞;
  3. 便于建模;

多线程的利与弊

可以提高CPU的利用率。在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。

  1. 线程也是程序,所以线程需要占用内存,线程越多占用内存也越多;
  2. 多线程需要协调和管理,所以需要 CPU 时间跟踪线程;
  3. 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;
  4. 线程太多会导致控制太复杂,最终可能造成很多Bug;

同步和互斥的区别与联系

同步

直接制约关系,是指多个线程(或进程)为了合作完成任务,必须严格按照规定的 某种先后次序来运行。

指散步在不同进程之间的若干程序片断,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。

互斥

间接制约关系,是指系统中的某些共享资源,一次只允许一个线程访问。当一个线程正在访问该临界资源时,其它线程必须等待。

指散布在不同进程之间的若干程序片断,当某个进程运行其中一个程序片段时,其它进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

区别与联系

  1. 互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
  2. 同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
  3. 同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。
  4. 同步是一种特殊的互斥。特殊在要求各线程访问资源有序。

串行、并行与并发

串行

一个时间段内多个任务执行时,一个任务执行完才能执行另一个。

举个栗子:打完游戏再写代码。

并行

一个时间段内每个线程分配给独立的核心,线程同时运行。

举个栗子:一边打游戏一边写代码。

并发

一个时间段多个线程在单个核心运行,同一时间只能一个线程运行,系统不停切换线程,看起来像同时运行,实际上是线程不断切换。

举个栗子:一会跑去客厅打游戏,一会跑去书房写代码。

一张图区分串行、并行与并发

image-20211228170656160

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/78384.html

(0)
小半的头像小半

相关推荐

极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!