操作系统是计算机系统中的核心软件,它为计算机硬件提供管理和控制,为计算机软件提供稳定的运行环境和服务。操作系统也是软件、硬件、用户之间交互的中介,使用户更加方便地使用计算机
操作系统对下,要管理硬件设备
操作系统对上,要给软件提供稳定的运行环境
举例说明:计算机只能识别机器语言(二进制),用户是不会机器语言的,所有就没办法直接跟计算机进行交互。当用户需要用计算机的时候,又不会机器语言那咋办咧?此时就需要一个中间介,来间接与计算机进行交互
Windows操作系统:它是由微软公司开发的,广泛应用于个人电脑、服务器和移动设备等领域
macOS操作系统:它是由苹果公司开发的,主要应用于苹果电脑和移动设备
Linux操作系统:它是一种开源的操作系统,由全球的开发者共同开发和维护的,广泛应用于服务器、嵌入式系统和个人电脑等领域
......
应用程序和硬件设备,大家应该是比较了解的,此处我们就来介绍一下系统调用、操作系统内核、驱动程序:
系统调用:是操作系统提供给应用程序的一种接口,它允许应用程序请求操作系统的服务和资源。应用程序通过系统调用向操作系统发出请求,操作系统在收到请求后进行相应的处理,并将结果返回给应用程序(系统调用就是应用程序和操作系统之间的桥梁)
操作系统内核:操作系统内核是操作系统的核心部分,它是操作系统的主要组成部分之一,负责管理计算机硬件和软件资源。提供各种服务和功能,如进程管理、内存管理、文件系统、设备驱动等
驱动程序:硬件设备种类繁多、厂商各异,所有硬件厂商在开发硬件的同时会提供驱动,电脑装了对应的驱动,系统才能正确的识别硬件设备
一个正在运行的程序就是进程,没有运行的就不是进程,当我们双击一个程序就可以运行,那么此时它就是一个进程,可以通过 ctrl + alt + delete 打开任务管理器,去查看当前的进程,进程又称为任务
在操作系统中,每个进程都有自己的地址空间、内存、文件句柄、线程和其他系统资源。进程是操作系统中最基本的资源分配单位,它可以独立地运行、停止、暂停、恢复和终止。在多任务操作系统中,多个进程可以同时运行,操作系统通过调度算法来分配CPU时间片,使得每个进程都能得到一定的CPU时间,从而实现多任务并发执行。
进程是一个重要的“软件资源”,它是由操作系统内核负责管理的,管理方式主要采用:描述+组织
描述:描述都有哪些属性特征,采用C语言结构体来描述进程属性,把这个描述进程的结构体称为 PCB
组织:通过一定的数据结构,把多个这样的基本单位串起来
此时我们就知道了,创建一个进程,本质上就是创建了一个 PCB 这样的结构体对象,并把它插入到链表中。销毁一个进程,本质上就是把链表中的这个 PCB 节点删除掉
PCB(进程控制块)是操作系统用来描述进程特征的数据结构
PCB 中描述了以下进程的特征:
进程状态:描述了进程当前的状态,可以是就绪、运行、阻塞等。就绪状态表示进程已经准备好运行,等待 CPU 分配时间片;运行状态表示进程正在执行;阻塞状态表示进程被阻塞,等待某个事件发生。
程序计数器:记录了进程执行到的指令地址,用于实现进程的断点续传。当进程被中断或者切换到其他进程时,程序计数器保存了进程执行的当前状态,以便下次继续执行。
内存分配情况:记录了进程所占用的内存地址空间,包括代码段、数据段、堆栈段等。代码段存放程序的指令,数据段存放程序中使用的数据,堆栈段存放程序的运行时栈。
资源占用情况:记录了进程所占用的资源,如 CPU、内存、磁盘等,以及资源的占用情况。进程需要占用资源才能正常运行,如果资源不足或者被其他进程占用,就会导致进程阻塞或者失败。
进程优先级:描述了进程的优先级,用于实现进程调度。优先级高的进程会被优先调度,优先级低的进程则会被暂时忽略,等待更高优先级的进程执行完毕。
进程标识符:唯一标识了进程,用于区分不同的进程。每个进程都有一个唯一的 ID,可以通过 ID 来查找和管理进程。
进程控制信息:记录了进程的父进程、子进程、创建时间、运行时间等控制信息。父进程是创建该进程的进程,子进程是该进程创建的其他进程,创建时间是指进程被创建的时间,运行时间是指进程已经运行的时间。这些信息可以用于进程管理和调度。
操作系统对内存的管理主要包括内存分配、内存保护和内存回收三个方面:
内存分配:操作系统需要为每个进程分配一定的内存空间,以便进程能够运行。内存分配的方式通常有静态分配和动态分配两种。静态分配是在程序编译时确定内存分配大小,动态分配是在程序运行时根据需要动态分配内存空间。
内存保护:操作系统需要保护不同进程之间的内存空间,防止进程之间相互干扰。为此,操作系统通常采用虚拟内存技术,将物理内存划分为若干个虚拟内存页,每个进程都有自己的虚拟内存空间,相互之间不会干扰。同时,操作系统还可以通过访问权限控制,限制进程对内存的访问权限,防止进程越权操作。
内存回收:操作系统需要及时回收不再使用的内存空间,以便为其他进程分配更多的内存。内存回收的方式通常有手动回收和自动回收两种。手动回收是由程序员手动释放内存,自动回收是由操作系统自动回收不再使用的内存空间。
总之,操作系统对内存的管理是保证系统正常运行和资源利用的关键,需要合理分配、保护和回收内存空间,以便为进程提供良好的运行环境。
程序中所获得的内存地址,并非是真实的物理内存地址,而是经过一层抽象,虚拟出来的地址。
内存的编号就是地址,并且这个地址是真实地“物理地址”
内存的特性:随机访问,就也是可以访问内存上的任意地址的数据,速度都极快,时间都差不多。
针对进程使用的内存空间,进行“隔离”引入了虚拟地址空间。代码里不再直接使用真实的物理地址,而是使用虚拟的地址,由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。虚拟地址空间,主要就是为了避免进程之间的相互产生的影响。
如果操作系统内核发现当前这里的地址,超出了进程1的访问范围,此时就会直接向进程反馈一个错误。
那如果不引入虚拟地址呢?
如果不引入虚拟地址,当一个进程内存越界,就会影响到另一个进程
然而引入了虚拟地址,谁出 bug ,谁崩溃,其他进程不受影响
引入虚拟地址后,虽然进程之间进行了隔离,但是却又引入了新的问题:有时候,进程之间也是需要进行数据交互的,那如何进行数据交互呢?
引入虚拟地址后,进程之间通信需要通过操作系统的支持来实现
操作系统通常提供了以下几种进程间通信方式:
管道:管道是一种半双工的通信方式,只能用于具有亲缘关系的进程之间通信,如父子进程。管道是由操作系统内核创建的一个缓冲区,可以通过写入和读取管道来实现进程间通信。
消息队列:消息队列是一种基于消息的通信方式,可以用于不具有亲缘关系的进程之间通信。消息队列是由操作系统内核维护的一个消息队列,进程可以通过发送和接收消息来实现进程间通信。
共享内存:共享内存是一种高效的进程间通信方式,可以用于具有亲缘关系的进程之间通信。共享内存是由操作系统内核创建的一块内存空间,多个进程可以共享这块内存空间,通过读写共享内存来实现进程间通信。
信号量:信号量是一种基于计数器的进程间通信方式,可以用于多个进程之间的同步和互斥。信号量是由操作系统内核维护的一个计数器,进程可以通过对信号量进行操作来实现进程间通信。
套接字:套接字是一种基于网络的通信方式,可以用于不同主机之间的进程通信。套接字是由操作系统提供的一种通信接口,进程可以通过套接字进行网络通信。