进程:
进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件 每个进程独立不可见
fork产生子进程。每个子进程都是父进程的一个副本,它会拥有父进程的数据段,栈和堆的副本,并且共享父进程代码段。
exec产生子进程。把一个新的程序加载都自己的内存中,原来的数据段,栈,堆及代码就会被替换掉。
并发:
一个进程的指令和另一个进程的指令是交错执行(时间片)。
并行:
多个程序,同一个时刻,同时执行。
用户进程(用户态):
用户进程(或者说程序的执行实例)总会存在于用户空间中,但不能与其所在计算机的硬件进行交互。
如果想要与硬件交互,需要通过系统调用(会进行上下文切换),进入内核态。通过内核线程操作
内核进程(内核态):
内核可以与硬件交互,但却生存在内核空间中。
用户态和内核态:
内存依据有CPU提供的,可以让进程驻留的特权级别建立了两个特权状态---内核态和用户态。大部分时间CPU处于用户态,当进程发出一个系统调用时,内核会把CPU从用户态换到内核态。而后会让CPU执行内核函数。执行完毕,切换回用户态。
系统调用:
为了使用户进程使用内核功能,内核会暴露出一些接口以供他们使用。这些接口是用户进程使用内核功能的唯一手段。用户进程使用这些接口的行为称为系统调用。
虚拟内存:
虚拟内存是一个抽象概念,它为每个进程提供一个假象。即每个进程都独占地使用主存,每个进程看到的内存都是一致的。称之为虚拟地址空间。虚拟地址空间分为 内核虚拟内存,用户虚拟内存,他们共同瓜分了操作系统能支配的内存区域。
用户空间虚拟地址的范围从0-TASKSIZE,内存空间占据剩余空间,虚拟内存的最大容量与实际可用的物理内存的大小无关。内核和CPU会负责维护虚拟内存和物理内存直接的映射关系。内核会为每个用户进程分配的是虚拟内存而不是物理内存。每个用户进程分配到的虚拟内存总是在用户空间中,而内核空间则留给内核专用。
上下文:
操作系统保持跟踪进程运行所需要的所有状态信息(比如PC和寄存器文件的当前值,主存内容)
上下文切换:
CPU快速地在多个进程之间进行切换,这也称为进程之间的上下文切换。
切换CPU正在运行的进程需要发出代价,例如,A切换到B进程,内核必须要及时保存进程A的运行时状态。另一方面,假设进程B不是第一次运行,那么在让进程B重新运行之前,内核必须保证已依据之前保存的相关信息把进程B恢复到之前被换下时的状态。这种在进程换出换入期间必须要做的任务统称为进程切换。这个任务主要是内核完成。
竞态:
多个进程同时对同一个资源进行访问,就很有可能相互干扰,这种干扰通常称之为竞态条件。执行过程中不能中断称之为原子操作,而只能被串行化访问或者执行的某个资源或者某段代码称之为临界区。
线程:
线程运行在进程的上下文中,共享代码和全局数据。
一个进程的第一个线程会随着这个进程的启动而创建,这个线程称为该进程的主线程。
一个进程中所有线程都拥有自己的线程栈,并以此存储自己的私有数据。这些线程的线程栈都包含在其所属进程的虚拟内存地址中。
一个进程中的很多资源都会被其中的所有线程共享,这些被线程共享的资源包括当前进程的虚拟内存地址中纯粹的代码段,数据段,堆,信号处理函数,以及当前进程所持有的文件描述符。
创建一个新线程,也不会像创建一个新进程那样耗时费力,因为在其所属进程的虚拟内存地址中存储的代码、数据和资源都不需要被复制。
进程之间存在层级关系,但同一个进程内的任意两个线程之间的关系都是平等的。不存在层级关系。任何线程都可以对同一个进程中的其他线程进行有限管理。
线程调度:
调度器会把时间划分成极小的时间片并把这些时间片分配给不同的线程。以使众多线程都有机会在CPU上运行
所有等待使用CPU的线程都会按照动态优先级从高到底的顺序排列,并依序放到与该CPU对应的运行队列中。
每个CPU的运行队列中都包含两个优先级阵列:一个用于存放正在等待运行的线程,我们暂且称之为激活的优先级阵列,另一个则用于存放已经运行过但还没有完成的线程。暂且称之为过期的优先级阵列。
协程:
协程可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。
https://www.cnblogs.com/liang1101/p/7285955.html