1.前言
1.1进程
在操作系统中有一个重要的概念——进程(Process)
一个运行起来的程序 就叫做进程, 现在的计算机可以同时运行上百个进程
因此操作系统就需要能够很好的管理上述进程
1.2 PCB的基本概念
Process Control Block 进程控制块
关键要点:
1.pid(进程id)—— 进程的身份标识符
2.内存指针(一组指针) ——进程需要了解 运行的指令位置,指令依赖的数据位置
进程在运行的过程中,需要依赖内存资源。
3.文件描述符表 ——进程运行的过程中,经常需要和硬盘上的文件数据进行交互。
以下为PCB的进一步属性——属于进程调度
4.进程状态
5.进程优先级
6.进程的上下文
7.进程的记账信息
1.3多任务操作系统
早期是“单任务”操作系统,同一时刻只能运行一个进程,下一个进程的开始需要上一个进程的结束。
“多任务”操作系统,即使CPU只有一个核心,也能同时运行多个进程,采用 分时复用 的方法
将一个单位时间分为多份,每一份运行不同进程的指令,由于cpu切换的时间足够快,人类来不及反应,感觉这些进程在“同时运行”。
一个CPU,按照分时复用,执行多个进程,这样的方法称为“并发执行”
多个CPU核心,同时执行多个进程,这样的方式称为“并行执行” ——真正意义的同时执行
因为需要并发执行,所有操作系统需要对进程进行快速切换,——即 进程调度
4.进程状态 最典型的分为
- 就绪状态——进程可以随时去CPU上进行执行
- 阻塞状态——当前进程不适合到CPU上执行
5.进程优先级
优先级越高的进程可以得到越多的CPU资源
6.进程的上下文
进程调度,一个进程执行一段时间,失去cpu后,进程还会回到cpu上 ,此时沿着上次执行到的状态,继续往下执行(而不是重头开始)
7.进程的记账信息
具有统计功能,统计每个进程在CPU上运行的时间,若发现某个进程长期没有吃到cpu资源,就会给这个进程倾斜一些资源。
2.线程
2.1原因
由于当前是多任务操作系统,为了高效利用 CPU的多核心,通过多进程编程的方式,可以实现“并发编程”效果。
进程的频繁创建和销毁 开销很大。
为了解决上述问题,减小开销,引入线程(Thread),轻量级进程,开销更小。
2.2简述进程和线程的关系
每个进程都是一个要执行的任务
每个线程 也是一个要执行的任务(代码指令)
1.进程包含线程 每个进程中,都会包含一个或多个线程
2.进程是操作系统资源分配的基本单位
资源包含CPU,内存,硬盘资源,网络带宽。。。
进程内部管辖的多个线程之间,会共享上述资源,
进程的创建/销毁 需要申请/释放 资源 ——属于重量级的事情
对于线程来说,只有在第一个线程创建(和进程一起创建的时候)申请资源,后续再创建线程 不涉及资源申请操作
当所有的线程都销毁(进程销毁) 才真正释放资源,运行过程中销毁某一个线程,也不会释放资源。
进程和进程之间,所涉及到的资源是各自独立的,彼此之间互不干扰,具有稳定性。
2.3线程调度
调度相关:
- 状态
- 优先级
- 记账信息
- 上下文
每个线程都有一份这样的数据
例如一个进程里 有10 个线程 则有10份这样的数据
但是这10个线程 共用同一个 文件描述符表和内存指针
2.4实例
假设问题: 1个房间 1张圆桌上摆满100份鸡腿 现有1名员工 需要吃完这100份鸡腿
- 如果引用多进程 并发编程 再增加1个房间 1张圆桌 1名员工 虽然效率提高 但是 开销比较大

- 使用多线程 只增加 1名员工 此时同上 也是每个员工吃50份鸡腿 提高效率 并且节省 房间 圆桌的开销

- 引用更多的线程——线程的数量 和 效率 不是“线性关系” 线程超过一定数目 反而无法有效提高效率 (圆桌位置有限 更多的员工 无法靠近鸡腿 完成任务)

-
由于多线程处理同一个问题 可能会产生冲突 引起线程安全问题
例如 两个员工抢同一个鸡腿
-
在运行过程中,线程会抛出异常 可能会停止整个工作,也可能被及时捕获处理 避免进程终止
3.代码体现
创建线程的写法
- 继承Thread 重写run
- 实现Runnable,重写run
3.1 继承Thread

定义Thread 子类
Thread 父类 自带run()方法 程序员自己重写run方法 实现相关业务逻辑

t.start() 创建一个新线程 分流工作
运行结果如下

由结果可知 多个线程,调度顺序是随机的
3.2 实现Runnable


runnable 就是一个任务 即一段要执行的逻辑 最终还是要通过Thread 真正创建线程
线程里的逻辑任务,通过Runnable来表示 (而不是通过重写Thread run)
4.耦合与内聚
4.1低耦合
两个代码的关联关系越大,耦合就越大,不希望出现“牵一发而动全身”的现象
代码中希望低耦合,尽量保证代码的可维护性高
4.2内聚
打比方说:
低内聚: 衣服在家里各个角落 很难找寻目标
高内聚: 衣服被归纳到 衣柜里或者晾衣架上
在一个项目中,有很多代码,类,文件,逻辑。。。。
把相关联的各种代码放在一起 只要和某个功能逻辑相关的东西,都在一块
称为高内聚
4.3小结
高内聚(一个模块之内,有关联的东西放在一起)
低耦合(模块之内 依赖尽量小 影响尽量小)
5.总结
5.1线程是什么
线程是轻量级进程
解决问题: 进程太“重”了——进程的创建/销毁开销比较大
5.2线程和进程的区别
进程 包含 线程
进程是操作系统 资源分配的基本单位
线程是操作系统 调度执行的基本单位
同一个进程中的多个线程之间,共享同一份资源(内存,文件。。。)
5.3关于进程调度
是由操作系统内核进行控制——程序员在应用程序这个层次,无法感知,也无法干预
1295

被折叠的 条评论
为什么被折叠?



