目录
一个CPU的一个逻辑核心只能进行一个任务,而计算机只有16个核心,但是进程可远远不止16个,怎么办?
进程
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
在进程的定义中包含两个非常重要的内容:
1.进程是基本的分配单元.
每一个任务进行的时候都需要硬盘资源,内存资源,任务是系统分配资源的基本单位.
系统分配内存
必须申请内存才操作系统才会给分配可使用的内存.
进程就必须在分配的这块内存上使用.
一个进程跑起来的时候需要指令和数据,指令和数据都是需要加载到内存当中去的,所以哪里是指令,哪里是数据就很重要(内存指针的作用)
2.进程是基本的执行单位. 任务 == 进程
每一个任务进行的时候都需要硬盘资源,内存资源.任务是系统分配资源的基本单位.
多任务操作系统
咱们现在的系统都是多任务操作系统
多任务:同一时间可以执行多个任务.
与之对应的就是单任务操作系统,例如老年机.就是典型的单任务操作系统
之前的诺基亚手机为例,我们只能打开qq或者打开贪吃蛇,并不能两个操作同时进行,在玩贪吃蛇的时候不能接收到qq的消息.
现在打游戏的同时后台还会有大量的任务进行,我们可以接收到qq,微信消息,这就是多任务操作系统.
多任务系统明显优于单任务系统.
多任务操作系统的实现
多任务操作系统是在硬件与操作系统逻辑优化的作用下共同完成的.
现在我们生活中的cpu都是多核处理器,可以看到电脑上的内核显示有8个,假如我们的老年机只有一个内核,现在我们的电脑就可以同时处理8个任务,而老年机只能处理一个.
同时我们看到了逻辑处理器有16个.cpu内核是物理上的核心,但是我们为了将cpu的性能进一步提升,就出现了逻辑处理器,逻辑处理器简单说就是借助超线程技术将一个核当成两个核用,此时物理上是一个内核,但是我们在计算机运行时就可以当成两个逻辑处理器使用.
此时我们处理任务的能力进一步提升,每个逻辑处理器都可以处理一个任务,就可以同时处理16个任务了.
一个CPU的一个逻辑核心只能进行一个任务,而计算机只有16个核心,但是进程可远远不止16个,怎么办?
所以这就涉及到一个非常关键的改变,分时复用(并发),关键要点,轮流执行任务
分时复用(并发)
假设现在我们的电脑上只有一个核心 ,能进行多任务操作系统吗?那如何完成多个任务的执行呢?
CPU核心虽然只有一个,但是可以先执行进程1的代码,然后进行进程2,进程3,以此类推,只要切换速度足够快,人就感受不出来.这就是我们所说的分时复用(并发)
线程
进程可以很好的去解决"并发编程"的问题
但是在一些特定的情况下进程的表现会不尽人意,比如我们要频繁的创建和销毁进程,此时系统开销就会很大.
服务器处理请求,每一个请求都需要建立一个进程,而请求结束后就要销毁,所以此时多进程就不符合要求了.
解决这个问题,我们就引用了线程(也可以成为轻量级进程,可以认为在进程上做出改进)
保持"并发支持",同时也减省了对"分配资源""释放资源"开销.
也不是随便两个进程就能资源共享,把能共享资源的多个线程成为线程组,线程组也就是进程的一部分,
每个进程可以包含一个线程或者多个线程.这样就缓解了进程分配,释放资源的开销.
那么此时线程是越多越好吗?
假设我们把进程比作包工头,他可以去申请项目,材料,然后招工人干活(线程)一定是比自己一个人干活快的,那么招的工人越多越好吗?当然不是,如果工人过多,就会有一些人干不到活,那么就相当于一些线程虽然存在,但是没有内存分配给他,它就无法执行任务,并且有可能多个线程抢占同一块内存,此时反而会使效率下降.
进程与线程之间的区别与联系
进程专注于资源分配
线程专注于调度执行了
当线程引入足够数量之后多出来的线程,线程之间就会竞争cpu资源,非但不会提高效率,反而增加调度开销
多线程还有一个问题,线程之间可能会因为调度同一块内存出现冲突(多线程安全问题)
多线程还有一个问题,共享资源可能会出现副作用
一个线程出现异常没有处理好就有可能导致进程终止.
总结
1.进程包含线程
2.每个线程是一个独立的执行流,可以执行代码,并且单独参与到cpu的调度中去.(状态,上下文,优先级,每个线程都单独有一份)
3.每个进程都有自己的资源,线程可以共同使用这些资源
进程是分配资源的基本单位,线程是执行调度的基本单位
4.进程与进程不会互相影响,但一个进程中的一个线程出现问题,则可能影响到其他线程
5.同一个进程中的线程可能会相互影响,引起线程安全问题.
6.线程不是越多越好,线程多了会影响PCB的调度