计算机核心基础

一、 计算机的组成

控制器:是计算机的指挥系统,负责控制所有其他硬件的运行
运算器:实现算术运算和逻辑运算的部件
存储器:存取数据
     内存:基于电工作,内存里存放的数据都是电信号
         特点:存取速度快,断电数据丢失 ---------------------->人脑的记忆功能
     外存:比如磁盘,基于磁工作,磁盘里存放的是磁信号
         特点:存取速度远远慢于内存,断电数据依旧存在--------------->人的笔记本
输入设备input:是向计算机输入信息(程序、数据、声音、文字、图形、图像等)的设备。常见的输入设备有:键盘、鼠标、图形扫描仪、触摸屏、条形码输入器等等。外存储器也是一种输入设备。
输出设备output:主要有显示器、打印机和绘图仪等。外存储器也当作一种输出设备。
控制器+运算器 ---> cpu -------- 相当于人类的大脑

二、与运行程序有关的三大核心硬件

CPU(控制器+运算器)    内存        硬盘

cup是人类的大脑,负责控制全身的运算
内存是人的记忆,负责临时存储
硬盘是人的笔记本,负责永久存储
输入设备是耳朵或眼睛或嘴巴,负责接收外部的信息存入内存
输出设备是你的脸部(表情)或者屁股,负责结果处理后的结果
以上所有的设备都要通过总线连接,总线相当于人的神经

三、程序运行的步骤

1、先将程序由硬盘读入内存--> 程序启动/加载过程
2、cup从内存取出程序的指令来运行-->程序的运行
ps:程序运行过程中产生的数据一定是最先存放于内存中的,关键数据一定要由内存刷入硬盘永久保存下来

 四、计算机硬件解析

cpu x86-64bit
一个CPU4核8线程

CPU包括运算逻辑部件、寄存器部件和控制单元部件等,英文名Logic components ; 运算逻辑部件,可以执行定点或浮点算数运算操作、移位操作以及逻辑操作,也可以执行地址运算和转换。

内存
    内存是计算机的重要部件之一。它是外存与cup进行沟通的桥梁,计算机中所有的程序的运行都在内存中进行。
    内存性能的强弱影响计算机整体的发挥水平。
    内存也称内存储器和主存储器,它用于暂时存放CPU中的运算数据,与硬盘等外部存储器交换的数据
    虚拟内存:许多计算机支持虚拟机制,该机制使计算机可以运行大于物理内存的程序,方法是将正在使用的程序放入内存执行,而暂时不需要执行的程序放到磁盘的某块地方,这块地方成为虚拟内存,
        在Linux中成为swap,这种机制的核心就在于快速的映射内存地址,由cpu中的一个部件负责,成为存储器管理单元(Memory Management Unit MMU) PS:从一个程序切换到另外一个程序,成为上下文切换,缓存和MMU的出现提升了系统的性能,尤其是上下文切换。 硬盘: 固态 固态硬盘是由控制单元和固态存储单元组成的硬盘。固态硬盘的介质分为两种,一种是采用闪存作为介质,另外一种是采用DRAM作为存储介质,目前绝大多数固态硬盘采用的是闪存介质。 固态存储单元负责存储数据,控制单元负责读取、写入数据。由于固态硬盘没有普通硬盘的机械结构,也不存在机械硬盘的寻道问题,因此系统能够在1ms的时间内对任意位置单元都完成输入、输出操作。 机械 机械硬盘即是温彻斯特硬盘,其部件主要由:盘头、磁头、盘片转轴及控制电机、磁头控制器、数据转换器、接口、缓存等几个部分组成。 磁头可沿盘片的半径方向运动,加上盘片每分钟数千转的高速旋转,磁头就可以定位在盘片的指定位置上进行数据的读写操作。 而混合硬盘则是机械硬盘
+固态硬盘相结合,比较好的兼顾了容量与速度,虽然在读写速度上远不如真正的固态硬盘。

五、buffer写缓冲区

buffer 写缓冲区
    缓冲区(buffer),它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区,显然缓冲区是具有一定大小的。

六、cache读缓存

cache 读缓存
    cache的核心作用是加快取用的速度。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了。加快了数据取用的速度。

七、编程语言分类

