学前注意事项
出去面试的时候java岗位不需要懂前端(会少量讲解)
但是我们做项目的时候多少回用到一些前端的东西
1.什么是计算机
1.1前情提要
不仅仅只有电脑是计算机
计算机还不仅仅是电脑手机和平板 路由器 智能洗衣机 刷脸打卡机都可以说是计算机
1.2计算机分类
1.更通用
(1)终端设别(台式机,笔记本,手机,ipad)手机
(2)服务器 日常普通用户是见不到的,以后我们作为开发人员还是经常和服务器打交道的
2.不是特别通用
(3)嵌入式设备,主体功能不是用来计算而是针对一些特定专属常见,量身定做的(专用计算机)
1.3冯诺依曼体系结构
(1)1.2中的所有设备都遵循冯诺依曼体系结构
(2)冯诺依曼和图灵是计算机的祖师爷
冯诺依曼在成为计算机之父之前就是物理化学专家,博弈论之父,还参与过"曼哈顿计划",是奥本海默的技术顾问,被评为20世纪的全才!!!!!!!!
他在火车上遇到了普林斯顿大小研究员,这个研究员在参与计算机设计,然后互留联系方式,后面冯诺依曼就参与了"艾尼阿克"第一台计算机的开发
然后提出了冯诺依曼体系,并对第一代计算机进行改进。
冯诺依曼体系定义了二进制表示的存储数据。
(3)冯诺依曼体系结构大致就是说
一个计算机要有(目前市面上有的计算机的结构)
CPU(控制器 运算器)
存储器(内存 外存)
输入设备
输出设备
有的硬件设备可能是输入设备也可以是输出设备
(4)计算机一开始是为了军事用途
最早是用来计算弹道轨迹
1.3.1CPU
(1)cpu主要功能是进行各种算数运算
(2)进行各种逻辑判断
我们的每一个程序都是通过cpu来进行执行的
(3)一个打工人一天可能工作8小时
可能一个人花4小时把活干了
这时候就可以把CPU占用率成为百分之50
一个计算机上同时运行横夺程序,这些程序有些全力工作有些不全力工作,最终算出的总占用率
(4)现在的计算机有多核,假如16个核心,就代表一个核心是一个cpu
(5)linux中式把每个cpu的核心加在一起
(6)CPU的频率就代表这CPU的效率,数字越大,干活越快,我们可以理解为1s中cpu运算了多少次,执行了多少个指令。
(7)CPU认识知道的指令就是汇编语言。
你让计算机算一个1+1 = 2其实这背后有非常多的机器指令
(8)如何让一个CPU核心更快
让CPU中的集成基础原件更多,也就是更加的小目前极限是4nm工艺
最近台机电在冲击1nm工艺
小到足够小的时候这其中就涉及到量子力学emmmmm
(9)既然多核心难以更nb,那么不妨往多核心发展
英特尔最近还有啥大小核心的,大核一个顶两,小核还是一对一。英特尔公司还提出了超线程技术,一个cpu一个核中有两个线程,也就是一个物理核心顶2个核心使用。
引入更多的核心本质上相当于干活的人读了,所以要想程序跑的更快,就需要在设计程序的时候考虑这一点,我们需要将问题拆分成更多的部分,交给多个不同的核心来进行处理。
不能单核全干,其他核看戏
(10)所以现在多线程编程,才成为了我们当前研究的重点内容。
底层就是数电emmm
1.3.2指令表(重要的)
(1)指令可以仍未CPU被设计的时候,给程序员提供的一些程序接口。
(2)不同的CPU提供的哪些指令是不一样的,虽然不一样但是也是有几套标准的。(x86)现在更多的是(酷睿一种x86的继承)amd为了和intel兼容,也高搞了了x86,还有一个交arm架构,像我们的平板手机各种嵌入式系统,m1,m2芯片也是arm架构,论性能不及x86,但是功耗比较低,所以比较适合移动设备。还有一些冷门架构emmm不多说了
总的来说CPU其实有很多不同的架构,同一个程序在这个机器上的cpu上面可以运行但是另一个机器就不行,就像我们的手机和电脑应用要区分开。
(3)cpu是如何执行指令啊?
所谓的指令都是先加载到内存中,然后才被cpu读取并执行。
比如一个java程序,写出来时一个java源文件程序,编译得到class二进制文件,运行jvm时就会把这个class文件加载到内存中,再进一步翻译成cpu能够识别的二进制指令
比如一个c程序写出来是一个c源文件代码,编译得到exe二进制文件,操作系统是吧这个exe加载到内存中,在进一步的由cpu执行。
(4)因此CPU执行程序大概就是经历三个阶段
读指令(把内存中的治理数据读取到cpu的寄存器中,存储数据的模块称之为寄存器,速度比内存快,但是内存空间更小也更贵)
解析指令,(理解放弃指令要做啥)
执行指令
上述是一个简化的模板,他还会有流水线啊啥的(计算机体系结构这个课里面会讲,大家自己去找找感兴趣的)
(5)指令表的引入
1.3.3后端程序员以后可能会遇到的计算机问题解决方式
1.4操作系统
上面的是硬件,下面我会给大家讲解一下软件也就是操作系统
1.4.1操作系统基本概念
(1)软件可以理解为一组指令的集合,我们将多个指令集合一起就可以搞出来一个软件。
(2)程序员的工作就可以理解为开发软件
(3)操作系统可以理解为一个大的软件,一个操作系统可以有成千上万行代码进行组成
(4)操作系统可以理解为一个大型的管理软件用来管理你的一些小的软件,和数据,文件,以及各类硬件的相互配合
(5)操作系统= 内核+配置的应用
(6)其中我们在编写代码的时候就是用操作系统来完成这些指令与程序的交互的(API)
其中java是调用操作系统的中的内核的API的
(7)API有的是搞网卡的,有的是管理显示屏的。
(8)操作系是用内核驱动程序,来操作系统
总的来说操作系统既要管理软件也要管理硬件,并且还要管理好软件再使用的环境,没有操作系统
1.4.2操作系统的进程
(1)进程是一个程序跑起来,在操作系统中就会出现一个对应的进程,所以进程就是一个跑起来的应用程序
(2)小知识:任务管理器就是占用了一个小进程
(3)运行的程序和自带的本身要运行的程序都会占用线程
(4)这里代表这每一线程占用的CPU使用率,
(4)想用硬件,软件,系统都会给他分配内存资源
(5)进程可以理解为操作系统分配资源的基本单位(重点)
(6)我们先用结构体来把一个进程核心进程提取出来,通过一定的数据结构把结构体穿起来,方便进一步的增删改查
(7)主流的操作系统都是用****c来进行编写的,linux是纯c,windos是一部分c++一部分c++
(8)在操作系统中,我们通称之为PCB这样的进程结构体来描述进程的
(9)操作系统中通常使用链表这样的结构来把多个PCB穿起来的
(10)创建新的进程,新的进程创建出一个对应的PCB并且添加到上述的链表中
(11)销毁的某个进程,就是将链表上面对应的PCB节点给删除掉
(12)pid进程的id/标识符,身份证号同一个机器,同一个时刻进程id一定是不同的
(13)内存指针,进程运行的时候需要消耗一定的硬件资源,内存是一个关键的资源。
图解
1.4.3文件描述表
(1)通过顺序表,记录顺序表,记录当下进程,都打开了哪些文件
(2)系统中包含了很多进程,进程需要执行,需要用cpu才能执行,占用cpu资源,这时候进程的数量是多于CPU的,现在的CPU是有多个核心的,每个CPU都是一个打工人,每个打工人互相之间各干各的,
现在有多个CPU核心,100多个进程,为了能够让这些进程有条不紊的运行,这时候就需要进程调度来组织这些东西。
一个核心同一时刻只能运行一个进程,16个核心同时进行(完全并行执行)
但是一个核心不同时间段可以执行不同的程序
但是他的切换速度太快了
所以我们肉眼感觉不到
所以操作系统并发相互搭配运行所有系统
这种系统我们称之为可以执行多个任务的操作系统
现在我们市面上见到的基本上都是可以执行多个任务的机器
并行指的微观时间上是串行
并发指的是宏观的化是同时进行的
我们在编程的时候,无法干预并行,普通用户也感知不到
把编写解决并发翁提的程序比称之为"并发编程"
(3)PCB中提供了几个属性来支持进程的调度
1)状态(后序线程文章会对线程来更好的讲解)
规划时间表的时候看这几个小哥的状态来进行规划(默认随叫随到,在操作系统中称之为就绪状态)假如一个小哥出差了(叫做进程处于阻塞状态),阻塞状态下无法运行,这个就叫做IO阻塞
2)优先级
给三个小哥排时间是不一样的,可能陪的时间不一样(时间资源会有所不一样)
3)上下文(内存的结构体中的一个成员变量)
一次约会没干完的事情,后面继续干
4)记账信息
这个用来记录后面要干的事情,在下次的时候一一对应,不出差错
也是有优先级的
此时就需要通过一个表格来统计每个进程(小哥)都分配了多少时间了。