进程的概念
进程,用大白话来说,就是正在跑的程序.
我们打开Windows系统的任务管理器:
这时,我们看到的都是进程.
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
程序是一个可执行文件,是静态的. 运行一个程序,就会把可执行文件中的数据和指令,加载到内存中,并让cpu去执行这里的指令,动态的运行起来,这就是进程.
可执行程序占用了硬盘资源.而进程会消耗cpu资源,内存,硬盘,网络带宽...
进程的管理
一台正在运行的计算机是包含很多进程的,这就需要去管理进程!
- 描述: 会使用一个结构体来记录一个进程里面的属性,也就是PCB(Process Control Block).
- pid进程的标识:
在同一个系统上,同一时刻,每个进程的pid一定都是不同的.
2. 内存指针:
最主要存储了从可执行文件中加载过来的指令和数据,还有一些运行过程中的中间结果之类的.
3. 文件描述符表:
每个进程都会有一个"文件描述符表"来记录,当前这个线程在使用哪些文件,包括(fopen,fread,fwrite,fclose).
操作系统打开一个文件,就会产生一个"文件描述符",使用文件描述符表组织起来.
- 组织: 会使用一系列的数据结构,把多个进程进行有效的组织,随时方便进行遍历,查找.
在Linux中,是使用双向链表来组织的.
进程的调度
进程是需要在cpu上执行指令的.
- 并行: 同一时刻,两个进程,同时运行在两个cpu逻辑核心上.
- 并发: 两个进程,在一个cpu逻辑核心上,由于cpu切换进程速度极快,在微观上,这辆进程是串行执行的.宏观上,这俩进程就是同时执行的.
由于感知不到是那种方式调度,并且这两种调度方式宏观上体现的效果都是一样的,通常也会用"并发"来指并行和并发.
PCB中关于进程调度有4个相关的属性(描述了进程的cpu资源的使用):
- 状态:
就绪状态: 一个进程已经随时做好了在cpu上执行的准备.
阻塞状态: 进程还没有准备好被调度到cpu上.
还有一些别的状态,这里不11列举了.
- 优先级:
系统在给进程进行调度的时候,会根据优先级的不同,来决定时间分配的权衡.
就可以把系统资源分配给更重要的进程上了.
- 上下文:
对于操作系统来说,所记录的上下文就是进程在执行过程中,cpu的寄存器中对应的数据.
这些寄存器,有些会存中间数据,有些会存特定意义的数据,这些寄存器会在进程离开cpu时,在寄存器中保存好.下次该进程再次进入cpu时,进程就和上次执行的状态一模一样了.(就是存档了)
- 记账信息:
它会统计每个进程在cpu都执行多久了,执行了多少指令了,相对于是对进程调度进行兜底.
虚拟地址空间
虚拟地址,并非是在物理内存中真是存在的地址,而只是在该进程内存在.
在不同的进程中,可以存在相同的虚拟地址,但是实际对应的只是不同的物理地址.
在虚拟地址和物理地址之间,操作系统可以灵活的进行切换.
这个概念有点抽象,我画个图出来:
比较简略…
这样设定后,每个进程的虚拟地址都是固定范围.
进程使用该虚拟地址的内存,都需要操作系统进行转换成物理地址的过程.这个转换过程中,就可以针对虚拟地址是否有效做出一个校验.
有了虚拟地址空间,进程就有了"独立性",一个进程无法直接访问和修改其它进程的虚拟地址空间的内容,进一步强化了系统的"稳定性".
进程间通信
虽然我们通过虚拟地址空间把进程隔离开了,但是还是需要让进程之间产生配合与联系.
那就是在多个进程都能够访问到的区域,借助公共区域来完成数据的交换.(我也没有深入学习,就不写上了)
结语
在本文中,了解了什么是进程,进程是如何管理的,依靠PCB进行进程调度,还有什么是虚拟地址空间的概念,在下一个博客中,将会学习线程,是一个非常重要的概念.
家人们多多支持!