操作系统的相关知识

1. 操作系统基础

1.1 什么是操作系统?

  1. 操作系统是管理计算机软硬件资源的一个程序,是计算机的基石。举例:你电脑上的程序就是通过操作系统来访问计算机上的CPU和硬盘资源的;
  2. 屏蔽了硬件的复杂性,相当于是硬件的使用负责人
  3. 操作系统的内核是操作系统的核心,主要负责硬件设备的管理、系统内存的管理、文件系统的管理。是软件和硬件之间的桥梁,决定着系统的性能和稳定性。

1.2 什么是系统调用?

进程在系统上运行有两种级别,首先是用户态,其次是系统态,前者可以直接获取用户程序运行的数据,而后者几乎可以访问计算机上的所有资源。当我们使用计算机的时候运行的程序基本上都是运行在用户态,但是当我们需要访问系统态级别的资源的时候,就必须向操作系统提出请求了,这就需要使用到系统调用了。系统调用可以分为以下几类:

  1. 设备管理:完成设备的请求释放
  2. 文件管理:完成文件的读、写、删除
  3. 进程控制
  4. 进程通信
  5. 内存管理:完成内存的分配、回收以及获取作业占用内存区大小和地址等功能

2. 进程和线程

2.1 进程与线程的区别

线程相当于更小的进程,一个进程可以有多个线程,从JVM角度讲,他们共享进程中的堆和方法区,有自己私有的虚拟机栈、本地方法栈以及程序计数器,他们最大的区别就在于,进程绝对是相互独立,而线程会相互影响,线程执行开销小,但不利于资源的管理,而进程正好相反。

2.2 进程有几种状态

进程有五种状态:
创建状态、就绪状态、等待状态、阻塞状态、结束状态,这几点和线程很像,线程多了一个等待超时状态。
在这里插入图片描述

2.3 进程间的通信方式

  1. 管道/匿名管道(Pipes):用于具有亲缘关系的父子进程间或者兄弟进程间的通信,只存在于内存中的文件
  2. 有名管道(Names Pipes):有名管道以磁盘的方式存在,克服了匿名管道只能亲属进程之间通信的缺点,可以实现本机任意两个进程之间的通信,严格遵循FIFO(First in First out),它存在于实质的磁盘介质或者文件系统中。
  3. 信号:用于通知进程某个事件已经发生
  4. 消息队列:消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。不同的是,消息队列只存在于内核中,只有在内核重启或者显式的删除一个消息队列时才能将其真正删除,他在读取的时候不一定要遵循先进先出的原则,也可以按照消息的类型读取,比FIFO更具有优势。消息队列克服了信号承载信息量少,管道智能承载无格式字节流以及缓冲区大小受限的问题。
  5. 信号量:是一个计数器,用于处理多个进程对共享资源访问时的同步问题。
  6. 共享内存:使得多个线程访问同一块内存空间,不同的进程可以及时看到对方金成中对共享数据的更新。这是一种比较理想的通信方式,但是需要一些一些同步操作,如信号量和互斥锁。
  7. 套接字:用于客户端与服务端之间进行网络通信。是支持TCP/IP协议的网络基本操作单元,就是通信双方的一种约定,用套接字中的相关函数来完成通信过程。

2.4 线程间的同步方式

线程冲突主要是两个或者多个线程在请求资源时的并发执行,用于解决一些关键性的冲突,主要有以下三种解决方案:

  1. 互斥量:如Java的synchronized关键字以及各种锁都是这个机制
  2. 信号量:允许多个线程同时来访问一个资源,但是需要控制同一时刻访问该资源的最大线程量。
  3. 事件:通过通知操作的方式来保持多线程同步

2.5 进程调度算法

  1. 先到先服务算法
  2. 短作业调度算法
  3. 时间片轮转算法
  4. 多级反馈队列算法(目前公认比较好的算法)
  5. 优先级调度

3. 操作系统的内存管理

3.1 主要是做什么?

负责内存空间的分配与释放,还有地址转换,主要是将逻辑地址转换称为物理地址

3.2 常见的内存管理机制

