浅谈进程&线程

本章主要介绍进程与线程相关的知识点。希望通过这边文章,能够给大家一点点帮助^-^

本章主要从以下几个方面切入:


入门

如果大家够细心的话,就会发现我们的生活中充满了进程和线程的例子,如: 90后可能生活中比较喜欢刷微博,那么当我们在移动终端上打开了一个软件时,实际上就是生成了一个新的进程;而我们在软件中进行各种各样的操作,诸多繁杂的操作就是一个个线程。

之前看blog,看到过一位大佬用一以下例子来类比这部分内容:

单核CPU: 我们可以把单核CPU比作是一个工作车间。

多核CPU: 那么以上的假设成立的基础上,多核CPU就可以类比为一个拥有好多个工作车间的工厂。

进程: 即一个运行的工作车间,那么我们平时所说的多进程就是 一个工厂可以同时运行多个工作车间。 那么我们可以由此看出CPU和进程之间的关系就是 - 单核CPU只能同时运行单个进程,多核CPU可以同时运行多个进程。

线程: 我们可以把线程比喻为工作车间里面的一个工人。 由此我们可以看出 - 一个进程可以包含多个线程。


定义

进程: 是程序的一次执行过程,是一个动态的性质。进程是操作系统进程资源分配和调度的基本单位。进程在整个存活的生命周期内都有一个自己的地址空间。

线程: 是CPU调度和分派的基本单元。同属于同一进程的所有线程共享该进程所拥有的全部资源。

线程是进程的一部分,一个线程只可以属于一个进程,而一个进程可以拥有多个线程,但至少要有一个线程。

深度认知

线程间内存共享,一个进程的内存空间是共享的,每一个线程都可以使用这些内存空间。但是当一个线程正在使用某些共享内存时,其他的线程必须等待该线程结束,才能使用这一块内存。

为了防止以上情况的发生,这里有如下策略:

   1. 使用互斥锁: 意思就是当一个线程使用某一资源的时候,先把这个资源锁上,然后使用结束就把锁打开;这样如果其他的线程在要使用这部分资源时看到是锁住的状态,它就会在门口排队,等锁打开了才会进去。

   2. 使用信号量: 跟上面的互斥锁概念相似,只不过我们是在资源上挂n钥匙,当线程要使用该资源时,先拿一把钥匙,等使用完,再把钥匙放回去,这样当有别的线程想使用该资源时,发现没有钥匙了,那么线程就会排队,等待有钥匙了再继续访问。

   从以上的描述我们可以看出 互斥锁是一种特殊的信号量,即此时只有一把钥匙。其实换句话说就是资源要求同一时间只能由一个线程来使用它,这种就叫做资源独占。

栈: 我们通常所说的调用堆栈 其实 就是调用栈,当我们从主线程入口函数main进入后,会不断的进行函数调用,每次调用的时候都会把所有的参数和返回地址压入栈中,保存现场。

PC ( program counter ): 程序计数器 - 操作系统真正运行的是一个个的线程,而 进程只是它的一个容器

TLS ( thread local storage ): 上面我们说到过每个进程都有自己独立的内存,那么同理 每一个线程也有一块独立的内存,那就是 TLS. 它的作用就是用来存储线程所独有的数据。

通过以上我们可以清楚的看到 - 线程才是操作系统真正与运行的,而进程就像是一个容器,它把自己需要的各种资源等东西逻辑上放到了一起,而把不需要的东西做了一层隔离。


区别

进程和线程之间的区别主要可以分为以下几方面:

本质区别: 进程时系统分配资源的基本单位,而线程是任务调度和执行的基本单位。

切换产生的开销: 因为每个进程拥有自己独立的指令和数据(程序上下文),而同一类线程是会共享指令和数据空间,所以进程之间切换的开销要大于线程之间切换的开销。

内存分配: 系统会给每个进程分配不同的内存空间,为对于线程来说并不会。线程所使用的资源来自于所属的进程。

操作系统可以运行多个进程(程序),而在同一个进程中有多个线程同时执行。注意这里的同时其实从严格意义上来说并不是同时,只不过是线程切换所花费的时间非常少。CPU的调度是通过时间片来的,在每个时间片中只有一个线程执行。


交互

进程之间是通过TCP/IP的端口来实现的。

线程的通信就相对比较简单了,因为有一块共享的内存,只要大家的指针是指向同一个的就可以看到各自的内存。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值