首先,线程和进程的区别
让我们来谈谈线程和进程的概念:
(1)进程是指在内存中运行的应用程序。例如,在Windows系统中,一个正在运行的exe就是一个进程。
(2)线程是指进程中的一个执行进程。
差异:
一个程序至少有一个进程,一个进程至少有一个线程。一个应用程序可以同时启动多个进程。例如,对于IE浏览器程序,每打开一个IE浏览器窗口,就启动一个新的进程。线程是指进程中的一个执行进程。一个进程可以有多个线程,每个线程执行不同的任务。当一个进程中的多个线程同时运行时,这种操作模式称为并发操作。
另外,线程和进程还有一个很重要的区别:每个进程在执行时都有一个独立的内存单元,而同一个进程中的多个线程共享内存,从而大大提高了程序的运行效率。
二、多线程并发的理解
多线程只是表面的、感知的并发,并不是实质性的并发。一个线程要运行,必须要占用CPU,而我们目前用的电脑大部分都是单CPU,所以一次最多只能有一个线程得到CPU并运行。
多线程的本质是“充分利用CPU资源”。当某个线程的处理只需要处理I/O等资源时,就给了其他线程获取CPU资源的机会。这有点类似于“整体规划法”,比如让你打扫房子,烧水。要在最短的时间内做好这两件事,你肯定会想到先把水烧开,然后在水烧开的空空余时间打扫房子,而不是烧开水之前先打扫,或者先烧了再打扫。在这个例子中,你是唯一的CPU,烧水和清洁是
虽然只有一个CPU,但它在多个线程之间频繁切换。当切换的频率高到一定程度,我们就觉得所有的线程都在同时运行,所以我们就觉得这些多线程是并发的。所以并发其实并不是指多个线程同时运行,它只是描述了一种现象。这就好比说有些人是“铁人”。只是用来形容某人不怕苦不怕累,像个“铁人”。
1.并发性:在操作系统中,是指几个程序处于从启动到完成的时期,并且这些程序都运行在同一个处理器上。两个并发关系是同步且互斥的。
2.互斥:进程之间互斥使用关键资源的现象称为互斥。
3.同步:流程之间的关系不是互斥的关键资源,而是相互依赖的关系。进一步说明:上一个进程的输出作为下一个进程的输入,第一个进程没有输出时,第二个进程必须等待。一组具有同步关系的并发进程相互发送的信息称为消息或事件。
其中有伪并发和真并发。伪并发是指单核处理器的并发,真并发是指多核处理器的并发。
4.并行性:在单处理器的多通道编程系统中,进程交替执行,表现出一种并发的外部特性;在多处理器系统中,进程可以交替和重叠执行。只有多个处理器上的程序才能实现并行处理。可以看出,并行是针对多处理器的。并行就是多个并发事件同时发生,也就是并发的意思,但是并发不一定是并行的,也就是说并发事件不一定要同时发生。
5.多线程:多线程是编程的逻辑概念,是在一个进程中并发运行的一段代码。多线程可以实现线程间的切换执行。
6.异步:异步和同步是相对的,同步意味着顺序执行。一个执行完,下一个就要执行了,需要等待,需要协同操作。异步是指相互独立,在等待一个事件的同时继续做自己的事,而不是等事件完成后再工作。线程是实现异步的一种方式。异步意味着调用方法的主线程不需要同步等待另一个线程的完成,这样主线程就可以做其他的事情了。
异步和多线程不是同一种关系。异步是最终目的,多线程只是我们实现异步的一个手段。异步是将调用请求发送给被调用方,调用方可以不等待结果的返回而做其他事情。异步的实现可以采用多线程技术,也可以由另一个进程来处理。
为了更好地理解上述概念,我们举一个简单的例子。假设我要做三件事:烧水,举杠铃100次,洗衣服。
要烧开水,我要做的就是准备烧开水1分钟,等它烧开8分钟,关掉开水器1分钟。
举杠铃100次。我要做的是,举杠铃100次,10分钟。
我要做的就是准备洗衣服1分钟,等开水5分钟,关洗衣机1分钟。
在单核的情况下
为了完成同步,我需要做的时间是1 8 1 10 1 5 1 = 27分钟。
如果是异步的,也就是在等待的时候,我可以切换去做别的事情。
准备烧水(1)准备洗衣服(1)举杠铃50次(5)关洗衣机1分钟举杠铃20次(2)关开水器1分钟举杠铃30次(3)分钟。
1 5 1 2 1 3 = 14分钟
异步并行
1准备烧水1分钟,举杠铃50次(5)分钟,等待3分钟,关开水器1分钟。
2准备洗衣服1分钟,举杠铃50次(5)分钟,关洗衣机1分钟,等待3分钟。
其实只用了1 5 3 1 = 10分钟。
还有双核等3分钟。
异步非并行双核
1举杠铃100次(10分钟)
2准备烧水1分钟,准备洗衣服1分钟,等5分钟,关热水器1分钟,等1分钟关洗衣机1分钟。
其实只用了1 5 3 1 = 10分钟。
多线程的实践
夏单核
1线程准备烧水1分钟,等它烧开8分钟,关开水器1分钟。
Thread举杠铃100次,10分钟。
3线程准备洗衣服1分钟,等开水烧开5分钟,关洗衣机1分钟。
也许这是cpu最好的切换方式。
1线程准备烧水,1睡眠1睡眠5睡眠1睡眠2关闭开水1分钟退出
线程2睡眠1睡眠1举杠铃50下5分钟睡眠1举杠铃20下2分钟睡眠1举杠铃30下3分钟。
线程3睡眠1准备洗衣服1分钟睡眠5关闭洗衣机1分钟退出
最后14分钟与异步相同。
但实际上是不同的,因为线程不会像我们预期的那样运行。如果2号线举起杠铃先跑,整个过程的速度就下来了。
异步同步和异步同步的区别在于,io在等待的时候,同步不会被切掉,浪费时间。
如果都是独占cpu的业务,比如杠铃举,单核的情况下多线和单线没有区别。
多线程的优点是更容易实现异步切换的思想,因为异步程序很难写。多线程本身仍然是同步完成的,但是应该说
效率比不上异步。而且多行书写容易,相对效率高。
多核的好处是你可以同时做事情,和单核完全不一样。