主要分为连续分配管理方式和非连续分配管理方式,前者主要有块式管理,指为一个用户程序分配一个连续的内存空间,后者主要有页式管理和段式管理,匀速用户程序工作在离散或者不连续的内存空间。

  1. 块式管理:将内存分为固定大小的块,每个块中只含一个进程。这种方式很浪费内存,因为一般的用户程序用不了这么大的一块空间,那块中剩下没用的部分就成了碎片;
  2. 页式管理:就是将内存分的更细了,提高了内存的利用率,减少了碎片,通过页表来对应逻辑地址和物理地址;
  3. 段式管理:这里给段赋予了实际的意义,每个段定义了自己的逻辑信息,例如,主程序段MAIN,子程序段X、数据段D以及栈段S等。通过段表对应
  4. 段页式管理:先把主存分为若干段,再把段分为若干页,所以段与段之间以及段内部都是离散的。这个结合了段式管理和页式管理的优点。

3.3 快表和多级页表

在页表管理机制中有两个很重要的概念:快表和多级页表,这两个东西分别解决了虚拟地址到物理地址需要快速转换的问题以及虚拟地址所占空间大,页表也会很大的问题。
快表:我们可以把快表理解成一种快速缓冲器(cache),其中的内容是页表的一部分或者全部内容。作为页表的cache,它的作用与页表是类似,只是提高了访问的速率。原先采用页表做地址转换的时候,读写数据时CPU要访问两次主存。有了快表,有时只需要访问一次高速缓存器一次主存就行,大大提高了指令运行的速度。

其流程为:

  • 根据虚拟地址中的页号查快表;
  • 如果该页在快表中,直接从快表中读取响应的物理地址;
  • 如果该页不在快表中,那么就只能去访问内存中的页表,找到物理地址,同时将其映射到快表中
  • 当快表满的的时候,按照一定的规则淘汰掉表中的一个页。

多级页表:多级页表指的就是不用把所有的页表都一直放在内存中占用过多的空间,特别是那些不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型例子。

通过观察可以发现上面两个概念是互补的,多节页表因为需要花费更多时间,所以就有快表来节省一部分时间。

3.4 分页机制和分段机制的共同点和区别

共同点

  1. 两者都是为了提升内存利用率,减少内存碎片;
  2. 两者都是离散分配内存的方式,但是每个页和每个段中的内容是连续的。
    不同点
  3. 页的大小是固定的,而端的大小是不固定的取决于当前运行的程序
  4. 分页仅仅是为了满足内存分配的需要,而分段每一段是逻辑信息的单位,比如有主程序段、数据段、栈段等,能够更好的满足用户的需求。

3.5 物理地址与虚拟地址

物理地址:加载到内存地址寄存器中的地址,内存单元的真正地址。在前端总线上传输的内存地址都是物理内存地址,编号从0开始一直到可用物理内存的最高端。
虚拟地址:CPU所生成的地址。逻辑地址是内部和编程使用的、并不唯一。你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址(偏移地址),不和绝对物理地址相干。

3.6 CPU寻址方式,为什么需要用到虚拟地址?

虚拟寻址,通过内存管理单元 Memeory Management Unit, MMU将虚拟地址翻译成物理地址,才能访问到真实的物理内存。
其具体寻址过程如下:系统会给CPU一个逻辑地址,通过CPU中MMU的分段单元能够产生线性地址,然后再请求MMU中的分页单元可以找到其物理地址。

逻辑地址 ----> | 分段单元 | ----> 线性地址 ----> | 分页单元 | ----> 物理地址
在这里插入图片描述

为什么需要用到虚拟地址
在没有虚拟地址之前程序都是用的直接访问物理地址,这样就会让物理地址所有存储单元都暴露给使用者,第一容易造成操作系统的崩溃,其次还不能同时运行多个程序,因为第二个程序可能会把第一个程序使用过的内存单元给覆盖掉。

虚拟地址访问内存的优势?
(直接背)

  • 程序可以使用一系列相邻的虚拟地址来访问物理内存中不相邻的大内存缓冲区
  • 程序可以使用一系列虚拟地址来访问大于可用物理内存的内存缓冲区。当物理内存的供应量变小时,内存管理器会将物理内存页(通常大小为 4 KB)保存到磁盘文件。数据或代码页会根据需要在物理内存与磁盘之间移动
  • 不同线程使用的虚拟地址彼此隔离。一个进程中的代码无法更改正在由另一进程或操作系统使用的物理内存。

