进程

概念

进程:正在进行的一个过程或者说一个任务。是系统进行资源分配和调度的基本单位,是操作系统结构的基础。

进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个抽象概念,所有多道程序设计操作系统都建立在进程的基础上。

  • 进程是指运行的应用程序,内存空间,操作系统的调度称为一个进程
  • 进程是竞争计算机系统有限资源的基本单位,也是进行处理机调度的基本单位
  • 进程是程序的基本执行实体

注: 进程与进程的空间是物理隔离的

补充: 同一个程序多次执行,就会在操作系统中出现两个进程,所以我们可以同时运行一个软件,分别做不同的事情也不会混乱

进程与程序的区别

程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。

想象一位tom猫正在给他的宿敌jerry做奶油蛋糕。

他有做奶油蛋糕的食谱及所需的所有原料:面粉、鸡蛋、奶油等。

在这个比喻中:

  • 做蛋糕的食谱就是程序

  • tom猫就是处理器(cpu)

  • 而做蛋糕的各种原料就是输入数据

  • 进程就是tom阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和

现在假设tom猫的主人站在门外需要tom去开门

tom想了想,给主人开门的任务比给jerry鼠做蛋糕的任务更重要,于是tom立马先记下照着食谱做到第几步(保存进程的当前状态),然后跑去给主人开门。这里,我们看到处理机从一个进程(做蛋糕)切换到另一个高优先级的进程(开门),每个进程拥有各自的程序(食谱和开锁)。开门之后,tom又回来从他离开时的那一步继续做蛋糕

需要强调的是:同一个程序执行两次,那也是两个进程,比如打开快播,虽然都是同一个软件,但是一个可以播放苍井空,一个可以播放饭岛爱,分别做不同的事情也不会混乱

进程调度

要想多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随即进行的,而是需要遵循一定的法则,由此就有了进程的调度算法。

  • 先来先服务调度算法

先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

  • 短作业优先调度算法

短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

  • 时间片轮转法

时间片轮转(Round Robin,RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片,例如,几十毫秒至几百毫秒。如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。

  • 多级反馈队列

前面介绍的各种用作进程调度的算法都有一定的局限性。如短进程优先的调度算法,仅照顾了短进程而忽略了长进程,而且如果并未指明进程的长度,则短进程优先和基于进程长度的抢占式调度算法都将无法使用。
而多级反馈队列调度算法则不必事先知道各种进程所需的执行时间,而且还可以满足各种类型进程的需要,因而它是目前被公认的一种较好的进程调度算法。在采用多级反馈队列调度算法的系统中,调度算法的实施过程如下所述。
(1) 应设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二个队列次之,其余各队列的优先权逐个降低。该算法赋予各个队列中进程执行时间片的大小也各不相同,在优先权愈高的队列中,为每个进程所规定的执行时间片就愈小。例如,第二个队列的时间片要比第一个队列的时间片长一倍,……,第i+1个队列的时间片要比第i个队列的时间片长一倍。
(2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS原则等待调度执行;如果它在第二队列中运行一个时间片后仍未完成,再依次将它放入第三队列,……,如此下去,当一个长作业(进程)从第一队列依次降到第n队列后,在第n 队列便采取按时间片轮转的方式运行。

(3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。如果处理机正在第i队列中为某进程服务时,又有新进程进入优先权较高的队列(第1~(i-1)中的任何一个队列),则此时新进程将抢占正在运行进程的处理机,即由调度程序把正在运行的进程放回到第i队列的末尾,把处理机分配给新到的高优先权进程

进程的并行与并发

并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑

并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。

区别:

并行是同时运行,只有具备多个cpu才能实现并行
并发是是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)

同步异步阻塞非阻塞

在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞(IO)

image-20190919190516495

就绪(Ready)状态

当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。

执行/运行(Running)状态

​ 当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。

阻塞(Blocked)状态

​ 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。

同步 、异步: 是指任务提交的方式 

同步:提交任务后原地等待任务执行完毕,拿到任务的返回值才能继续下一行代码,导致程序串行

异步:提交任务后不在原地等待,任务一旦执行完毕就会触发回调函数的执行,程序是并发

阻塞 、非阻塞 : 指程序执行中的运行状态 
    阻塞: 出现io 非阻塞: 没有出现 io
    异步非阻塞: 程序在执行过程中没有出现io,任务提交是异步,无需等

import time
​
def func(name):
    print('%s runing'%name)
    time.sleep(3)
​
func('waller')  # 同步 任务提交后原地等待函数运行结束后再走下面的代码
print('procedure over')

多路I/O复用模型,非阻塞IO

通过一种机制,可以监视多个文件描述符,一旦描述符就绪(读就绪和写就绪),能通知程序进行相应的读写操作,I/O多路复用避免阻塞在io上,原本为多进程或多线程来接收多个连接的消息变为单进程或单线程保存多个socket的状态后轮询处理。

    I/O多路复用的本质就是用select/poll/epoll,去监听多个socket对象,如果其中的socket对象有变化,只要有变化,用户进程就知道了。I/O多路复用是用于提升效率,单个进程可以同时监听多个网络连接IO。

select,poll,epoll模型的区别

select是不断轮询去监听的socket,socket个数有限制,一般为1024个;

poll还是采用轮询方式监听,只不过没有个数限制;

epoll并不是采用轮询方式去监听了,而是当socket有变化时通过回调的方式主动告知用户进程。

下面举一个例子,模拟一个tcp服务器处理30个客户socket。

假设你是一个监考老师,让30个学生解答一道竞赛考题,然后负责验收学生答卷,你有下面几个选择:

1. 第一种选择:按顺序逐个验收,先验收A,然后是B,之后是C、D。。。这中间如果有一个学生卡住,全班都会被耽误。

这种模式就好比,你用循环挨个处理socket,根本不具有并发能力。

2. 第二种选择:你创建30个分身,每个分身检查一个学生的答案是否正确。 这种类似于为每一个用户创建一个进程或者线程处理连接。

3. 第三种选择,你站在讲台上等,谁解答完谁举手。这时C、D举手,表示他们解答问题完毕,你下去依次检查C、D的答案,然后继续回到讲台上等。此时E、A又举手,然后去处理E和A。

这种就是IO复用模型

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值