进程 线程
概念:
进程
狭义的定义:进程就是一段程序的执行过程。
广义定义:进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元。
简单来讲进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程中调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。
进程状态:进程有三个状态,就绪,运行和阻塞。就绪状态其实就是获取了除cpu外的所有资源,只要处理器分配资源马上就可以运行。运行态就是获取了处理器分配的资源,程序开始执行,阻塞态,当程序条件不够时,需要等待条件满足时候才能执行,如等待I/O操作的时候,此刻的状态就叫阻塞态。
说说程序,程序是指令和数据的有序集合,其本身没有任何运动的含义,是一个静态的概念,而进程则是在处理机上的一次执行过程,它是一个动态的概念。进程是包含程序的,进程的执行离不开程序,进程中的文本区域就是代码区,也就是程序。
线程
通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义。线程可以利用进程所拥有的资源,在引入线程的操作系统中,通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位,由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统多个程序间并发执行的程度。
理解:
一个进程里包含一个或多个线程,线程共享进程所取得的资源,如共享内存等。共享内存的大小直接影响到可容纳线程的多少,有些内存区域能容纳多个线程,有些则只能容纳一个,若需防止多个线程进入限定大小的内存区域时,使用“互斥锁”,先进的线程把该区域“锁”上,完成任务后再传递给下一个或多个线程使用,这样防止多个线程同时读写某一块内存区域。若该内存区域可容纳多个线程协同工作,则需引入“信号量”的概念,意思即是该内存区域进入一个线程后,信号量递减,信号量为空时,就不能够继续进入线程,只有其中一个或多个线程完成任务并释放信号量时才能其余的线程才能进入。
同步 异步
概念:
同步
就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事.就像早上起床后,先洗涮,然后才能吃饭,不能在洗涮没有完成时,就开始吃饭。
异步
异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
理解:
结合线程,同步就是在该线程里工作时,需要等该执行中的任务得到返回的执行结果后才能继续进行下一任务,否则不能进行下一个任务;而异步则是在执行任务时没有等其返回实际结果就返回并可开始执行下一任务,以此类推,实际处理结果则由状态,通知和回调的方式返回。比如ajax,在没有等请求响应完成就进行页面渲染,实际响应完成后通过成功或错误的回调方法再根据实际情况改变页面结构。这相对于等整个请求响应完成才进行页面渲染输出优势在于这个执行分部分分批进行,面对相对复杂的逻辑处理或网络状况能做到回调成功才作进一步处理,不会阻塞后续执行。
阻塞 非阻塞
概念:
阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。
阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
非阻塞
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。
理解:
阻塞与非阻塞调用其实就是同步与异步的状态。该线程在同步执行时,在没有得到实际的处理结果前,所以该线程会被挂起,其他任务则不能使用该线程执行任务,就好等于电话中的占线,两个人在通话,第三个人就不能进入,所以该线程处于阻塞状态。而在进行异步处理时,由于不等实际处理结果返回就返回整个线程,而实际处理结果是通过状态,通知和回调的方法获得,则整个线程不会被挂起,继续进行任务,该线程就处于非阻塞状态。