什么是进程?
为了使程序能并发执行,人们引入了进程的概念。进程是进程实体的运行过程,是系统进行资源分配和调度的一个基本单位。那什么是进程实体?进程实体由程序段,相关的数据段以及PCB三部分组成。那什么是PCB?PCB是Process Control Block的简称,即进程控制块。系统用PCB来描述进程的基本情况和活动过程。所谓创建进程,其实就是创建PCB,撤销进程,其实就是撤销PCB。
什么是线程?
为了提高程序并发执行的程度,人们引入了线程。由于进程在创建、切换、撤销的过程中所要付出的时空开销太大,人们需要线程这么一个东西,来负责分担进程的压力。在以前,进程既是拥有资源的单位,又是调度和分派的基本单位。引入了线程之后,线程就作为了调度和分派的基本单位,而进程仅拥有资源。而因为线程在切换时,仅需保存和设置少量寄存器的内容,切换代价很低,所以线程的引入提高了操作系统的性能。一个进程中拥有很多个线程,它们共享进程的资源。例如浏览器是一个进程,而这个进程里有很多个线程,如Http请求线程,页面渲染线程等。线程的并发执行可以让浏览器在发送http请求的同时,还可以响应其他事件。
进程和线程的区别。
①拥有资源。进程是资源分配的基本单位,线程仅拥有极少量资源。
②调度。线程是调度的基本单位,如果同进程中的线程进行切换,不会引起进程的切换。而不同进程中的线程进行切换时,会引起进程的切换。
③系统开销。进程创建、切换、撤销时会有很大的开销,因为进程拥有很多资源。而线程进行切换时只需保存和设置少量寄存器的内容,开销很小。
④通信。线程可以通过读写同一进程中的数据进行通信,但是进程间通信需要借助IPC。
进程状态的切换
进程拥有三种基本状态。就绪状态(ready),运行状态(running)和阻塞状态(waiting)。
就绪状态是指进程获得了除CPU之外的必要资源,只要被分配到了CPU使用时间,就可以执行,变成运行状态。然后等所分配的CPU时间片用完之后,又会重新变成就绪状态。
而阻塞状态是因为进程在运行过程中,因为某一事件的发生,阻止了进程的运行,如所需要访问的临界资源被另一个进程所霸占,那么进程就会由运行状态变成阻塞状态。而当阻止它运行的事件完成后,该进程又会由阻塞状态变成就绪状态。
另外,进程还有创建状态和挂起状态。
进程调度算法
不同环境或系统的调度算法不同,因此需要针对不同环境来讨论进程调度算法。
①批处理系统。
I.先来先服务调度算法。(FCFS,first come first served)
非抢占式的调度算法。顾名思义,就是先到先得。先进入就绪状态的会先得到CPU的使用权。缺点是有利于长作业,不利于短作业,因为短作业必须等前面的长作业执行完毕才能拥有CPU使用权。
II.短作业优先。(SJF,short job first)
非抢占式的调度算法。顾名思义,就是作业时间越短其优先级越高。缺点是长作业可能一直无法执行,一直在等待。
III.最短剩余时间优先。(SRTN,shortest remaining time next)
短作业优先的抢占式版本。按剩余运行时间的顺序进行调度,如果一个新的作业到达了,将新的作业完成所需要的时间和正在运行中的作业的剩余完成时间进行比较,如果新的作业所需时间短,那么正在运行中的作业就会被暂时挂起,运行新的作业。
②交互式系统
I.时间片轮转。所有进程按照FCFS的原则进行排队,为每个进程分配固定的时间片,即固定的使用时间。当规定的使用时间耗尽后,就中断该进程的执行,把它放到就绪队列的最后面。
II.优先级调度。为每个进程分配一个优先级,优先级高的先拥有CPU的使用权。
III.多级反馈队列。是时间片轮转调度和优先级调度的结合。设置多个队列,每个队列上的进程的时间片都不一样。进程在一个队列没执行完,会被移到下一个队列。同样每个队列的优先级也不同,最上面的优先级最高。
③实时系统
实时系统要求一个请求在一个确定的时间内得到响应。
分为软实时和硬实时,硬实时必须满足绝对的截止时间,软实时则不用。
进程同步
计算机系统里有许多临界资源,如打印机、磁带机等。进程间只能互斥地访问这些资源,这些进程间不能同时访问的资源称为临界资源,而每个进程中访问临界资源的代码被称为临界区。而进程同步指的就是制定某种规则,让进程间能很好地互相合作访问临界资源,从而使程序具有可再现性。
①硬件同步机制。
②信号量机制。
信号量(Semaphore)是一个整型变量,可以对它进行P,V操作。
P:如果信号量大于0,则将信号量减1。如果信号量小于0,则进程睡眠,等待信号量大于0.
V:将信号量加1,然后把所有沉睡的进程唤醒。
P,V操作需要设计成原语,不可分割。
互斥量(mutex)的取值只能为0或1,0表示临界资源已加锁,1表示已解锁。
③管程机制。
虽然信号量机制是一种既方便又有效的进程同步机制,但每个要访问临界资源的进程都必须自备同步操作wait(S)和signal(S)。(wait()表示进程阻塞,将进程挂起让出临界资源。signal()表示唤醒阻塞的资源)这就使大量的同步操作分散在各个进程中。这不仅给系统的管理带来了麻烦,而且还会因同步的操作的使用不当而导致系统死锁。为了解决这个问题,管程(Monitors)就诞生了。
代表共享资源的数据结构以及由对该共享数据结构实施操作的一组过程所组成的资源管理程序共同构成了一个操作系统的资源管理模块,称之为管程。管程被请求和释放资源的进程所调用。
管程有一个重要的特性,在一个时刻只能有一个进程使用管程。进程在无法执行的时候不能一直占用管程,不然其他进程永远不能使用管程。
④经典同步问题
I.生产者消费者模式。
II.哲学家共餐问题。
进程通信
进程通信和进程同步的概念很容易混淆,进程通信指的是进程之间的信息交换,而进程同步指的是进程之间相互配合进入临界区。故进程通信是为了进程同步。
①管道
管道是unix系统ipc最古老的形式。它是半双工的(即信息只能单向传递),具有固定的读端和写端。而且它只能用于父子进程或兄弟进程之间。可以将它看成是一种特殊的文件,但它不存在于文件系统中,只存在于内存中。
②FIFO
FIFO也称为命名管道,它是一种文件类型,存在于文件系统中。它可以在父子进程或者兄弟进程之间交换数据。
③消息队列
消息队列是消息的链接表,存放在内核中,一个消息队列由一个标识符(ID)来标识。
消息队列独立于读写进程而存在,进程终止了消息队列仍然存在。
消息队列可以实现消息的随时查询,消息不一定要按先进先出的顺序读取,可以按消息的类型读取。
④信号量
信号量是一个计数器,用于为多个进程提供对共享储存对象的访问。
⑤共享内存
共享内存是最快的一种IPC,因为进程是直接对内存进行存取,不用在进程间进行复制。
需要人工进行进程同步。
⑥套接字(socket)
可以实现不同机器间的进程通信。