4. 虚拟内存

4.1 什么是虚拟内存?

  1. 虚拟内存可以帮助我们电脑再运行程序的时候,可以让程序所拥有的内存远远超过超过电脑的物理内存;
    这是怎么实现的呢?比如你的内存条是256M,你的程序却要创建一个2G的数据区,那么不是所有数据都能一起加载到内存(物理内存)中,势必有一部分数据要放到其他介质中(比如硬盘),待进程需要访问那部分数据时,在通过调度进入物理内存。所以,虚拟内存是进程运行时所有内存空间的总和,并且可能有一部分不在物理内存中,而物理内存就是我们平时所了解的内存条。

虚拟内存地址和物理内存地址的映射?

假设你的计算机是32位,那么它的地址总线是32位的,也就是它可以寻址00xFFFFFFFF(4G)的地址空间,但如果你的计算机只有256M的物理内存0x0x0FFFFFFF(256M),同时你的进程产生了一个不在这256M地址空间中的地址,那么计算机该如何处理呢?回答这个问题前,先说明计算机的内存分页机制。对虚拟内存地址空间(32位为4G)分页产生页(page),对物理内存地址空间(假设256M)分页产生页帧(page frame),这个页和页帧的大小是一样大的,所以呢,在这里,虚拟内存页的个数势必要大于物理内存页帧的个数。在计算机上有一个页表(page table),就是映射虚拟内存页到物理内存页的,更确切的说是页号到页帧号的映射,而且是一对一的映射。但是问题来了,虚拟内存页的个数 > 物理内存页帧的个数,岂不是有些虚拟内存页的地址永远没有对应的物理内存地址空间?不是的,操作系统是这样处理的。操作系统有个页面失效(page fault)功能。操作系统找到一个最少使用的页帧,让他失效,并把它写入磁盘,随后把需要访问的页放到页帧中,并修改页表中的映射,这样就保证所有的页都有被调度的可能了。这里就和前面的当物理内存供应量小的时候将物理内存页保存到磁盘文件这就是处理虚拟内存地址到物理内存的步骤。

虚拟内存地址的大小是与地址总线位数相关,物理内存地址的大小跟物理内存条的容量相关。

  1. 此外虚拟内存为每个进程提供了一个一致的、私有的地址空间,它让每个进程产生了一种自己在独享主存的错觉,因为每个进程都拥有一片连续的内存空间,这样会更加有效地管理内存并减少出错。
    说到底,虚拟内存还是采用时间换空间的概念,用 CPU 的计算时间,页的调入调出花费的时间,换来了一个虚拟的更大的空间来支持程序的运行。

4.2 局部性原理

局部性原理是虚拟内存技术的基础,正是因为程序运行具有局部性原理,才可以只装入部分程序到内存就开始运行。

局部性原理表现在以下两个方面:

  1. 时间局部性:如果程序中的某条指令一旦执行,不久以后还会被再次执行;如果某些数据被访问过,不久以后该数据可能会被再次访问。(背一下)取决于程序中存在的循环操作。
  2. 空间局部性:旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内。
    时间局部性是通过**将近来使用的指令和数据保存到高速缓存存储器(因为将来还可能用到)**中,并使用高速缓存的层次结构实现。空间局部性通常是使用较大的高速缓存,**并将预取机制集成到高速缓存控制逻辑中(因为将来可能直接会访问到周围的存储单元)**实现。虚拟内存技术实际上就是建立了 “内存一外存”的两级存储器的结构,利用局部性原理实现髙速缓存。

4.3 问到虚拟存储器指的就是虚拟内存

4.4 虚拟内存的技术实现

主要有三种方式:

  1. 请求分页存储管理:建立在分页管理的基础上,为了支持虚拟存储器(虚拟内存)而增加了请求调页功能和页面置换功能。请求分页是目前最常用的一种实现虚拟存储器的方法。请求分页存储管理系统中,在作业开始运行之前,仅装入当前要执行的部分页即可运行。假如在作业运行的过程中发现要访问的页面不在内存,则由处理器通知操作系统按照对应的页面置换算法将相应的页面调入到主存,同时操作系统也可以将暂时不用的页面置换到外存中。
  2. 请求分段存储管理:和上面基本上一样的,把页换成段
  3. 请求段页式存储管理
    实现上面的管理方式一定都需要:
  • 虚拟地址到物理地址之间的转换
  • 一定容量的内存和外存
  • 页面中断,也就是从外存中调相应的页面到内存中来

