操作系统 ---- 进程管理

16 篇文章 0 订阅
9 篇文章 0 订阅

一、进程

进程是计算机中已运行程序的实体。
进程和程序之间的关系可以这么理解,程序可以看做是一些指令的集合,而这些指令在执行时就可以成为是一个进程。

1.总结一下进程和程序的区别:

  • 进程是程序及其数据在计算机上的一次运行活动,是一个动态的概念。进程的运行实体是程序、离开程序的进程没有存在的意义。从静态角度来看,进程是由程序、数据和进程控制块(PCB)三部分组成。而程序是一组有序的指令集合,是一种静态的概念。
  • 进程是程序的一次执行过程,他是动态地创建和消亡的,具有一定的生命期,是暂时存在的。而程序则是一组代码的集合,它是永久存在的,可以长期保存。
  • 一个进程可以执行一个或者几个程序,一个程序也可以构成多个进程。进程可以创建进程,而程序是不可以形成新程序的。
  • 进程与程序的组成不同。进程的组成包括程序、数据和进程控制块。

2.进程的五种状态

  • 运行状态:进程正在处理器上运行,在单处理器环境下,每一时刻最多只有一个进程处于运行状态。
  • 就绪状态:进程已处于准备运行的状态,即进程获得了除处理器之外的一切所需要的资源,一旦得到处理器即可运行。
  • 阻塞状态:又称为等待状态,进程正在等待某一事件而暂停运行。如等待某资源为可用(不包括处理器)或等待输入/输出完成。即使处理器空闲,该进程也不能运行。
  • 创建状态:进程正在被创建,尚未转到就绪状态。
  • 结束状态:进程正从系统中消失。可能是进程正常结束或其它原因中断退出运行。在这里插入图片描述

二、线程

线程,有时候被称为轻量级进程,是程序执行体的最小单元。一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成。
另外,线程是进程中的一个实体,是被系统独立分配调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的资源。

1.线程的一些固有属性

  • 线程ID:每个线程都有自己的线程ID,这个ID在本进程中是唯一的,进程用此来标识线程。
  • 寄存器组的值:由于线程间是并发运行的,每个线程都有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有线程的寄存器集合的状态进行保存,以便将来该线程在被重新切换时能得以恢复。
  • 线程的堆栈:堆栈是保证线程独立运行所必需的。线程函数可以调用函数,而被调用的函数中又可以是层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不收其它线程的影响。在一个进程的线程共享堆区。
  • 错误码返回
  • 线程的信号屏蔽码
  • 线程的优先级

2.线程与进程的区别

大致可以总结为以下几点:

  • 调度:在传统的操作系统中,拥有资源和独立调度的基本单位是进程。引入线程之后,**线程是独立调度的基本单位,进程是拥有资源的基本单位。**在同一进程中,线程的切换不会引起进程切换。在不同进程中进行的线程切换,则会引起进程切换。
  • 拥有资源:不论是传统的还是引入线程的操作系统,进程都是拥有资源的基本单位,线程不拥有资源,但是线程可以共享其隶属进程的系统资源。
  • 并发性:在引入线程的操作系统中,不仅进程可以并发执行,而且同一进程内的线程也可以并发执行,从而使操作系统具有更好的并发性,大大地提高了系统的吞吐量。
  • 系统开销:创建和撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,因此操作系统所付出的开销远大于创建或撤销线程的开销。类似的,在进程切换时,涉及当前执行进程CPU环境的保存以及新调度的进程CPU环境的设置;而线程切换时只需要保存和设置少量寄存器内容,因此开销很小。另外,由于同一进程内的多个线程共享进程的地址空间,因此这些线程之间的同步与通信比较容易实现,甚至无须操作系统的干预。
  • 地址空间和其他资源:进程的地址空间之间是相互独立的,同一进程的各线程间共享进程的资源,某进程内的线程对于其他进程不可见。
  • 通信方面:进程间通信需要借助操作系统,而线程间可以直接读写进程数据段来进程通信。

三、进程通信与进程同步

