进程和线程:
1:进程可以看作是一个程序一次运行的过程,在操作系统内部也是分配资源的基本单位。
2:每一个PCB对象就是一个实实在在运行的程序,也就是进程,PCB有以下几种属性:
2.1:pid进程的身份标识
2.2:内存指针 指明了进程要执行的代码指令和依赖的数据在内存的哪里。
2.3:文件描述符:为了程序运行的时候方便与文件打交道。
2.4:
3:并行:两个CPU核心 同时执行两个任务的代码
并发:微观上一个CPU 执行一会任务1 在执行一会任务2 在执行一会任务3 然后循环,只要切换的足够快,宏观上看起来就好像这么多任务在同时执行一样。
进程的调度:并发和并行 这就是调度的过程
下面的PCB的属性也是为了调度服务:
状态
这个状态描述了当前这个进度接下来应该怎么调度
就绪状态:随时CPU可以执行
阻塞状态/睡眠状态 :可以调用
优先级
先给谁分配时间 后给谁分配时间
给谁分的多 给谁分的少
记账信息
统计了每个进程都分别被执行了多久,都执行了哪些指令
分别都排队等了多久,给进程调度提供指导依据
4:进程调度 就是操作系统考虑CPU资源如何给各个进程分配
内存资源又怎么分配呢 ?
虚拟地址空间
两个进程之间通过虚拟地址空间 已经各自隔离开了
5:操作系统提供类似的公共空间
进程A就可以把数据放到公共空间上 进程B在取走。
这就是进程间通信!
6:面试问题:
进程是什么? 跑起来的程序
进程是怎么管理的? 描述加组织
进程的PCB里有啥?
进程的调度? 时间管理
进程的独立性? 虚拟地址 吧每个进程都隔离开
进程之间如何通信 ?通过操作系统提供的公共空间
线程:
因为系统支持并发执行,所以有进程,但是如果需要频繁的创建销毁进程 成本比较高,频繁的调度进程 也比较麻烦 成本也比较高。
如何解决这个问题
1:进程池 (数据库连接池 字符串常量池)都放在池子里
虽然能解决问题,但是消耗的系统资源太多了 池子里的闲置进程 太多了 消耗系统资源
2; 使用线程来实现并发编程 线程也可以执行一个任务。
线程的优点:
线程比进程更轻量
创建线程成本低
销毁成本也低
调度也低
为啥线程比进程更轻量 ?
因为进程需要申请和释放
线程是包含在进程中,一个进程中的多个线程,共用一份资源,只是创建进程的第一个线程的时候分配资源,后续在创建线程的时候 成本就低了,因为很多资源可以共用。
经典面试题:
进程和线程的区别和联系?
1:进程包含线程,一个进程里有多个或者一个线程。
进程和线程都是为了处理并发编程这样的场景
2:进程在创建和释放的时候 效率低 相比之下 线程更轻量 创建和释放效率更高 (因为少了申请释放资源的过程,所以轻量)
操作系统创建进程,要给进程分配单位,进程是操作系统分配资源的基本单位。
3:操作系统创建的线程,是要在CPU上调度执行,线程是操作系统调度执行的基本单位(其实调度进程 就是调度线程)
4:进程具有独立性 每个进程有各自的虚拟空间 不会互相影响,但是同一个进程的多个线程,共用一个内存空间,一个线程挂了,可能会影响到其他线程的,导致进程崩溃。
5:多个线程共用一份资源, 类似于工厂和生产线