OS
Java 线程状态
Java 没有 Ready 状态,线程状态有 6 种:
NEW 新建
RUNNABLE 可运行(包含 Ready + Running)
BLOCKED 阻塞(等待锁)
WAITING 等待(wait/join/park 等)
TIMED_WAITING 限时等待
TERMINATED 终止
Java 没有 Ready 状态,线程状态有 6 种:
NEW 新建
RUNNABLE 可运行(包含 Ready + Running)
BLOCKED 阻塞(等待锁)
WAITING 等待(wait/join/park 等)
TIMED_WAITING 限时等待
TERMINATED 终止
以线程 A 发起读取磁盘文件为例
当线程 A 执行到读取文件的代码时,它其实是没有权限直接控制底层硬件的,必须向操作系统老大哥(内核)求助。
操作系统是一个广义概念,指管理计算机硬件和软件资源的完整软件系统
包含内核 + 系统程序 + 应用软件
内核 (Kernel)是操作系统的核心组件,直接管理硬件资源的最底层软件
计算机是由各种外部硬件设备组成的,比如内存、cpu、硬盘等,如果每个应用都要和这些硬件设备对接通信协议,那这样太累了,所以这个中间人就由内核来负责
让内核作为应用连接硬件设备的桥梁,应用程序只需关心与内核交互,不用关心硬件的细节
单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来
另外,单片机的 CPU 是直接操作内存的「物理地址」
在这种情况下,要想在内存中同时运行两个程序是不可能的。如果第一个程序在 2000 的位置写入一个新的值,将会擦掉第二个程序存放在相同位置上的所有内容,所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃
操作系统是如何解决这个问题
可以把进程所使用的地址「隔离」开来,即让操作系统为每个进程分配独立的一套「虚拟地址」,人人都有,大家自己玩自己的地址就行,互不干涉
进程是操作系统分配资源的最小单位,每个进程都有自己独立的内存地址空间。一个进程崩溃通常不会直接影响到其他进程(除非耗尽了系统资源)
线程是进程中的独立执行单元,是CPU分配调度的最小单位, 是操作系统真正放在 CPU 核心上去执行的实体
多个线程可以共享同一个进程的资源,如内存;每个线程都有自己独立的栈和寄存器
进程都希望自己能够占用 CPU 进行工作,那么这涉及到前面说过的进程上下文切换。
一旦操作系统把进程切换到运行状态,也就意味着该进程占用着 CPU 在执行,但是当操作系统把进程切换到其他状态时,那就不能在 CPU 中执行了,于是操作系统会选择下一个要运行的进程。
选择一个进程运行这一功能是在操作系统中完成的,通常称为调度程序(scheduler)。
那到底什么时候调度进程,或以什么原则来调度进程呢?
这里的进程指只有主线程的进程,所以调度主线程就等于调度了整个进程 主要是操作系统相关书籍,都是用进程调度这个名字,所以也沿用了这个名字