Linux学习总结
理解操作系统,了解系统实际运行的情况,能够更好的理解程序的运行。首先理解操作系统需要理解为什么需要操作系统。操作系统的存在是为了提供一些便利。第一,通过抽象,抽象出来硬件,统一硬件的管理,提供给上层一个抽象接口,屏蔽下面的硬件的使用。让我们上层应用开发者可以更简单的使用和掌握。第二,提供一个中间层,隔离上层开发者对底层的误用,通过这个的操作系统的隔离,避免了应用程序员的为所欲为,也一定程度保护了底层,减少错误的产生。既然操作系统作为一个承上启下的一层,需要进行功能的抽象。这些抽象主要包括对内存的抽象,也就是内存的管理,提供了对文件系统的抽象。对设备的管理,统一不同设备的使用。对进程的管理,让每一个程序感觉像自己使用整个操作系统一样,在一定程度上也简化了进程模型的设计。为了达到这些目的,也就是支持这些的使用,我们需要提供一些方法和手段来进行设计。这就是中断的作用和用处。因为计算机整体架构遵循冯诺依曼体系,就是包括五大部件,计算单元,控制单元,输入设备,输出设备,存储器。整体的思想是指令存储的思想,就是不断地从内存取指令然后执行,一个无限的循环。中断为何能够起到这么大的作用呢?其实就是因为一个程序的执行会记录需要的内容,保证程序执行的顺利,这些状态的存储都是通过一系列的寄存器记录。只要通过记录保存这些功能部件的状态就能恢复起来向没有发生中断一样。中断这个功能就起到了很大的作用。
关于虚拟内存的使用,由于物理内存的限制,我们无法做到加载一个程序的全部到内存中,并且一个程序的执行也不需要刚开始就加载所有的内容到物理内存,可以一边执行,一边加载。这就引入了虚拟内存的概念,通过该概念的思想,我们将每个进程分配同样的内存空间,都包括,数据段,代码段,栈区,堆区。这样统一了每个进程的分布,另一方面我们也可以通过运行时加载我们的需求。我们使用的地址都是虚拟地址,这最后只有转换成物理地址才能使用,这就需要一个转换功能的实现,并且通过一些缓存的技术来达到速度的匹配。当我们需要一个页面的时候首先看是否在内存中存在,如果不存在就引发缺页中断,这样就不需要全部一次性加载,节省了空间,并且能让更多的程序驻留在内存。每个页需要寻址,这样就引入了页表和多级页表,为了进行地址的查询,linux采用多级页表可以支持很大的内存空间。成功加载完成后就是进行执行,这样就引入进程的抽象概念,将运行大的程序抽象成进程,对进程的管理包括进程的创建,进程的终止,进程的阻塞和唤醒,还有进程的切换。进程在linux中主要使用进程控制块进行统一的管理,这里面包括进程的所有信息,是一个庞大的数据结构。进程的创建主要通过复制进行实现,然后修改进程的信息,完成新进程的创建,也就是采用fork()函数。进程创建之后会反悔两次,实际上是一分为二,一个父进程,一个子进程,然后他们分别返回。有了进程之后需要完成进程的切换,这些就需要操作系统的调度,我们可以采用不同的调度算法,比如简单的时间片轮转等等。进程切换的实现主要靠中断的作用,通过中断保存现场信息。首先关中断,然后保存断电,中断服务程序的寻址,然后执行中断服务程序,恢复现场和屏蔽字开中断,中断返回,这就可以进行进程之间的不断切换。完成类似于进程并行的效果。执行完程序,如何进行数据的持久化呢?这就是Linux的文件管理的作用,linux将文件组织成一个层次化的树型结构,并且要屏蔽掉不同文件系统的影响,于是就是一个虚拟的文件系统,在这个虚拟文件系统中,未不同的文件系统提供了通用的接口抽象,这样程序就不需要关注底层具体文件系统的实现,只需要调用接口的使用就行了。Linux文件类型有很多,比如普通文件,目录文件,链接文件,设备文件,管道文件,套接字文件,通过ls-a我们就可以查看具体的信息。文件有很多的权限,包括文件权限,文件的属性,这些存在不同的区块中,一些存储在inode节点,一些存在超级块中。超级快是整个文件系统的第一块空间,包括整个文件系统的基本信息。Inode块也称为文件索引节点,记录文件的属性,数据块是用来记录文件的内容。那么不同进程如何使用文件呢。我们通过文件描述符表来定位文件。文件描述符就是这个表的索引,每个表项都有一个指向一个打开文件的指针。我们可以通过文件指针进行对文件的读写,然后这些调用底层的设备进行实际的读写的使用。针对设备管理,设备管理在/dev目录,数据从应用程序或者操作系统传递到设备文件,然后设备文件传递给设备驱动程序,驱动程序再发给物理设备。
浙公网安备 33010602011771号