要想了解多线程编程,那就必须从本质上开始什么是进程?
首先,进程和可执行文件很像(文件名.exe)->这就是可执行文件.但是他们又有所不同.
但是可执行文件就像是静态的,躺在我们的硬盘中,但是,我们在任务管理器中可以明显的看到我们的进程是动态的,是在内存中不断被加载的.
我们可以理解为一个可执行文件是一个静态的,当我们双击运行的时候,操作系统就会把这个可执行文件中的关键信息加载到内存中,并且开始运行里面的代码,这样就形成了一个进程.
这就是可执行文件和进程的关系------>进程是怎样形成的.
进程管理:
我们的一个操作系统中跑着这么多程序,但是我们的CPU的资源是有限的,我们要如何管理这些进程,保证进程能够正常运行,这就需要我们操作系统对进程的管理有一定的要求.
那么我们先说说管理:
管理的大致流程是这样的.
1.先描述:使用一个类/结构体将这东西有啥特征都给表示出来.
2.再组织:使用一个数据结构,将这些 对象/结构体 给整合到一起
我们的CPU也是这样进行管理的.
进程控制块(PCB:Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态,其作用是使一个程序成为一个能够独立运行的基本单位,并且可以并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理。PCB通常是占用系统内存中一块连续的内存空间,存放着操作系统用于描述进程情况及控制进程运行的全部信息。
在进程创建状态的时候创建pcb、在进程终止的时候销毁pcb----->这一点很重要
其中PCB中包含了信息:
a.进程标识符.
内部标识符SID:操作系统为每个进程赋予的位移数字标识符,系统使用
外部标识符:由创建者提供,通常有字母与数字组成,往往是由(进程)在访问该进程时使用.描述进程的家族关系,设置父进程表示和子进程表示,还可以设置用户表示,以指示拥有该进程的用户.
b.上下文数据
主要是有处理机的各种寄存器中的内容组成的,处理机被中断的时候,所有这些信息都必须保存在pcb中,以便在该进程重新执行时能够冲断电继续执行.
c.进程的调度信息
进程的状态:创建,就绪,阻塞,执行,终止
进程的优先级:进程共有6个优先级
进程调度所需的其他信息,比如已等待CPU的时间综合,进程一直只想的时间总和.
事件,指进程由执行状态转为阻塞状态所等待发生的时间,即阻塞原因
d.进程控制信息
程序和数据的地址
进程同步的通信机制
支援清单链接指针
PCB的作用:
PCB可以被操作系统中的多个模块读写或者修改,如被调度程序,资源分配程序,中断处理程序以及监督分析程序等读或者修改.操作系统是根据pcb来对并发执行的进程进行控制和管理,所以说PCB是操作系统中最重要的记录型数据结构,作用如下:
1.作为独立运行的基本单位
2.能实现间断性运行方式
3.提供进程管理所需要的信息
4.提供进程调度所需要的信息
5.实现与其他进程同步与通信
操作系统内核中将若干个pcb串成一个双向链表
进程的调度
这个进程中的主要属性-----用来实现进程的调度.
当前计算机的CPU是有限的,但是进程的数量是比较多的,总的来说就是狼多肉少
所以我们要尽可能公平分配,就需要合理的分配调度,CPU就轮流使用.
CPU的论断速度实际上是非常快的 例如1.9GHz,一秒有19亿个时钟周期
因此,我们认识感知不到这样的轮转~站在宏观的角度来看,就好像这些进程在同时执行,但是微观上而是,"轮流使用"的方式占用CPU执行~
同时,我们还有两个概念就是"并发式执行" 和"并行式执行"
其实两者在宏观上两者就像是在CPU中的进程不断执行
但是在微观上"并发式执行"->"轮流" 的方式占用CPU
"并行式执行" ->微观上有CPU上有多个核心,每个核心都可以跑一个进程,某一时刻就是在两个CPU上同时执行的.
进程的调度
进程的调度需要考虑很多因素
1.进程的优先级
对于进程有很多状态,但是最经典的就是:
就绪状态:进程是准备就绪的,随时可以上CPU执行
阻塞状态:进程在等待某个任务完成(读写磁盘),完成之后才能上CPU,完成之后才能上CPU,否则就没办法完成.
2.进程的上下文:
每次执行进程PCB都要记录好,执行进程的关键信息,当前处理进度,当前处理的进出/中间结果
对于进程来说,上下文具体的就是CPU里面一堆寄存器里面的值,上下文就会在进程被切出CPU的时候,把寄存器的状态保存到排查表中(内存)
3.进程的虚拟地址空间
进程需要使用一些系统资源,其中内存资源,就是一个很关键的资源.
为了让各个进程之间不要相互打扰,操作系统就引用了"虚拟地址空间"这样的概念
每个进程都只能访问到自己的地址空间,互相之间不会有影响,哪怕你指针出错,操作系统也能即使发现问题,不会影响其他的进程,就算出问题,问题也被限制在进城内部.