目录
【操作系统篇】
PS:本文不适合完全没有OS基础的阅读
什么是操作系统
- 管理计算机硬件和软件资源
- 本质是运行在计算机上的软件程序
- 屏蔽了硬件层的复杂性
- 内核是操作系统的核心部分,负责内存管理、文件系统管理、硬件设备管理、应用程序管理
系统调用
- 调用操作系统提供的内核态的功能–>系统调用
- 用户态与系统级别资源相关的操作–>系统调用向操作系统提出,由操作系统完成
- 系统调用有设备管理、文件管理、进程管理、进程通信、内存管理。
进程
进程和线程
- 对操作系统来说线程是最小的执行单元,进程是最小的资源管理单元。
- 无论进程还是线程都是操作系统管理的。
- 线程是进程中的一条执行流程,一个进程可以拥有多个线程。
- 同一进程内多个线程之间可以共享地址空间、代码段、数据段、打开的文件等资源;但每个线程都有独立一套寄存器和栈,这样可以确保线程的控制流是相对独立的。
- 线程同样拥有就绪、阻塞、执行三种基本状态。
- 线程能够减少并发执行的时间和空间开销。线程创建比进程快、终止也快,切换也快、线程之间传递数据不需要经过内核,交互效率更高。
- Java中线程状态转换是需要操作系统内核中的TCB(Tread Control Block)模块来改变线程的状态,这一过程需要耗费一定的CPU资源。
线程有自己的 stack,但是没有单独的 heap,也没有单独的 address space。只有进程有自己的 address space,而这个 space 中经过合法申请的部分叫做 process space。Process space 之外的地址都是非法地址。当一个线程向非法地址读取或者写入,无法确认这个操作是否会影响同一进程中的其它线程,所以只能是整个进程一起崩溃。
当一个线程崩溃时,很可能会导致其所属进程的所有线程崩溃。
协程
英文Coroutines是一种比线程更加轻量级的存在。
正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。Java的原生语法中并没有实现协程,Python、Go等语言有。
但是有开源框架模拟了协程的功能。