进程和线程的区别

一段程序本身不会执行,就像是一个做好的菜谱。食谱写好后被放进抽屉里,而程序由程序员写好放在硬盘中永久保存。

为了做这道菜,我们需要将这份菜谱拿出来,放到桌上,然后按照步骤做菜。这相当于CPU从硬盘中读取程序到内存中,方便CPU读取。这个在内存中的可执行的程序实例就叫做进程。

一个程序若多次读取到内存中,则变成了多个独立的进程。硬盘中多个程序读取到内存中运行时也就创造了更多的进程。

内存中任何一个地方都有相应的地址方便访问,而在内存中的每个进程自己内部都有一个虚拟独立的地址空间。在进程内,就可以根据虚拟地址来访问。

进程间是怎么访问的呢?

首先,进程是程序执行的完整单位,所以大部分时间都是在进程内,那么进程间就需要进程间通信IPC,这可能需要系统调用,访问会更慢。每个进程都以为自己独占着整个内存,不需要关心其他进程的实际位置。这样就把进程们很好地分隔开了。

每个进程首先有加载程序,通常只有一个程序计数器(PC指针),记录当前程序执行的位置,会按照程序顺序计算。这里一个执行流就是一个线程。如果有多个线程的话就需要多个程序计数器,每个线程会独自运行。除此自外,每个线程还有寄存器、堆栈等程序运行时的状态信息。同时,线程间共享的则有地址空间、全局变量、打开的文件等等信息。

为什么在进程中还要有更小的“进程”--线程?

假如有一个文档编辑器,这自然是一个进程,存放着相应的程序和文档。现在用户用键盘在第二行末打出回车,我们需要交互的程序接受键盘的按下事件。然后,布局的程序将文字重新计算位置,再把它们渲染出来。另外,每隔一段时间需要写入的程序保存文档到硬盘中。所以,这三个程序最好能够并行执行。但是,它们又需要访问修改同一个文档,所以肯定是在同一个进程中,这时候需要更轻量级的三个线程(交互线程,渲染线程,保存线程)。

现在我们了解到线程是并行的最小单位。假如现在计算机只有一个单核CPU,也就是一次只能执行一个线程,那就需要对每个线程轮流执行。每次单个计算的时间成为一个CPU时间片,实际只有几十毫秒,用户根本感觉不到。对于线程来说,存在等待CPU的时候,称为就绪状态。一旦CPU过来执行就转变成运行状态。当CPU转而执行其他线程时,就又变成就绪状态。假如线程正在执行中,程序向硬盘发送访问请求,然后等待。这时CPU就变成空转了,所以,线程变成阻塞状态。CPU转而执行其它线程。等到硬盘的数据回复,线程从阻塞态转变成就绪态,等待CPU的再次光临,然后继续执行。

如果是多个CPU,确实可以让多个线程真正地并行计算,但往往线程会很多,所以还是需要时间片轮转。为了简化,CPU在内核中为每个线程提供各自的虚拟CPU。每个线程会认为自己是独占着CPU,它们就不需要考虑时间片轮转的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lindsey小姐月光加冕

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

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

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

打赏作者

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

抵扣说明:

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

余额充值