操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。操作系统需要处理如管理与配置内存、决定系统资源供需的优先次序、控制输入设备与输出设备、操作网络与管理文件系统等基本事务。操作系统也提供一个让用户与系统交互操作的界面。
在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。
简单来说 应用软件与硬件并不直接沟通,而是加了一层操作系统去完成与硬件的联系。
现在主流两大操作系统 Windows和Linux 操作系统的核心就是内核。
计算机由各种外部硬件组成,而每个应用都要和这些硬件打交道,所以产生了内核作为连接应用与硬件的桥梁,应用程序只关心和内核交互,不用挂心硬件的细节。
由操作系统实现提供的所有系统调用所构成的集合即程序接口或应用编程接口(Application Programming Interface,API)。是应用程序同系统之间的接口。
简单来说每个接口都有自己功能,比如摄像头、打印机等的系统资源调用需要配备。
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。
假设两个程序同时对内存的一个位置写,就会出现替换、抹擦的现象。当然是不允许的,所以产生了虚拟内存,让每个进程独享自己的虚拟内存,互不干扰。这里每个进程都不能访问物理地址。至于虚拟内存最后怎么落在物理内存中对进程来说是透明的,操作系统帮我们都做好了。
内存内存分段(英语:Memory segmentation),一种电脑内存的管理技术,它将电脑的主内存分成许多区段(segment或sections)。当处理器要进行内存寻址时,会使用一个数值,这个数值包括了某个区段,以及偏移量(offset)。一个程式的目的档(Object file)中也会使用区段,让它们可以链结成执行档,并加载内存中执行。 段选择子和段内偏移量
虚拟地址中的段选择子会指向物理地址。
假若我们几个进程同时运行,占据了物理内存连续的一片,但是中间的进程停止,中间的内存空出来之后 其他的进程占用空间不会偏移补全,这样就造成了内存资源的浪费。
把处于等待状态(或在CPU调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来 这一来过程又叫换出 把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入
内存分段的好处就是能让内存出现连续的空间,但是空间碎片太大太多 内存交换的空间太大。
所以产生了内存分页。
内存分页是把整个虚拟和物理内存都分成诺干等份,每份叫做页。连续并且尺寸固定。虚拟地址和物理地址之间用页表映射,页表由操作系统管理。
如果内存空间不足,内存分页下,内存交换的效率会非常高。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
一旦排队的进程多了,对于有限的内存空间就是极大的考验,为了解决内存问题可以将一部分进程交换到磁盘中,这个进程就会处于挂起的状态。就有了七状态模型。
进程是如何去切换下一个进程的。
PCB 进程管理块。为了描述控制进程的运行,系统中存放进程的管理和控制信息的数据结构称为进程控制块(PCB Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录性数据结构。它是进程管理和控制的最重要的数据结构,每一个进程均有一个PCB,在创建进程时,建立PCB,伴随进程运行的全过程,直到进程撤消而撤消。
选择哪一个进程在操作系统中完成,这一动作成为进程的调度。
进程的调度有很多的原则。参考一下博客。
(52条消息) 进程调度_smile_zhangwj的博客-CSDN博客_进程调度
每个进程的用户地址空间都是独立的,一般而言是不能相互访问的,但内核空间是每个进程都共享的,所以进程之间通信必须通过内核。
1.管道(| 管道符) 单工 只能写或者读。
管道在内核当中是块缓冲区, 供进程进行读写, 交换数据。 如:ps aux | grep xxx
管道的通信方式效率低,不适合进程间频繁的交换数据。
2.消息队列
比如A进程要给B进程发送消息,只需要放到队列里,B进程再去队列里读取。
消息队列是双工的,大家都可以往消息队列上发送消息,也可以从消息队列上接收消息。
但是进程在用户空间,消息队列在内核空间 每次交换数据需要数据拷贝(将用户空间的数据拷贝到内核空间)。
3.共享内存
因为消息队列的不足,产生了共享内存,将两个进程的虚拟地址映射到相同的物理内存中。
假如两个进程同时操作一个数据,就会发生错误,虽然速度很快但是就会不太安全。
4.信号量
信号量就是一个整型的计数器,来分辨进程对于数据的处理状态。
5.信号( kill -9)(进程通信里唯一的异步通信机制)
信号的数据结构一般就是一个数字。我们可以使用kill -l 查看所有信号。需要设置监听处理,收到特定的信号执行特定的指令处理。
6.socket
前面所有的通信都是用于一台主机上的通信,那想要跨网络与不同主机上的进程之间通信,就需要socket通信了,实际上Socket通过新不仅可以跨网络与不同的主机的进程间通信,还可以在用主机上进程间通信。
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
在同一个进程中,线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有自己的一套独立的寄存器和栈,这样就可以确保线程的控制流是相对独立的。
寄存器(寄存器的功能是存储二进制代码,它是由具有存储功能的触发器组合起来构成的。一个触发器可以存储1位二进制代码,故存放n位二进制代码的寄存器,需用n个触发器来构成。)
Linux系统中有一句话为 一切皆文件。
文件系统是操作系统负责管理持久数据的子系统,就是负责把用户的文件存到磁盘中。持久化操作
linux文件系统会为文件分配两个数据结构:索引节点和目录项。 目录项是缓存到内存当中的因为读取的次数比较多,这样可以提高效率。 索引节点用来记录文件的元信息,被存在磁盘中,是文件的唯一标识。
磁盘 读写的最小单位是扇区,每个扇区只有512B大小,假如每次读写这么小的单位效率很低。所以文件系统把多个扇区组成了一个逻辑块,每次读写的最小单位就是逻辑块 也叫数据块。linux中的逻辑块每个为4KB也就是8个扇区。大大提高了读写效率。
内存中的目录项的分层,指向子目录项 同时会有索引节点指针指向磁盘中的索引节点。
文件系统的种类有很多,而操作系统希望用户操作不同的文件系统都用同一套接口,所以在用户层和文件系统中间加入了中间层,虚拟文件系统。(VFS)定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员每次操作文件系统都只需要访问统一的接口。
与内存管理一样,为了方便对磁盘的管理,文件的逻辑地址也被分为一个个的文件块,于是文件的逻辑地址就是逻辑块号和块内地址,用户通过逻辑地址来操作文件,操作系统负责完成逻辑地址与物理地址的映射。
设备管理是说我们鼠标点一下或者键盘按一下,操作系统发生了什么?
为了屏蔽设备之间的差异我们有个设备叫设备控制器(属于硬件 不属于操作系统)。cpu连接接口
在设备控制器中有三类寄存器,分别是状态寄存器、命令寄存器、数据寄存器。
另外输入输出设备分为两大类,如块设备和字符设备。块设备传输的数据量太大所以设立的数据缓冲区,当到达一定的量在输出或者输入。为了减少对设备的操作次数。
那么CPU是如何与这些寄存器进行通信的。
cpu通过i/o向设备控制器的三个寄存器发送和接收消息。
设备驱动器才是属于操作系统的范畴。
虽然设备控制器屏蔽掉了设备之间的差异,但设备管理器中不同硬件的寄存器模式不同,所以软件用设备驱动器去屏蔽设备管理器的差异。