2015阿里巴巴校园招聘电话面试总结(研发工程师php)

7月22日晚7点接到了阿里面试电话

首先就是非常常见的自我介绍,,这里略过了,

以下是大部分的内容:

php方面 1、魔术方法:

__construct(),__destruct(), 方法重载:__call(),__callStatic(), 属性重载:__get(),__set(),__isset(),__unset(),这四个只对类中,私有,受保护的成员属性有效 __toString(),__autoload(); _set_state(),//自 PHP 5.1.0 起当调用 var_export() 导出类时,此静态 方法会被调用。 本方法的唯一参数是一个数组,其中包含按 array(‘property’ => value, …) 格式排列的类属性。 __clone();//通常用于对副本进行重新初始化,that指原对象引用 等方法在 PHP 中被称为”魔术方法”(Magic methods)。

2、魔术常量:

FILE,LINE,DIR,FUNCTION,CLASS,TRAIT,METHOD, NAMESPACE

3、常见的数组函数

current — 返回数组中的当前单元 end — 指针指向数组的末尾 next — 将数组中的内部指针向前移动一位 pos — current 的别名 prev — 将数组的内部指针倒回一位 reset — 将数组的内部指针指向第一个单元

array_keys — 返回数组中所有的键名 array_flip — 交换数组中的键和值 key — 从关联数组中取得键名 array_change_key_case — 返回字符串键名全为小写或大写的数组 array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 in_array — 检查数组中是否存在某个值 key_exists — 别名 array_key_exists array_search — 在数组中搜索给定的值,如果成功则返回相应的键名 array_pop — 将数组最后一个单元弹出(出栈) array_push —入栈 array_shift — 将数组开头的单元移出数组 array_unshift — 在数组开头插入一个或多个单元

4、memcache内存管理机制

page(页)为内存分配的最小单位

Memcached 的内存分配以page为单位,默认情况下一个page是1M,可以通过-I参数在启动时指定。如果需要申请内存时,memcached会划分出一个新的 page并分配给需要的slab区域。page一旦被分配在重启前不会被回收或者重新分配

Slabs(层)划分数据空间

Memcached并不是将所有大小的数据都放在一起的,而是预先将数据空间划分为一系列slabs,每个slab只负责一定范围内的数据存储。如下图,每个slab只存储 大于其上一个slab的size并小于或者等于自己最大size的数据。例如:slab 3只存储大小介于137 到 224 bytes的数据。如果一个数据大小为230byte将被分配到slab 4中。从下图可以看出,每个slab负责的空间其实是不等的,memcached默认情况下下一个slab的最大值为前一个的1.25倍,这个可以通过修 改-f参数来修改增长比例。

Chunk(块)才是存放缓存数据的单位。

Chunk 是一系列固定的内存空间,这个大小就是管理它的slab的最大存放大小。例如:slab 1的所有chunk都是104byte,而slab 4的所有chunk都是280byte。chunk是memcached实际存放缓存数据的地方,因为chunk的大小固定为slab能够存放的最大值, 所以所有分配给当前slab的数据都可以被chunk存下。如果时间的数据大小小于chunk的大小,空余的空间将会被闲置,这个是为了防止内存碎片而设计的。例如下图,,chunk size是224byte,而存储的数据只有200byte,剩下的24byte将被闲置。

Slab的内存分配。

Memcached在启动时通过-m指定最大使用内存,但是这个不会一启动就占用,是随着需要逐步分配给各slab的。

如果一个新的缓存数据要被存放,memcached首先选择一个合适的slab,然后查看该slab是否还有空闲的chunk,如果有则直接存放进去;如果没有则要进行申请。slab申请内存时以page为单位,所以在放入第一个数据,无论大小为多少,都会有1M大小的page被分配给该slab。申请到 page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成了一个chunk的数组,在从chunk数组中选择一个用于存储 数据。如下图,slab 1和slab 2都分配了一个page,并按各自的大小切分成chunk数组。

Memcached内存分配策略。

综合上面的介绍,memcached的内存分配策略就是:按slab需求分配page,各slab按需使用chunk存储。

这里有几个特点要注意:

Memcached分配出去的page不会被回收或者重新分配 Memcached申请的内存不会被释放 slab空闲的chunk不会借给任何其他slab使用

数据结构与算法 1、hash表Status; typedef struct{int *elem; //数据元素的存储基址 int count; //当前数据元素的个数 } HashTable;int m = 0; //散列表长度//初始化 散列表Status initHashTable(HashTable *H){int i;m = HASHSIZE;H->count = m;H->elem = (int *)malloc(m * sizeof(int)); //在堆中开辟空间 for(i = 0; i < m; i++){H->elem[i] = NULLKEY; //初始化数据 }return OK;}//散列函数 计算散列地址 int hash(int key){return key % m; //除留余数法 } //插入关键字进散列表void insertHash(HashTable *H, int key){int addr = hash(key); //求散列地址while(H->elem[addr] != NULLKEY){ //冲突产生了. addr = (addr + 1) % m; //开放定址法 线性探测 }H->elem[addr] = key; //如果有空位插入关键字 } //散列表查找关键字 用*addr返回 Status searchHash(HashTable H, int key, int *addr) {*addr = hash(key);while(H.elem[*addr] != key){ //有冲突,向下查找 *addr = (*addr + 1) % m;if(H.elem[*addr] == NULLKEY || *addr == hash(key)){ //循环回到原点 说明关键字不存在 printf(“查找的关键字不存在\n”);return ERROR;}}return OK;}int main(void){int array[12] = {12,67,56,16,25,37,22,29,15,47,48,34};HashTable H;initHashTable(&H);printf(” 1.初始化散列表\n 2.插入散列值\n 3.查找\n 0.退出\n”);int option = 1, key;int i, length, addr, res;while(option){scanf(“%d”, &option);switch(option){case 1:res= initHashTable(&H);if(res == OK){printf(“初始化成功!\n”);}break;case 2:initHashTable(&H);length = arr_length(array) – 1;for(i = 0; i < length; i++){insertHash(&H, array[i]);}printf(“插入成功\n”);break;case 3:printf(“请输入要超找的关键字\n”);scanf(“%d”, &key);res = searchHash(H, key, &addr);if(res == OK){printf(“查找成功 关键字的下标是 %d\n”, addr);}break;case 0:return OK;default:printf(” 1.初始化散列表\n 2.插入散列值\n 3.查找\n 0.退出\n”);break;}}return 0;}夫妇一条心,泥土变黄金。

2015阿里巴巴校园招聘电话面试总结(研发工程师php)

相关文章:

你感兴趣的文章:

标签云: