一.概念:进程是程序执行的过程 ,它会消耗cpu资源,内存源,硬盘,网络带宽等
进程和程序的区别:程序是可执行文件,是硬盘上的一个东西(静态)
进程会干活 会消耗一些硬件资源
进程和程序的联系:如果双击程序,操作系统就会把可执行文件中的数据和指令,加载到内存中,并且让cpu去执行这里的指令 完成一系列相关的工作,运行起来动态的是进程。
二.进程的管理:先描述 在组织
1.描述:会使用专门的结构体来记录进程里的每一个属性
PCB:(进程控制块)(Linux 里的PCB 在源码中是一个task_struct结构体)
(通用叫法 各种系统用来描述进程的各个部分都可以称为 进程)
2.会用一系列的数据结构,把多个进程进行有效的组织,随时方便进行遍历,查找,汇总数据
通常是使用双向链表的方式进行组织的(针对Linux来说)
使用双向链表来组织的时候
1)在查看进程的链表本质上就是在遍历整个链表
2)创建一个进程就是创建了一个pcb结构体,并插到链表上
3)销毁一个进程就是把pcb结构体从链表上删除并释放
pcb中的信息:
1.pid进程的标识:同一个系统上,同一时刻,每个进程的pid一定都是不同的
如:有时候运行的QQ音乐.exe,实际上可能会涉及到多个进程
2.内存指针:表示了该进程对应的内存资源
内存资源里存从.exe可执行程序中加载过来的指令和数据
指令:二进制的指令 都是在程序员开发这个程序的时候最终编译的结果(也就是程序员写代码的逻辑)
数据:在执行这些指令时 会产生一些数据,要保存一些中间的数据
3.文件描述符:
和硬盘资源有关
硬盘是硬件,应用程序一般不会触碰到硬件这一层的
实际上是操作系统抽象成文件这样的概念,程序操作的是文件,文件实际上是存储在硬盘上的
每一个进程都会有一个“文件描述符表”来记录,当前进程正在使用那些文件
操作系统打开文件就会产生一个“文件描述符”就像文件身份标识一样,当然知识在进程内部生效
同时 使用文件标识符(类似于数组),把文件描述符给组织起来
fopen:先打开
fread:再调用
fwrite
fclose:最后关闭
4.PCB=>进到程调度相关的属性
1)状态:就绪状态:已经做好了在cpu上执行的准备
阻塞状态/睡眠状态:进程没有准备好调度到cpu上
2)优先级:系统在进行调度时 也不是完全公平,也会根据优先级的不同来决定时间分配的的权衡 就可以把系统资源调配到更重要的进程上了
3)上下文:这些进程是轮着上的 一次运行不完就要 保证下一次上cpu 运行的时候能够从上次运行到的位置的往后运行
4)记账信息:想当于一个统计信息
会统计每一个进程在cpu上执行了多久,执行了多少指令
是对于进程调度工作的一个兜底
小结:这些属性主要是直观的认识cpu 是怎么样进行调度的
三.虚拟地址空间=>进程的隔离性
每个进程都需要有一定的内存资源
(早期的操作系统就直接把物理内存直接分配给进程 就会带来一个严重的问题
只要有一个进程代码内部出现bug,就会影响其他的进程)
后来操作系统内就引入了"虚拟地址空间" 来解决上述问题
这样设定后 每个进程的有效的虚拟地址都是固定的范围
进程使用该虚拟地址都需要操作系统进行转化成物理地址的过程 这个转化过程中 都可以针对虚拟地址是否有效做一个校验
每个进程自己承担自己的问题 就不会影响到别人 提高了整个系统的稳定性
四.进程间的通信
进程之间用来通信的办法有很多 无论那个都需要找一个公共的区域 多进程都能访问的区域
使用公共区域来完成后面的交换
1)基于文件(公共区域硬盘)
2)基于网络(socket)(公共区域网卡)