进程,线程,并发,并行,同步,异步

目录

进程和线程

什么是进程

什么是线程

进程和线程的联系

并发

并行

线程切换

线程切换的特点

线程开销

 高并发

通过多线程实现并发/并行

异步

同步

异步与多线程的关系

异步操作的优缺点

多线程的优缺点

适用范围


进程和线程

什么是进程

 

进程就是应用程序的运行实例,是操作系统进行资源分配(包括cpu、内存、磁盘IO等)的最小单位。(也就是我们的应用程序)

什么是线程

线程是CPU调度和分配的基本单位(可以理解为CPU只能看到线程)。

进程和线程的联系

进程可能有多个子任务,比如聊天工具要接受消息,发送消息,这些子任务就是线程。

并发

当多个线程在操作的时候,如果系统只有一个CPU,同一时刻就只有一条线程指令在执行,但是各个线程指令被快速的轮换执行,这就是的宏观上看起来是多个线程在同时执行。但微观上并不是这样,只是将时间分成若干个片段,多个线程交替执行。

如图系统只有1个CPU,线程就要通过竞争得到执行机会。谁得到CPU谁就执行。

并行

如果系统有1个以上的CPU,则系统的线程有可能非并发而是并行。当一个CPU执行一个线程时,另一个CPU也在执行另外的线程,两个线程互不争夺CPU资源,可以同时进行,这就称为并行。

这就是和并发不同之处,同一时刻线程指令都在执行。

线程切换

上边说到,各个线程指令被快速的轮换执行,也就是线程之间的切换。这个动作我们称之为线程切换。在线程切换的时候每个线程都会对cpu的资源进行争夺。

线程切换的特点

(1)cpu给线程分配时间片(也就是分配给线程的时间),执行完时间片后会切 换都另一个线程。

(2) 切换之前会保存线程的状态,下次时间片再给这个线程时才能知道当前状态。

(3) 从保存线程A的状态再到切换到线程B时,重新加载线程B的状态的这个过程就叫上下文切换。

(4) 而上下切换时会消耗大量的cpu时间。

线程开销

在线程切换的过程中会消耗大量的cpu时间,这就是线程的开销,但是这只是线程开销里面的其中一项。如下是线程开销的所有内容:

(1)上下文切换消耗

(2)线程创建和消亡的开销

(3)线程需要保存维持线程本地栈,会消耗内存

 高并发

是指短时间内大量的访问和请求,例如双十一。想系统能够适应高并发状态,则需要全面优化优化,包括,硬件、网络、系统架构、开发语言的选取、数据结构的运用、算法优化、数据库优化……而多线程只是其中解决方法之一。

多线程在高并发问题中起到的作用是使计算机资源在每一时刻能达到最大利用率,不至于浪费计算机资源使其闲置。

通过多线程实现并发/并行

1.Thread类定义实现了多线程,通过多线程可以实现并发或者并行。

2.在CPU比较繁忙资源不足的时候,操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会自己争夺时间片。这就是多线程实现并发,线程之间争夺CPU资源获得执行机会。

3.在CPU资源较足的时候,一个进程内的多线程,可以被分配到不同的CPU资源,这就是多线程实现并行。

4.至于多线程实现的究竟是并发还是并行?前面两点提到的说明这是都有可能的。因为多线程可能被分配到一个CPU内核执行,也可能被分配到不同的CPU资源中执行。然而这个过程是操作系统干的,不关我的事。所以我也不确定最后究竟是并发还是并行。

5.不管是并发还是并行,都提高了对CPU资源的利用率,最大限度的利用了CPU资源。

异步

进程之间的关系不是相互排斥临界资源的关系,而是相互依赖的关系。进一步的 说明:就是前一个进程的输出作为后一个进程的输入,当第一个进程没有输出时第二个 进程必须等待。具有同步关系的一组并发进程相互发送的信息称为消息或事件。

同步

异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。

异步与多线程的关系

异步和多线程并不是一个同等关系,异步是最终目的,多线程只是我们实现异步的一种手段。异步是当一个调用请求发送给被调用者,而调用者不用等待其结果的返回而可以做其它的事情。实现异步可以采用多线程技术或则交给另外的进程来处理。

异步操作的优缺点

因为异步操作无须额外的线程负担,并且使用回调的方式进行处理,在设计良好的情况下,处理函数可以不必使用共享变量(即使无法完全不用,最起码可以减少共享变量的数量),减少了死锁的可能。当然异步操作也并非完美无暇。编写异步操作的复杂程度较高,程序主要使用回调方式进行处理,与普通人的思维方式有些初入,而且难以调试。

多线程的优缺点

多线程的优点很明显,线程中的处理程序依然是顺序执行,符合普通人的思维习惯,所以编程简单。但是多线程的缺点也同样明显,线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现。

适用范围

在了解了线程与异步操作各自的优缺点之后,我们可以来探讨一下线程和异步的合理用途。我认为:当需要执行I/O操作时,使用异步操作比使用线程+同步I/O操作更合适。I/O操作不仅包括了直接的文件、网络的读写,还包括数据库操作、Web Service、HttpRequest以及.Net Remoting等跨进程的调用。

而线程的适用范围则是那种需要长时间CPU运算的场合,例如耗时较长的图形处理和算法执行。但是往往由于使用线程编程的简单和符合习惯,所以很多朋友往往会使用线程来执行耗时较长的I/O操作。这样在只有少数几个并发操作的时候还无伤大雅,如果需要处理大量的并发操作时就不合适了。

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
线程是操作系统能够进行运算调度的最小单位,它是进程中的一个实体。线程可以被操作系统独立地进行调度和执行,并与同一进程中的其他线程共享进程的资源。 首先,串行线程是指多个线程按照顺序依次执行,一个线程的执行必须在前一个线程执行完毕之后才能开始。这意味着多个任务无法同时进行,执行效率相对较低。 其次,并行线程是指多个线程同时进行执行,每个线程独立执行自己的任务,互不干扰。这样可以大大提高程序的执行效率。 然后,同步线程是指多个线程之间存在有序的执行关系,每个线程需要等待其他线程执行完毕之后才能开始自己的任务。同步线程可以保证数据的一致性,但容易造成程序的阻塞。 最后,异步线程是指多个线程之间不存在执行的先后顺序,各个线程可以独立执行自己的任务。异步线程可以提高程序的响应速度和并发性,但需要特别注意线程安全问题。 总结起来,线程的执行方式可以分为串行、并行同步异步四种情况。其中,串行线程按照顺序执行,效率较低;并行线程可以同时进行,提高执行效率;同步线程按照有序关系执行,保证数据一致性;异步线程可以并发执行,提高响应速度。根据具体的应用场景和需求,选择合适的线程模式可以提高程序的执行效率和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值