机器语言:直接用二进制指令编写程序
    缺点:1、二进制指令难以记忆,极易出错
         2、编程的复杂度极高

汇编语言:用英文标签取代二进制指令去编写程序
    缺点:1、编程的复杂度依然很高

高级语言:用人类能理解的表达方式去编写程序
    高级语言编写的程序计算机无法直接理解,必须要经过翻译才可以,按照翻译的方式不同
    高级语言又分为两种:
    1、编译型(需要编译器,相当于用谷歌翻译,如c、go):执行速度快,调试麻烦
    2、解释型(需要解释器,相当于同声传译,如shell、python):执行速度慢,调试方便

八、小整数池

 Python实现int的时候有个小整数池。
  为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池
  范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收
  小整数池目的:节省内存,提高执行效率

九、内存回收:垃圾回收机制GC

详情参见:https://blog.csdn.net/xiongchengluo1129/article/details/80462651

引用计数

    Python垃圾回收主要以引用计数为主,分代回收为辅。引用计数法的原理是每个对象维护一个ob_ref,用来记录当前对象被引用的次数,也就是来追踪到底有多少引用指向了这个对象,当发生以下四种情况的时候,该对象的引用计数器+1
    1、对象被创建  a=14
    2、对象被引用  b=a
    3、对象被作为参数,传到函数中   func(a)
    4、对象作为一个元素,存储在容器中   List={a,”a”,”b”,2}
  
与上述情况相对应,当发生以下四种情况时,该对象的引用计数器-1
    1、当该对象的别名被显式销毁时  del a
    2、当该对象的引别名被赋予新的对象,   a=26
    3、一个对象离开它的作用域,例如 func函数执行完毕时,函数里面的局部变量的引用计数器就会减一(但是全局变量不会)
    4、将该元素从容器中删除时,或者容器被销毁时。

当指向该对象的内存的引用计数器为0的时候,该内存将会被Python虚拟机销毁


引用计数法有很明显的优点:
    1、高效
    2、运行期没有停顿 可以类比一下Ruby的垃圾回收机制,也就是 实时性:一旦没有引用,内存就直接释放了。不用像其他机制等到特定时机。实时性还带来一个好处:处理回收内存的时间分摊到了平时。
    3、对象有确定的生命周期
    4、易于实现
    
原始的引用计数法也有明显的缺点:
    1、维护引用计数消耗资源,维护引用计数的次数和引用赋值成正比,而不像mark and sweep等基本与回收的内存数量有关。
    2、无法解决循环引用的问题。A和B相互引用而再没有外部引用A与B中的任何一个,它们的引用计数都为1,但显然应该被回收。

标记清除

『标记清除(Mark—Sweep)』算法是一种基于追踪回收(tracing GC)技术实现的垃圾回收算法。它分为两个阶段:第一阶段是标记阶段,GC会把所有的『活动对象』打上标记,第二阶段是把那些没有标记的对象『非活动对象』进行回收。

标记清除算法作为Python的辅助垃圾收集技术主要处理的是一些容器对象,比如list、dict、tuple,instance等,因为对于字符串、数值对象是不可能造成循环引用问题。Python使用一个双向链表将这些容器对象组织起来。

不过,这种简单粗暴的标记清除算法也有明显的缺点:
    清除非活动的对象前它必须顺序扫描整个堆内存,哪怕只剩下小部分活动对象也要扫描所有对象。

分代回收

分代回收是一种以空间换时间的操作方式,Python将内存根据对象的存活时间划分为不同的集合,每个集合称为一个代,
Python将内存分为了3“代”,分别为年轻代(第0代)、中年代(第1代)、老年代(第2代),
他们对应的是3个链表,它们的垃圾收集频率与对象的存活时间的增大而减小。
新创建的对象都会分配在年轻代,年轻代链表的总数达到上限时,Python垃圾收集机制就会被触发,把那些可以被回收的对象回收掉,而那些不会回收的对象就会被移到中年代去,
依此类推,老年代中的对象是存活时间最久的对象,甚至是存活于整个系统的生命周期内。同时,分代回收是建立在标记清除技术基础之上。

 

posted @ 2021-06-09 14:54  Palpitate~  阅读(80)  评论(0编辑  收藏  举报