操作系统(一)

一 什么是操作系统
操作系统(OS) 是管理计算机硬件与软件资源的程序 是计算机系统的内核与基石
在这里插入图片描述
操作系统的本质是运行在计算机上的软件程序
操作系统是为用户提供一个与系统交互的操作界面
操作系统分内核和外壳(我们可以把外壳理解成围绕着内核的应用程序 而内核可以理解为能直接操作硬件的程序)
关于内核多插一嘴:内核负责管理系统的进程、内存、设备驱动程序、文件和网络系统等等,决定着系统的性能和稳定性。是连接应用程序和硬件的桥梁。内核就是操作系统背后黑盒的核心。
在这里插入图片描述
二 系统调用
根据进程访问资源的特点 我们可以把进程在系统上的运行分为两个级别:
1 用户态:用户运行的进程可以直接读取用户程序的数据
2 系统态 可以简单的理解系统运行进程或程序几乎可以访问计算机的任何资源 不受限制
我们运行的用户程序中,凡是与系统态级别的资源有关的操作(如 文件管理 进程控制 内存管理)都必须通过系统调用方式向操作系统提出服务请求 并由操作系统代为完成
1 设备管理 完成设备请求或者释放 以及设备启动等功能
2 文件管理 完成文件的读写创建 撤销 阻塞 以及唤醒等功能
3 进程通信 完成进程间的消息传递 或者信号传递等功能
4 内存管理 完成内存分配 回收以及获取作业占用内存区大小及地址等功能

