zoukankan      html  css  js  c++  java
  • 一篇让你明白进程与线程之间的区别与联系

    前言

    欢迎关注公众号:Coder编程
    获取最新原创技术文章和相关免费学习资料,随时随地学习技术知识!

    本章主要介绍进程与线程的区别与联系相关知识点,也是我们面试过程中,经常会问到的了一个问题。希望通过这篇文章,能让大家理解相关知识点~

    涉及面试题:

    • 1.进程与线程之间有什么区别?
    • 2.进程、线程都各有什么特点?
    • 3.进程之间的是怎么进行交互的呢?
    • 4.什么是缓冲区溢出?
    • 5.进程之间如何进行交互?
    • 6.线程之间如何进行交互?

    上面的面试题可以看出,其实都是一回事,只是换了一种提问方式,只要我们能掌握核心要点,随便面试官怎么提问,我们都能轻松应对!

    1. 小栗子:

    我们生活中有许许多多关于进程与线程的小栗子,比如:1.我们使用打开一个微信软件,这个时候就开启了一个进程,
    当我们在微信里面进行各种操作(查看朋友圈,扫一扫...),这么多的操作就是线程。
    所以我们可以说“进程”是包含“线程”的,“线程”是“进程”的一个子集。
    

    来源百度百科:

    进程(Process) 是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。

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

    我们简单总结下:

    进程:指在系统中正在运行的一个应用程序;程序一旦运行就是进程;进程——资源分配的最小单位。

    线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流。线程——程序执行的最小单位。

    2. 深入理解:

    进程

    2.1 进程(线程+内存+文件/网络句柄)

    我们通过上面的图片进行进一步理解:

    “内存”:
    我们通常所理解的内存是我们所见到的(2G/4G/8G/16G)物理内存,它为什么会在进程之中呢?
    实际上,这里的内存是逻辑内存。指的是内存的寻址空间。每个进程的内存是相互独立的。
    否则的话会出现一个问题:我们把指针的值改一改就指向其他进程的内存了,通过这样我们岂不是就可以看到其他进程中"微信"或者是"网上银行"的信息,
    这样的话,那我们的微信聊天记录或者是银行账户的信息就都被别人找到了,这是一个很危险的信号!显然这样是不可能的。

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

    “线程”:
    接下来,我们就要介绍一下我们的“线程”有关知识

    线程

    2.2 线程(栈+PC+TLS)

    2.2.1 栈:

    我们通常都是说调用堆栈,其实这里的堆是没有含义的,调用堆栈就是调用栈的意思。
    那么我们的栈里面有什么呢?
    我们从主线程的入口main函数,会不断的进行函数调用,
    每次调用的时候,会把所有的参数和返回地址压入到栈中。

    2.2.2 PC:

    Program Counter 程序计数器,操作系统真正运行的是一个个的线程,
    而我们的进程只是它的一个容器。PC就是指向当前的指令,而这个指令是放在内存中。
    每个线程都有一串自己的指针,去指向自己当前所在内存的指针。
    计算机绝大部分是存储程序性的,说的就是我们的数据和程序是存储在同一片内存里的
    这个内存中既有我们的数据变量又有我们的程序。所以我们的PC指针就是指向我们的内存的。

    2.2.2.1 缓冲区溢出

    例如我们经常听到一个漏洞:缓冲区溢出
    这是什么意思呢?
    例如:我们有个地方要输入用户名,本来是用来存数据的地方。
    然后黑客把数据输入的特别长。这个长度超出了我们给数据存储的内存区,这时候跑到了
    我们给程序分配的一部分内存中。黑客就可以通过这种办法将他所要运行的代码
    写入到用户名框中,来植入进来。我们的解决方法就是,用用户名的长度来限制不要超过
    用户名的缓冲区的大小来解决。

    2.3 TLS:

    全称:thread local storage
    之前我们看到每个进程都有自己独立的内存,这时候我们想,我们的线程有没有一块独立的内存呢?答案是有的,就是TLS。
    可以用来存储我们线程所独有的数据。
    可以看到:线程才是我们操作系统所真正去运行的,而进程呢,则是像容器一样他把需要的一些东西放在了一起,而把不需要的东西做了一层隔离,进行隔离开来。

    3. 进程之间的是怎么进行交互的呢?

    通过TCP/IP的端口来实现

    在后续的文章中我们将一一详细介绍!

    4. 线程之间又是怎样进行交互?

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

    在后续的文章中我们将一一详细介绍!

    5.小结:

    1.进程要分配一大部分的内存,而线程只需要分配一部分栈就可以了.
    2.一个程序至少有一个进程,一个进程至少有一个线程.
    3.进程是资源分配的最小单位,线程是程序执行的最小单位。
    4.一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行.

    文末

    文末

    欢迎关注个人微信公众号:Coder编程
    获取最新原创技术文章和免费学习资料,更有大量精品思维导图、面试资料、PMP备考资料等你来领,方便你随时随地学习技术知识!
    新建了一个qq群:315211365,欢迎大家进群交流一起学习。谢谢了!也可以介绍给身边有需要的朋友。

    文章收录至
    Github: https://github.com/CoderMerlin/coder-programming
    Gitee: https://gitee.com/573059382/coder-programming
    欢迎关注并star~
    微信公众号

  • 相关阅读:
    Neurosurgeon: Collaborative Intelligence Between the Cloud and Mobile Edge
    Adversarial Attack Type I: Cheat Classifiers by Significant Changes
    Federated Optimization for Heterogeneous Networks
    On the Convergence of FedAvg on Non-IID Data
    联邦学习综述
    Federated Learning: Challenges, Methods, and Future Directions
    Hop: Heterogeneity-aware Decentralized Training
    C++文件操作
    c++: internal compiler error: Killed (program cc1plus)
    SCAFFOLD: Stochastic Controlled Averaging for On-Device Federated Learning
  • 原文地址:https://www.cnblogs.com/coder-programming/p/10595804.html
Copyright © 2011-2022 走看看