进程和线程的区别

来源:互联网 发布:男生衣服搭配软件 编辑:程序博客网 时间:2024/06/16 12:48


当我们的程序中的两个功能需要同时实现,或是都需要阻塞,我们
可能会想到求助于进程或线程,但它们的具体区别是什么或许一下还
说不出来。
进程是具有一定独立功能的程序,是系统进行资源分配和调度的一个独立单位.
线程是进程的一个实体,它是比进程更小的能独立运行的基本单位.线程自己基
本上不拥有系统资源,只拥有一点在运行中必不可少的资源
(如程序计数器,一组寄存器和栈),但是它可与同属一个进程
的其他的线程共享进程所拥有的全部资源.
进程和线程的区别;
1创建和结束 

进程的创建  常用的是fork(); 还有exec();

结束时有wait(NULL)//NULL表示不关心子进程返回状态;

或pid_t waitpid(pid_t pid,int * status,int options);

例:

waitpid(pid, NULL,0 );pid为子进程进程号, status为子进程返回状态,不关心的话可以为NULL; options为0的话表示要等的子进程没结束的话就挂起,不挂起的话就用 WNOHANG;waitpid(-1,NULL,0) 相当于wait(NULL);

线程的创建 pthread_create(&tid[i], NULL, fun, &a[i]);  第一个参数为要线程号的地址;第二个参数为创建线程的类型,一般为NULl即默认;第三个参数为要调用函数的入口地址,可以是函数指针;第三个为该函数的参数;

线程的结束:pthread_join(tid[1], NULL); 第一个参数为要结束的线程号, 第二个参数为结束类型,和线程以什么方式退出有关,如不关心可以是NULL;

2所占内存资源的不同

进程有自己独立的地址空间,而线程则需要和同一进程中的其他线程共享一个地址空间,但线程却有自己独立

的栈,线程的栈是从进程的栈中切割出来的,当然它也能给子函数分配和保存栈帧;(两个不同线程调用同一子

函数时都会在自己的栈区为其创建栈帧,所以子函数可以同时被不同的线程调用);下边详细讲它们在所占内存资源上的不同
进程有自己独立的地址空间,也就是有自己的一套诸如text段,realdata段
data段、栈、堆等, 进程创建时会将父进程的地址空间复制一份,如父进程定义的全局
变量在子进程中也能有一个相同名称的,但这两个变量并不是同一个。

而对于线程,同一个进程中的多个线程共享同一个地址空间,也就是
进程的地址空间,当然线程也有自己独享的一些内存资源来保障它能相对
独立运行,比如栈。栈是个线程独有的,保存其运行状态和局部自动变量的。
栈在线程开始的时候初始化,每个线程的栈互相独立,因此,
栈是 thread safe的也就是线程安全。操作系统在切换线程的时候会自动的切换栈,
就是切换 SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放


每个进程都有一个栈,在这个进程中每个函数被调用是分别从
这个栈中占用一段区域称为帧(即新建一个栈顶,再有一个指针指向它)

进程的地址空间分成代码段、静态数据段、堆和栈段。线程栈的位置和
大小是从它所属的进程的栈中切分出来的。线程栈为线程调用且尚未退出
的每个例程保存一个栈帧。栈帧包含临时变量、局部变量、返回地址以及
线程回到之前执行的例程所需要的任何附加信息。一旦例程退出,
该例程的栈帧会从栈中删除。

0 0
原创粉丝点击