1.冯诺依曼结构体系:
- 运算器
- 控制器
- 存储器
- 输入设备
- 输出设备
2.操作系统
-
向上为应用程序提供一个稳定的运行环境
-
向下管理所有的硬件设备
-
为用户提供一个人机交互的界面
3.进程
每一个运行起来的程序(软件),操作系统都会以进程的形式把它管理起来。
每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1-n个线程)(进程是资源分配的最小单位)。
面试题:请你说一下什么是并发,什么是并行?
并发:一会干这件事,一会干那件事(同时只能干一件事)
并行:一边干这件事,一边干那件事(真正意义上的同时进行)
在编程方面。我们并不区分是并行还是并发,统一称为并发编程。
4.虚拟内存空间:进程启动之后会申请内存空间。
由于MMU的限制,导致进程之间不能够互相访问内存。
一、多线程
线程:同一个类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是CPU调度的最小单位)。
线程和进程一样分为5个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
1. 多进程处理一个复杂或很大的任务。
当进程启动时:
1.申请内存;2.申请文件资源;3.加PCB加到链表中。
当进程结束时:
1.释放文件;2.释放内存;3.从链表中删除PCB
但是:这些申请也释放资源的操作是非常耗时的
为了解决资源消耗问题,提出一个轻量级进程的概念(线程 ),创建线程只需要关注要处理的任务,使用的是进程创建时申请到的所有资源。
使用多线程编程的原因:
- 充分利用CPU资源
- 利用轻量级进程的特性减少系统性能的开销
- 线程创建的效率比进程高
- 线程销毁的效率比进程高
- 线程调度的效率比进程高
2. 多线程可能存在的问题
3.创建线程:通过JDK给我们提供的API来创建线程
线程:JAVA中的类。不是系统中真正的PCB
1.继承Thread类
如果说你只是想起一条线程,没有什么其他特殊的要求,那么可以使用Thread。
举例说明:
public class Thread1 extends Thread{
private String name;
public Thread1(String name) {
this.name = name;
}
public void run(){
for(int i=0;i<5;i++){
System.out.println(name + "运行 : " + i);
try{
sleep((int) Math.random() * 10);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
Thread1 mTh1=new Thread1("A");
Thread1 mTh2=new Thread1("B");
mTh1.start();
mTh2.start();
}
}
说明:程序启动运行main的时候,java虚拟机启动一个进程,主线程main在main()调用时候被创建,随着调用两个对象的start方法时,另外两个线程也启动了,这样,整个应用就在多线程下运行。
注意:start()方法的调用后并不是立即执行多线程代码,而是使得线程变为可运行态(Runnable),什么时候运行是由操作系统决定。
从程序的运行结果来看,多线程是乱序执行,因此,只有乱序执行的代码才有必要设计为多线程。
Thread。sleep()方法调用的目的是不让当前线程独自霸占该进程所获取的CPU资源,以留出一定时间给其他线程执行的机会。
实际上所有的多线程代码执行顺序都是不确定的,每次执行的结果都是随机的。
start方法重复调用的话。会出现Exception in thread "main" java.lang.IllegalThreadStateException 异常。