自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 问答 (1)
  • 收藏
  • 关注

原创 【面经】vivo推荐平台后台开发

前天,进行了一场vivo的推荐系统平台的后台开发岗位的面试,面试时长约1小时,一面通过。看得出来,不同的企业的面试风格明显不同。腾讯、快手、头条的面试,主要考察候选人对每个方面基础知识的掌握情况,上来由项目经历出发,挨个对c++,操作系统,网络编程,数据结构,算法,挨个来一遍,如果你2个或以上的方向有短板,则基本gg。我的vivo的这场面试,面试官并没有对每个方面的基础都考察,只是先聊了聊项目,问了问项目细节,问了问项目性能指标,然后只是对网络编程和算法方面进行了考察。面试官先让我做了自..

2020-07-19 17:38:12 292

原创 【面经】20200711-腾讯pcg腾讯看点大数据后台开发

昨天,面试了腾讯pcg腾讯看点部门的后台开发岗位,偏大数据方向。我本人其实是没有大数据相关工作经验的,但对于后台开发,经历了前2次的失败总结之后,我个人还是比较有信心的。如果对我的前两次的面试经验感兴趣,可以移步我之前的2片文章查看:【面试题解析】快手基础架构中心高级C++开发【面经】20200621-头条后台开发面试官是一个年长我一些的人,看上去就很厉害。。。但整个过程下来,我觉得人还是蛮好的。上来先让我做一下自我介绍,我简单介绍了一下背景,然后说了一下我工作前两年是...

2020-07-11 20:23:00 1795

原创 【itsrohan技术随笔1】阻塞recv,select,epoll用法及实现详解

从事服务端编程,epoll是绕不开的话题,很多著名的开源软件如redis,nginx等都使用了epoll,公司内部的很多产品也用到了epoll。我个人在工作中也用过epoll做开发,但会用只是第一步,完整地理解它的实现,明白它为什么如此高效,才是我的目标,今天写文记录一下,如果哪里写的不准确,希望大家不吝赐教,帮忙指出来。最开始,先说一下,最普通的场景---阻塞recv的用法,要先明白epoll为什么如此高效,需要先明白最简单的用法有什么问题。首先,每个socketfd在内核中,都有以下三个成员:发

2020-07-05 11:47:28 259

原创 【面经】20200621-头条后台开发

为了完成今年进大厂的心愿,我投了头条的后台开发岗试了试,其实面试前大致知道不能通过,但为了更好的积累经验,提高自我提升的速度,还是抱着试试看的心态试了一下。一面面试官看起来年纪不大,我是94年的,看起来和我年纪相仿。面试安排在晚上8点,面试官人看起来很疲惫,大概是经常高负荷工作导致,我心里也感慨了一些,头条的工作强度不是盖的呀。面试过程中所有的基础问题,我都用加粗字体标注出来,方便各位查看。文章整体的话还是以流水账的方式,记录一下整个过程。面试官先让我做了简单的自我介绍。然后直奔主题,直接.

2020-06-27 18:40:30 250

原创 【面经】20200620-快手深圳基础架构中心-C++开发一面

1. "I am a worker" 去空格,不要另外开辟空间,不能使用std::string2. char *input = "I am a worker";char a[] ="I am a worker";char *input = a;三种在内存中的形式。3. 进程的内存布局;4. c数组基础,数组做参数的场景5. int32 -1在内存中的表示6. float在内存中的表示形式?如何判断一个float是否等于0;7. 大小端定义?如何判断一个计算机是大端还是小.

2020-06-20 22:02:55 555

转载 转载:ps命令找出线程占用cpu情况

https://blog.csdn.net/xnn2s/article/details/11865339

2020-05-26 11:46:20 331

原创 树和二叉树-基础学习

树,是n个节点的有限集合。n=0时称为空树;n>0时,需要满足以下2个条件:1.必须有一个root节点;2.其他节点可以划分为互不相交的子集合,这些子集合都是root的子树。非线性数据结构,特点是1对多。树的表示形式:1. 倒置树形式-最通用;2. 嵌套集合;3. 嵌套括号表示法;4. 凹入表示法;相关定义:结点:本身信息和其他节点的关系;结点的度:一个结点子树的个数;分支结点(非终端结点):度不为0的结点;叶子结点(终端结点):..