4.5 区分一下页式管理和请求页式管理的区别

请求分页存储管理建立在分页管理之上。他们的根本区别是是否将程序全部所需的全部地址空间都装入主存,这也是请求分页存储管理可以提供虚拟内存的原因。

4.6 页面置换算法

首先我们需要了解什么情况下需要用到页面置换算法,当我们访问的页不在主存,需要操作系统将其调入主存进行访问的时候,这种情况叫做缺页中断。而当主存中没有空闲的页帧的时候,我们就需要选择让一个页帧失效,然后再将我们从外存中调入的页放到里面。这个时候选择让哪个页帧失效就是我们的页面置换算法。
主要有以下几种:

  1. 先进先出法(FIFO)
  2. 最近最久未使用(LRU)
  3. 最少使用置换法(LRU)

5.Linux系统

5.1 inode介绍

硬盘的最小存储单位是扇区(Sector),块(block)由多个扇区组成。文件数据存储在块中。块的常见的大小是4kb,约为8个连续的扇区(每个扇区存储512字节)。一个文件可能会占用多个block,但是一个block中只能存储一个文件的内容。

虽然,我们将文件存储在了块(block)中,但是我们还需要一个空间来存储文件的 元信息 metadata :如某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等。这种 存储文件元信息的区域就叫 inode,译为索引节点:i(index)+node。 每个文件都有一个 inode,存储文件的元信息。

简单来说:inode 就是用来维护某个文件被分成几块、每一块在的地址、文件拥有者,创建时间,权限,大小等信息。

简单总结一下:

inode :记录文件的属性信息,可以使用 stat 命令查看 inode 信息。
block :实际文件的内容,如果一个文件大于一个块时候,那么将占用多个 block,但是一个块只能存放一个文件。

5.2 Linux文件类型

Linux 支持很多文件类型,其中非常重要的文件类型有: 普通文件,目录文件,链接文件,设备文件,管道文件,Socket 套接字文件等。

普通文件(-) : 用于存储信息和数据, Linux 用户可以根据访问权限对普通文件进行查看、更改和删除。比如:图片、声音、PDF、text、视频、源代码等等。
目录文件(d,directory file) :目录也是文件的一种,用于表示和管理系统中的文件,目录文件中包含一些文件名和子目录名。打开目录事实上就是打开目录文件。
符号链接文件(l,symbolic link) :保留了指向文件的地址而不是文件本身。
字符设备(c,char) :用来访问字符设备比如硬盘。
设备文件(b,block) : 用来访问块设备比如硬盘、软盘。
管道文件(p,pipe) : 一种特殊类型的文件,用于进程之间的通信。
套接字(s,socket) :用于进程间的网络通信,也可以用于本机之间的非网络通信

5.3 Linux目录树

所有可操作的计算机资源都存在于目录树这个结构中,对计算资源的访问,可以看做是对这棵目录树的访问。
Linux 的目录结构如下:
Linux 文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:
在这里插入图片描述
常见目录说明

  • /bin: 存放二进制可执行文件(ls、cat、mkdir 等),常用命令一般都在这里;
  • /etc: 存放系统管理和配置文件;
  • /home: 存放所有用户文件的根目录,是用户主目录的基点,比如用户 user 的主目录就是/home/user,可以用~user 表示;
  • /usr : 用于存放系统应用程序;
  • /opt: 额外安装的可选应用程序包所放置的位置。一般情况下,我们可以把 tomcat 等都安装到这里;
  • /proc: 虚拟文件系统目录,是系统内存的映射。可直接访问这个目录来获取系统信息;
  • /root: 超级用户(系统管理员)的主目录(特权阶级o);
  • /sbin: 存放二进制可执行文件,只有 root 才能访问。这里存放的是系统管理员使用的系统级别的管理命令和程序。如 ifconfig 等;
  • /dev: 用于存放设备文件;
  • /mnt: 系统管理员安装临时文件系统的安装点,系统提供这个目录是让用户临时挂载其他的文件系统;
  • /boot: 存放用于系统引导时使用的各种文件;
  • /lib : 存放着和系统运行相关的库文件 ;
  • /tmp: 用于存放各种临时文件,是公用的临时文件存储点;
  • /var: 用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,比方说各种服务的日志文件(系统启动日志等。)等;
  • /lost+found: 这个目录平时是空的,系统非正常关机而留下“无家可归”的文件(windows 下叫什么.chk)就在这里。

