更多精彩内容.....
🎉❤️博主の主页✨😘
操作系统
操作系统(operating system,简称OS)是管理计算机硬件与软件资源的计算机程序。
计算机系统由处理器、内存、磁盘、键盘、显示器、网络接口以及各种其他输入/输出设备组成。计算机是一个复杂的系统。如果每个程序员都需要掌握系统的所有细节,那就不可能再编写代码了。所以,计算机安装了一层软件,称为操作系统,它的任务是为用户程序提供一个更好、更简单、更清晰的计算机模型。
内核
内核,操作系统的核心,作为应用程序连接硬件设备的桥梁,应用程序只关心与内核交互,不用关心硬件的细节。
内核的能力:
- 进程调度:管理进程、线程,决定哪个进程、线程使用 CPU
- 内存管理:决定内存的分配和回收
- 提供文件系统:提供文件系统,允许对文件执行创建、获取、更新以及删除等操作
- 管理硬件设备:为进程与硬件设备之间提供通信能力
- 提供系统调用接口:进程可利用内核入口点(也称为系统调用)请求内核去执行各种任务
内核具有很高的权限,可以控制 CPU、内存、硬盘等硬件,而应用程序具有的权限很小,因此大多数操作系统,把内存分成两个区域:
CPU 可以在两种状态下运行:用户态和内核态,在用户态下运行时,CPU只能访问用户空间的内存;在内核态运行时,CPU既能访问用户空间也能访问内核空间。
系统调用
补全man:
sudo apt-get install manpages-dev glibc-doc manpages-posix manpages-posix-dev
如果你熟练man工具的话,那么你可能就知道,man指令是用于查看命令和程序的手册页,手册页(man pages)被分为多个部分,不同部分包含不同类型的文档。下面是常见的几个部分:
使用man man命令查看
1-用户命令(Executable programs or shell commands):可执行程序或shell命令
2-系统调用(System calls):内核提供的函数
3-库调用(Library calls):程序库中的函数
4-特殊文件(Devices and special files):通常位于/dev
5-文件格式和约定(File formats and conventions):如/etc/passwd
6-游戏(Games)
7-杂项(Miscellaneous):包括宏包和规范,如man(7),groff(7)
8-系统管理命令(System administration):通常只针对root用户
由于有些内容是多个文档共有的,所以我们可以使用man <section> <command>来查看特定部分的手册页,eg. man 1 ls将显示ls命令的用户命令部分,而不会默认打开其它部分的内容。
系统调用 :由操作系统实现并提供给外部应用程序的编程接口(Application Programming Interface,简称API)。是应用程序 和 系统 之间 数据交互的桥梁。调用的是内核提供的函数。那内核又是什么?在此之前我想问操作系统本质是什么?操作系统本质就是个程序、是个代码、是个软件,所以内核其实是操作系统提供的核心代码。那么内核提供的函数,用来干嘛或者说服务于谁?(答案是:服务于上层应用,因为内核其实是与硬件打交道的一段核心代码)。内核提供的函数是有限的,在linux2.6版本大约有270多个系统函数。现在根据发行版本和内核版本不同,常见范围大致在300-400个系统调用之间。
内核提供的函数更偏硬件操作,所以易用性差,但性能高。操作系统与用户交互是避免不了的,所以我们使用man查看一些系统调用时,我们会看到open,read,write等。但是,操作系统的源码中并没有这些所谓的open,read等函数,有的只是:sys_open,sys_read等,这些sys_做前缀的才是真正的系统调用,而我们使用man手册看到的是一个"假"系统调用,二者之间的区别就在于:open是sys_open的一层壳,这是操作系统为了保持神秘性,避免我们看到内核的代码而做的一层浅封装,其他的,像函数原型、实现代码都是一样的(或者说相似的更好一些)。所以严谨的称呼我们man手册看到的函数应该叫做:系统函数,而非系统调用。
下面给大家一个示意图来帮助大家理解C标准函数和系统函数调用关系,一个helloworld如何打印到屏幕:
还记得我们的虚拟空间地址模型吗:【Linux】虚拟空间布局模型&地址回填&数据段合并(万字详解)_linux 虚拟地址空间布局-CSDN博客
我们将这个图画的宽一点,然后倒过来,然后额外拓展一个硬件的空间,那么是不是就是我们上面画的图。我们编写的程序是用户级应用,存放在用户空间(0-3G)中,每一个硬件都对应着一个系统级的驱动。通过系统调用来让这个驱动发挥作用,而系统调用如何被用户使用呢?那就是使用操作系统封装好的系统函数。但我们一般都是使用用户自己定义的库函数来变着花样调用系统函数,从而发送各种的需求来获得相应的回应。使用C语言的我们当然是调用标准C库了。所以有了这个层次的流程分析,相必大家都能看懂上买的过程了。
以前我们的学习层面在0-3G里面,之后我们要学习的东西就是在内核空间也就是3-4G的那块空间的知识了。做好准备吧!挑战才刚刚开始。
系统调用是内核的入口,用户程序只在用户态下运行,如果需要进入内核空间,就需要通过系统调用,当应用程序使用系统调用时,会产生一个中断,CPU中断当前执行的用户程序,跳转到中断处理程序,也就是开始执行内核程序。内核处理完成后,主动触发中断,把CPU执行权限交回给用户程序。这里还有一个知识点,叫做"中断",中断是操作系统的一个机制。用户的权限要低于内核的权限,这是肯定的,。
我们在用户态处理事情的时候,内核态突然有一件急事,那操作系统肯定要先去处理内核态的事情,处理完再返回内核态。中断的处理流程:
此外,中断系统可以对中断进行优先级设置。高优先级的中断可以打断低优先级的中断。优先级管理确保系统能够及时响应最重要的事件。(这就是内核态的中断信号优先级大于用户态的中断信号的优先级)。
每学习一种机制,都要知道这个机制是干嘛的,也就是目的是什么,优势是什么?
- 响应性:中断机制使得操作系统能够即时处理事件,提高了系统的响应速度。
- 系统资源的有效利用:通过中断,CPU可以在等待I/O操作时进行其他计算任务,提高了系统的效率。
- 简化程序设计:程序员可以通过中断来处理复杂事件,减少了对轮询的需求,从而使设计更为简洁。
程序和进程
程序:使用编程语言编写的代码经过编译和链接处理,得到的计算机可以理解和执行的指令
进程:进程是正在执行程序的实例,是操作系统进行资源分配和调度的基本单位。在内核看来,进程是一个个实体,内核需要在它们之间共享各种计算机资源。例如内存资源,内核会在开始为进程分配一定大小的内存,并统筹该进程和整个系统对内存的需求,对这一分配进行跳转。程序终止时,内核会释放所有资源,供其他进程使用。
虚拟内存
进程中只能访问虚拟内存地址,操作系统会把虚拟内存地址翻译成真实的内存地址。这种内存管理方式,称为虚拟内存。
进程如果访问的是真实的物理地址,多个进程之间会互相干扰。例如一个程序在一个物理地址上写入了一个新值,可能将另一个程序在这个位置的内容擦掉,程序就会崩溃。
操作系统为每个进程分配一套独立的虚拟地址,每个进程访问自己的虚拟地址,互不干涉,操作系统会提供将虚拟内存地址和物理内存地址映射的机制。
并发
假设我们的计算机只有一个CPU,并且只有一个核心(core)
**并发:**一个时间段中有多个进程都处于已启动运行到运行完毕之间的状态。但任意一个时刻点上只有一个进程在运行。
现在有两件事等待处理,第一件事需要3s,第二件事需要2s,按照常理来说,我们就需要5s才能执行完这两件事。但是我们如何能在5s内(<=5s)执行完这两件事呢?三年级有个奥数题--统筹问题或者说是最优化问题:
【问题描述】妈妈让小明给客人烧水沏茶。洗水壶需要1分钟,烧开水需要15分钟,洗茶壶需要1分钟,洗茶杯需要1分钟。要让客人喝上茶,最少需要多少分钟?
【思路导航】经验表明,能同时做的事,尽量同时做,这样可以节省时间。水壶不洗,不能烧开水,因此洗水壶和烧开水不能同时进行。而洗茶壶,洗茶杯、拿茶叶与烧开水可以同时进行
【结果分析】根据以上分析,我们可以这样安排:先洗水壶1分钟,接着烧开水用15分钟,在烧水的同时洗茶壶、洗茶杯、拿茶叶,水开了就沏茶,共需要16分钟。
我们所说的并发就是类似于这样的一件事,CPU在执行程序时,最好是的就是读取磁盘,磁盘的读写速度是很慢的,如果CPU一直等到硬盘返回数据,CPU的利用率就会很低。所以,当进程从硬盘读取数据时,CPU不需要阻塞等待数据的返回,而去执行其他进程。当硬盘数据返回时,给CPU发送中断,CPU就可以回来继续执行了。
CPU可以通过交替执行程序管理多个进程,CPU在多个进程间快速切换,每个进程各运行几十或几百毫秒,在宏观上看就是多个进程在同时运行。但是,在任意一个瞬间,CPU都只运行一个进程。
感谢大家!