企业网站栏目规划的重要性,网站服务器和空间的区别,如何注册营业执照,网络营销论文参考文献网络
网络的字节序网络知识 tcp三次握手 各种细节 timewait状态tcp 与 udp 区别 概念 适用范围TCP四次挥手讲一下过程#xff0c;最后一次ack如果客户端没收到怎么办#xff0c;为什么挥手不能只有三次#xff0c;为什么time_wait。对于socket编程#xff0c;accept方法是…网络
网络的字节序网络知识 tcp三次握手 各种细节 timewait状态tcp 与 udp 区别 概念 适用范围TCP四次挥手讲一下过程最后一次ack如果客户端没收到怎么办为什么挥手不能只有三次为什么time_wait。对于socket编程accept方法是干什么的在三次握手中属于第几次可以猜一下为什么这么觉得。tcp怎么保证有序传输的讲下tcp的快速重传和拥塞机制知不知道time_wait状态这个状态出现在什么地方有什么用知道udp是不可靠的传输如果你来设计一个基于udp差不多可靠的算法怎么设计http与https有啥区别说下https解决了什么问题怎么解决的说下https的握手过程。tcp 粘包半包问题怎么处理keepalive 是什么东东如何使用列举你所知道的tcp选项并说明其作用。socket什么情况下可读nginx的epoll模型的介绍以及io多路复用模型SYN Flood攻击流量控制拥塞控制TCP和UDP区别TCP如何保证可靠性对方是否存活(心跳检测)tcpdump抓包如何分析数据包tcp如何设定超时时间基于socket网络编程和tcp/ip协议栈讲讲从客户端send()开始到服务端recv()结束的过程越细越好http报文格式http1.1与http1.0区别http2.0特性http3了解吗http1.1长连接时发送一个请求阻塞了返回什么状态码udp调用connect有什么作用TCP与UDP之间的区别 (1) IP首部TCP首部UDP首部 (2) TCP和UDP区别 (3) TCP和UDP应用场景 (4) 如何实现可靠的UDPTCP三次握手与四次挥手详细说明TCP状态迁移过程 (1) 三次握手和四次挥手状态变化 (2) 2MSL是什么状态作用是什么 (3)三次握手为什么不是两次或者四次TCP相关技术TCP重发机制Nagle算法TCP的拥塞控制使用的算法和具体过程TCP的窗口滑动TCP客户与服务器模型用到哪些函数UDP客户与服务器模型用到哪些函数域名解析过程ARP的机制RARP的实现Ping和TraceRoute实现原理
操作系统
进程和线程-分别的概念 区别 适用范围 它们分别的通讯方式 不同通讯方式的区别优缺点僵尸进程死锁是怎么产生的CPU的执行方式代码中遇到进程阻塞进程僵死内存泄漏等情况怎么排查。有没有了解过协程说下协程和线程的区别堆是线程共有还是私有堆是进程共有还是私有栈呢了解过协程吗我携程不了解呜呜呜共享内存的使用实现原理必考必问然后共享内存段被映射进进程空间之后存在于进程空间的什么位置共享内存段最大限制是多少c进程内存空间分布注意各部分的内存地址谁高谁低注意栈从高道低分配堆从低到高分配ELF是什么其大小与程序中全局变量的是否初始化有什么关系注意.bss段使用过哪些进程间通讯机制并详细说明重点多线程和多进程的区别重点 面试官最最关心的一个问题必须从cpu调度上下文切换数据共享多核cup利用率资源占用等等各方面回答然后有一个问题必须会被问到哪些东西是一个线程私有的答案中必须包含寄存器否则悲催信号列出常见的信号信号怎么处理i是否原子操作并解释为什么说出你所知道的各类linux系统的各类同步机制重点什么是死锁如何避免死锁每个技术面试官必问列举说明linux系统的各类异步机制exit() _exit()的区别如何实现守护进程linux的内存管理机制是什么linux的任务调度机制是什么标准库函数和系统调用的区别补充一个坑爹坑爹坑爹坑爹的问题系统如何将一个信号通知到进程这一题哥没有答出来
fork与vfork区别 fork和vfork都用于创建子进程。但是vfork创建子进程后父进程阻塞直到子进程调用exit()或者excle()。 对于内核中过程fork通过调用clone函数然后clone函数调用do_fork()。do_fork()中调用copy_process()函数先复制task_struct结构体然后复制其他关于内存文件寄存器等信息。fork采用写时拷贝技术因此子进程和父进程的页表指向相同的页框。但是vfork不需要拷贝页表因为父进程会一直阻塞直接使用父进程页表。exit()与_exit()区别 exit()清理后进入内核_exit()直接陷入内核。孤儿进程与僵死进程
孤儿进程是怎么产生的僵死进程是怎么产生的僵死进程的危害如何避免僵死进程的产生
Linux是如何避免内存碎片的
伙伴算法用于管理物理内存避免内存碎片;高速缓存Slab层用于管理内核分配内存避免碎片。
共享内存的实现原理系统调用与库函数(open, close, create, lseek, write, read)同步方法有哪些
互斥锁自旋锁信号量读写锁屏障互斥锁与自旋锁的区别互斥锁得不到资源的时候阻塞不占用cpu资源。自旋锁得不到资源的时候不停的查询而然占用cpu资源。死锁 命令netstat tcpdump ipcs ipcrm 这四个命令的熟练掌握程度基本上能体现实际开发和调试程序的经验
Effective C
视 C 为一个语言联邦C、Object-Oriented C、Template C、STL宁可以编译器替换预处理器尽量以 const、enum、inline 替换 #define尽可能使用 const确定对象被使用前已先被初始化构造时赋值copy 构造函数比 default 构造后赋值copy assignment效率高了解 C 默默编写并调用哪些函数编译器暗自为 class 创建 default 构造函数、copy 构造函数、copy assignment 操作符、析构函数若不想使用编译器自动生成的函数就应该明确拒绝将不想使用的成员函数声明为 private并且不予实现为多态基类声明 virtual 析构函数如果 class 带有任何 virtual 函数它就应该拥有一个 virtual 析构函数别让异常逃离析构函数析构函数应该吞下不传播异常或者结束程序而不是吐出异常如果要处理异常应该在非析构的普通函数处理绝不在构造和析构过程中调用 virtual 函数因为这类调用从不下降至 derived class令 operator 返回一个 reference to *this 用于连锁赋值在 operator 中处理 “自我赋值”赋值对象时应确保复制 “对象内的所有成员变量” 及 “所有 base class 成分”调用基类复制构造函数以对象管理资源资源在构造函数获得在析构函数释放建议使用智能指针资源取得时机便是初始化时机Resource Acquisition Is InitializationRAII在资源管理类中小心 copying 行为普遍的 RAII class copying 行为是抑制 copying、引用计数、深度拷贝、转移底部资源拥有权类似 auto_ptr在资源管理类中提供对原始资源raw resources的访问对原始资源的访问可能经过显式转换或隐式转换一般而言显示转换比较安全隐式转换对客户比较方便成对使用 new 和 delete 时要采取相同形式new 中使用 [] 则 delete []new 中不使用 [] 则 delete以独立语句将 newed 对象存储于置入智能指针如果不这样做可能会因为编译器优化导致难以察觉的资源泄漏让接口容易被正确使用不易被误用促进正常使用的办法接口的一致性、内置类型的行为兼容阻止误用的办法建立新类型限制类型上的操作约束对象值、消除客户的资源管理责任设计 class 犹如设计 type需要考虑对象创建、销毁、初始化、赋值、值传递、合法值、继承关系、转换、一般化等等。宁以 pass-by-reference-to-const 替换 pass-by-value 前者通常更高效、避免切割问题slicing problem但不适用于内置类型、STL迭代器、函数对象必须返回对象时别妄想返回其 reference绝不返回 pointer 或 reference 指向一个 local stack 对象或返回 reference 指向一个 heap-allocated 对象或返回 pointer 或 reference 指向一个 local static 对象而有可能同时需要多个这样的对象。将成员变量声明为 private为了封装、一致性、对其读写精确控制等宁以 non-member、non-friend 替换 member 函数可增加封装性、包裹弹性packaging flexibility、机能扩充性若所有参数包括被this指针所指的那个隐喻参数皆须要类型转换请为此采用 non-member 函数考虑写一个不抛异常的 swap 函数尽可能延后变量定义式的出现时间可增加程序清晰度并改善程序效率尽量少做转型动作旧式(T)expression、T(expression)新式const_castT(expression)、dynamic_castT(expression)、reinterpret_castT(expression)、static_castT(expression)、尽量避免转型、注重效率避免 dynamic_casts、尽量设计成无需转型、可把转型封装成函数、宁可用新式转型避免使用 handles包括 引用、指针、迭代器指向对象内部以增加封装性、使 const 成员函数的行为更像 const、降低 “虚吊号码牌”dangling handles如悬空指针等的可能性为 “异常安全” 而努力是值得的异常安全函数Exception-safe functions即使发生异常也不会泄露资源或允许任何数据结构败坏分为三种可能的保证基本型、强列型、不抛异常型透彻了解 inlining 的里里外外inlining 在大多数 C 程序中是编译期的行为inline 函数是否真正 inline取决于编译器大部分编译器拒绝太过复杂如带有循环或递归的函数 inlining而所有对 virtual 函数的调用除非是最平淡无奇的也都会使 inlining 落空inline 造成的代码膨胀可能带来效率损失inline 函数无法随着程序库的升级而升级将文件间的编译依存关系降至最低如果使用 object references 或 object pointers 可以完成任务就不要使用 objects如果能够尽量以 class 声明式替换 class 定义式为声明式和定义式提供不同的头文件确定你的 public 继承塑模出 is-a是一种关系适用于 base classes 身上的每一件事情一定适用于 derived classes 身上因为每一个 derived class 对象也都是一个 base class 对象避免遮掩继承而来的名字可使用 using 声明式或转交函数forwarding functions来让被遮掩的名字再见天日区分接口继承和实现继承在 public 继承之下derived classes 总是继承 base class 的接口pure virtual 函数只具体指定接口继承非纯 impure virtual 函数具体指定接口继承及缺省实现继承non-virtual 函数具体指定接口继承以及强制性实现继承考虑 virtual 函数以外的其他选择如 Template Method 设计模式的 non-virtual interfaceNVI手法将 virtual 函数替换为 “函数指针成员变量”以 tr1::function 成员变量替换 virtual 函数将继承体系内的 virtual 函数替换为另一个继承体系内的 virtual 函数绝不重新定义继承而来的 non-virtual 函数绝不重新定义继承而来的缺省参数值因为缺省参数值是静态绑定statically bound而 virtual 函数却是动态绑定dynamically bound通过复合塑模 has-a有一个或 “根据某物实现出”在应用域application domain复合意味 has-a有一个在实现域implementation domain复合意味着 is-implemented-in-terms-of根据某物实现出明智而审慎地使用 private 继承private 继承意味着 is-implemented-in-terms-of根据某物实现出尽可能使用复合当 derived class 需要访问 protected base class 的成员或需要重新定义继承而来的时候 virtual 函数或需要 empty base 最优化时才使用 private 继承明智而审慎地使用多重继承多继承比单一继承复杂可能导致新的歧义性以及对 virtual 继承的需要但确有正当用途如 “public 继承某个 interface class” 和 “private 继承某个协助实现的 class”virtual 继承可解决多继承下菱形继承的二义性问题但会增加大小、速度、初始化及赋值的复杂度等等成本了解隐式接口和编译期多态class 和 templates 都支持接口interfaces和多态polymorphismclass 的接口是以签名为中心的显式的explicit多态则是通过 virtual 函数发生于运行期template 的接口是奠基于有效表达式的隐式的implicit多态则是通过 template 具现化和函数重载解析function overloading resolution发生于编译期了解 typename 的双重意义声明 template 类型参数是前缀关键字 class 和 typename 的意义完全相同请使用关键字 typename 标识嵌套从属类型名称但不得在基类列base class lists或成员初值列member initialization list内以它作为 base class 修饰符学习处理模板化基类内的名称可在 derived class templates 内通过 this- 指涉 base class templates 内的成员名称或藉由一个明白写出的 “base class 资格修饰符” 完成将与参数无关的代码抽离 templates因类型模板参数non-type template parameters而造成代码膨胀往往可以通过函数参数或 class 成员变量替换 template 参数来消除因类型参数type parameters而造成的代码膨胀往往可以通过让带有完全相同二进制表述binary representations的实现类型instantiation types共享实现码运用成员函数模板接受所有兼容类型请使用成员函数模板member function templates生成 “可接受所有兼容类型” 的函数声明 member templates 用于 “泛化 copy 构造” 或 “泛化 assignment 操作” 时还需要声明正常的 copy 构造函数和 copy assignment 操作符需要类型转换时请为模板定义非成员函数当我们编写一个 class template而它所提供之 “与此 template 相关的” 函数支持 “所有参数之隐式类型转换” 时请将那些函数定义为 “class template 内部的 friend 函数”请使用 traits classes 表现类型信息traits classes 通过 templates 和 “templates 特化” 使得 “类型相关信息” 在编译期可用通过重载技术overloading实现在编译期对类型执行 if...else 测试认识 template 元编程模板元编程TMPtemplate metaprogramming可将工作由运行期移往编译期因此得以实现早期错误侦测和更高的执行效率TMP 可被用来生成 “给予政策选择组合”based on combinations of policy choices的客户定制代码也可用来避免生成对某些特殊类型并不适合的代码了解 new-handler 的行为set_new_handler 允许客户指定一个在内存分配无法获得满足时被调用的函数nothrow new 是一个颇具局限的工具因为它只适用于内存分配operator new后继的构造函数调用还是可能抛出异常了解 new 和 delete 的合理替换时机为了检测运用错误、收集动态分配内存之使用统计信息、增加分配和归还速度、降低缺省内存管理器带来的空间额外开销、弥补缺省分配器中的非最佳齐位、将相关对象成簇集中、获得非传统的行为编写 new 和 delete 时需固守常规operator new 应该内涵一个无穷循环并在其中尝试分配内存如果它无法满足内存需求就应该调用 new-handler它也应该有能力处理 0 bytes 申请class 专属版本则还应该处理 “比正确大小更大的错误申请”operator delete 应该在收到 null 指针时不做任何事class 专属版本则还应该处理 “比正确大小更大的错误申请”写了 placement new 也要写 placement delete当你写一个 placement operator new请确定也写出了对应的 placement operator delete否则可能会发生隐微而时断时续的内存泄漏当你声明 placement new 和 placement delete请确定不要无意识非故意地遮掩了它们地正常版本不要轻忽编译器的警告让自己熟悉包括 TR1 在内的标准程序库TR1C Technical Report 1C11 标准的草稿文件让自己熟悉 Boost准标准库
More Effective c
仔细区别 pointers 和 references当你知道你需要指向某个东西而且绝不会改变指向其他东西或是当你实现一个操作符而其语法需求无法由 pointers 达成你就应该选择 references任何其他时候请采用 pointers最好使用 C 转型操作符static_cast、const_cast、dynamic_cast、reinterpret_cast绝不要以多态polymorphically方式处理数组多态polymorphism和指针算术不能混用数组对象几乎总是会涉及指针的算术运算所以数组和多态不要混用非必要不提供 default constructor避免对象中的字段被无意义地初始化对定制的 “类型转换函数” 保持警觉单自变量 constructors 可通过简易法explicit 关键字或代理类proxy classes来避免编译器误用隐式类型转换操作符可改为显式的 member function 来避免非预期行为区别 increment/decrement 操作符的前置prefix和后置postfix形式前置式累加后取出返回一个 reference后置式取出后累加返回一个 const 对象处理用户定制类型时应该尽可能使用前置式 increment后置式的实现应以其前置式兄弟为基础千万不要重载 || 和 , 操作符 与 || 的重载会用 “函数调用语义” 取代 “骤死式语义”, 的重载导致不能保证左侧表达式一定比右侧表达式更早被评估了解各种不同意义的 new 和 deletenew operator、operator new、placement new、operator new[]delete operator、operator delete、destructor、operator delete[]利用 destructors 避免泄漏资源在 destructors 释放资源可以避免异常时的资源泄漏在 constructors 内阻止资源泄漏由于 C 只会析构已构造完成的对象因此在构造函数可以使用 try...catch 或者 auto_ptr以及与之相似的 classes 处理异常时资源泄露问题禁止异常流出 destructors 之外原因一、避免 terminate 函数在 exception 传播过程的栈展开stack-unwinding机制种被调用二、协助确保 destructors 完成其应该完成的所有事情了解 “抛出一个 exception” 与 “传递一个参数” 或 “调用一个虚函数” 之间的差异第一exception objects 总是会被复制by pointer 除外如果以 by value 方式捕捉甚至被复制两次而传递给函数参数的对象则不一定得复制第二“被抛出成为 exceptions” 的对象其被允许的类型转换动作比 “被传递到函数去” 的对象少第三catch 子句以其 “出现于源代码的顺序” 被编译器检验对比其中第一个匹配成功者便执行而调用一个虚函数被选中执行的是那个 “与对象类型最佳吻合” 的函数以 by reference 方式捕获 exceptions可避免对象删除问题、exception objects 的切割问题可保留捕捉标准 exceptions 的能力可约束 exception object 需要复制的次数明智运用 exception specificationsexception specifications 对 “函数希望抛出什么样的 exceptions” 提供了卓越的说明也有一些缺点包括编译器只对它们做局部性检验而很容易不经意地违反与可能会妨碍更上层的 exception 处理函数处理未预期的 exceptions了解异常处理的成本粗略估计如果使用 try 语句块代码大约整体膨胀 5%-10%执行速度亦大约下降这个数因此请将你对 try 语句块和 exception specifications 的使用限制于非用不可的地点并且在真正异常的情况下才抛出 exceptions谨记 80-20 法则软件的整体性能几乎总是由其构成要素代码的一小部分决定的可使用程序分析器program profiler识别出消耗资源的代码考虑使用 lazy evaluation缓式评估可应用于Reference Counting引用计数来避免非必要的对象复制、区分 operator[] 的读和写动作来做不同的事情、Lazy Fetching缓式取出来避免非必要的数据库读取动作、Lazy Expression Evaluation表达式缓评估来避免非必要的数值计算动作分期摊还预期的计算成本当你必须支持某些运算而其结构几乎总是被需要或其结果常常被多次需要的时候over-eager evaluation超急评估可以改善程序效率