当前位置: > Linux教程 > Linux学习 >

总结:进程和线程的区别

时间:2019-05-28 14:03来源:linux.it.net.cn 作者:IT
首先呢,进程是系统进行资源分配和调度的一个独立单位,线程呢就是进程内部的一条执行序列是CPU调度和分派的基本单位,线程的执行呢必须依赖于进程,一个进程内部至少有一条线程,main主函数的执行序列为主线程 ,我们可以通过线程库创建线程。

其次呢,进程有四个要素:
其一,必须有一段程序供其执行
其二,有专用的系统堆栈空间
其三,在内核中有一个task_struct结构体,也就是进程控制块,用来记录进程所占的各项资源
其四,除了专用的系统堆栈空间外,进程还拥有专有的用户空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段。

如果具备前三条缺少第四条,那么就是一个线程,也就是线程没有自己专有的用户空间,一个进程中的全部线程是共享进程中的全局数据,堆区数据,以及进程PCB中的资源,线程只有自己的进程栈和寄存器变量,因此,线程之间的通信更方便,而且CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多,对于一些要求同时执行,而且又要共享某些变量的并发操作,就应该使用线程。

但是多进程程序更健壮,多线程程序只要有一个线程奔溃,整个进程也就奔溃了,而一个进程奔溃并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

其实呢linux 系统中,进程和线程的区别也不是特别严格,因为在linux系统中,许多进程在创建之初,都与其父进程共用一个存储空间,所以严格上来说,还是一个线程,但是子进程可以建立自己的存储空间,和父进程分离开来执行,成为真正意义上的进程,而且线程也有pid,也有task_struct结构,

Linux系统运行时的

第一个进程是在开机初始化阶段“创造”出来的,而此后的进程或线程都是由一个已经存在的进程像细胞分裂一样通过do_fork()系统调用创造出来的。
Linux 系统对进程和线程的并不区分,线程只不过是一种特殊的进程。

说说进程里面都有什么信息?

进程里面除了最基本的task_struct 结构体和 系统堆栈 之外,还有进程拥有的用户空间,因此,就要有用于虚存管理的mm_struct结构,以及下属的 vm_area_struct 结构,以及相应的页面目录 和 页面表,这些信息都是记录在task_struct中,也就是在PCB中。

进程不仅仅局限于一段可执行的代码,它还包含了许多其他资源,像打开的文件,信号、内核内部数据、处理器状态、地址空间、以及一个或多个执行线程,以及存放全局变量的数据段等。程序本身不是进程,进程就是一个处于执行状态的程序以及它所包含的资源的总称。

进程的组织方式?
内核把进程存放在叫做任务队列(task list)的双向循环链表中。链表中的每一项都是一个task_struct(进程描述符)结构
task_struct 相对比较大,在32位机器上,大约有1.7 KB
进程描述符中包含的数据能完整的描述一个正在执行的程序。

未完:最近在找工作,准备把自己知道的一些东西总结在博客里,接下来会有更详细的总结。


(责任编辑:IT)
------分隔线----------------------------