进程管理

进程是资源分配的基本单位,是一个程序对某个数据集的动态执行过程。操作系统通过PCB感知进程的存在,PCB内部描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对PCB进行操作。

进程的状态

进程状态的转换:

  1. 初始【建立PCB】
  2. 就绪【经过调度进入3】
  3. 执行【时间片到进入2,IO请求时进入4,正常完成时进入5】
  4. 等待【IO满足时进入2】
  5. 消亡

进程空间被划分为两大部分,用户程序在用户空间内执行,操作系统内核程序在系统空间执行。为了防止用户程序访问系统空间,造成访问出错,计算机还通过程序状态寄存器等设置不同的执行模式 【 用户模式,系统模式 】

单CPU系统中,任一时刻处于执行状态的进程只能有一个。

进程的控制

     系统使用一些具有特定功能的程序段 ↓ 来创建,撤销进程以及完成进程各状态间的转换,从而达到多进程并发执行,资源共享的目的。

     原语:系统态下执行的某些具有特定功能的程序段称作原语。

【原语分为两种:机器指令级别:执行期间不允许中断功能级别不允许并发执行

       【关于进程于原语:创建原语,撤销原语,阻塞原语,唤醒原语

进程互斥

         临界区不允许多个并发进程交叉执行的一段程序称为临界段or临界区。【由于不同并发进程的程序段共享公用数据或共用数据变量引起的

        互  斥:  不允许两个以上的共享资源并发进程同时进入临界区.【资源共享所引起的制约

       互斥执行准则:

              1>不能假设各并发进程的相对执行速度.

              2>自己不在临界区,不能阻止其他进程进入临界区.

              3>若干个进程申请进入临界区时,只允许一个进程进入.

              4>某个进程申请进入临界区时,应该在有限时间内得以进入临界区.

         互斥可以采用称为软件的解决办法,其基本思想是基于内存访问级别的一些基本的互斥,无需硬件,操作系统和程序设计语言的任何支持,采用busy-waiting技术解决来实现互斥问题:

         互斥的硬件方法,禁止中断、使用机器指令。软件方法和硬件方法来实现互斥本身也会有缺陷。

1.加锁实现互斥:[  轮询消耗CPU资源,不够公平 ]

       当某个进程进入临界区之后,它将锁上临界区,直到它退出临界区为止.并发进程在申请进入临界区时,首先测试该临界区是否是上锁的.如果该临界区已被锁住,则该进程要等到该临界区开锁之后才有可能获得临界区.

2.信号量机制实现互斥:两个或多个进程可通过单一的信号量来展开合作,即进程在某一特定的地方停止执行。直到某个特定的信号量到来为止。

两种方式来使用信号量: 用于互斥mutex,用于保证某种事件的顺序发生或不发生。

信号量与P,V原语:

       信号量:管理相应临界区的公有资源,它代表可用资源实体。【仅可以通过P,V原语操作改变。】

         sem>=0 : 代表可供并发进程使用的资源实体数。

         sem < 0  :正在等待使用临界区的进程数。

P:(1) sem-1 ; (2) 减1后仍>=0,P原语继续返回;(3)若减1后小于0,则该进程被阻塞后进入与该信号对应的队列中,再转进程调度。【P代表请求一个资源】

V: (1) sem+1 (2) 加1后>0,V原语停止执行该进程返回调用处继续执行;(3)若加1后<=0,则从该信号的等待队列中唤醒一个等待进程,然后再返回原进程处继续执行或进行进程调度。

【V意味着释放一个资源】

PV原语实现进程互斥:

互斥信号量【mutex】: 初始值为1;

进程同步

       就是并发进程/线程在一些关键点上可能需要互相等待互通消息,这种相互制约的等待与互通信息称为进程/线程同步。

       对共有资源的竞争而引起间接制约。

       并发进程之间存在着其他制约关系影响执行速度。

       在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度。---并发进程间的直接制约

       进程间的同步:把异步环境下的一组并发进程因直接制约而相互发送消息而进行相互合作,相互等待使得各进程按一定的速度执行的过程。

 


 

进程的调度算法:

  1. 先来先服务
  2. 最短作业优先
  3. 最短剩余时间优先
  4. 时间片轮转法
  5. 优先级调度

     

为什么需要线程:

创建一个进程需要花费较大的系统开销和占用较多的资源。为减少进程切换创建开销,提高执行效率和节省资源,引入线程的概念。

进程(火车)与线程(车厢)的区别:

进程是系统分配资源的最小单位,线程是系统调度的最小单位,线程之间共享它所属进程的资源。

一个进程:就是CPU执行的单个任务的过程,是程序在执行过程当中CPU资源分配的最小单位,并且进程有自己的地址空间,包含了准备,就绪,运行,阻塞,终止等状态。线程是CPU调度的最小单位,它可以和属于同一个进程的其他线程共享这个进程的全部资源。两者关系:一个进程包含多个线程,一个线程只能在一个进程中,每一个进程至少包含一个线程。两者区别:进程是CPU资源分配的最小单位,线程是CPU调度的最小单位,进程之间的切换,开销比较大,但是线程之间的开销比较小。CPU会把资源分配给进程,但是线程几乎不拥有任何的系统资源,因为线程共享同一个进程,所以线程间的通信几乎不需要系统的干扰。

  1. 拥有资源方面:进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属该进程的资源
  2. 调度方面:线程是独立的调度单位,

