操作系统中的进程和线程
冯诺依曼体系
结构
存储器指的是内存;
不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备);
外设要输入或输出数据,也只能写入内存或者从内存中读取;
所有设备都只能直接和内存打交道
操作系统
操作系统的概念
操作系统(OS)是控制和管理计算机硬件资源,以尽量合理有效的方法组织多个用户共享多种资源的程序集合,任何其他软件都必须在操作系统的支持下才能运行。
操作系统的特征
- 并发性
在一段时间内宏观上有多个程序在同时运行,但在单处理机系统中每一个时刻却仅能有一道程序执行,故在微观上这些程序是分时地交替执行。 - 共享性
系统中的资源可供内存中多个并发执行的进程共同使用。 - 异步性
由于资源等因素的限制,是进程的执行通常都不可能“一气呵成”,而是以“停停走走”的方式运行。进程是以人们不可预知的速度向前推进的,即进程的异步性。 - 虚拟性
“时分复用”和“空分复用”技术。
在OS中,把通过某种技术将一个物理实体变为若干个逻辑上的对应物的功能称为“虚拟”。
操作系统的功能
1. 进程管理
又称处理器管理,主要任务是对处理器的时间进行合理分配,对处理器的运行实施有效的管理。
2. 存储器管理
由于多道程序共享内存资源,所以其主要任务是对存储器进行分配、保护和扩充。
3. 设备管理
根据确定的设备分配原则对设备进行分配,使设备与主机能够并行工作,为用户提供良好的设备使用界面。
4. 文件管理
有效的管理文件的存储空间,合理的组织和管理文件系统,为文件访问和文件保护提供更有效的方法及手段。
进程
概念
进程:通过程序运行,表现在操作系统中动态执行的、被操作系统所管理的,是系统分配资源的最小单位。
文件:本地磁盘中的资源。
程序:属于文件,是静态资源,但是是一种可执行的资源。
用户态和内核态
一般的操作系统(如Windows,Linux)对执行权限进行分级:用户态和内核态。
内核态:操作系统内核作为直接控制硬件设备的底层软件,权限最高。
用户态:用户程序的权限最低。
进程的状态
进程的状态图
就绪:进程处于可运行的状态,只是CPU时间片还没轮转到该进程。
运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码。
阻塞:进程不具备运行条件,正在等待某个事件的完成。
进程中的上下文
上下文就是一个环境
(1)就是一个进程在执行的时候,CPU的所有寄存器中的值、进程的状态以及堆栈上的内容;
(2)切换时需保存当前进程中的所有进程的状态。
线程
概念
1.线程是系统调度的最小单位
2.一个进程的线程之间是可以共享资源的
3.每个进程至少有一个线程存在,即主线程
创建线程的方式
(1)继承Thread类
class MyThread extends Thread {
public void run(){
System.out.println(Thread.currentThread().getName());
}
}
MyThread myThread = new MyThread();
myThread.start();
(2)实现Runnable接口
class MyRunnable implements Runnable{
public void run(){
System.out.println(Thread.currentThread().getName());
}
}
new Thread(new MyRunnable()).start();
Thread类
构造方法
常见属性
启动一个线程-start()
MyThread myThread = new MyThread();
myThread.start();
//run方法直接调用,不会启动线程,只是在当前main线程中调用run方法
//myThread.run();
一定要注意 run 方法和 start 方法是不同的,启动线程必须要调用 start 方法
中断一个线程
(1)通过共享的标记来进行沟通
(2)调用interrupt()方法来通知
public static void test2(){
Thread t = new Thread(new Runnable() {
@Override
public void run() {
//线程运行状态时,需要自行判断线程的中断标志位
//while(!Thread.currentThread().isInterrupted()){
while(!Thread.interrupted()){
System.out.println(Thread.currentThread().getName());
}
}
});
t.start();//t线程中的中断标志位=false
t.interrupt();//t线程的中断标志位=true
}
等待一个线程join
public static void without() throws InterruptedException {
//打印顺序:main -> thread-0
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
});
t.start();
t.join();//等待t线程执行完毕
System.out.println(Thread.currentThread().getName());
}
对比线程和进程
线程的优点
- 创建一个新线程要比创建一个新进程的代价小的多;
- 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要少很多;
- 线程占用的资源要比进程少很多;
- 能充分处理多并行器的可并行数量;
- 在等待慢速IO操作结束的同时,程序可执行其他的计算任务;
- 计算密集型应用,为了能在多处理器上运行,将计算分解到多个线程中实现;
- IO密集型应用,为了提高性能,将IO操作重叠。线程可以同时等待不同的IO操作。
进程与线程的区别
- 进程是系统进行资源分配和调度的独立单位,线程是程序执行的最小单位;
- 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈;
- 由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信;
- 线程的创建、切换及终止效率更高。