🎈进程
对于操作系统来说,一个正在运行的程序就是一个进程(Process)。通过任务管理器就能够看到很多进程
操作系统管理进程
所谓的管理:就是描述 + 组织
描述:task struct 结构
组织:使用双向链表把很多的task struct变量给串起来。例如:当我们打开任务管理器的时候,就可以认为是操作系统内核遍历了一遍这个双向链表,把每个节点里的信息取了出来并暂时,但我们创建一个线程,本质就是创建了一个 task struct 放到双向链表中,当某个进程结束,就是从这个双向链表中删除这个节点。
一个进程的 task struct 包含那些内容 ?
-
pid 进程 id:描述进程的唯一标识。
-
进程的内存指针:描述了进程持有的内存资源是那些范围(进程依赖的代码,和数据在哪里)。
-
进程的优先级:描述进程执行的优先权,谁优先级高谁就可以先被执行。
-
进程的上下文:记录了一次活动的上下状态,大概意思就是保存了进程当前是什么状态,之前是什么状态,接下来又会是什么状态。
详细描述: -
进程的记账信息:类似一种统计信息,统计了该进程执行过那些状态,实行时间,执行次数等等
-
进程的状态:
进程的调度
所谓的进程调度就是指多个进程在操作系统内核的管理下采用时间片轮转的方式执行,换句话说,就是一个抢占式执行的过程。不过现在的操作系统基本都是支持多线程的。
🎈线程
概念:线程就是一个轻量级的 “进程” ,线程是系统调度执行的最小单位,一个进程内的线程之间是可以共享资源的。每个进程至少有一个线程存在,即主线程。
线程的五种创建方式
1. 继承 Thread 类创建一个线程类。该方法的好处是 this 代表的就是当前线程,不需要通过Thread.currentThread() 来获取当前线程的引用。
class MyThread extends Thread {
@Override
public void run() {
while (true) {
System.out.println("通过继承 Thread 类创建线程");
}
}
}
public class Thread01 {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start(); //执行线程
}
}
2. 通过实现 Runnable 接口,并且调用 Thread 的构造方法时将 Runnable 对象作为 target 参数传入来创建线程对象。该方法的好处是可以规避类的单继承的限制;但需要通过 Thread.currentThread() 来获取当前线程的引用。
class MyTask implements Runnable{
@Override
public void run() {
while (true) {
System.out.println("hello");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class ThreadDemo02 {
public static void main(