5.4 Linux基本命令

5.4.1 目录切换命令

  • cd usr进入usr路径
  • cd ..放回上一层目录
  • cd /回到系统根目录
  • cd ~回到用户主目录
  • cd -切换到上一个操作所在目录

5.4.2 增删改查

目录的增删改查
  • mkdir 目录名称 增加目录
  • ls- l/ll 查看目录信息
  • find 目录 参数 1)列出当前目录及子目录下所有的文件和文件夹:find .2)/home目录下查找以.txt 结尾的文件名:find /home -name "*.txt",忽略大小写:find /home -iname "*.txt"3)当前目录及子目录下查找所有以.txt结尾和pdf结尾的文件:
    find . -name "*.txt" -o -name "*.pdf"
  • mv 目录名称 新目录名称 重命名
  • mv 目录名称 目录的新位置 移动目录的位置
  • cp -r 目录名称 目录拷贝的目标位置 复制粘贴
  • rm -rf 目录 删除目录
文件的操作命令
  • touch 文件名称 新建文件
  • cat 文件名称 查看文件
  • 修改文件:vim 文件------>进入文件----->命令模式------>按i进入编辑模式----->编辑文件 ------->按Esc进入底行模式----->输入:wq/q!
  • rm -rf 文件:无论删除什么都最好用这个删除
压缩文件的操作命令
  • 打包文件:tar -zcvf 打包压缩后的文件名 要打包压缩的文件

z:调用 gzip 压缩命令进行压缩 c:打包文件 v:显示运行过程 f:指定文件名

  • 解压压缩包:tar -xvf 压缩文件,其中x代表解压
Linux的权限命令

通过ls -l来查看某个目录下的文件或目录的权限
在这里插入图片描述
第一列的内容的信息解释如下:
在这里插入图片描述
chmod u=rwx,g=rw,o=r aaa.txt:修改权限
chmod +x aaa.txt:添加权限

用户管理
  • useradd 选项 用户名:添加用户账号
  • userdel 选项 用户名:删除用户帐号
  • usermod 选项 用户名:修改帐号
  • passwd 用户名:更改或创建用户的密码
  • passwd -S 用户名 :显示用户账号密码信息
  • passwd -d 用户名: 清除用户密码
Linux用户组的管理
  • groupadd 选项 用户组 :增加一个新的用户组
  • groupdel 用户组:要删除一个已有的用户组
  • groupmod 选项 用户组 : 修改用户组的属性
网络通信命令
  • 查看当前系统的网卡信息:ifconfig,注意Windows中有一个ipconfig是用来查看tcp/ip的相关配置的,作用和ifconfig是差不多的
  • 查看与某台机器的连接情况:ping
  • 查看当前系统的端口使用:netstat -an
其他常用命令
  • pwd: 显示当前所在位置(print work directory)
  • sudo + 其他命令:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
  • grep 要搜索的字符串 要搜索的文件 --color: 搜索命令,–color 代表高亮显示
  • ps -ef/ps -aux: 这两个命令都是查看当前系统正在运行进程,两者的区别是展示格式不同。如果想要查看特定的进程可以使用这样的格式:ps aux|grep redis (查看包括 redis 字符串的进程),也可使用 pgrep redis -a。也可以使用top来查看进程:top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况

注意:如果直接用 ps((Process Status))命令,会显示所有进程的状态,通常结合 grep 命令查看某进程的状态。

  • kill -9 进程的pid: 杀死进程(-9 表示强制终止。)先用 ps 查找进程,然后用 kill 杀掉
  • shutdown: shutdown -h now: 指定现在立即关机;shutdown +5 “System will shutdown after 5 minutes”:指定 5 分钟后关机,同时送出警告信息给登入用户。
  • rebootreboot: 重开机。reboot -w: 做个重开机的模拟(只有纪录并不会真的重开机)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值