【随笔】进程与线程之间的区别

** 举个栗子 **
我们使用打开微信,这个时候就开启了一个进程,当我们在微信里面进行各类操作(比如打开小程序、扫一扫、
浏览朋友圈等),这些操作就是线程。
所以,我们可以说"进程"是包含"线程"的,"线程""进程"的一个子集。
** 摘菜 **
'进程(Process)' 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,
是操作系统结构的基础。在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形
式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度
的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

'线程(thread)' 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。
一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。

'''
简单总结一下:
进程:指在程序中正在运行的一个应用程序;程序一旦运行就是进程;进程--资源分配的最小单位。
线程:系统分配处理器时间资源的基本单元,或说进程之内独立执行的一个单元执行流。线程--程序执行的最小单位。

'''

在这里插入图片描述

** 进程 **
进程 = 线程 + 内存 + 文件/网络句柄

'内存'
这里的内存是逻辑内存,指的是内存的寻址空间,每个进程的内存是相互独立的。
如果不独立,就出现问题:我们把指针的值改一改就能够指向其他进程的内存了,通过这样的方式我们岂不是可以访问
其他进程"微信"或者是"网上银行"的信息。
这样的话,那我们的微信聊天记录或者是银行账户的信息就很容易被别人窃取,这是一件很不安全的事。

'文件/网络句柄'
他们是所有进程所共有的,例如打开同一个文件,去抢同一个网络的端口,这样的操作是被允许。

'线程'
如下图,线程 =+ PC + TLS
> 栈
  我们从主函数的入口 main 函数,会不断的进行函数调用,每次调用的时候会把所有的参数和返回地址压入到栈中。
  即栈中存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中而是存放在堆或者常量池中,还有局部变量
> PC
  Program Counter 程序计数器,操作系统真正运行的是一个个的线程,而我们的进程只是它的一个容器。
  每个线程都有一个程序计数器,是线程私有的,这个PC计数器就是一个指针,指向下一条命令的地址,也就是指向
  下一条即将执行的指令代码,由执行引擎来读取。
  计算机绝大部分是存储程序性的,说的就是我们的数据和程序是存储在同一片内存里的,这个内存中既有我们的数
  据变量又有我们的程序。
  "缓冲区溢出"
  我们经常听到的一个漏洞"缓冲区溢出"
  例如:我们有个地方要输入用户名,有一块专门用来存相关数据的内存
  然后黑客把数据输入的特别长,这个长度超出了我们给数据存储的内存区,这时候跑到了我们给程序分配的一部分
  内存中。黑客就可以通过这种办法将他所要运行的代码写入到用户名框中,植入进来。我们的解决方法就是,限制
  用户名的长度不要超过用户名的缓冲区的大小来解决。
> TLS
  全称:thread local storage
  线程独有的一块内存(TLS),用来存储线程独有的数据

在这里插入图片描述

** 进程之间的是怎么进行交互的呢? **
通过TCP/IP的端口来实现(消息队列和共享内存)

** 线程之间又是怎样进行交互? **
线程的通信就比较简单,有一大块共享的内存,只要大家的指针是同一个就可以看到各自的内存
'''
                    ** 总结 **
                                   
1.进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了.
2.一个程序至少有一个进程,一个进程至少有一个线程.
3.进程是资源分配的最小单位,线程是程序执行的最小单位。
4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.

'''
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值