2020-05-24 22:37:38 129

原创 《深入理解计算机系统》Syetem level I/O

unix中文件种类:EOL在不同系统上的区别:0 1 2三个fd代表的文件:关闭已经关闭的文件,会导致close返回错误(多线程同时操作时)执行一个系统调用大概需要小号20000~40000个时钟周期strace -e trace=write ./xxx只跟踪write系统调用strace -e trace=write,read ./xxx跟踪write和read两个系统调用内核用3个数据结构来表示打开的文件:1. 描述符表:每

2020-05-20 21:43:57 291

原创 《深入理解计算机系统》Dynamic Memory Allocation-Basic Concepts

calloc:malloc后,内存清零。realloc:alloc后,改变分配的大小。sbrk:内存分配内部使用,用来增长和缩小堆碎片:内部碎片:外部碎片:需要分配N字节内存时,内存中空间足够,但是没有N字节的块可供分配内存分配需要考虑的问题:1. 如何知道free的指针,包含多大的空间;2. 如何组织空闲块3. 分配一个小块内存时,如何处理原本这个空闲块的剩余部分;4. 如何在许多空闲块中选择一个用来分配内存;5. 如何合并释放...

2020-05-20 21:43:04 314

原创 《深入理解计算机系统》Vitual memory system

linux虚拟内存管理:结构如上图所示,pgd指向一级页表的基地址;mmap指向一个,vm_area_struct的结构,每个vm_area_struct都指向了虚拟地址空间的一个区域。vm_area_struct解析:vm_start:虚拟内存块的起始位置;vm_end:虚拟内存快的终止位置;vm_prot:这块内存块的读写执行权限;vm_flags:这块内存是进程私有的,还是与其他进程共享的;vm_next:指向下一块mmaplinux缺页异常处理:当

2020-05-20 21:41:43 178

原创 《深入理解计算机系统》Vitual memory concepts

使用虚拟内存,使用mmu的原因:1. 更有效地使用内存,当作磁盘的缓存。由于局部性,将最近访问过的磁盘空间,缓存到内存中;2. 更简单地管理每个进程的内存空间:每个进程具有相似的虚拟内存空间;3. 可以实现对内存访问的保护,隔离每个进程的内存使用,避免一个进程踩到其他进程的内存。术语:PTE page table entry 页表项 页表条目page table 为 page table entry 的数组page hit的情况:这种情况也是需要访问内存,原因时...

2020-05-20 21:40:26 133

原创 《深入理解计算机系统》Exceptional Control Flow-Exception and Processes

分支跳转和过程调用与返回,也是异常的一种。较低层次的异常:由操作系统和硬件共同管理较高层次的异常:1. 进程上下文切换:操作系统+硬件定时器2. signals3. 各类跳转异常:当发生一些异常事件(除0,段错误,缺页,算数溢出,IO请求完成)时,控制权从用户态进程交给内核。由内核的异常处理函数来执行。执行结束后,有三种方式处理:1.回到原来的地址重新执行(缺页异常);2.跳到下一条指令继续执行(中断服务程序执行完成后,或按了ctrl-c后,或执行系统调用);3.

2020-05-20 21:39:15 178

原创 《深入理解计算机系统》Exceptional Control Flow-Signals and Nonlocal Jumps

shell:shell有一些内建命令,收到命令行字符串之后,首先检查是否时内置命令,如果是,则直接执行;如果不是,则认为命令行是需要执行的可执行文件,直接fork-exec执行。通过这样的方式达到可扩展的优势。信号是一小条消息,通知进程系统中发生了一个某种类型的事件。是完全由软件基于异常机制实现的。以下摘自man 7 signalSignal Value Action Comment ────────────────────────────────...

2020-05-20 21:37:51 177

原创 《深入理解计算机系统》Linking

