进程包括
程序的代码
-程序处理的数据
-程序计数器的值,指示下一条将运行的指令
-一组通用的寄存器的当前值,堆,栈
-一组系统资源(如打开的文件)
总之,进程包含了正在运行的一个程序的所有状态信息。
进程与程序的联系
程序是产生进程的基础
-程序的每次运行构成不同的进程
-进程是程序功能的体现
-通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序。
进程与程序的区别
进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行,进程有核心态/用户态
-进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存
-进程与程序的组成不同:进程的组成包括程序,数据和进程控制块(进程的状态信息)
进程特点
程序通过CPU在进程中处理数据。
动态性:可动态地创建,结束进程
并发性:进程可以被独立调度并占用处理机运行
独立性:不同进程的工作不互相影响(不可能越过地址空间)
制约性:因访问共享数据/资源或进程间同步而产生制约
进程控制块
标识进程;记录状态信息;控制信息。
进程生命期
进程创建-进程运行-进程等待-进程唤醒-进程结束
进程等待(阻塞)
->请求并等待系统服务,无法马上完成;
->启动某种操作,无法马上完成;
->需要的数据没有到达。
进程只能自己阻塞自己,因为只有进程自身才能知道何时需要等待某种事件的发生。
进程唤醒
进程只能被别的进程或操作系统唤醒。
状态变化
运行状态(running):当一个进程正在处理机上运行时;
就绪状态(ready):一个进程获得了除处理机之外的一切所需资源,一旦得到处理机即可运行;
阻塞状态(blocked):一个进程正在等待某一事件而暂停运行时的状态,如等待资源,等待I/O完成。
进程挂起
进程不在内存中被挂到disk上了。
阻塞挂起状态(blocked-suspend):进程在外存并等待某事件的出现。
就绪挂起状态(ready-suspend):进程在外存,但只要进入内存,即可运行 。
挂起状态也有优先级。
在外存阻塞挂起得到需要的事件之后会变成就绪挂起
激活
外存阻塞变内存阻塞,其他同理。也有优先级考虑。
状态队列(状态转换)
操作系统维护队列;
不同状态有不同队列。相同状态又会区分优先级。
当状态发生变化时就可以加入其他状态队列,例如阻塞变就绪。
线程
就是进程中的一条执行流程。
进程 = 资源管理 + 线程
一个进程中可以同时存在多个线程;
各个线程之间可以并发的执行;
各个线程之间可以共享地址空间和文件等资源。
一个线程崩溃,该进程的所有线程崩溃。
eg:浏览器中的多个页面。但谷歌是进程网页。
线程与进程的比较:(重要)
线程是资源分配的单位,线程是CPU调度单位;
进程拥有完整的资源平台,而线程只占有必须的资源,如寄存器,栈。
线程同样由就绪,阻塞,执行三种基本状态,同样具有状态之间的转换关系。
线程能减少并发执行的时间和空间开销:
线程的创建时间/终止时间/同一进程内切换时间更小。
同一进程内各线程共享内存和文件资源,可直接进行不通过内核的通信。
实现线程方式
**用户线程:**在用户空间实现,例如POSIX Pthreads, Mach C-threads, Solaris threads。
**内核线程:**在内核中实现,例如Windows, Solaris, Linux。
**轻量级线程:**在内核中实现,支持用户线程,例如Solaris。
用户线程:
不依赖操作系统内核,由用户态中线程库完成。、
优点:
->不需要操作系统内核了解用户线程的存在,可用于不支持线程技术的多进程操作系统;(单进程单线程????)
缺点:
->如果一个线程发起系统调用而阻塞,则整个进程都在等待;(因为操作系统感知不到线程)
->如果一个线程开始运行,除非它主动交出CPU,否则该线程所在进程的其它线程都无法运行;
->由于时间片分配给的是进程,所以与其它进程相比,在多线程执行时,每个线程得到的时间片较少,执行会较慢。
内核线程(windows)
进程线程都在内核控制内(PCB,TCB)。线程切换都得由内核完成。开销大
轻量级线程(linux)
他是内核支持的用户线程。一个进程可以有一个或多个轻量级进程,每个轻量级进程由一个单独的内核线程来支持(Solaris/Linux)。
内核线程控制进程。
切换上下文
进程创控制
其他知识点:21、进程控制 - noticeable - 博客园
一些经典知识点
。。。
死锁
一组阻塞的进程持有一种资源等待获取另一 个进程所占有的一个资源。
例如:
如果一个低优先级的进程拥有临界区并且一个高优先级进程也需求,那么高优先级迸程会获得处理器并等待临界区。
死锁特征(死锁可能出现如果四个条件同时成立)
必要不充分条件
互斥:在一个时间只能有一个进程使用资源。
持有并等待:进程保持至少一个资源正在等待获取其他进程持有的额外资源。
无抢占:一个资源只能被进程自愿释放,进程已经完成了它的任务之后。
循环等待:进程之间等待存在闭环。
解决方案
确保系统永远不会进入死锁状态。.
运行系统进入死锁状态,然后恢复。
忽略这个问题,假装系统中从来没有发生死锁;用于大多数操作系统,包括UNIX。
理论解决就打破四个条件之一就可以了
(死锁预防):一开始就通过条件预防他
1.取消资源互斥性(不靠谱)
2.限制条件占用并等待-必须保证当一个进程请求的资源,它不持有任何其他资源。(要么都拿,要么不拿):但也会导致饥饿状态。
3.抢占 直接kill掉别的
4.(循环等待)打破循环:对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请。(嵌入式用的多)
(死锁避免):
最简单和最有效的模式是要求每个进程声明它可能需要的每个类型资源的最大数目。
资源的分配状态是通过限定提供与分配的资源数量,和进程的最大需求。
死锁避免算法动态检查的资源分配状态,以确保永远不会有一个环形等待状态。(不安全状态)
安全状态:系统处于安全状态指:针对所有进程, 存在安全序列。序列<P1,P2,.... PN>是安全的:针对每个Pq, P;要求的资源能够由当前可用的资源+所有的P持有的资源来满足,其中j<i。
安全的执行序列。
(死锁检测)/(死锁恢复)
允许系统进入死锁状态;死锁检测算法;恢复机制(kill,抢占)