进程(process)和线程(thread)是操作系统的基本概念。
进程和线程都是CPU工作时间段的描述。
背景:由于CPU与其他PC资源之间速度的不协调,人们想提高资源利用率,所以提出了多任务系统。得益于CPU的计算速度,我们可以“同时”运行多个任务,实质上是多个任务之间轮流使用CPU资源,由于速度超快,给用户的感觉就是连续的。
如何实现:任务的执行需要依赖各个PC资源,我们可以称为计算机执行的上下文环境。要实现“同时执行”,就需要不断轮换,为了下一次继续从当前状态执行下去,计算机需要保存切换前的程序上下文。所以有了进程:用进程去描述程序当前上下文的状态信息----内存位置、变量值、任务ID……所以,进程是资源分配的单位。一般来说宏观上可以看做是一个软件的运行,例如一个word文档的打开。
多个任务之间切换因为要保存上下文、调入上下文,一旦多了的时候,还是有一定的时间消耗。为了进一步提高资源利用率,人们在进程中,引入了线程,线程只是CPU轮流调度的单位,其他上下文信息用所在进程中的。这样上下文切换的耗时就降了下来。同样的,宏观上来可以看做是一个软件中的多个处理功能,例如上述打开word中拼写检查功能、字体加粗……
区别:
进程:
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配的独立单位。
进程之间的地址空间是相互独立的,每个进程都是用虚拟地址空间,每个进程都以为整个地址空间只有自已在运行。操作系统在进行进程切换时,要把每个进程的上下文保存完整;
进程之间不能共享资源;
进程切换的开销较大。
线程:
线程是进程中的一个执行路径。(进程可以创建多个线程);
线程是CPU调度的单位;
线程共享所在进程的地址空间和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器;
线程没有自己独立的地址空间,线程必须依赖于进程而存在;
线程切换的开销相对较小。
其他术语:
并发:
Concurrency,是并发的意思。并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。
从微观角度看,所有的并发处理都有排队等候、唤醒、执行等这样的步骤,在微观上他们都是序列被处理的,如果是同一时刻到达的请求(或线程)也会根据优先级的不同,而先后进入队列排队等候执行。
从宏观角度看,多个几乎同时到达的请求(或线程)在宏观上看就像是同时在被处理。
并行:
Parallelism,即并行,指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源呢上(多核),同时执行。并行,不存在像并发那样竞争,等待的概念。
通过多线程实现并发,并行:
1.java中的Thread类定义了多线程,通过多线程可以实现并发或并行。
2.在CPU比较繁忙,资源不足的时候(开启了很多进程),操作系统只为一个含有多线程的进程分配仅有的CPU资源,这些线程就会为自己尽量多抢时间片,这就是通过多线程实现并发,线程之间会竞争CPU资源争取执行机会。
3.在CPU资源比较充足的时候,一个进程内的多线程,可以被分配到不同的CPU资源,这就是通过多线程实现并行。
4.至于多线程实现的是并发还是并行?上面所说,所写多线程可能被分配到一个CPU内核中执行,也可能被分配到不同CPU执行,分配过程是操作系统所为,不可人为控制。所有,如果有人问我我所写的多线程是并发还是并行的?我会说,都有可能。
5.不管并发还是并行,都提高了程序对CPU资源的利用率,最大限度地利用CPU资源。
串行、并行:
并行和串行指的是任务的执行方式。串行是指多个任务时,各个任务按顺序执行,完成一个之后才能进行下一个。并行指的是多个任务可以同时执行,异步是多个任务并行的前提条件。
异步和同步
异步和同步是相对的,同步就是顺序执行,执行完一个再执行下一个,需要等待、协调运行。异步就是彼此独立,在等待某事件的过程中继续做自己的事,不需要等待这一事件完成后再工作。线程就是实现异步的一个方式。异步是让调用方法的主线程不需要同步等待另一线程的完成,从而可以让主线程干其它的事情。
并发编程又叫多线程编程
并发的实质是一个物理CPU(也可以多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。