转自: http://blog.csdn.net/guyan0319 https://blog.csdn.net/guyan0319/article/details/79411626程序员
1、进程
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操做系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。markdown
组成数据结构
进程是一个实体。每个进程都有它本身的地址空间,通常状况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。多线程
特征
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程均可以同其余进程一块儿并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:因为进程间的相互制约,使进程具备执行的间断性,即进程按各自独立的、不可预知的速度向前推动
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不一样的进程能够包含相同的程序:一个程序在不一样的数据集里就构成不一样的进程,能获得不一样的结果;可是执行过程当中,程序不能发生改变。并发
状态 异步
2、线程函数
线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程本身不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的所有资源。post
线程是程序中一个单一的顺序控制流程。进程内有一个相对独立的、可调度的执行单元,是系统独立调度和分派CPU的基本单位指令运行时的程序的调度单位。在单个程序中同时运行多个线程完成不一样的工做,称为多线程。性能
特色操作系统
在多线程OS中,一般是在一个进程中包括多个线程,每一个线程都是做为利用CPU的基本单位,是花费最小开销的实体。线程具备如下属性。
1)轻型实体
线程中的实体基本上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源。
线程的实体包括程序、数据和TCB。线程是动态概念,它的动态特性由线程控制块TCB(Thread Control Block)描述。TCB包括如下信息:
(1)线程状态。
(2)当线程不运行时,被保存的现场资源。
(3)一组执行堆栈。
(4)存放每一个线程的局部变量主存区。
(5)访问同一个进程中的主存和其它资源。
用于指示被执行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄存器和堆栈。
2)独立调度和分派的基本单位。
在多线程OS中,线程是能独立运行的基本单位,于是也是独立调度和分派的基本单位。因为线程很“轻”,故线程的切换很是迅速且开销小(在同一进程中的)。
3)可并发执行。
在一个进程中的多个线程之间,能够并发执行,甚至容许在一个进程中全部线程都能并发执行;一样,不一样进程中的线程也能并发执行,充分利用和发挥了处理机与外围设备并行工做的能力。
4)共享进程资源。
在同一进程中的各个线程,均可以共享该进程所拥有的资源,这首先表如今:全部线程都具备相同的地址空间(进程的地址空间),这意味着,线程能够访问该地址空间的每个虚地址;此外,还能够访问进程所拥有的已打开文件、定时器、信号量机构等。因为同一个进程内的线程共享内存和文件,因此线程之间互相通讯没必要调用内核。
3、协程
协程与子例程同样,协程(coroutine)也是一种程序组件。相对子例程而言,协程更为通常和灵活,但在实践中使用没有子例程那样普遍。协程源自 Simula 和 Modula-2 语言,但也有其余语言支持。
协程不是进程或线程,其执行过程更相似于子例程,或者说不带返回值的函数调用。
一个程序能够包含多个协程,能够对比与一个进程包含多个线程,
于是下面咱们来比较协程和线程。咱们知道多个线程相对独立,有本身的上下文,切换受系统控制;而协程也相对独立,有本身的上下文,可是其切换由本身控制,由当前协程切换到其余协程由当前协程来控制。
协程和线程区别:协程避免了无心义的调度,由此能够提升性能,但也所以,程序员必须本身承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。
4、进程和线程的关系和区别
一、地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有本身独立的地址空间;所以线程能够读写一样的数据结构和变量,便于线程之间的通讯。相反,进程间通讯(IPC)很困难且消耗更多资源。
二、资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
三、进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
四、两者都可并发执行.
五、进程的建立调用fork或者vfork,而线程的建立调用pthread_create,进程结束后它拥有的全部线程都将销毁,而线程的结束不会影响同个进程中的其余线程的结束
六、线程有本身的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有本身的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志
5、优缺点
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。同时,线程适合于在SMP机器上运行,而进程则能够跨机器迁移。
最后送上,从网上找的材料,以图文方式将进程和线程作的很好的解释清晰易懂:
一、
计算机的核心是CPU,它承担了全部的计算任务。它就像一座工厂,时刻在运行。
二、
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其余车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
三、
进程就比如工厂的车间,它表明CPU所能处理的单个任务。任一时刻,CPU老是运行一个进程,其余进程处于非运行状态
四、
一个车间里,能够有不少工人。他们协同完成一个任务。
五、
线程就比如车间里的工人。一个进程能够包括多个线程。
六、
车间的空间是工人们共享的,好比许多房间是每一个工人均可以进出的。这象征一个进程的内存空间是共享的,每一个线程均可以使用这些共享内存。
七、
但是,每间房间的大小不一样,有些房间最多只能容纳一我的,好比厕所。里面有人的时候,其余人就不能进去了。这表明一个线程使用某些共享内存时,其余线程必须等它结束,才能使用这一块内存。
八、
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫”互斥锁”(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
九、
还有些房间,能够同时容纳n我的,好比厨房。也就是说,若是人数大于n,多出来的人只能在外面等着。这比如某些内存区域,只能供给固定数目的线程使用。
十、
这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种作法叫作”信号量”(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊状况(n=1时)。也就是说,彻底能够用后者替代前者。可是,由于mutex较为简单,且效率高,因此在必须保证资源独占的状况下,仍是采用这种设计。
十一、
操做系统的设计,所以能够归结为三点:
(1)以多进程形式,容许多个任务同时运行;
(2)以多线程形式,容许单个任务分红不一样的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另外一方面容许进程之间和线程之间共享资源。
(完)