|
cgi在2000年或更早的时候用得比较多, 以前web服务器一般只处理静态的请求,web服务器会根据这次请求的内容,然后会fork一个新进程来运行外部c程序 (或perl脚本...), 这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求改动态脚本,那么web服务器又再次fork一个新进程,周而复始的进行。
后来出现了一种更高级的方式是, web服务器可以内置perl解释器或php解释器。 也就是说这些解释器做成模块的方式,web服务器会在启动的时候就启动这些解释器。 当有新的动态请求进来时,web服务器就是自己解析这些perl或php脚本,省得重新fork一个进程,效率提高了。
fastcgi的方式是,web服务器收到一个请求时,他不会重新fork一个进程(因为这个进程在web服务器启动时就开启了,而且不会退 出),web服务器直接把内容传递给这个进程(进程间通信,但fastcgi使用了别的方式,tcp方式通信),这个进程收到请求后进行处理,把结果返回 给web服务器,最后自己接着等待下一个请求的到来,而不是退出。
fastcgi跟cgi的区别是:
在web服务器方面 在对数据进行处理的进程方面
cgi fork一个新的进程进行处理 读取参数,处理数据,然后就结束生命期
fastcgi 用tcp方式跟远程机子上的进程或本地进程建立连接 要开启tcp端口,进入循环,等待数据的到来,处理数据
举个例子: 服务端现在有个10万个字单词, 客户每次会发来一个字符串,问以这个字符串为前缀的单词有多少个。 那么可以写一个程序,这个程序会建一棵trie树,然后每次用户请求过来时可以直接到这个trie去查找。 但是如果以cgi的方式的话,这次请求结束后这课trie也就没了,等下次再启动该进程时,又要新建一棵trie树,这样的效率就太低下了。 而用fastcgi的方式的话,这课trie树在进程启动时建立,以后就可以直接在trie树上查询指定的前缀了。
3、select, poll和epoll的区别
select
select最早于1983年出现在4.2BSD中,它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回后,该数组中就绪的文件描述符便会被内核修改标志位,使得进程可以获得这些文件描述符从而进行后续的读写操作。
select目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点,事实上从现在看来,这也是它所剩不多的优点之一。
select的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,不过可以通过修改宏定义甚至重新编译内核的方式提升这一限制。
另外,select()所维护的存储大量文件描述符的数据结构,随着文件描述符数量的增大,其复制的开销也线性增长。同时,由于网络响应时间的延迟 使得大量TCP连接处于非活跃状态,但调用select()会对所有socket进行一次线性扫描,所以这也浪费了一定的开销。
poll
poll在1986年诞生于System V Release 3,它和select在本质上没有多大差别,但是poll没有最大文件描述符数量的限制。
poll和select同样存在一个缺点就是,包含大量文件描述符的数组被整体复制于用户态和内核的地址空间之间,而不论这些文件描述符是否就绪,它的开销随着文件描述符数量的增加而线性增大。
另外,select()和poll()将就绪的文件描述符告诉进程后,如果进程没有对其进行IO操作,那么下次调用select()和poll() 的时候将再次报告这些文件描述符,所以它们一般不会丢失就绪的消息,这种方式称为水平触发(Level Triggered)。
epoll
直到Linux2.6才出现了由内核直接支持的实现方法,那就是epoll,它几乎具备了之前所说的一切优点,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。
epoll可以同时支持水平触发和边缘触发(Edge Triggered,只告诉进程哪些文件描述符刚刚变为就绪状态,它只说一遍,如果我们没有采取行动,那么它将不会再次告知,这种方式称为边缘触发),理论上边缘触发的性能要更高一些,但是代码实现相当复杂。
epoll同样只告知那些就绪的文件描述符,而且当我们调用epoll_wait()获得就绪文件描述符时,返回的不是实际的描述符,而是一个代表 就绪描述符数量的值,你只需要去epoll指定的一个数组中依次取得相应数量的文件描述符即可,这里也使用了内存映射(mmap)技术,这样便彻底省掉了 这些文件描述符在系统调用时复制的开销。
另一个本质的改进在于epoll采用基于事件的就绪通知方式。在select/poll中,进程只有在调用一定的方法后,内核才对所有监视的文件描 述符进行扫描,而epoll事先通过epoll_ctl()来注册一个文件描述符,一旦基于某个文件描述符就绪时,内核会采用类似callback的回调 机制,迅速激活这个文件描述符,当进程调用epoll_wait()时便得到通知。
4、Memcache和Redis区别
- Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。
- Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存。
- 他们的扩展都需要做集群;实现方式:master-slave、Hash。
- 在100k以上的数据中,Memcached性能要高于Redis。
- 如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。
- 如果你对数据持久化和数据同步有所要求,那么推荐你选择Redis,因为这两个特性Memcached都不具备。即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择Redis也是明智的。
- Redis和Memcache在写入性能上面差别不大,读取性能上面尤其是批量读取性能上面Memcache更强
假设给你5台机器,请大致的描述一下,如何使用你所熟悉的开源软件,搭建一个日PV 3万左右的中型网站
3台Web服务器,两台MySQL数据库服务器,采用Master/Slave同步的方式减轻数据库负载,Web服务器可以结合Memcahe缓存来减少负载,同时三台Web服
务器内容一致,可以采用DNS轮训的方式来进行负载平衡
2.说说你所了解的搜索引擎包含那些技术?
爬虫(采集)、切词(分词)、索引(存储)、查询以及其他相关技术
3.使用过Memcache缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce是把所有的数据保存在内存当中,采用hash表的方式,
每条数据又key和value组成,每个key是独一无二的,当要访问某个值的时候先按照找到
值,然后返回结果。
Memcahce采用LRU算法来逐渐把过期数据清除掉。
- 平时喜欢哪些php书籍及博客?CSDN、虎嗅、猎云
- js闭包是什么,原型链了不了解?
- for与foreach哪个更快?
- php鸟哥是谁?能不能讲一下php执行原理?
- php加速器有哪些?apc、xcache.....能不能讲一下它的加速原理,与现在的O+有什么差别?
- Node.js能彻底代替php+apache 吗?
- 怎样判断一个值是否存在于数组中?in_array(),array_key_exists 哪一个更好
- 怎样判断select语句中是否使用了索引?explain 等的使用
- sphinx的中文分词词库使用第三方库还是自己建库?
- mysql与mysqli的区别有哪些?
- 将来的发展方向?安全、还是数据挖掘、大数据处理?
- php的面向对象:类的修饰符、封装、继承、多态等
- php的设计模式:单例模式、工厂模式、生产者模式......等23种
- 服务器状态码:200、202、301、404、500......
- i++与++i++与++i的区别?
- 项目开发:电商项目中的购物车数据持久化、考试系统的安全性考虑、
- mysql设计基础:三大范式、功能->思维导图、创建表的第一字段是什么?
- mysql字段char、varchar、int、smallint、tinyint、mediumint、bigint、decimal、double、float字节数及应用场景
- mysql 数据类型有哪些 ? 分别占用多少存储空间 ?
- mysql 索引原理及sql性能优化
- memcache与mongoDB、Redis各自的使用场景是什么?
- 为什么mongoDB与Redis非但没有形成竞争反而是互补关系?
- Redis数据类型有哪些?int、string、hash、set、list ?
- 安装linux软件时使用make方式还使用yum方式?
- linux网络优化,如何查看进程、怎样查看最大文件打开数?
- 1条微薄要推送给100万个粉丝该怎么处理?
- 知道哪些算法?冒泡排序?快速排序?二分查找法?
- yii thinkphp ci 各自优点
- php 设计模式有哪些?单例模式的4个特性和实现原理
- C语言中的虚函数是什么?
- C排序算法有哪些?
- php 基本结构是什么?
- memcache magent 分布式设计?
- php的内存回收机制是什么?
- php在2011年底出现hash碰撞,hash碰撞原理为? 如何进行修复?
- 一个php文件的解释过程是? 一般加速php有哪些? 提高php整体性能会用到哪些技术?
- redis 分布式设计,如何设计?
- mongo 集群架构是怎样的?
- tcp/ip 网络协议,osi7层指是什么?
- php 处理大数据业务
- linux 应用,负载性能查看 ?
- nginx设置缓存js、css、图片等信息,缓存的实现原理是?
- nginx负载均衡有哪些? 如果其中一台服务器挂掉,报警机制如何实现?
- nginx 实战优化业务功能 ?
- 谈一下近三年来你的得意之作?
- 看看简历,会问一些过去做的项目的用户量、pv、吞吐量、相关难点和解决方法等
- 数据库设计经验,为什么进行分表? 分库?
- 一般多少数据量开始分表? 分库? 分库分表的目的? 什么是数据库垂直拆分? 水平拆分? 分区等等?可以举例说明
- 数据库优化有哪些? 分别需要注意什么?
- web开发方面会遇到哪些缓存? 分别如何优化?
- 给你256M的内存,对10G的文件进行排序(文件每行1个数字),如何实现?
- 对10G的文件进行查找如何实现?
- 统计10G文件每个关键字出现的次数如何实现?
- 假如你现在是12306火车订票的设计师,你该如何设计满足全国人民订票?
- 假如有1亿用户的访问量,你的服务器架构是怎样的? 用户信息的存储方案如何设计?
- 如果你是技术组长,所带团队任务进度无法完成你该如何解决?
- 如果在进度排满的前提下插入任务,你该如何保证总进度不延期?
- 如果有的工程师今天预定任务没有完成,你该如何解决?
- 从你的经验方面谈一下如何构建高性能web站点? 需要哪些环节? 步骤? 每个步骤需要注意什么如何优化等?
- 为什么要对数据库进行主从分离?
- 如何处理多服务器共享session?
- 一个10G的表,你用php程序统计某个字段出现的次数,思路是?
- 会告诉你一个nginx日志例子,用你认为最佳的编程语言统计一下http响应时间超过1秒的前10个url?
- 给你一个mysql配置文件,用你认为最佳的编程语言解析该文件?
- 给你两个路径a和b,写一个算法或思路计算a和b差距几层并显示a和b的交集?
- 给你一个url,在nginx配置一下rewrite指定到某个具体路径?
- session和cookie生存周期区别? 存储位置区别?
- require、include、require_once、include_once区别? 加载区别? 如果程序按需加载某个php文件你如何实现?
- chrome号称为多线程的,那么多线程和多进程的区别为?
- 如何提高缓存命中率? 如何对缓存进行颗粒化?
- web不安全因素有哪些? 分别如何防范?
- 假如两个单链表相交,写一个最优算法计算交点位置,说思路也可以?
- 假如你是技术组长? 如何提高团队效率?
- 不优化前提下,apache一般最大连接数为? nginx一般最大连接数为? mysql 每秒insert ? select ? update ? delete?
- 我的所有问题都问完了(当然没有这么多),你有什么问题问我没有?如果帮到了您,可以支持一下,谢谢您的支持!
|
|
|