为什么不把所有的文件都编译到一个可执行文件中:1. 效果:分成多个模块,有利于开发不同的优秀的模块,开发不同的库。2. 效率:改代码时,只需要重新编译一个模块,替换即可。链接器做的2件事:1. 符号解析。2. 重定位:在重定位之前,每个模块中的函数和数据只对应了在本模块的偏移。链接器将所有的模块的函数和数据进行合并,并把他们重定位。目标文件有三种,所有的目标文件都是elf格式的:1. 可重定位目标文件(.o):2. 可执行目标文件(.out可执行文件):3. 共.

2020-05-20 21:36:09 272

原创 《深入理解计算机系统》Cache memories

cache完全由硬件管理。cache替换算法:假设4个组(set),地址总共4位。四个地址位,被分为标记位(tag),一位;索引位(index),两位,类似虚拟内存管理中的页号(页帧号);偏移位(offset),一位;索引位和偏移位组合,称为块号(block);如果一个组,只有一个缓存行,那么如果块号相同, 则该内容会被清除,换新的内存的数据过来,此时标记位一定是不同的。因为地址是由tag+block组成的。但实际计算机中,往往一个组不只有一个缓存行。这取决于cpu的

2020-05-20 21:34:50 423

原创 《深入理解计算机系统》The memory Hierarchy

SRAM(静态RAM)和D%RAM(动态)的比较solid state disk想要写某个页,必须先把它擦除。存储器层次结构示意图:cache miss的几种情况:1. cold miss: cache 是空的2. capcity miss: cache 容量不足以放置所需要读取的数据时(working set > cache size)3. conflict miss: 和cache实现方式有关,cache实现上对特定的block

2020-05-20 21:32:52 279

原创 《深入理解计算机系统》Programing Optimization

通用的优化措施:1. for循环里尽可能不放计算;2. 乘法用加法替代;3. 避免在循环中使用内存别名(使用指针进行读写),原因是,编译器无法知道是否有指向相同地址的指针,同时也在对该地址进行读写操作,因此每次循环必须重新从内存中读取新值,建议使用全局变量统一操作,最后循环结束后,再统一赋值给指针。4. 尽量使不同的计算过程无关化,以充分利用流水线/通常来讲,cpu寄存器都有上百个寄存器副本,所以分支预测时,会暂时将计算结果存在副本中,如果预测正确,则写入生效副本中;如果

2020-05-20 21:31:08 122

原创 《深入理解计算机系统》Machine level programming-V Advanced topics

B 0KB 3MB 6GB 9TB 12PB pegabytes 15EB Exabyte 18ZB Zettabyte 210x0000 7FFF FFFF FFFF 这个地址在Linux中为栈的起始地址。不安全的函数:getsstrcpystrcatsscanf fscanf scanf 当传入%s时栈溢出:如果发生栈溢出,则由很大可能栈空间的...

2020-05-17 12:37:56 162

原创 《深入理解计算机系统》Machine level programming-IV Data

主要讲解数组,之前几节&有关整形。申请数组和申请指针在汇编语言上的区别:申请数组:1.申请了一块内存空间;2.申请了一个指针别名申请指针:只申请了指针别名对齐问题:需要进行对齐的原因:硬件方面的原因。从内存中取值不是一个字节一个字节来取的,而是一块一块来取的,不进行对齐的话,会导致cpu在某些情况下为了取一个int不得不进行2此取值,导致效率问题。在x86上,仅仅会导致效率问题,在某些cpu上,则会导致内存错误。从大到小排列可有效减少内存空

2020-05-17 12:36:39 195

原创 《深入理解计算机系统》Machine level programming-III Procedures

主要讲解程序运行的各种过程, 涉及栈,函数调用过程中的数据传输,栈上数据存储.栈结构:栈的数据结构特征是后入先出,有一些场景适合用栈数据结构来设计。%rsp---x86下的16个cpu之中普通的一个,stack pointer。它的值代表现在栈顶的地址。每次在栈上分配空间时,都会对%rsp进行自减。一般会倒着画栈图,为了和linux虚拟地址空间做对应(个人理解)。注意,栈的弹出,只是移动栈指针,被弹出的地址的数据暂时还在。实际执行call指令的时候,一

