文章目录
编程语言
程序
所谓程序,就是 一组指令 以及 这组指令要处理的数据。狭义上来说,程序对我们来说,通常表现为一组文件。
程序 = 指令 + 指令要处理的数据。
编程语言发展
- 机器语言:0、1 二进制构成
- 汇编语言:用一些容易理解和记忆的字母 + 单词 代替机器指令
- 高级语言:C、C++、Java、Python 等
对比:
- 汇编语言:代码 --> 指令 -->CPU
- C :代码 --> 编译 --> 指令 -->CPU
- Java:代码 --> --> JVM --> 编译 --> 指令 -->CPU
Java 运行在 JVM 上
JVM 针对不同的操作系统做了不同的实现,对 JAVA 程序员提供了统一的调用方式
操作系统(Operating System)
操作系统是一组管理计算机资源的软件的统称。每台电脑或手机等设备都会装一个操作系统。
目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙等。
操作系统的定位
操作系统的作用
- 对下(硬件):管理各种计算机设备,比如鼠标、键盘、显示器等可以看到的与计算机连接的任何设备
- 对上(软件):为应用程序提供一个稳定的运行环境
- 对于有图形化界面的操作系统:提供良好的人机交互界面
- 文件管理
操作系统是如何管理运行中的程序?
程序安装后,在系统中是静态文件。
双击之后,从磁盘加载到内存,系统会创建一个与程序的进程,这时程序就运行起来了。
每一个运行的程序在操作系统中都对应着一个进程。
进程分为:用户执行的进程、前台进程、系统创建的进程、后台进程
进程
什么是进程/任务(Process/Task)
每个应用程序运行于现代操作系统之上时,操作系统会提供一种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了一个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;
在操作系统内部,进程是操作系统进行资源分配的基本单位。
先描述,再组织进程
描述进程
进程控制块(PCB Process Control Block)
计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据。在 Java 语言中,我们可以通过类/对象来描述这一特征。
每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。
操作系统再通过数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便管理时进行增删查改的操作。
PCB 描述的 7 个属性:
- 进程控制符( PID Process Identifier)
也称为进程标识符,是各进程的身份标识。
程序一运行,系统就会自动分配给进程一个独一无二的PID。
进程中止后PID被系统回收,可能会被继续分配给新运行的程序。
- 内存指针
当程序运行时,操作系统先从磁盘加载程序文件到内存中,在程序运行之前,要在内存中分配一片有效的空间。在内存中的数据和指令,最终被 CPU 读取和执行。
- 文件描述符表
当程序运行之后,需要访问一些文件资源,这时操作系统就负责给程序分配这些资源。
程序所需要的每个文件,称为文件描述符;多个文件描述符 合在一起,就组成了文件描述符表,类似于一个集合。
在 Linux 中的所有计算机设备(网卡、硬盘、磁盘、外接设备),都用文件的方式去描述。
默认每个程序运行时,都会被分配 3 个文件描述符:
- 标准输入:System.in
- 标准输出:System.out
- 标准错误:System.error
电脑上有百十个进程,但是只有 16 个逻辑处理器,即只可以同时处理 16 条指令一个逻辑处理器,并不是一次就把一个进程执行完,而是一个进程执行一会儿就休息一会儿,再去执行另一个进程,不停的轮换执行。
由于 CPU 的频率很高,轮换的速度也很快,人察觉不到。
【并发编程】
- 并发:在单个处理器上不停地轮换执行指令
- “并行”:在多个处理器上,可以同时执行不同的指令
并行可以说是真正意义上的同时执行。
- 进程状态
- 运行状态:当前在 CPU 上正在执行指令
- 就绪状态:排队中,随叫随到,随时可以在 CPU 上运行
- 在 CPU 中,一般不区分运行状态和就绪状态,一般统称为就绪状态。
- 阻塞状态:当前进程不适合在 CPU 上执行。
- 进程优先级
哪个进程有更的大机会去 CPU 上运行,它的优先级就越高。
- 进程的上下文
进程调度的过程中,进程一会儿失去了 CPU,一会儿又回到 CPU 上继续执行;当回到 CPU 之时,要沿着上次的状态继续执行,而不是从头开始
- 失去 CPU 时,进程的中间值:从寄存器保存到内存中(存档)
- 回到 CPU 时,进程的中间值:从内存中读回到寄存器中(读档)
- 进程的中间值存储:当前执行的指令、下一条指令、中间产生的一些变量
- 进程的记账信息
统计功能:统计每个进程在 CPU 上运行了多久,哪些进程很长时间没有在 CPU 上运行了。
进程的组织方式
通过一个双向链表组织 PCB
- 创建一个进程,就是把 PCB 加入到链表中
- 销毁一个进程,就是把 PCB 从链表中删除
- 查看所有的进程,就是遍历双向链表
内存分配⸺内存管理(Memory Manage)
程序运行时会分配内存空间。
操作系统为了防止野指针,使用了虚拟内存来规避上述现象。
通过使用内存管理单元(Memory Management Unit,MMU)的方式来实现:
进程间通信(Inter Process Communication,IPC)
进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备**“隔离性(Isolation)”**。
但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换”的需求。
进程间通信的需求就应运而生。
目前,主流操作系统提供的进程通信机制有如下:
- 管道
- 共享内存
- 文件
- 网络
- 信号量
- 信号
其中,网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。