那么,共享哪一些资源?哪一些又是私有的?

1.私有的> 线程运行的本质是函数的运行,函数运行时信息保存在栈帧中,因此每个栈都有自己独立的私有的栈区。同时函数运行时需要额外的寄存器来保存一些信息,如部分局部变量等,这些寄存器也是线程私有的。一个线程不可能访问到另一个线程的这类寄存器信息,【栈区,程序计数器,栈指针,函数运行使用的寄存器】--->统称 线程上下文

2.除了私有的就是共享的,如代码区,数据段,堆空间等。

进程间的通信方式

  1. 管道:linux命令中,ps auxf | grep mysql 中 ,| 就是一个管道,将前一个命令的输出作为后一个命令的输入。管道是单向的,如果要相互通信,就需要创建两个管道。匿名管道的创建,调用( int pipe(int fd[2]))这个系统调用。管道实际就是内核里的一段缓存。从管道的一端写入数据,实际是缓存在内核中,另一端读取,也是从内核中读取该段数据。管道传输的数据是无格式的流且大小受限。生命周期随进程的创建而建立,随进程的结束而销毁
  2. 消息队列:消息队列可以适合于进程间频繁地交换数据。消息队列是保存在内核中的消息链表。 像邮件一样,通信不及时,不适合较大数据的传输。消息队列通信过程中,存在用户态和内核态之间的数据拷贝开销。生命周期:与内核一致,如果释放消息队列或关闭操作系统,消息队列会一直存在。
  3. x共享内存:解决了消息队列读写过程中,发生在用户态与内核态之间的消息拷贝过程。机制:在内存中拿出一块虚拟地址空间,映射到相同的物理内存中。
  4. 信号量:解决共享内存的读写冲突问题,为防止多进程竞争共享资源,造成数据错乱,需要保护机制,使得共享的资源,在任一时刻只能被一个进程访问。信号量表示资源的数量P操作:把信号量减一,相减后,如果信号量<0,则表示资源已经被占用,进程需要阻塞等待,相减后信号量>=0,则表明还有资源可用,进程可正常继续执行。V操作:把信号量加1,如果相加后信号量<=0,则表明当前有阻塞中的进程,于是会将该进程唤醒运行, 相减后如果信号量>0,则表明当前没有阻塞中的进程。PV操作成对出现
  5. 信号:对于异常情况下的工作模式,就需要信号的方式来通知进程,Linux为了响应各种事件,提供了几十种信号,分别代表不同的意义。kill -l 查看。信号来源:硬件来源(Ctrl+C),软件来源(Kill命令)。信号是进程间通信机制中唯一的异步通信机制,可以在任何时候发信号给某一个进程,用户进程对信号可以采取的措施:执行默认操作,捕捉信号,忽略信号。
  6. Socket:跨网络与不同主机上的进程之间通信,int socket(int domain, int type, int protocal)。

僵尸进程,孤儿进程,守护进程

  1. 僵尸进程:子进程先于父进程退出后,子进程的PCB需要其父进程释放,但是父进程并没有释放子进程的PCB,这样子的子进程就称为僵尸进程。危害:僵尸进程不工作,但是会浪费掉系统资源,导致子进程没有被及时回收,称为僵尸状态。处理方法:重启 [X] 傻子!。 kill掉父进程,子进程就变成了孤儿进程,由系统来回收[X],会导致其他子进程受到影响。 进程控制-进程等待,调用wait(),waitpid()等方法。
  2. 孤儿进程:父进程先于子进程退出,子进程没有父进程,变成孤儿进程,被1号init进程所领养,(1号进程会回收子进程的资源)。
  3. 守护进程:一种特殊的孤儿进程,父进程是一号进程,运行在后台,与终端和登录会话脱离关系,不受影响。守护进程通常是一种运行在系统后台的批处理程序,默默做一些循环往复的事情。

 

 

 

 

 

死锁

定义:各并发的进程互相等待对方所拥有的资源,并且这些并发资源在得到对方的资源之前不会释放自己所拥有的资源,从而造成大家都想得到资源而又得不到资源,各并发进程不能继续向前推进的状态。

形成死锁的四个必要条件

  1. 资源互斥:在一段时间内,某资源只能由一个进程占用,如果此时还有其他进程请求资源,就只能等待,直到占有资源的进程用完释放资源。
  2. 占有并等待:进程已经持有一个资源,但是又提出新的资源请求,而该资源已被其他进程占有,此时请求进程阻塞,但又对自己获得的其他资源保持不放。
  3. 不可剥夺:进程所获得的资源在未使用完毕之前,不能被其他进程强行剥夺,而只能由获得该资源的进程自己释放。
  4. 循环等待:存在一种进程循环链,链中每一个进程都已获得的资源同时被下一个进程所请求。

死锁的消除方法:

  1. 死锁预防:打破资源互斥,不可剥夺的条件,打破死锁的循环条件。
  2. 死锁避免:银行家算法。
  3. 死锁检测和恢复:利用有限状态转移图+PetriNet等技术判断是否构成环路来检测。恢复可采用终止各锁住进程的方法,或按一定的顺序中止进程序列,直至已经释放有足够的资源来完成剩下的进程时为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值