2020-05-17 12:35:12 169

原创 《深入理解计算机系统》machine level programing - II control

Single bit registers:用于条件控制的CF:carry bit 两个数做运算,如果溢出,该位置一,对于无符号计算SF:有符号计算中,最高位为1,即计算结果为负数ZF:如果计算结果为0,该位置位OF:与CF相同。对于有符号计算注:这几个bit在lea指令下不会置位。这些位,一般情况下都会被忽略,只有在 条件判断指令时,会起作用,如cmpq...

2020-05-17 12:33:33 150

原创 《深入理解计算机系统》 machine level programing-I

from有道云笔记gcc -Og -S sum.c-Og为为调试准备的优化等级,更容易看懂;-S为只编译出汇编文件;这样编译出来的汇编文件中,以点(.)开头的行,不用理会,为一些标识符,符号等信息。gcc -Og sum.c -o sum编译之后,可以使用objdump工具,进行反汇编:objdump -d sum > sum.d或者使用gdb中的disassemble工具:disassemble sum,其中sum是函数名,可以进行移个函数的反汇编。

2020-05-17 12:32:16 180

原创 leetcode - 8. 字符串转换整数 (atoi)

题目网址:https://leetcode-cn.com/problems/string-to-integer-atoi/这个题目相对简单,题意是自己实现一个atoi,要考虑各种溢出情况。我的题解:class Solution {public: int myAtoi(string str) { int answer = 0; int i = 0; int flag = 1; // 正数 wh...

2020-05-17 12:23:22 103

原创 leetcode - 6. Z 字形变换

题目网址:https://leetcode-cn.com/problems/zigzag-conversion/这个题目,第一次看到的时候,我想到的是,申请一个二维数组,然后遍历字符串,给对应的二维数组的字符赋值。当时感觉有点复杂,然后就看了一下官方题解,静下心看了一阵,理解了思路,记录下来,后面面试准备是快速理解思路:首先,题目只是要打印出z字形变换的字符串,并没有要求把空格之类的也打印出来,因此直接申请一个vector<string> rows,用来按行存放变换后的字符串;.

2020-05-17 11:41:18 139

原创 随笔20190725-当你感觉没办法解决当前的问题的时候

当你感觉没办法解决当前遇到的问题的时候,尝试问一下周围的人,即使你感觉他们对你的问题不了解,没办法解决。尝试一下,多数情况下会得到新的思路。甚至可以解决问题。...

2019-07-25 15:30:55 124

原创 《深入理解计算机系统》第二章 信息的表示及处理

只记自己觉得需要记的。1. 计算机系统中广泛采用二进制的原因:二进制特别适合存储及传输,纸带的有孔或无孔,点平的高或低等等;2. 大端:最高有效字在前;小端:最低有效字在前;3. &amp;按位与 |按位或 ~按位非未完待续。。。...

2019-03-09 16:59:19 160

原创 《深入理解计算机系统》第一章 计算机系统漫游

前言:感觉自己由于是电气工程专业出身,既然现在正在从事软件编程相关工作,同时兴趣也在这里,那么就应该将自身在软件编程方面的基础知识补充一下。通过这阵的面试了解和平常的了解,发现自己在计算机系统、linux内核、数据结构算法方面基础还需加强,虽然自己有意识地去理解,但我觉得还需要系统性地学习才行!只记自己觉得有必要记的。深入理解计算机系统---计算机系统漫游1. 指针与数组索引哪个更高效...

2019-03-09 15:39:52 688

原创 第一个linux驱动模块

在ubuntu上做的实验,ubuntu版本12.04hello.c:#include &lt;linux/init.h&gt;#include &lt;linux/module.h&gt;MODULE_LICENSE("GPL");static int __init hello_init(void){ printk(KERN_EMERG "Hello, wor...

2018-12-01 16:28:10 119

原创 20181129-普联科技面试

