1、几种IO模型的原理

系统IO模型:

同步/异步:关注的是事件处理的消息通信机制,即在等待⼀件事情的处理结果时,被调⽤者是否提供完成通知

同步:同步需要调⽤者主动询问事情是否处理完成。

异步:被调⽤者通过状态、通知或回调机制主动通知

 

阻塞/⾮阻塞:关注调⽤者在等待结果返回之前所处的状态

阻塞:blocking,指IO操作需要彻底完成后才返回到⽤⼾空间,调⽤结果返回之前,调⽤者被挂起,⼲不了别的事情。

⾮阻塞:nonblocking,指IO操作被调⽤后⽴即返回给⽤⼾⼀个状态值,⽆需等到IO操作彻底完成,最终的调⽤结果返回之前,调⽤者不会被挂起,可以去做别的事

情。

 

网络IO模型:

同步阻塞:用户进行读操作时,内核要等数据包到达并拷贝到用户空间,在完成之前,用户进程是挂起的,一直在等待内核返回结果,即apache 的preforck模型。  

同步非阻塞:用户进行读操作时,如果内核不能及时返回结果,进程将继续处理其它请求,但却隔一段时间就就要查看内核IO是否完成。

IO多路复用:多线程,即一个process可以处理多个IO请求基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知⽤⼾进程。

信号驱动式:当有IO操作准备就绪时,由内核通知触发⼀个SIGIO信号处理程序执⾏,然后将⽤⼾进程所需要的数据从内核空间拷⻉到⽤⼾空间,即异步阻塞模式,apache event模型。

 

异步非阻塞:nginx的模型,程序进程向内核发送IO调⽤后,不⽤等待内核响应,可以继续接受其他请求,内核调⽤的IO如果不能⽴即返回,内核会继续处理其他事物,直到IO完成后将结果通知给内核,内核在将IO完成的结果返回给进程,期间进程可以接受新的请求,内核也可以处理新的事物,因此相互不影响,可以实现较⼤的同时并实现较⾼的IO复⽤。

 

2、nginx实现基于域名的移动端和pc端

基于不同的域名实现资源的访问,其实就是在不同的location下寻找对应的url去访问;但为了实现资源的划分,我在新建的conf.d的目录下,基于课程中给到的pc.conf做了相关的测试;

i) nginx.conf下指定新的路径;

http {

include  /apps/nginx/conf/conf.d/*.conf;

}

 

ii)访问逻辑:默认配置下,访问对应目录下的index.html;或直接访问文件,如图片等;

 

iii) 在pc.conf下定义server name;

server {
listen 8000;
server_name lsp.lsp;
charset utf-8;

...

}

备注:在这里有一个疑问,如果和主配置文件里server都使用80端口,则在dns解析后,访问界面会跳转到ip对应的站点上去,因此这里使用http://lsp.lsp:8000才能看到正确的效果,其中server name需要在访问站点的机器和本机上的/etc/hosts下添加ip与域名对应关系(由于使用vpn连接环境,使用.net或.com会解析到互联网上,因此使用了这个奇怪的域名);

root@myubuntu:~# cat /etc/hosts
127.0.0.1 localhost
192.168.241.187 ubuntuserver
192.168.241.187 lsp.lsp

 

 

iv) 在server下还可以指定多个location:资源可以使用图片,网页即index.html或自定义页面,通过http://root目录位置/xxx访问;

alias作用:访问当前域名时,直接跳转到root下的index.html;

访问图片效果;

 

 

v) 配置密码登录,账号密码储存在服务器的截文件中;

 密码登陆效果;