操作系统线程入门
谈到并发编程,c++鼓励多使用多进程编程,而java更鼓励多线程编程
引入多个进程 是为了 实现并发编程 => 因为目前是多核cpu时代
多进程,实现并发编程,效果也是非常理想
但是,多进程编程模型,也有明显缺点。进程太重量,效率不高
创建一个进程,销毁一个进程,调度一个进程, 消耗时间都比较多,消耗在资源申请上。
为了解决上诉问题,就引入了“线程”(Thread)
线程也叫做"轻量级进程",创建,销毁,调度都比线程更快。
线程不能独立存在,而是要依附于进程(进程包含线程),进程可以包含一个线程,也可以包含多个线程
一个进程最开始的时候,至少要有一个线程
这个线程负责完成执行代码的工作(每个线程可以独立执行一些代码)
也可以根据需要创建更多线程,从而实现 “并发编程 ” 的效果
每个线程都有 状态,优先级,上下文,记账信息
线程的特点:
-
每个线程都可以独立的去CPU上调度执行
-
同一个进程的多个线程之间,共用同一份内存空间,和文件资源 (因此创建的时候无需申请资源,直接复用之前分配给进程的资源,省区了资源分配开销,使得效率更高)
一个进程由多个PCB共同表示 => 每个PCB就用来表示一个线程 => 每个线程有自己的状态,优先级,上下文,记账信息 => 每个线程都可以独立去CPU上调度执行 => 这样的线程共用了同样的内存指针,文件描述符表 => 创建线程(PCB)不需重新申请资源 => 创建,销毁效率更高了。
由此可得结论,线程是调度的基本单位,线程是资源分配的基本单位
线程安全
适当增加线程可以增加执行效率
当线程数目多了,可能会产生一定冲突,称为 "线程不安全"
如果某个线程出现异常,没有妥善处理 (catch),容易把整个进程崩溃,其他线程也随之消亡
线程和进程的区别
1.进程包含线程,一个进程里面可以有一个线程,也可以有多个线程
2.进程和线程都是用来实现 并发编程 场景的,但是线程比进程更轻量,更高效
3.同一个进程的线程之间,共用同一份资源(内存+硬盘),省去了申请资源的开销
4.进程和进程之间,是具有独立性的,一个进程挂了,不会影响别人。线程和线程之间(同一个进程内),是可能会相互影响的 (线程安全问题 + 线程出现异常)
5.进程是资源分配 的基本单位,线程是资源调度的基本单位