进程和线程的区别与联系

1. 共同点
功能上都是用于实现多任务并发程序设计的技术手段,线程的状态包括就绪、执行与阻塞,与进程类似。
从系统实现的角度看,进程实体和线程实体在Linux内核中都是有task_struct实现的,两者的创建最终都是调用系统函数clone(),

2. 区别
进程是资源分配的基本单位,线程是系统调度的基本单位,进程维护资源,线程是真正的执行体。

  • 定义
    进程是一个用户程序在同一数据集合上的一次执行过程,而在不同数据集合上或者同一数据集合的不同运行都是不同的进程。线程是进程上的一个实体,是系统调度的基本单位。

  • 所属关系
    线程只能属于一个进程,而进程可以创建多个线程,且最少创建一个主线程。

  • 系统开销
    线程开销小于进程开销,切换效率高于进程
    ,因为进程需要独立的数据段,代码段、扩展段等系统资源,创建时需要复制(写时复制)父进程的所有资源。而线程与其它线程共享进程的系统资源,每个线程只需要拥有自己的栈段和寄存器,用于存储局部变量和临时变量。但是进程因为有独立的数据段、堆栈段,所以更加稳定、安全。

  • 资源分配
    进程所维护的是程序所包含的资源(静态资源),比如:虚拟地址空间(代码、数据、堆、共享库)、文件系统信息、文件描述符表和信号处理程序等;线程所维护的运行相关的资源(动态资源),比如:运行栈、调度相关的控制信息、待处理的信号集等。

  • 通信机制
    进程间相互独立,互不打扰,因此通信方式较为复杂,包括Pipe(管道),Signal(信号),Semaphore(信号量),Message(消息队列),SharedMemory(共享内存),Socket(套接字),文件。(PS:PIC包括Semaphore,Message,SharedMemory)而线程之间由于共享进程数据段,所以通过全局变量来实现通信,当然访问时需要加锁。

  • 控制权
    线程可以销毁,挂起、恢复其它线程,也可以通过销毁主线程来销毁进程,而进程没有权利控制其父(子)进程的状态。子线程终止不会引起其它线程或者进程的终止,但进程(主线程)的终止能够引起所有子线程的终止,同时任何一个子线程执行exit()会引起进程中的全部线程同时灭亡。

  • linux系统内核实现
    无论进程创建使用的fork()函数,还是线程创建使用的pthread_create()函数最终都是调用系统函数clone(),,只是通过传入不同的flag来设置是否共享父进程的资源。

同时,无论是进程实体还是线程实体,都是用linux内核中的进程控制表(process table)中的表项task_struct表示的。
(PS:这里解释一下Process Table,它的每一项都是task_struct结构,其物理实现是包含多个指针的静态数组,大小固定,所以内核有最大进程数。)
只是对于线程来说,其task_struct中的 TGID(thread group identifier)是主线程中的TGID,而主线程的TGID就是其自身的PID。
(CLONE_VM、CLONE_FS、CLONE_FILES、CLONE_SIGHAND、CLONE_THREAD、CLONE_SYSVSEM参数表示与父进程共享内存空间、文件系统、文件描述符,信号处理程序表和信号量列表。)

线程创建调用clone():

clone(child_stack=0xb7597424, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0xb7597ba8, {entry_number:6, base_addr:0xb7597b40, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}, child_tidptr=0xb7597ba8)

进程创建调用clone():

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb755a768)
  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值