1. 操作系统

操作系统是一组计算机资源管理的软件的统称。

操作系统的基本功能:一是防止硬件被时空的应用程序滥用,二是向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。

2.什么是程序

程序是指令和数据的集合,其本身没有任何运行的含义,是一个静态的概念。

3.进程

正在运行的程序

进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程;

在操作系统内部,进程又是操作系统进行资源分配的基本单位,各个进程互相之间是无法感受到对方存在,进程之间互相具备隔离性,进程A和进程B的内存独立不共享。

3.1 程的运行方式

并行:微观上同一时刻,两个核心上的进程同时执行

并发:微观上同一时刻,一个核心上只能运行一个进程,但是它能对进程快速进行切换,看起来感觉像是这几个进程在同时进行。

除非显式声明,否则谈到并发就是指 并发+并行。

3.2 PCB

进程的"身份证"——进程控制块抽象(PCB)
3.2.1 PCB的内容

pid:进程的身份标识符(唯一数字)

内存指针:指向了自己的内存是哪些。

文件描述符表:硬盘上的文件等其他资源。

进度调度信息:进程的状态(就绪,运行,阻塞……),优先级,*上下文,*记账信息


*了解内容:

上下文:操作系统在进行进程切换的时候,就需要把进程执行的“中间状态”(CPU的各个寄存器的值)记录下来保存好,下次这个进程再上CPU上运行的时候,就可以恢复上次的状态好继续往下执行。保存上下文就是把这些CPU寄存器的值记录保存到内存中,恢复上下文就是把内存中这些寄存器值回复回去。

记账信息:操作系统,统计每个进程在CPU上占用的时间和执行的指令数目,

根据这个来决定下一阶段如何调度。

3.2.2 为什么会有PCB?

计算机内部要管理任何现实事物,都需要将其抽象成一组有关联的、互为一体的数据,PCB是Java语言中的类,每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程。

3.3 操作系统如何管理进程?

通过各种数据结构,例如线性表、搜索树等将 PCB 对象组织起来,方便进行增删查改的操作。

CPU分配:时间模式 —— 不同的进程在不同的时间段去使用 CPU 资源。

内存分配:空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。

3.4 进程间如何通信?

管道, 共享内存,文件,网络,信号量,信号

网络是一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信。

4.线程简介

4.1 线程

线程就是进程中的单个顺序控制流,也可以理解成是一条执行路径。

4.1.1 什么是单线程?

一个进程中包含一个顺序控制流(一条执行路径)

JAVA多线程一:线程是什么?_寄存器

4.1.2 Java线程和操作系统线程之间的关系

线程是操作系统中的概念,操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用。

Java 标准库中 Thread 类可以视为是对 操作系统提供的 API 进行了进一步的抽象和封装。

4.1.3 什么是多线程?

一个进程中包含多个顺序控制流(多条执行路径)

JAVA多线程一:线程是什么?_多线程_02

4.1.4 多线程程序与普通线程程序的区别

每个线程都是一个独立的执行流。

多个线程之间是 “并发” 执行的。

4.2 为什么会有线程?

单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU 资源.。

有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程。

虽然多进程也能实现 并发编程, 但是线程比进程更轻量.创建线程比创建进程更快,销毁线程比销毁进程更快.,调度线程比调度进程更快.

最后, 线程虽然比进程轻量, 又有"线程池"(ThreadPool) 和 “协程”(Coroutine)。

4.3 JVM与如何调度多线程?

在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的,先后顺序是不能人为的干预的。

线程会带来额外的开销,如cpu调度时间,并发控制开销。

JAVA多线程一:线程是什么?_寄存器_03

在java语言中:

线程A和线程B,堆内存和方法区内存共享。但是栈内存独立,一个线程一个栈。

假设启动10个线程,会有10个栈空间,每个栈和每个栈之间,互不干扰,各自执行各自的,这就是多线程并发。


对于单核的CPU来说,不能够做到真正的多线程并发,但是可以做到给人一种“多线程并发”的感觉。对于单核的CPU来说,在某一个时间点上实际上只能处理一件事情,但是由于CPU的处理速度极快,多个线程之间频繁切换执行,跟人来的感觉是多个事情同时在做。


在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程。

main()称之为主线程,为系统的入口,用于执行整个程序。

对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

4.4 Java多线程是如何实现数据共享的?

JVM 把内存分成了:方法区, 堆区, 栈区, 程序计数器

其中堆区这个内存区域是多个线程之间共享的,只要把某个数据放到堆内存中, 就可以让多个线程都能访问到。

5.进程和线程的区别与联系?

5.1 进程与线程的区别

进程是系统分配资源的最小独立单位,线程是系统调度执行的最小单位。 进程是包含线程的:个进程可以包含多个线程,每个进程至少有一个线程存在,即主线程。只有第一个线程启动的时候开销比较大,后续线程就省事了。进程分为:单线进程,单线程进程,多个单线程进程,多个多线程进程。 同一个进程里的多个线程之间共用了进程的同一份资源(主要是指内存和文件描述符表),可以不通过内核进行直接通信。 进程和进程之间不共享内存空间,同一个进程的线程之间共享同一个内存空间,进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。

5.1 线程的优点

创建一个新线程的代价要比创建一个新进程小得多。

线程的创建、切换及终止效率更高。

与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多。

线程占用的资源要比进程少很多。

线程能充分利用多处理器的可并行数量。

在等待慢速I/O操作结束的同时,程序的线程可执行其他的计算任务。

如果一个进程有多个线程,每个线程是独立在CPU上运行的。计算密集型应用,为了能在多处理器系统上运行,可以将计算分解到多个线程中实现。

I/O密集型应用,为了提高性能,线程可以同时等待不同的I/O操作,将I/O操作重叠。