您的位置:首页 > 其它

进程与线程的区别与联系

2017-06-04 17:48 267 查看
一、  进程:
1、概念:程序的运行实例,是应用程序的一次动态执行,可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体(但是并不代表所有的进程都在运⾏行,进程在内存中因策略或调度需求,会处于各种状态)。
2、进程的特征:
动态性:进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行。
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
结构特征:进程由程序、数据和进程控制块三部分组成。
3、进程描述:
每个进程在内核中都有⼀一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体(task_struct是Linux内核的⼀一种数据结构,它会被装载到RAM⾥里并且包含着进程的信息)
每个进程都把它的信息放在 task_struct 这个数据结构⾥里)
task_struct 包含了这些内容:
标⽰示符 : 描述本进程的唯⼀一标⽰示符,⽤用来区别其他进程。
状态 :任务状态,退出代码,退出信号等。
优先级 :相对于其他进程的优先级。
程序计数器:程序中即将被执⾏行的下⼀一条指令的地址。
内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
上下⽂文数据:进程执⾏行时处理器的寄存器中的数据。
I/O状态信息:包括显⽰示的I/O请求,分配给进程的I/O设备和被进程使⽤用的⽂文件列表。
记账信息:可能包括处理器时间总和,使⽤用的时钟数总和,时间限制,记账号等。
4、创建进程:
(1)fork函数:
a、正确返回:父进程中返回子进程的进程号;子进程中返回0;(单调用双返回函数)错误返回:-1。
b、子进程是父进程的一个拷贝。具体说,子进程从父进程那得到了数据段和堆栈段,但不是与父进程共享而是单独分配内存。fork函数返回后,子进程和父进程都是从fork函数的下一条语句开始执行。
c、由于子进程与父进程的运行是无关的,父进程可先于子进程运行,子进程也可先于父进程运行。
(2)vfork函数:
a、vfork()创建的进程并不将父进程的地址空间完全复制到子进程中,它与父进程数据是共享的,是在父进程的空间中运行的。
b、vfork()保证子进程先运行,vfork出来的子进程调用exec或exit之后父进程才可能被调度运行(如果在调用这两个函数之前子进程依赖于父进程的进一步动作,则会导致死锁)。
二、线程
1、概念:线程是指进程内部的一个可执行分支,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。
2、线程可访问资源:
由于同一进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调⽤用,如果定义一 个全局变量,在各线程中都可以访问到。
但是,但有些资源是每个线程各有一份的: (1)线程id(2)上下文,包括各种寄存器的值、程序计数器和栈指(3)栈空间(4)信号屏蔽字(5)调度优先级(6)errno变量
3、线程特点:
(1)在一个已有进程中创建一个新线程比创建一个新进程所需时间更少。终止线程比终止进程所花费时间少。同一个进程内,线程间切换比进程间切换所花费时间少。
(2)提高并发性,通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
(3)利于充分发挥多处理器的功能。通过创建多线程进程(即一个进程可具有两个或更多个线程),每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
(4)一旦主线程消亡(进程),其他所有线程都会消亡。
三、进程和线程的关系:
1、一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
2、资源分配给进程,同一进程的所有线程共享该进程的所有资源。
3、线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。
4、处理机分给线程,即真正在处理机上运行的是线程。
5、线程是指进程内的一个执行单元,也是进程内的可调度实体。
四、线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行。
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
(4)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: