2、晌基开始轮询:设置循环计数器,进入轮询循环。
3、读写变频器参数:使用S7-200的特殊指令,向变频器发送读写指令,获取变频器的相关参数,如电压、电流、频率、运行状态等等。
4、数扰亮据处理:对读取到的变频器参数进行处理,如进行单位转换,数据滤波等。
5、控制指令下发:根据变频器参数和控制算法,生成相应的控制指令,通过S7-200输出端口向变频器发送控制指令,调整变频器的工作状态和参数。
6、等待下一缓谨宽次轮询:根据程序设定的时间间隔,等待下一次轮询。
在用户程序中,select()和poll()也是与设备阻塞和非阻塞访问相关的内容。
使用非阻塞IO的应用程序通常会使用select()和poll()系统调用查询是否可以对设备进行无阻塞的访问。
select()和poll()系统调用最终会使设备驱动中的poll()函数执行,在后续的Linux内核版本中还引入了epoll(),即扩展的poll()。
select()和poll()系统调用的本质是一样的,前者在BSD Unix中引入,后者在System V中引入。
应用程序中使用最广泛的是BSD Unix中引入的select()系统调用,原型如下:
如下图所示,
第一次对n个文件进行select()的时候,若任何一个文件满足要求,select()就直接返回;
第二次再进行select()的时候,没有文件满足读写要求,select()的进程阻塞且睡眠。
由于调用select()的时候,每个驱动的poll()接口都会被调用到。实际上执行select()的进程被挂到了每个驱动的等待队列上,可以被任何一个驱动唤醒。如果FDn变得可读写,select()返回。
poll()的功能和实现原理与select()类似,其原型函数为:
当多路复用的文件数量庞大、IO流量频繁的时候,一般不太适合使用select()和poll(),这种情况下select()和poll()表现较差,推荐使用epoll()。
使用epoll()最大的好处就是不会随着fd数目的增长而降低效率,select()则会随冲厅着fd数量增大性能明显下降。
相关接口:
创建一个epoll()的句柄,size用来告诉内核要监听多少个fd,当创建好epoll()句柄时,它本身也会占用一个fd值,所以在使用完epoll()后,必须调用close()关闭。
告诉内核要监听什么类型的事件:
第一个参数epfd是epoll_create()的返回值,
第二个参数表示动作,包含散洞隐:
第3个参数是需要监听的fd,
第4个参数是告诉内核需要监听的事件类型,struct_epoll_event结构如下:
events可以是以下几个宏的”或“:
一般来说,当涉及的fd数量较少时,使用select是合适的;如果涉及的fd很多,如颤判在大规模并发的服务器中监听许多socket的时候,则不太适合选用select,适合使用epoll。
需要用辅助的数组存储信息之类的。RR算法用队列直接模拟是相对很简单的,也很适合在考试时使用,但是其它的调度算法就不一定了,需要用辅助的数组存储信息之类的,符合原理地适时调整。
换进程。该算法中,将一个较小时间单元定义为时间量或时间片。时间片启拿的大小通常为10-100ms。就绪队列作为循环队列。拦贺CPU调度程序循环整个就绪队列,为每个进程分配不超过一个时间片的CPU。为了实现RR调度,我们再次将就绪队列视为进程的FIFO队列。新进程添加到就绪队列的尾部。CPU调度程序从就绪队列中选择第一个进程,将定时器设置在一个时间片后中断,最后分派这个进程。接下来,有两种情况可能发生。进程可能只需少于时间片的CPU执行。对于这种情况,进程本身会自动释放CPU。调度程序接着处理就绪队列的下一个进程。否则,如果当前运行进程的CPU执行大于一个时间片,那么定时器会中断,进而中断 *** 作系统。然后,进行上下文切换,再将进程加到就绪队列的尾部,接着CPU调度程序会简旁派选择就绪队列内的下一个进程。不过,采用RR策略的平均等待时间通常较长。假设有如下一组进程,它们在时间0到达,其CPU执行以ms计。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)