进程和线程的区别

进程和线程的区别

进程,是计算机中的程序关于某数据集合上的一次活动运行,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。他的执行需要系统分配资源创建实体之后,才能进行。

Linux中的线程不是真正的线程,Linux中的线程是轻量级进程

1).二者的相同点

在系统层面,二者具有的状态都非常相似,所以在多任务程序中,子进程(子线程)的调度一般与父进程(父线程)平等竞争。

2).实现方式的差异

进程是资源分配的基本单位,线程是调度的基本单位。

进程的个体间是完全独立的,而线程间是彼此依存的。多进程环境中,任何一个进程的终止,不会影响到其他进程。而多线程环境中,父线程终止,全部子线程被迫终止(没有了资源)。而任何一个子线程终止一般不会影响其他线程,除非子线程执行了exit()系统调用。任何一个子线程执行exit(),全部线程同时灭亡。

从系统实现角度讲,进程的实现是调用fork()系统调用,线程的实现是调用clone系统调用

其中fork()是将父进程的全部资源复制给了子进程。而线程的clone只是复制了一小部分必要的资源。在调用clone时可以通过参数控制要复制的对象。而实际上创建线程并不采用clone系统调用,而使用大佬封装的pthread库,所以在创建线程时用的是pthread_create()。

3).多任务程序设计模式的区别

多进程间资源独立,要实现通信的话就得采用IPC,他们通常都是耗时间的。而线程则不用任何数据手段就是共享的。当然多个子线程在同时执行写入操作时需要实现互斥,否则数据就是脏数据了。

4).实体间(进程间,线程间,进线程间)通信方式的不同

进程间的通信方式有这样几种:共享内存、消息队列、信号量、命名管道、匿名管道、信号、文件、socket

线程间的通信方式包含上面几种,而且还有自己独特的几种:互斥量、自旋锁、条件变量、读写锁、线程信号、全局变量

注意一点,线程间通信用的信号不能采用进程间的信号,因为信号是基于进程为单位的,而线程是同属于同一进程空间,故而要采用线程信号

而且,进程间采用的通信方式要么切换内核,要么与外设访问,除了共享内存,所以速度会比较慢

而线程采用自己独有的通信方式的话,基本上都是在自己的进程空间内完成,不存在切换,所以通信速度较快。

也就是说,进程间与线程间分别采用的通信方式,除了种类的区别外,还有速度上的区别。

5).控制方式的异同

在全系统中,进程ID是唯一标识,对于每个进程的管理都是通过PID来实现的,在Linux中,线程又称轻量级进程,所以每个线程都有自己的task_struck结构体,也同样有自己独特的PID,但是在外界看来,同一进程下的线程又有着同一PID,这是因为进程PID实际上是进程组tgid。

当子进程结束回收时(子进程调用exit()退出或代码执行完),需要通过wait()系统调用来进行,未回收的消亡进程会变成僵尸进程,其进程实体已经不复存在,但会虚占PID资源,因此回收是有必要的。

对于线程而言,若要主动终止需要调用pthread_exit(),主线程需要调用pthread_join()来回收(没有被detached的线程)

6).资源管理方式的异同

进程本身是资源分配的基本单位,因而它的资源都是独立的,如果多进程间的共享资源,就要用到IPC了

线程间使用共享资源不需要用共享内存,直接使用全局变量即可,或者malloc()动态申请内存

总结一下,进程间的通信方式都是脱离于进程本身存在的,是全系统都可见的

7).个体间辈分关系的迥异

进程的关系森严,一个进程可能是父进程,也可能是子进程

而多线程间的关系没有那么严格,不管是父线程还是子线程创建的线程,都是共享父线程的资源,都是父线程的子线程,也就是只存在一个父线程,其余线程都是父线程的子线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值