路漫漫其修远兮,吾将上下而求索
目录
一、操作系统
操作系统的作用:
二、进程
1.进程的概念
2.进程管理
3.进程的结构体里有哪些属性(核心的)
三、并行和并发
四、内存分配
五、进程间通信
六、进程和线程
操作系统是一组做计算机资源管理的软件,常见的有Windows ,IOS,Android,Linux 等等
对上要配合软件,给软件提供一个稳定的运行环境
对下要管理硬件设备
进程是操作系统对每一个正在运行中的软件的一种抽象,可以把进程看过程序的一次运行。
进程是操作系统进行资源分配的基本单位!!!(包括 内存资源 硬盘资源 CPU资源)
描述一个进程:使用结构体/类来表示一个进程有哪些信息
组织一个进程:使用一定的数据结构,把这些结构体/对象放到一起
PCB:进程控制块
1.PID:进程中唯一的标识
2.内存指针:当前进程使用了哪一块内存 (标识使用了内存上的哪些资源)
3.文件描述表:进程每次打开一个文件,就会产生一个文件描述符(标识了这些被打开的文件),对应的一组文件描述符,组织起来放到一个顺序表中就是“文件描述表” (使用了硬盘上的哪些资源)
4.进程调度信息(CPU分配)
进程的状态: 一种是就绪态:已经准备好了,随时可以在CPU上运行
一种是阻塞态:目前还没准备好,不能在CPU上运行
进程的优先级:进程间的调度不一定是“公平的” 进程之间存在优先级,故优先执行谁取决于优先级(跟下面食堂谁便宜就先运行谁一样!!)
进程的上下文:记录这个进程执行了到了哪里的“记录”,当CPU执行一个进程,还没执行完,暂时离开了这个进程,就要把之前CPU执行到哪里了,执行的中间结果“存档”存档一下(将寄存器中存储计算的中间结果存到PCB),等CPU回来时,可以接着上次的执行(将PCB中的值恢复到寄存器中)继续执行进程。
进程的进账信息:统计当前进程在CPU上执行了多长时间,可以作为调度的参考(那个运行时间少就可以先运行这个)
并行:两个核心同时运行两个进程,两个进程同时运行
并发:一个核心,先运行进程A,运行一会再去运行进程B,运行一会再去运行进程C,来回切换着运行,只要切换的足够快,看起来就和“同时”运行一样
并发举例:比如说,你在学校非常喜欢吃食堂的三个窗口A B C 窗口的大叔大婶都喜欢你天天去吃他们窗口的饭,但是你觉得一直吃一个窗口太腻了,于是你排了一个时间表:一 三 五 吃窗口A(因为窗口A 最便宜)二 四 吃窗口B(这个第二便宜) 周六吃窗口C 周日就随便吃其他窗口的 这样换个维度来看!!
如果我是站在一天的维度来说,那我就是这一天我只吃一个窗口的
如果是站在一个星期,一个月的维度来看,那我就是在同时吃这三个窗口的!!
只要你切换的足够快,那么看起来就和“同时”一样(并发) 如果你一天同时吃了窗口A和窗口B这样就是(并行)了!!!
操作系统对内存的分配,采用的是空间模式,不同进程使用内存中的不同区域,相互之间互不干扰(使用虚拟地址)
举例:有两个进程A 和进程B 如果我们是采用的是真实的物理地址 如果我的进程A里面出错了,出现了野指针,这个野指针正好指向了进程B中的地址,这样两个进程就都坏掉了!!(这样及其不稳定)
所以我们的操作系统就使用了虚拟地址来解决这个问题
进程A 和进程B都使用了一段虚拟地址(0x00-0xff),在操作系统中有个专门的页表(用来映射虚拟地址)将其映射到真实的物理内存上,A B映射到不同的内存上,这个过程对于进程A B来说,他们本身是感知不到的
如果此时进程A中再出现野指针的情况,页表一检查,你操作的内存不在你的(0x00-0xff)这个范围內 ,页表就翻译不出来,就无法访问真正的物理地址。
有了页表的存在,一个进程就无法直接干预另一个进程的地址了,进程的独立性,大大提高了操作系统的稳定性!!
在隔离性的前提下,找到一个公共区域,两个进程都可以访问这一块,用来交换数据。
目前,主流操作系统提供的进程通信机制有如下:
1. 管道
2. 共享内存
3. 文件
4. 网络
5. 信号量
6. 信号
线程说白了,就是轻量化的进程
在操作系统中,创建/销毁/调度一个进程的成本和资源都是比较高的(主要体现在进程调度上)
比如说:系统要给一个进程分配内存
1.要先遍历一遍空闲内存的表,找到一个大小合适的空间来进行分配
2.当很多个进程都要分配内存的时候,还是得一个一个进行分配(这样开支就比较大了)
线程是轻量化的进程:
一个进程中有多个线程,约定每一个线程都是一个可以调度的独立的执行流(执行流之间都是并发的),同时这些线程(这个进程),公用一个进程的内存资源,这样对于线程来说所有的系统资源都已经分配好了,这样就省去了多次的资源分配!