1. java起源和发展历程
Java诞生于上世纪90年代,当时C/C++是主流语言,詹姆斯高斯林,最初他们公司要搞"智能面包机"这样的产品,首选C++,当时公司里大家是新人,高斯林怕大家搞不定就自己搞了一个语言Oak(橡树,工位窗外有一颗橡树),最后项目流产了,但语言挺好保留了下来,但Oak的商标被注册了,改为java(爪哇岛产的咖啡)logo是一杯咖啡。
詹姆斯高斯林
java的logo
-
Java最开始起飞,用来开发前端程序,好景不长被微软封杀(IE浏览器不再支持java,微软转为扶持政自己的j++,之后java兵分两路:
1.后端开发/服务器开发
最初服务器后端使用C/C++开发,2000年之后,PHP突起,一下子变为后端开发最主流语言。java搞了一套JSP技术系统,虽然干不过PHP但也有一席之地
2.手机端开发(2000左右 功能机)
java推出J2ME,打开一些应用程序尤其是游戏,加载界面都是java logo
Java凭借以上两点,不光站稳了脚跟,同时也成为了业界最主流的编程语言之一。
-
好景不长,新的危机又出现了
- 后端开发方面
PHP这一套开发方式,针对简单的网站绰绰有余,网站越来越复杂,PHP难以应对,JSP面临同样的问题
- 手机开发方面
2007年是一个惊天动地的一年,乔布斯发布了苹果手机(移动互联网时代,智能手机登场)传统功能机一夜暴死,J2ME市场没了
应对危机
1.后端开发方面
Spring开始崛起(Spring在JSP时代就有)
以Spring为首的一系列框架
开启了服务器开发新纪元,反超PHP成功,java成为后端开发最强语言
- 移动端方面
IOS系统
使用的语言 Objective---C,介于C和C++之间
Android(谷歌)
龟叔
-
最早考虑的是Phyon作为开发语言,Phyon作者龟叔本来是谷歌员工,这段时间闹着离职,Phon错过这次机会,java抓住了
-
之前那一波做手机开发的,就是java程序员,是得Android快速发展起来
系统要发展 ---> 有很多好用的程序员 ---> 优秀的开发者 ---> 吸引更多的用户 ---> 有很多好用的程序
安卓很快超过IOS,称为智能手机端最强系统
上述两波操作,java一跃而起,编程语言排行榜榜一大哥,一直垄断多年(近几年开始被其他语言反超)
-
Java近几年也遇到了新的挑战
- 后台开发
java最大的挑战者 Golang (java追求呆板,比较麻烦)
肯汤姆逊
-
Golang是出名门,肯汤姆逊(C语言之父),C语言原版人马打造
- 移动端
java安卓开发,最大的挑战者是前端
IOS是一个语言,安卓是一个语言,能否一套代码,写的程序同时支持多个平台
前端方向有很多技术体系在做
最近这几年AI浪潮把Phyon,C++又推起来了,(AI核心是C++写,C++提供一些API给Phyon调用写应用)AI的特特点,计算量非常大,消耗时间非常大,对于性能要求很高,甚至要调用GPU进行并行计算
2. 一台计算机的构成元素
CPU 电脑上最核心部分
中央处理器
计算机进行各种算术运算,逻辑判断,都是CPU负责(代码里写的内容都是CPU运行)
CPU是人类科技的巅峰之作,和CPU齐名的是氢弹,虽然表面笑,内部结构非常复杂,复杂到量子力学尺度
主板(就是一个大插座)
内存
存储数据的主要模块,统称为存储器
硬盘
存储数据的主要模块,统称为存储器
电源
散热器
机箱
显卡
GPU
显卡,GPU,CPU都输很相似的,都进行算数运算和逻辑判断
CPU是一个大学是,能算1+1,也能算微积分
GPU是一组小学生,只能算1+1,算不了微积分,但算的速度快
GPU用来处理运算简单,但运算量很大的场景
1.图形渲染
2.挖矿(加密货币)
3.AI 人工智能
冯诺依曼体系
冯诺依曼
- CPU
2.存储器
3.输入设备
4.输出设备
内存和硬盘
1.内训访问速度快,硬盘速度慢
2.内存空间小,硬盘空间大
3.内存成本高,硬盘成本低
4.内存数据掉电后都是,硬盘不丢失
输入和输出
站在CPU的角度看
输入:数据从外界"流入"CPU,是它接收的一切指令与信息。
输出:计算结果从CPU"流出",是它对外界的反馈与响应。
简单说:进CPU的是输入,出CPU的是输出。
输入设备:键盘、鼠标、麦克风...
输出设备:显示屏、投影仪、打印机...
既属于输入也属于输出:显示屏、网卡...
CPU主要关系指标
cpu频率
基本速度--->基频/默频
速度--->睿频/加速频率
G相当于10^9 10亿
HZ表示一秒多少次
现代CPU的一个特性,动态根据当前的任务量,频率变更
CPU核心数
最开始的CPU是单核的,努力提高xpu频率,但有上限
8核 16线程
8个物理核心,16个逻辑核心(能同时干16个活)
CPU核心越多,干活效率越高
程序员写代码的时候,就需要把任务拆分多个部分
CPU执行程序(指令)的过程
指令表
一段指令由操作吗和操作位数构成
CPU寄存器
一个CPU不止一个寄存器,大概有几十个
寄存器也是存储数据的模块,是长在CPU身上的,CPU存储数据就是通过寄存器
CPU寄存器,访问速度比内存还要快,存储空间比内存小跟多,成本也更高
CPU寄存器主要是在CPU执行指令,进行各种运算的时候,存储临时数据,起到一些辅助作用
理解一段指令如何执行
CPU执行指令过程
1.读取指令
2.解析指令
3.执行指令
3. 操作系统
Windows 10/11
Linux:在程序员圈子里很重要,后端开发服务器使用的系统一般都是Linux
Mac OS:苹果电脑上的系统
IOS:苹果手机系统,和MacOS不一样
Android:当前市场上最多的系统
上述系统批次之间是不兼容的
写一份java代码,不用做任何修改,就可以拿到另外一个系统上完成一样的功能
操作系统是一个搞管理的软件
1.管理各种硬件设备
系统通常会内置一些常用的驱动程序
操作系统通过驱动程序,间接的管理硬件设备
2.给各种应用系统,提供一个稳定的运行环境 这些应用程序在工作过程中,是互不干扰的,不影响其他应用程序运行
进程
一个运行起来的程序,就称为进程
站在操作系统的视角如何管理进程
1.先描述一个进程是啥样
使用结构体,描述出进程的核心属性
进程控制块(PCB)
非常大的结构体,有很多属性
2.再把多个进程组织起来
比如,Linux操作系统使用链表这样的形式,把多个PCB串到一起
创建一个进程:创建一个PCB,初始化PCB上的各个属性,把PCB加到链表上
销毁一个进程:把这个进程的PCB在链表上找到,并且从链表上删除
查看进程列表:遍历链表,取出链表上的每一个元素,把里面的一些关键元素显示到界面上
PCB中的一些关键要点
1.pid(进程id) 进程的身份标识符
2.内存指针(一组指针)
可执行文件(保存在硬盘上的一段数据)包含执行指令(二进制)和指令运行过程中依赖的数据
进程就需要知道要执行的指令在哪里,指令依赖数据在哪里
进程运行的过程中,需要依赖内存资源
3.文件描述表
进程运行过程中,很多时候需要和硬盘这个硬件设备进行交互,硬盘上的数据就是以文件的形式组织起来
进程在读写文件的时候,就需要先"打开文件"
每次打开一个文件,机会把这个文件的信息保存到文件描述表中,表中的每一个项,就对应着一个打开了的文件
操作系统中,会把很多资源,抽象成文件来表示,不一定是硬盘上的文件
操作系统管理网卡到时候,就是当做"文件"一样来管理
进程是操作系统中,资源分配的基本单位
操作系统如何进行多个进程
早期的计算机,操作系统是单任务操作系统
同一时刻,只能运行一个进程,要想运行下一个进程,就得结束上一个进程
多任务操作系统(在有多核处理器之前,多任务系统已经有了)
即使cpu只有一个核心,也能同时运行多个进程
分复使用把一个单位时间,分成很多份
第一份:进行进程1的指令
第二份:进行进程2的指令
......
cpu运行速度足够快,上述切换功能,也会非常快,快到超出人类的反应瞬间
使人看起来感觉好像这些进程在'同时进行'一样
把一个CPU核心上,按照分时复用,执行多个进程这样的方式,称为'并发执行',人看起来是同时执行,微观上,其实是一个CPU在串行执行,切换速度极快
把多个CPU核心上,同时执行多个进程这样的方式,称为'并行执行'
现代CPU在运行这些进程的时候,并行和并发是同时存在的
这些同称为并发
4.进程状态
就绪状态:进程可以随时到cpu上进行执行
阻塞状态:进程当前不适合到cpu上执行
5.进程优先级
有些进程,就是要优先级更高一些,吃到更多的cpu资源
6.进程的上下级
进程调度,一个执行一会,市区cpu,过了一段时间之后,进程还会到cpu上执行
沿着上次执行到的状态,继续往下执行(而不是重头执行)
进程在cpu中运行的过程中,cpu上各种寄存器,就表示了当前进程运行的'中间状态'
保存上下文:把CPU中的这些寄存器的值,保存到内存中
恢复上下文:把PCB中刚才保存的属性,填写回对应的寄存器中
7.进程的记账信息
估计功能,统计每个进程都在CPU上运行了多久
如果发现某个进程,好久没有吃到资源了,就会给这个进程倾斜一些资源
-
-
- 7 叫做进程调度
-