进程是什么
通俗理解一个运行起来的程序或者软件叫做进程 1.1 每次启动一个进程都需要向操作系统索要运行资源,让进程中的线程去执行对应的代码,进程是操作系统分配资源的基本单位
线程是什么
如果说进程和进程之间相当于程序与程序之间的关系,那么线程与线程之间就相当于程序内的任务和任务之间的关系。所以线程是依赖于进程的,也称为 「微进程」 。它是 程序执行过程中的最小单元 。
协程是什么,参考go语言的goroutine
用户态线程,可以中断执行的函数,语言层面的调度
通俗来说:与其让操作系统调度,不如我自己来,这就是协程。说白了就是系统调度需要走流程(这里申请一下,那里盖个章),自己办事不求人自然快的多。
协程的好处:
1.无需线程上下文切换的开销
2.无需原子操作锁定及同步的开销
3.方便切换控制流,简化编程模型
缺点:
1.无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上
2.进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
因为协程是微线程,所以这里只讨论进程和线程的区别
问题:进程与线程的区别?
1.进程是最小的资源分配单位(提高系统并发量)线程是最小的调度单位(降低不同任务间
的切换代价)
2.一线程在进程下行进(单纯的车厢无法运行)
一个进程可以包含多个线程(一辆火车可以有多个车厢)
3.不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车比如站点换乘)
同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)
4.进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)
5.进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)
6.进程可以拓展到多机.进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)
7.进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结
束,才能使用这一块内存。(比如火车上的洗手间)-“互斥锁”
8.进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如
果满了需要在门口等,等有人出来了才能进去)-“信号量”
9.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址
空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的
不同执行路径。
其实本质上是用户栈和内核栈的切换,后面会详细出一篇文章讲讲。
进程的内存分布
1.代码段:主要是程序的代码以及编译时静态链接进来的库。这段内存大小在程序运行之前就已经确定,而且是只读,可能存在一些常量,比如字符串常量。
2. 数据段:分为data和bss两个段,表现为静态内存段,data段存放已初始化的全局变量(静态内存分配的变量和初始化全局变量)。bss段存放未初始化的全局变量,在内存中bss段被清零。
3. 堆 段:用于程序动态内存分配和管理,如何分配和管理由程序的开发者决定,大小不固定(跟您的机器内存有关系),可以动态伸缩。
4. 映射段:该内存区域存放链接其它动态程序库的向量,共享内存映射向量等等。
5. 栈 段:栈是一种先进后出的数据结构,该段内存区域由程序在运行中自行管理,如:局部变量保存和撤除、函数调用相关等。
6. 输入的环境变量和参数段:主要内存程序执行时的环境变量,输入参数等等。
7. 就是系统区域。