码农翻身

1.计算机的世界你不懂

1.1 线程和进程

  • 一个请求的话,就是一个线程,然后会携带数据,让后台服务器处理;当线程需要被处理的时候,会从创建态到就绪态;
  • CPU执行速度是很快的,交替快速执行;
  • 线程是一种昂贵的资源,一般需要放在线程池里面
  • 当我们的数据库压力过大的时候,可以考虑用缓存减缓数据库的压力
  • 锁:有死锁;当我们执行一些并发性操作,或者涉及到一些重要资源的时候,要时刻考虑用锁,锁的分类有乐观锁,悲观锁,分布式锁(Redis,zookeeper实现)
  • 内存处理速度快,但是一旦关闭了电脑,数据就会丢失,因此硬盘存储数据是非常有必要的,为了提高效率可以先将数据读进内存里面,CPU操作内存就非常快。如果有一些频繁要处理的数据的话,可以放到内存中的缓存区域,从而提高访问的速度
  • 流水线:CPU操作线程的时候,其实有多个线程在并发进行,但是不会闲着,而是不断地切换。就好像流水线一样,每一个线程该干嘛就干嘛,比如线程1读取数据,线程2在写数据。。
  • 以前的计算机是专用计算,打游戏的只能打游戏,计算的只能计算。后来发展为不同的程序可以写好以后,可以在同一台计算机运行,按照存储的程序逐条取出指令然后加以分析;
  • 计算机逻辑上分为五大部件:运算器,控制器,存储器,输入设备,输出设备。
  • 进程:一个一个进程在内存中就是不同的程序,每一个程序都有自己的PCB【记录进程的一些信息,比如说运行多长时间,上次运行的指令,地址等等】,记录每一个线程运行到XXX指令,寄存器的值,记录处理这些花了多少时间,等待了多少时间等等。。。
    但是如果有多个运行的进程(程序)的话,内存分配不是一件简单的事

1.2 解决多进程问题

这里涉及到一个比较重要的理论就是:
局部性原理。访问了一个内存位置以后,过不了多久还会再次访问,还有,一个内存位置被访问了,附近的位置也很快被访问到【缓存,内存分页的依据】
内存分配

  • 地址重定位:假设第一个程序的地址为0,第二个的起始地址就为1000;CPU增加一个基址寄存器,专门用来保存起始地址。运行第一个程序的时候CPU,将寄存器设为0,;切换到第二个程序的时候,寄存器为1000【动态重定位】
    为了防止指令混乱,在CPU中增加一个叫做内存管理单元的东西。用来计算两次访问的地址是否一致,看一下是否有越界行为。
  • 分时系统:分时系统是为了同时处理多个程序,让程序相互间切换而出现的。由于CPU的处理速度非常快,因此。将每一段的程序分时间片,分段处理。计算机使用者根本察觉不到。
  • 分块装进内存:以前是批处理系统。排着队来。随着进程的普及。很多程序一起涌入内存中,导致内存爆炸。因此需要分块进行内存加载。而加载到内存用到一个理论,局部性原理:
    1.时间局部性:如果程序中的某个指令开始执行,则不久后,该指令可能再次执行;如果某数据被访问,不久之后,该数据可能再次被访问。
    2.空间局部性:一旦程序访问了某个存储单元,不久后,其附近的存储单元也会被访问。
    这些被分页的块称为页框。(把最大可能访问的空间和指令放在同一块。空闲出来的内存页让给其他程序)
  • 虚拟内存(分页):虚拟分页是为了可以让内存,CPU更高效的工作。给每一个程序分配一个虚拟的内存,(比如4G)。然后维护一个页表,映射虚拟内存物理内存的关系。
  • 分段+分页:一个程序会被分成代码段,数据段,堆栈段等等。有一些是共享的。
  • 装载程序的过程:程序并不会全部加载进物理内存页。而是先分配虚拟内存页,然后按需加载进物理内存,会将程序“大卸八块”.

你可能感兴趣的:(码农翻身)