1.进程通信与同步通常有以下一些目的

  • 数据传输:一个进程需要将它的数据发送给另一个进程。
  • 共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到。
  • 通知事件:一个进程需要向另一个或者一组进程发送消息,通知它发生了某种事件。
  • 资源共享:多个进程之间共享同样的资源。为了做到这一点,需要内核提供锁和同步机制。
  • 进程控制:有些进程希望完全控制另一个进程的执行,此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。

2.Linux下进程间通信的几种主要手段简介

  • 管道(pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,它还允许无亲缘关系的进程间通信。
  • 信号(single):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;Linux除了支持UNIX早起信号语义函数single外,还支持语义符合Posix.1标准的信号函数sigaction;
  • 消息队列(Message):有足够权限的进程可以在消息队列中放取消息。其克服了信号承载信息少,管道只能承载无格式字节流以及缓冲区大小受限制等缺点。
  • 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其他通信机制,如信号量结合使用,来达到进程间的同步及互斥。
  • 信号量(semaphore):主要作为进程空间以及同一进程不同线程之间的同步手段。
  • 套接口(socket):更为一般的进程间通信机制,可用于不同机器上的进程间的通信。起初是有UNIX系统的BSD分支开发出来的,但现在一般可以移植到其他类UNIX系统上:Linux和System V的变种都支持套接字。

3.其他系统以及线程间的通信

  • Linux线程间通信:互斥体(互斥量)、信号量、条件变量。
  • Windows进程间通信:管道、共享内存、消息队列、信号量、socket。
  • Windows线程间通信:临界区(Critical Section)、互斥量(Mutex)、信号量(Semaphore)、事件。

4.临界区和互斥体的区别

  • 临界区只能用来同步本进程内的线程,而不可以用来同步多个进程中的线程。
  • 互斥量、信号量、事件都可以被跨越进程使用来进行同步数据操作。
  • 临界区是非内核对象,只在用户态进行锁操作,速度快。互斥体是内核对象,在核心态进行锁操作,速度慢。
  • 临界区和互斥体在Windows平台下都可用,但是Linux只有互斥体可用。

四、调度算法

调度的基本准则包括CPU利用率、系统吞吐量、周转时间、等待时间、响应时间等。

  • 系统吞吐量:表示单位时间内CPU完成作业的数量。
  • 周转时间:作业完成时刻减去作业达到时刻。
  • 等待时间:指进程处于就绪态的时间之和,等待时间越长,用户满意度越低。
  • 响应时间:指从用户提交请求到系统首次产生响应所用的时间。
  • 典型的调度算法:先来先服务算法(FCFS)、短作业优先算法(SJF)、优先级调度算法、高响应优先调度算法、时间轮转算法、多级反馈队列调度算法。其中SJF的平均等待时间、平均周转时间最少。

五、死锁

所谓死锁是指多个进程因竞争资源而造成一种僵局(互相等待),若无外力干预,这些进程都无法前进。现实生活中简单的例子:交通阻塞,两股相向而行的车流都想通过已被对方占用的道路,结果双方都不同前进。

1.死锁产生的原因

  • 系统资源的竞争
  • 进程推进顺序非法

2.死锁产生的必要条件

产生死锁必须同时满足以下四个条件:

  • 互斥条件:进程要求对所分配的资源进行排他性控制,即在一定时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
  • 不剥夺条件:进程所获得的资源在未使用完之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放。
  • 请求和保持条件:又称为部分分配条件。进程每次申请它所需要的一部分资源,在等待新资源的同时,进程继续占有已分配到的资源。
  • 循环等待条件:存在一种进程资源的循环等待链,链中每个进程已获得的资源同时被链中下一个进程所请求。

3.死锁处理策略

  • 预防死锁:设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个。
  • 避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态。银行家算法是著名的死锁避免算法。
  • 死锁的检测及解除:无须采取任何限制性措施,允许进程在运行过程中发生死锁,通过系统的检测机制及时地检测出死锁的发生,然后采取某种措施解除死锁。
  • 主要的解除方法:资源剥夺发、撤销进程法、进程回退法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值