一、计算机硬件组成
名称 | 分类 | 功能 |
---|---|---|
控制器 | 组合逻辑控制器和微程序控制器 | 计算机的指挥系统,用来控制计算机其他组件的运行,相当于人类的大脑 |
运算器 | 并行、串行 | 进行算术运算和逻辑运算 |
存储器 | 内存 | 存储数据,断电数据会消失 |
外存 | 存储数据,断电数据不会消失 | |
输入输出(I/O) | 人机交互类外部设备,存储设备等 | 控制输入和输出 |
cpu=运算器+控制器
CPU、内存(主存储器)以及其他I/O设备都由一条系统总线(bus)连接起来并通过总线与其他设备通信,如图所示:
(注:我们编写的程序一定是要运行于计算机硬件之上,而站在硬件的角度,与运行程序有关的三大核心硬件为CPU、内存、硬盘。
程序最先是存放于硬盘中的,程序的运行是先从硬盘把代码加载到内存中,然后cpu是从内存中读取指令运行。)
总结来说:
cpu是人的大脑,负责控制全身和运算(通常将运算器和控制器合称为中央处理器(Central Processing Unit,CPU)。其中运算器用来主要负责程序运算与逻辑判断,控制器则主要协调各组件和各单元的工作,所以CPU的工作主要在于管理和运算。可以说计算机的大脑就是CPU,它从内存中**取指令->解码->执行,**然后再取指->解码->执行下一条指令,周而复始,直至整个程序被执行完成。) 内存是人的记忆,负责临时存储 硬盘是人的笔记本,负责永久存储 输入设备是耳朵或眼睛或嘴巴,负责接收外部的信息存入内存 输出设备是你的脸部(表情)或者屁股,负责经过处理后输出的结果以上所有的设备都通过总线连接,总线相当于人的神经
举个例子:
上课开始,老师讲课,学生听课,老师是程序员,学生是计算机,学生的器官都是计算机各部分组成
1.你通过耳朵接收老师讲的知识->输入
2.通过自己的神经,将接收的数据存入自己的内存/短期记忆(总线、内存)
3.光听不行,你还需要反应/处理老师讲的知识,于是你的大脑/cpu从短期记忆里取出知识/指令,分析知识/指令,然后学习知识/执行指令 (cpu取指、分析、执行)
4.你通过作业或者说话输出你学到的结果
5.你想要永久将知识保存下来,只能拿出一个笔记本,把刚刚学会的知识都写到本子上,这个本子就是硬盘(磁盘)
既然CPU的重点在于进行运算和判断,那么要被运算与判断的数据是从哪里来的?CPU读取的数据都是从主存储器(内存)来的!主存储器内的数据则是从输入单元所传输进来!而CPU处理完毕的数据也必须先写回主存储器中,最后数据才从主存储器传输到输出单元。
在超大规模集成电路构成的微型计算机中,往往将CPU制成一块具有特定功能的芯片,称为微处理器,芯片里边有编写好的微指令集,我们在主机上的所有操作或者说任何软件的执行最终都要转化成cpu的指令去执行,如输入输出,阅读,视频,上网等这些都要参考CPU是否内置有相关微指令集才行。如果没有那么CPU无法处理这些操作。不同的CPU指令集不同对应的功能也不同,这就好比不同的人脑,对于大多数人类来说,人脑的结构一样,但是大家的智商都有差别。
CPU按照指令集可以分为精简指令集CPU和复杂指令集CPU两种,区别在于前者的指令集精简,每个指令的运行时间都很短,完成的动作也很单纯,指令的执行效能较佳;但是若要做复杂的事情,就要由多个指令来完成。后者的指令集每个小指令可以执行一些较低阶的硬件操作,指令数目多而且复杂,每条指令的长度并不相同。因为指令执行较为复杂所以每条指令花费的时间较长,但每条个别指令可以处理的工作较为丰富。
x86架构64位
x86架构
x86是针对cpu的型号或者说架构的一种统称,详细地讲,最早的那颗Intel发明出来的CPU代号称为8086,后来在8086的基础上又开发出了80285、80386…,因此这种架构的CPU就被统称为x86架构了。
由于AMD、Intel、VIA所开发出来的x86架构CPU被大量使用于个人计算机上面,因此,个人计算机常被称为x86架构的计算机!
程序员开发出的软件最终都要翻译成cpu的指令集才能运行,因此软件的版本必须与cpu的架构契合,举个例子,我们在MySQL官网下载软件MySQL时名字为:
Windows(x86,32-bit),ZIP Archive
(mysql-5.7.20-win32.zip)
我们发现名字中有x86,这其实就是告诉我们:该软件应该运行在x86架构的计算机上。
**64位 **
cpu的位数指的是cpu一次性能从内存中取出多少位二进制指令,64bit指的是一次性能从内存中取出64位二进制指令。
在2003年以前由Intel所开发的x86架构CPU由8位升级到16、32位,后来AMD依此架构修改新一代的CPU为64位,到现在,个人计算机CPU通常都是x86_64的架构。
cpu具有向下兼容性,指的是64位的cpu既可以运行64位的软件,也可以运行32位的软件,而32位的cpu只能运行32位的软件。这其实很好理解,如果把cpu的位数当成是车道的宽,而内存中软件的指令当做是待通行的车辆,宽64的车道每次肯定既可以通行64辆车,也可以通信32辆车,而宽32的车道每次却只能通行32辆车
二、操作系统
1.概念:操作系统是应用软件与硬件之间的一个桥梁,是协调、管理、控制计算机硬件与应用软件资源的控制程序
2.操作系统的四个特征:并发、共享、虚拟、异步
并发性(Concurrence):并发是指两个或多个时间在同一时间间隔内发生。操作系统的并发性是指操作系统中同时存在多个运行着的程序。引入进程的目的是使程序能够并发执行。并发和共享是操作系统最基本的两个特征。并发(同一时间间隔),并行(同一时刻)。
并发是指一段时间内,宏观上有多道程序在同时执行。并行是指在每一时刻,单处理器的环境下实际仅能有一道程序执行。并行性需要硬件的条件支撑,例如:多流程或是多处理器
共享(Sharing):资源共享即共享,是指系统中的资源可供内存中的多个并发执行的进程共同使用,可以分为两种资源共享方式:
1:互斥共享方式:一段时间内仅允许一个进程访问该资源,这样的资源被称为临界资源或是独占资源,例如打印机等等
2:同时访问方式:一段时间内允许多个进程访问该资源,只是一个请求分几个时间片间隔完成的效果和连续完成的效果相同,例如磁盘设备等等
虚拟(Virtual):指把一个物理上的实体变为若干个逻辑上的对应物,有时分复用技术:处理器的分时共享,空分复用技术:虚拟存储器 异步(Asynchronism):在多道程序环境下,允许多个程序并发执行,但是由于资源有限,进程的执行不一定是连贯到底,而是走走停停。3.主要功能
处理器管理:在多道程序的情况下,处理器的分配和运行都以进程(或线程)为基本单位,因而对处理器的管理可以分配为对进程的管理 存储器管理:包括内存分配、地址映射、内存保护等等 文件管理:计算机中的信息都是以文件的形式存在的,操作系统中负责文件管理的部分被称为文件系统,文件管理包括文件存储空间的管理、目录管理和读写保护等等 设备管理:主要任务是完成用户的I/O请求,包括缓冲管理、设备分配、虚拟设备等等4.核心态与用户态
核心态:就是执行一些特权指令。
用户态:在核外的用户程序不允许执行特权指令。
操作系统内核工作在核心态,而用户程序工作在用户态。系统不允许用户程序实现核心态的功能,而它们又必须使用这些功能。因此,需要在核心态建立一些“门”,以便实现从用户态进入核心态。在实际操作系统中,CPU运行上层程序时唯一能进入这些“门”的途径就是通过中断或异常。发生中断或异常时,运行用户态的CPU会立即进入核心态,这是通过硬件实现的。
例如用一个特殊的寄存器的一位来表示CPU所处的工作状态,0表示核心态,1表示用户态。若要进入核心态,则只需将该位置0即可。
在操作系统这一层面上,我们关心的是系统核心态和用户态的软件实现与切换。
下面是由用户态转向核心态的例子:
用户程序要求操作系统的服务,即系统调用。发生一次中断。
用户程序中产生了一个错误状态。 用户程序中企图执行一条特权指令。 从核心态转向用户态由一条指令实现,这条指令也是特权命令,一般是中断返回指令。5.后备队列、就绪队列、阻塞队列
后备队列:放在外部辅助存储中,这里放的是作业,还不能叫做线程,进程。 就绪对列:当线程、进程获取资源后,但还没有获取CPU时,就放进就绪队列 阻塞队列:当线程阻塞时,就进入这个状态。6.进程和线程
名称 | 进程 | 线性 |
---|---|---|
含义 | 进程是程序的一次执行过程,是一个动态概念,是程序在执行过程中分配和管理资源的基本单位 | 线程是CPU调度和分派的基本单位,它可与同属一个进程的其他的线程共享进程所拥有的全部资源 |
联系 | 一个进程可以有多个线程,但至少有一个线程 | 线程是进程的一部分,一个线程只能属于一个进程 |
包含关系 | 没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻量级进程 | |
区别 | 1.根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位 | |
2.在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小 | ||
3.所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行) | ||
4.内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。 |
7.进程和线程在多核cpu,多cpu中的运行关系
操作系统会拆分CPU为一段段时间的运行片,轮流分配给不同的程序。对于多cpu,多个进程可以并行在多个cpu中计算,当然也会存在进程切换;对于单cpu,多个进程在这个单cpu中是并发运行,根据时间片读取上下文+执行程序+保存上下文。同一个进程同一时间段只能在一个cpu中运行,如果进程数小于cpu数,那么未使用的cpu将会空闲。
多线程的概念主要有两种:一种是用户态多线程;一种是内核态多线程,对于内核态多线程(java1.2之后用内核级线程),在操作系统内核的支持下可以在多核下并行运行;
对于多核cpu,进程中的多线程并行执行。
对于单核cpu,多线程在单cpu中并发执行,根据时间片切换线程。
同一个线程同一时间段只能在一个cpu内核中运行,如果线程数小于cpu内核数,那么将有多余的内核空闲。
8**.进程的常见状态?以及各种状态之间的转换条件?**
就绪:进程已处于准备好运行的状态,即进程已分配到除CPU外的所有必要资源后,只要再获得CPU,便可立即执行。 执行:进程已经获得CPU,程序正在执行状态。 阻塞:正在执行的进程由于发生某事件(如I/O请求、申请缓冲区失败等)暂时无法继续执行的状态。9.分页和分段
名称 | 分页 | 分段 |
---|---|---|
目的 | 页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页是出于系统管理的需要而不是用户需要。 | 段是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了更好地满足用户的需要。 |
长度 | 页的大小固定而且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,是由机器硬件实现的,因而在系统中只能有一种大小的页面。 | 段的长度不固定,决定于用户所编写的程序,通常由编译程序在对程序进行编译时,根据信息的性质来划分。 |
地址空间 | 页的地址空间是一维的,即单一的线形地址空间,程序员只要利用一个记忆符就可以表示一个地址。 | 作业地址空间是二维的,程序员在标识一个地址时,既需要给出段名,又需给出段内地址。 |
碎片 | 分页有内部碎片无外部碎片 | 分段有外部碎片无内部碎片 |
绝对地址 | 处理器使用页号和偏移量计算绝对地址 | 处理器使用段号和偏移量计算绝对地址 |
管理方式 | 对于分页,操作系统必须为每个进程维护一个页表,以说明每个页对应的的页框。当进程运行时,它的所有页都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个空闲页框列表。 | 对于分段,操作系统必须为每个进程维护一个段表,以说明每个段的加载地址和长度。当进程运行时,它的所有短都必须在内存中,除非使用覆盖技术或虚拟技术,另外操作系统需要维护一个内存中的空闲的空洞列表。特别的,当使用虚拟技术是,把一页或一段写入内存时可能需要把一页或几个段写入磁盘 |
共享和动态链接 | 不容易实现 | 容易实现 |
10.进程同步
进程同步的主要任务:是对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
同步机制遵循的原则:
(1)空闲让进;
(2)忙则等待(保证对临界区的互斥访问);
(3)有限等待(有限代表有限的时间,避免死等);
(4)让权等待,(当进程不能进入自己的临界区时,应该释放处理机,以免陷入忙等状态)。
11.死锁(Java面试必问)
定义:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。更加规范的定义:“集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。”竞争的资源可以是:锁、网络连接、通知事件,磁盘、带宽,以及一切可以被称作“资源”的东西。例如,在某一个计算机系统中只有一台打印机和一台输入 设备,进程P1正占用输入设备,同时又提出使用打印机的请求,但此时打印机正被进程P2 所占用,而P2在未释放打印机之前,又提出请求使用正被P1占用着的输入设备。这样两个进程相互无休止地等待下去,均无法继续执行,此时两个进程陷入死锁状态。
产生原因: 系统资源的竞争系统资源的竞争导致系统资源不足,以及资源分配不当,导致死锁。
进程运行推进顺序不合适进程在运行过程中,请求和释放资源的顺序不当,会导致死锁。
四个必要条件互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。
** 死锁的避免与预防** 1. 死锁避免死锁避免的基本思想:系统对进程发出的每一个系统能够满足的资源申请进行动态检查,并根据检查结果决定是否分配资源,如果分配后系统可能发生死锁,则不予分配,否则予以分配,这是一种保证系统不进入死锁状态的动态策略。
如果操作系统能保证所有进程在有限时间内得到需要的全部资源,则系统处于安全状态否则系统是不安全的。
安全状态是指:如果系统存在 由所有的安全序列{P1,P2,…Pn},则系统处于安全状态。一个进程序列是安全的,如果对其中每一个进程Pi(i >=1 && i <= n)他以后尚需要的资源不超过系统当前剩余资源量与所有进程Pj(j < i)当前占有资源量之和,系统处于安全状态则不会发生死锁。
b.不安全状态:如果不存在任何一个安全序列,则系统处于不安全状态。
下面我们来通过一个例子对安全状态和不安全状态进行更深的了解
如上图所示系统处于安全状态,系统剩余3个资源,可以把其中的2个分配给P3,此时P3已经获得了所有的资源,执行完毕后还能还给系统4个资源,此时系统剩余5个资源所以满足(P2所需的资源不超过系统当前剩余量与P3当前占有资源量之和),同理P1也可以在P2执行完毕后获得自己需要的资源。
如果P1提出再申请一个资源的要求,系统从剩余的资源中分配一个给进程P1,此时系统剩余2个资源,新的状态图如下:那么是否仍是安全序列呢那我们来分析一下
系统当前剩余2个资源,分配给P3后P3执行完毕还给系统4个资源,但是P2需要5个资源,P1需要6个资源,他们都无法获得资源执行完成,因此找不到一个安全序列。此时系统转到了不安全状态。
2.死锁预防我们可以通过破坏死锁产生的4个必要条件来 预防死锁,由于资源互斥是资源使用的固有特性是无法改变的。
破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。 破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。 启动计算机在计算机的主板上有一个基本的输入输出程序(Basic Input Output system)
BIOS就相当于一个小的操作系统,它有底层的I/O软件,包括读键盘,写屏幕,进行磁盘I/O,该程序存放于一非易失性闪存RAM中。
启动流程
1.计算机加电
2.BIOS开始运行,检测硬件:cpu、内存、硬盘等
3.BIOS读取CMOS存储器中的参数,选择启动设备
4.从启动设备上读取第一个扇区的内容(MBR主引导记录512字节,前446为引导信息,后64为分区信息,最后两个为标志位)
5.根据分区信息读入bootloader启动装载模块,启动操作系统
6.然后操作系统询问BIOS,以获得配置信息。对于每种设备,系统会检查其设备驱动程序是否存在,如果没有,系统则会要求用户按照设备驱动程序。一旦有了全部的设备驱动程序,操作系统就将它们调入内核。然后初始有关的表格(如进程表),穿件需要的进程,并在每个终端上启动登录程序或GUI
参考博客:
https://blog.csdn.net/misayaaaaa/article/details/73087967
https://www.cnblogs.com/linhaifeng/p/6523843.html#4462371
https://blog.csdn.net/qq_32100465/article/details/95730268