Linux进程和线程

程序是一组指令及参数的集合,指令按照既定的逻辑控制计算机运行。进程则是运行着的程序,是操作系统执行的基本单位。线程则是为了节省资源而可以在同一个进程中共享资源的一个执行单位。

 

1. 程序和进程

 C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。应用程序的运行状态称为进程。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由操作系统维护的资源管理实体。可以从以下几个方面进行区别:

  • 进程是动态的,而程序是静态的。

  • 进程有一定的生命周期,而程序是指令的集合,本身无"运动"的含义。

  • 一个进程只能对应一个程序,一个程序可以对应多个进程。进程和程序的关系就像戏剧和剧本之间的关系。

 

2. 进程

进程是指程序执行时的一个实例,由代码、数据、系统资源和环境组成。每个运行的程序就是一个进程。

  • 进程是操作系统进行资源分配的基本单位,拥有完整的进程空间。

  • 进程有进程控制块PCB,PCB记录了进程上下文信息,系统通过PCB对进程进行调度。

  • 进程=程序+数据+PCB

 

每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体,task_struct是Linux内核的一种数据结构,每个进程都把它的信息放在 task_struct 这个数据结构里,task_struct 包含了以下内容:  

1).标示符 : 描述本进程的唯一标示符,用来区别其他进程。

2).状态 :任务状态,退出代码,退出信号等。

3).优先级 :相对于其他进程的优先级。

4).程序计数器:程序中即将被执行的下一条指令的地址。

5).内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针

6).硬件上下文数据:进程执行时处理器的寄存器中的数据。

7).IO状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。

8).记账信息:可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。

9).文件:描述符等

每个进程都有自己独立的 mm_struct 结构(虚拟地址空间),各个进程都在自己的地址空间中活动,互不干扰。 mm_struct是对进程的地址空间(虚拟内存)的描述,包括:代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆),堆栈。

 

3. 线程

进程中的一个执行路径就叫做线程。

  • 线程是进程的一部分,如果没有进行显示的线程分配,可以认为进程是单线程的;如果进程中建立了线程,则可认为系统是多线程的。

  • 程序执行的最小单位,系统分配处理器时间资源的基本单元,内核的调度对象是线程。

  • 线程自己只拥有少量系统资源:程序计数器、一组寄存器、栈。

 

Linux实现线程的机制非常独特。从内核的角度说,他并没有线程这个概念。Linux把所有的线程都当做进程来实现。内核并没有准备特殊的调度算法或者是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的 task_struct ,所以在内核中,它看起来像是一个普通的进程(只是它和其他一些进程共享某些资源,如地址空间),只是它并没有自己独立的内存地址空间。

在linux中,实际上线程和进程使用的是同一个结构体 task_struct,在 linux 眼里,不会区分进程和线程,内核在进程任务调度时,仅仅是根据调度算法选择一个 task_struct,至于这个task_struct,到底是进程、还是线程,内核并不关心。

当创建一个线程时,创建一个 task_struct结构体,但是这个 task_struct 共享进程的虚拟内存 (也就是 task_struct 结构中的 mm_sruct mm字段)。

 

什么情况下使用线程:

1)需要频繁创建销毁的优先使用线程,因为对进程来说创建和销毁一个进程代价很大

2)线程的切换速度快,所以在需要大量计算,切换频繁时用线程,耗时的操作使用线程可提高应用程序的响应

3)因为对CPU系统的效率使用上线程更占优,所以可能要发展到多机分布的用进程,多核分布用线程

4)并行操作时使用线程,如C/S架构的服务器端并发线程响应用户的请求

5)需要更稳定安全时,适合选择进程;需要速度时,选择线程更好

 

4. 区别

  • 因为进程拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大,而线程不一样,线程拥有独立的堆栈空间,但是共享数据段,它们彼此之间使用相同的地址空间,共享大部分数据,比进程更节俭,开销比较小,切换速度也比进程快,效率高,但是正由于进程之间独立的特点,使得进程安全性比较高,也因为进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。一个线程死掉就等于整个进程死掉。

  • 体现在通信机制上面,正因为进程之间相互独立,进程的通信机制相对很复杂,譬如管道,信号,消息队列,共享内存,套接字等通信机制,而线程由于共享数据段所以通信机制很方便。

  • 体现在CPU系统上面,线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

  • 进程——资源分配的最小单位,线程——程序执行的最小单位。

  • 进程的创建和撤消的开销要远大于线程创建和撤消的开销

  • 进程间切换时,当前进程的CPU环境要保存,新进程的CPU环境要设置,线程间切换时只须保存和设置少量寄存器,并不涉及存储管理方面的操作,可见,进程切换的开销远大于线程切换的开销。

 

5. 关系

  • 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。

  • 资源分配给进程,同一进程的所有线程共享该进程的虚拟地址空间资源(通过共享进程的mm_sruct)。 同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆)。但是每个线程拥有自己的栈段,用来存放所有局部变量和临时变量。

  • 处理器分给线程,即真正在处理器上运行的是线程。

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hello_courage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值