进程与线程的区别与联系
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)系统开销:在创建或撤销进程的时候,由于系统都要为之分配和回收资源,导致系统的明显大于创建或撤销线程时的开销。但进程有独立的地址空间,进程崩溃后,在保护模式下不会对其他的进程产生影响,而线程只是一个进程中的不同的执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在进程切换时,耗费的资源较大,效率要差些。