面试岗位:嵌入式软件工程师面试官问了三个方面:1. 网络协议相关:比如ping另外一台电脑的过程,ping百度的过程,ping另外一个网段的设备的过程(这个问题我只是简单了解有ARP静态表,再深入我就不了解了,没打上。。。),还问了比较基础的,socket编程,问了tcp和udp用的接口有何不同。2. 嵌入式系统相关:linux,vxworks,这个简单问了下,两者有啥差别,还问了li...

2018-11-30 21:36:25 980

原创 bool类型在C/C++混合编程时的处理

C语言中是没有bool类型的,C++中原生有bool类型的定义的。在C/C++混合编程时,容易造成不好解决的编译错误,可以按如下方式处理:在定义数据类型的文件中如下定义: #ifndef __cplusplus#define TRUE 1#define FALSE 0typedef unsigned char bool;#endif   ...

2018-11-14 20:08:20 773

转载 从别处复制的虚拟机,vmware提示:无法获得vmci驱动程序的版本,处理办法

https://jingyan.baidu.com/article/a3a3f811ea5d2a8da2eb8aa1.html

2018-07-22 11:27:12 238

原创 linux常用命令

1.挂载U盘到对应目录: mount -t vfat /dev/sda /home/usb2.安装gcc编译器:sudo apt-get  install  build-essential3.运行可执行文件:   ./helloworld4.命令的说明文档: man useradd5.查看权限: ls -al6.查看帮助 man 2 open...

2018-07-22 11:25:33 81

原创 20171109-程序员的自我修养

今天看4.5-静态库链接静态库可以看做是一组目标文件的集合。操作系统的开发者编译出相应的目标文件,如:输入输出的printf.o,scanf.o文件操作的fread.o,fwrite.o时间日期的date.o,time.o内存管理的malloc.o等等等等如果直接将这些目标文件给库的使用者(即应用程序开发者),则会造成文件传输、管理和组织上的不便,因此,将一组目

2017-11-09 21:50:22 145

原创 20171107-程序员的自我修养

今天看 C++在编译链接过程中的相关问题。C++由于类的特殊性,一些内容必须由编译器和链接器共同支持才能完成工作(重复代码消除,构造函数,析构函数)。而且C++中的一些特性如虚函数、重载、继承等,背后的数据结构非常复杂,还会导致不同编译器和链接器之间相互不能通用。首先看了4.4.1,重复代码消除C++的某些特性会出现:在多个编译单元内多次被实例化的情况,如果简单的将重复的代码都

2017-11-07 21:44:31 142

原创 20171104-程序员的自我修养

今天看4.2符号解析与重定位这部分是接着昨天的部分,都是静态链接中的步骤。在完成了空间地址的分配之后,链接器就进入了符号解析与重定位的步骤,也是静态链接的核心步骤。 编译完成后,静态链接完成之前,a.o的反汇编为:18行使用的为b.o中定义的shared变量;26行使用的为b.o中定义的函数swap()movl对应的机器码为c7 44 24 04,后面跟的为地址信息

2017-11-04 22:22:33 221

原创 20171103-程序员的自我修养

今天开始看第四章,静态链接。由于这本书中内容大多为编译器和链接器的内容,故大部分都无法用例子程序的方式记录。对于链接器来说,输入为目标文件a.o和b.o,输出为可执行文件ab。a,b的代码为:一般来说,有两种方式:1.按序叠加,即简单的按照次序讲不通目标文件的各个段叠加起来。这样做会让内存中存在大量零散的段(每个段必须占用单独的页,x86位4096字节即4k)2

2017-11-03 21:44:06 171

原创 20171102-程序员的自我修养

记录学习笔记因为这本书有些地方过于深奥,第一次读的时候先跳过了一些难懂的地方,今天看到了:强符号和弱符号变量重定义的链接错误产生原因:多个目标文件中含有相同名字的符号的定义,且都为强符号。.强符号:编译器默认函数和进行了初始化的全局变量为强符号。弱符号:未初始化的全局变量。注意:符号的强弱都是针对定义来说的,不针对引用(extern)如上,weak和weak

2017-11-02 21:17:25 155

原创 20171101-程序员的自我修养

程序员的自我修养-第三章

2017-11-01 21:29:31 206

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除