社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。
参见百度百科: https://baike.baidu.com/item/进程调度/10702294?fr=aladdin
系统需要维护3个队列:
遇到IO事件,会变成等待态,放入到等待队列。遇到锁也会放入到等待队列
一个进程可以处理多个IO事件,多个请求。
遇到IO事件进入等待态,会造成一个线程只能处理一个请求,线程过多上下文切换又会浪费cpu,所以有了IO多路复用技术
举例:一个线程利用epoll监听多个fd,将fe、事件注册到epoll中,当有事件发生时,线程再去处理。具体包含:注册、epoll_wait(获取可以处理的fd)、处理、再放回epoll(可能没有处理完)。线程需要维护fd相应的session信息,事件对于的回调函数,当某类事件来临时,可以进行相应处理。
正是因为nginx应用了IO多路复用,所以可以单线程,可以处理高并发的请求
nginx是一个master进程,多个worker进程(一个进程包含一个线程)。master进程监听请求之后,转给worker进程处理,由于网络包的传输是一个个分批传输的,worker进程在读取网络IO的时候,不能一次性读取完,一般两种选择 第一阻塞:一直等,等这个连接完全传输完,然后进行相应处理,这样会造成一个线程只能同时处理一个请求,并发低。 第二非阻塞:也是nginx采取的方式,不会一直等,而是转而去处理其他请求。这就是异步非阻塞IO
事件驱动:nginx是事件驱动的,事件来了 我才去处理
IO:文件、网络 均为IO事件。 fd是IO的一种抽象
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!