三 线程和进程
进程 是一个具有一定独立功能的程序在一个数据集上的一次动态执行,是操作系统进行资源分配和调度的一个单位 是应用程序运行的载体
进程是一种抽象的概念 从来没有统一的标准定义 进程一般有程序 数据集合和进程控制块三部分组成
程序 用于描述 进程要完成的功能 是控制进程执行的指令集
数据集合是程序在执行时 所需要的数据和工作区
程序控制块包含进程的描述信息和控制信息是进程存在的唯一标志
进程的特征:
动态性:进程是程序的一次执行过程 是临时性的 有生命期的 是动态产生的 动态消亡的
并发性:任何进程都可以同其他进行一起并发执行
独立性 进程是系统进行资源分配和调度的一个独立的单位
结构性 进程由程序 数据和进程控制块三部分组成
线程 :
线程是程序执行中一个单一的顺序控制流程 是程序执行流的最小单元 是处理器调度和分派的基本单位 一个 进程可以有多个线程 各个线程之间共享程序的内存空间(也就是所在进程的内存空间) 一个标准的线程有线程id 当前指令指针pc 寄存器和堆栈组成
进程由内存空间(代码数据 进程空间 打开的文件)和一个或者多个线程组成
进程和线程的区别:
线程是程序执行的最小单位 进程是操作系统分配资源的最小单位
2 一个进程由一个或多个线程组成 线程是一个进程中代码的不同执行路线
3 进程之间相互独立 但同一进程下的各个线程之间共享程序的内存空间及一些进程级别的资源
4 调度和切换 线程上下文切换比进程上下文切换要快的多
在这里插入图片描述
在这里插入图片描述
FAQ:为何不使用多进程而不是使用多线程
线程廉价 线程启动快退出比较快 对系统的冲击也比较小 而且线程彼此分享了大部分核心对象的拥有权 如果使用多重进程 但是不可预期且测试困难、
在这里插入图片描述
总结: 线程是进程划分成的更小的运行单位,一个进程在其执行的过程中可以产生多个线程。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
在这里插入图片描述
3,2进程的五大状态
1 创建状态(new)进程正在被创建 但尚未就绪状态
2 就绪状态 进程已处于准备运行状态 即进程获得了除了处理器之外的一切所需资源 一旦得到处理器资源 即可运行
3 运行状态(running) 进程在处理器上运行
4阻塞状态 又称等待状态 进程在等待某一件事而暂停运行等待某资源可用或者等待10 操作完成
5进程正在从系统中消失 可能是进程正在结束或其他原因中断
3,3进程间的通信方式
管道/匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信。
有名管道(Names Pipes) : 匿名管道由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了有名管道。有名管道严格遵循先进先出(first in first out)。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
信号(Signal) :信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生;
消息队列(Message Queuing) :消息队列是消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识。管道和消息队列的通信数据都是先进先出的原则。与管道(无名管道:只存在于内存中的文件;命名管道:存在于实际的磁盘介质或者文件系统)不同的是消息队列存放在内核中,只有在内核重启(即,操作系统重启)或者显示地删除一个消息队列时,该消息队列才会被真正的删除。消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取.比FIFO更有优势。消息队列克服了信号承载信息量少,管道只能承载无格式字 节流以及缓冲区大小受限等缺。
信号量(Semaphores) :信号量是一个计数器,用于多进程对共享数据的访问,信号量的意图在于进程间同步。这种通信方式主要用于解决与同步相关的问题并避免竞争条件。
共享内存(Shared memory) :使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
套接字(Sockets) : 此方法主要用于在客户端和服务器之间通过网络进行通信。套接字是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
线程间的通信方式
线程同步是两个或多个共享关键资源的线程的并发执行。应该同步线程以避免关键的资源使用冲突。操作系统一般有下面三种线程同步的方式:
互斥量(Mutex):采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问。比如 Java 中的 synchronized 关键词和各种 Lock 都是这种机制。
信号量(Semphares) :它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量
事件(Event) :Wait/Notify:通过通知操作的方式来保持多线程同步,还可以方便的实现多线程优先级的比较操
3,4 进程间的调度算法
1 先到先服务调度算法
先到先服务(FCFS)调度算法 : 从就绪队列中选择一个最先进入该队列的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用CPU时再重新调度。
短作业优先(SJF)的调度算法 : 从就绪队列中选出一个估计运行时间最短的进程为之分配资源,使它立即执行并一直执行到完成或发生某事件而被阻塞放弃占用CPU时再重新调度。
时间片轮转调度算法 : 时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称RR(Round robin)调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。
多级反馈队列调度算法 :前面介绍的几种进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程 。多级反馈队列调度算法既能使高优先级的作业得到响应又能使短作业(进程)迅速完成。,因而它是目前被公认的一种较好的进程调度算法,UNIX操作系统采取的便是这种调度算法。
优先级调度 :为每个流程分配优先级,首先执行具有最高优先级的进程,依此类推。具有相同优先级的进程以FCFS方式执行。可以根据内存要求,时间要求或任何其他资源要求来确定优先级。
四 操作系统内存管理基础
操作系统的内存主要负责内存的分配和回收函数 申请内存 free函数 释放内存
另外地址转换也是将逻辑地址转换成相应的物理地址等功能也是操作系统内存的事
分类:连续分配管理方式和非连续分配管理方式
1 块式管理远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。
页式管理 :把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。
段式管理 :页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多 。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段 MAIN、子程序段 X、数据段 D 及栈段 S 等。段式管理通过段表对应逻辑地址和物理地址。
段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说 段页式管理机制 中段与段之间以及段的内部的都是离散的。
快表和多级页表
在分页内存管理中,很重要的两点是:
虚拟地址到物理地址的转换要快。
解决虚拟地址空间大,页表也会很大的问题
为了解决虚拟地址到物理地址的转换速度,操作系统在 页表方案 基础之上引入了 快表 来加速虚拟地址到物理地址的转换。我们可以把块表理解为一种特殊的高速缓冲存储器(Cache),其中的内容是页表的一部分或者全部内容。作为页表的Cache,它的作用与页表相似,但是提高了访问速率。由于采用页表做地址转换,读写内存数据时CPU要访问两次主存。有了快表,有时只要访问一次高速缓冲存储器,一次主存,这样可加速查找并提高指令执行速度。
使用快表之后的地址转换流程是这样的:
根据虚拟地址中的页号查快表;
如果该页在快表中,直接从快表中读取相应的物理地址;
如果该页不在快表中,就访问内存中的页表,再从页表中得到物理地址,同时将页表中的该映射表项添加到快表中;
当快表填满后,又要登记新页时,就按照一定的淘汰策略淘汰掉快表中的一个页。
看完了之后你会发现快表和我们平时经常在我们开发的系统使用的缓存(比如 Redis)很像,的确是这样的,操作系统中的很多思想、很多经典的算法,你都可以在我们日常开发使用的各种工具或者框架中找到它们的影子。
多级页表
引入多级页表的主要目的是为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中。多级页表属于时间换空间的典型场景,具体可以查看下面这篇文章

总结
为了提高内存的空间性能,提出了多级页表的概念;但是提到空间性能是以浪费时间性能为基础的,因此为了补充损失的时间性能,提出了快表(即TLB)的概念。不论是快表还是多级页表实际上都利用到了程序的局部性原理,局部性原理在后面的虚拟内存这部分会介绍到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值