1.并行/并发
计算机操作系统定义:
并行性是指两个或多个事件在同一时刻发生;
并发性是指两个或多个事件在同一时间段内发生。
计算机组成原理定义:
并行性包含同时性和并发性,前者是指两个或多个事件在同一时刻发生;
后者是指两个或多个事件在同一时间段内发生。
并行(Parallel):当系统有一个以上CPU(多核),则线程的操作有可能非并发.当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行
并发(Concurrent):当有多个线程在操作时,如果系统只有一个CPU(单核),则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状态
打个比方:
并行:2个人喂2个孩子,两个孩子也同时在吃饭。
并发:1个人(cpu)喂2个孩子(程序),轮换着每人喂一口,表面上两个孩子都在吃饭。
2.线程/进程
2.1进程(Process):具有一定独立功能的程序关于某个数据集合上的一次运行活动
2.2线程(Thread):系统(CPU)进行资源分配和调度的一个独立单位
一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。 线程与进程的一个主要区别是,同一进程内的多个线程会共享部分状态, 多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时, 每个线程还拥有自己的寄存器和栈,其它线程可以读写这些栈内存。
联系:不支持线程机制,进程的系统调度的单位;否则,线程是系统调度的单位
不同:
- 定义方面:进程是程序在某个数据集合上的一次运行活动;线程是进程中的一个执行路径。
- 角色方面:在支持线程机制的系统中,进程是系统资源分配的单位,线程是系统调度的单位。
- 资源共享方面:进程之间不能共享资源(拥有各自独立堆空间和栈空间),而线程共享所在进程的地址空间(堆空间)和其它资源。同时线程还有自己的栈和栈指针,程序计数器等寄存器(堆空间共享,栈空间独立)。
- 独立性方面:进程有自己独立的地址空间,而线程没有,线程必须依赖于进程而存在。
2.3线程调度:
计算机通常只有一个CPU时候,在任意时刻只能执行一条计算机指令,每一个进程只有获得CPU的使用权才能执行指令。
所谓多线程并发运行,从宏观上看,其实是各个进程轮流获得CPU的使用权,分别执行各自的任务,
那么在可运行池中会有多个线程处于就绪状态等到CPU,JVM就负责线程的调度。
JVM采用的是抢占式调度,没有采用分时调度,因此可以能造成多线程执行结果的随机性。
java程序的进程(java的一个程序运行在系统中)至少包含主线程(main)和垃圾回收线程(gc后台线程)。
3.创建进程
public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); try { runtime.exec("notepad");//只能是系统进程.exe的名字,win+r+dropbox(因为环境变量指定了文件夹 dropbox.lnk)的不行的 } catch (IOException e) { e.printStackTrace(); } }