进程
概述:操作系统调度单位,进程使用cpu工作。
操作系统OS基本的任务执行单元、调度单位,可以被系统分配相应的资源(内存、CPU),可以完成执行特定的工作和任务,任何操作系统都有进程概念。
进程:执行任务。
调度单位不只进程一种。
进程是最小的分配资源的单位。
线程是最小的调度单位。线程不需要额外分配内存, 而进程是需要的。
进程需要额外分配资源。
现在的操作系统,都是多任务操作系统,很久以前是单任务的。
单任务:一个时刻只能干一件事。
处理器、硬盘、内存,同一时刻,只能给一个人,单任务操作系统的局限性,一个进程会占用系统的全部硬件资源,无法执行多任务。硬件水平有限。
这个进程用完切换个下一个进程。
软件是随着硬件变化的。软件再强也没用。
如果新的硬件,让一个进程使用,就太浪费了。
多任务、多进程,开发出来了。
多个进程多个单元能合理的使用硬件就行。
多任务操作系统设计核心:优化。
多任务操作系统:可以被多个进程,或多个线程使用,可用性更强。
有限的硬件可以被合理的使用,轮转之类的。
硬件资源有限的情况下,多个调度单位,如何合理分配和使用系统资源。
进程生存环境/系统形态
主要是逻辑抽象概念。
进程在系统中:进程创建之后,被分配空间,一个进程会被分配0-4G内存,这么多内存分为两块区域。
3-4G系统空间,内核层,或叫做,系统层。
0-3G用户层。
内核层
PCB
进程控制块,每个进程都是独一无二的,PCB就是身份证。
记录进程信息、进程数据。所有的都保存在这里。
什么能表示一个进程?PCB
PCB可以理解为一个结构体,存储了很多信息。
用户层
从高地址开始
命令行参数/环境变量
main(int argc, char** argv)这是命令行参数,pwd是环境变量,进程初始化的时候,需要用到环境变量,内置变量、内置数据,初始化的时候需要用到这个数据。
进程创建出来,默认有环境变量,进程默认使用系统的环境变量。
进程栈
保存临时的东西。
lib
静态库、共享库等等,称之为lib
堆空间
就是new的那种空间,手动开辟的内容。
BSS数据段
static静态变量,全局变量,分为初始化和未初始化,如果未初始化,则在BSS,就是定义了没初始化,如果初始化了,就在下面。
DATA数据段
存放已初始化的数据。
Text代码段
核心逻辑、代码
综上,就是0-3G的内容,几乎包含了所有的数据。
用户层是,执行核心层。
用户在用户层有权限,但是内核层没有权限,用户没开放。写了就是:段错误!强制杀死,访问受限。
用户层,允许读写。
0-4G就是x86,32位系统的分配,64是0-8-16T分层。
虚拟内存
一个进程怎么可能占4G这么多内存呢?
cpu核越多越好,内存越大越好,显卡高级gpu
内存一般就是4g、8g、16g
如果按照进程的系统形态来看,多少内存都不够消耗的。
因此,进程的系统形态,所占据的,是虚拟内存。
内存条上的内存,是物理内存。
进程分配的内存是虚拟内存。
每一个进程创建的时候,是虚拟内存。
但是实际上,虚拟内存和物理内存是有对应关系的。
因为,你即使再虚拟,你的这些东西还是真实存在的,加载也加载到物理内存里了,只不过小的很多。
最吃内存的是ui界面这种东西。
虚拟地址和物理地址的对应关系
每一个虚拟地址,都是一个指针,指向一个物理地址。
例如:进程栈,有一个地址,然后指向一个真实的物理地址。一一映射关系。
虚拟地址和物理内存的一一映射关系。
实际上物理内存也参与使用,但是有:交换技术
也就是说你的进程在使用的时候将这块物理地址进行使用,不用的时候交换出去。
交换技术满足了内存小的情况。
但是用的人多,即使有交换技术,也会很卡。
操作系统进程很多,映射关系很复杂,交给:内存管理器,去管理。
内存管理器有一张:虚拟内存映射表,来进行管理。
内核层和用户层都是有对应的物理地址的。
CPU——内存——磁盘——交换
每个进程都会分配0-4G,每个进程都会有自己的映射。
多进程不同的虚拟地址,指向的是相同的物理内存吗?
多进程用户层虚拟地址是否共享物理内存?
内存是会给不同的进程用的,但是使用,是轮转,不能同时使用。
一块内存是不可以被两个进程同时使用的,但是可以轮转使用。
用户层映射的物理地址,不允许多进程同时共享使用,会产生访问冲突。
注:用户层,不能共享,是独占,但是内核层,是可以共享的。
因为内核层是访问受限的,多个进程可以映射同一块内核层物理地址。
内核层,共享地址,多个进程指向相同的物理地址。
ipc进程间通信技术,完全依赖于内核层共享物理内存。
分时复用原则
多任务操作系统中的重要部分。
要想到:时间片。
操作系统核心处理单元CPU处理器,数量有限,如何让若干个调度单位合理使用CPU资源?
分时复用:将CPU的使用权,以时间片为单位,进行切割,而后多进程交换轮转占用CPU。
使用理由:CPU资源宝贵且有限,为了让多进程合理使用CPU,以时间片为单位进行切分,每个进程占用CPU一段时间。
这是多任务OS典型特征。
保存和恢复处理器现场
光有分时复用是不完整的,但是不能保证每个进程在一个时间片内处理完。
A进程用完时间片,B再用,B会不会影响A进程的配置或使用?
多任务操作系统的另一特性:保存和恢复处理器现场。
CPU由几个核心部件组成:控制器、计算器、译码器、寄存器,这几个是主要的。
寄存器:一个进程使用CPU,必须使用寄存器。但是寄存器数量有限,没有能力一个进程给一个。
x86单核cpu,可能寄存器就16个,存储运算过程、运算数据、运算地址,例如:eax,ebx,ecx,edx,eflag,edi,并不是说一个进程用一个,而是进程共用这16个。
进程AB都是对不同数据进行相同的操作,但是:变量计算,并不是原子操作,而是由多条指令完成的。
时间片暂时耗尽:软件中断。
例如a++一个操作,是由好几步组成:mov eax, 0x10; add eax; mov 0x10 eax;
如果时间片运行到进程A的add时中断了,那么会不会影响b的操作?
我们的eax里存了我们的运算过程。因此,必须解决这个问题。
多进程共用CPU资源(寄存器),寄存器中保存了执行过程,和中间数据,如果以为中断产生进程切换,其他进程使用寄存器,可能会破坏或覆盖掉A的运算过程。
为了避免这种事情,我们只需要保存运算过程,这就叫做:保存和恢复处理器现场。
这就是多任务操作系统的功能!
保存,保存在进程里。
每个进程由两个栈,另一个栈不在用户层,而是在内核层里的PCB里,每一个PCB都有一个内核栈里。
如果产生了时间片轮转终端,将现场保存在,PCB内核层的内核栈里。
反之,恢复的时候,从内核栈里取出现场,进行恢复现场。
进程状态转换
新生态、就绪态、运行态、阻塞态、终止态。
线程同步=线程安全。指的是加锁。
阻塞态有两种:挂起态,基本特征一致,阻塞可能被异常中断,但是挂起无法被中断。
挂起就是防中断的。psaux进行查看进程状态时,可以看到状态s,t。
r+前台运行态。ctrl+z控制挂起。
Linux还有两种新的状态:僵尸态、孤儿态。
多进程并发模型
并行、并发、串行。
并行:多核cpu,每个cpu运行一个进程,这就是并行。
多个进程,占用多个处理器,同时执行任务,物理并行。
并发:一个cpu,执行多个进程,时间片轮转,这就是并发。
多个进程分配轮转使用CPU,为轮转执行。
操作系统支持并行,但是一般都是并发,而且你选不了让谁并行并发。
串行:顺序执行。
多进程模型:
1、是完成同一个任务目标的,可以获取更多的系统资源,极快任务执行速度,缩短任务完成周期。
2、单进程模型可能产生阻塞挂起,任务无法推进,多进程模型可以调高任务执行的密集程度,比如有的进程阻塞了,我们还可以继续接上。因为我们完成的是同一目标。
现在一般都是多进程、或多线程混合使用。
多进程执行共有任务
多进程拷贝一个文件,提高拷贝速度
不同的进程做不同的事情。