C++ :多重继承 在现实生活中,一些新事物往往会拥有两个或者两个以上事物的属性,为了解决这个问题,C++引入了多重继承的概念,C++允许为一个派生类指定多个基类,这样的继承结构被称做多重继承。(派生类有两个或两个以上的直接基类)当一个派生类要使用多重继承的时候,必须在派生类名和冒号之后列出所有基类的类名,并用逗好分隔。存在多继承的类层次图是一个图(graph)。只有单继承的类层次图是一个树(tree)。
Linux:信号处理原理与实现 程序错误:除零,非法内存访问等。外部信号:终端 Ctrl-C 产生 SGINT 信号,定时器到期产生SIGALRM等。显式请求:kill函数允许进程发送任何信号给其他进程或进程组。目前 Linux 支持64种信号。信号分为非实时信号(不可靠信号)和实时信号(可靠信号)两种类型,对应于 Linux 的信号值为 1-31 和 34-64。信号是异步的,一个进程不必通过任何操作来等待信号的到达。事实上,进程也不知道信号到底什么时候到达。
算法:哈夫曼编码 通常的编码方式有固定长度编码和不定长度编码两种。哈夫曼编码是不定长度编码的一种,它利用字符的使用频率来编码,经常使用的字符编码较短,不常使用的字符编码较长。我们可以把每一个字符作为叶子,它们对应的频率作为其权值,为了方便,可以对其同时扩大100倍,得到a~f分别对应5, 32, 18, 7, 25, 13。(1) 初始化:构建单结点树集合T = {a, b, c, d, e, f},如图1所示。(3) 哈夫曼树构造成功后,约定左分支编码为0,右分支编码为1,如图7所示。(2) 选择,具体过程见图2~图6。
Java:BIO、NIO、AIO 同步指的是必须等待IO缓冲区内的数据就绪,而非阻塞指的是,用户线程不原地等待IO缓冲区,可以先做一些其他操作,但是要定时轮询检查IO缓冲区数据是否就绪。普通的NIO是线程轮询查看一个IO缓冲区是否就绪,而Java中的new IO指的是线程轮询地去查看一堆IO缓冲区中哪些就绪,这是一种IO多路复用的思想。不需要新开一个线程。AIO可以做到真正的异步的操作,但实现起来比较复杂,支持纯异步IO的操作系统非常少,目前也就windows是IOCP技术实现了,而在Linux上,底层还是是使用的epoll实现的。
操作系统:生产者-消费者问题 有一群生产者进程在生产产品,并将这些产品提供给消费者进程去消费.为使生产者进程与消费者进程能并发执行,在两者之间设置了一个具有n个缓冲区的缓冲池,生产者进程将它所生产的产品放入一个缓冲区中;由于缓冲区是由生产者和消费者共享的存储空间,应当互斥访问,即:生产者修改缓冲区时,禁止消费者从缓冲区中取走数据;为此,可以利用互斥信号量mutex实现进程对缓冲区的互斥访问。最后,在每个程序中的多个p操作不能颠倒,应该先执行对资源信号量的p操作,然后再执行对互斥信号量的v操作,否则可能引起进程死锁。
操作系统:同一进程中线程共享和独占的资源 由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。堆栈是保证线程独立运行所必须的(在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈)。2. 进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)一.同一进程中的线程共享的资源。
操作系统:虚拟地址翻译为物理地址的过程 我们可以根据物理地址的组号定位到映射表的一个组,然后看看这个组下的有效位是不是为1,如果不为1,那么表示这一组的内容都无效了,没有必要比较下去了,因此缓冲没有命中,如果为1呢,那么比较这个组下的标记位和物理地址中标记位,如果不相等,那就是没有命中,如果相等呢,则继续根据物理地址中的块号去这个组相应的块号下找,如果找到数据,则表示命中了,否则缓冲没有命中。由上图得知,组号(CI)占用4位,因为我们假设高速缓冲有16个组,每个组下有4个块,因此块号(CO)占用2位,剩下的6位就是标记位(CT)。
操作系统:如何理解虚拟内存 关于虚拟内存内部的结构可以参考进程虚拟地址空间的区域划分每个进程创建加载的时候,会被分配一个大小为4G的连续的虚拟地址空间,虚拟的意思就是,其实这个地址空间时不存在的,仅仅是每个进程“认为”自己拥有4G的内存,而实际上,它用了多少空间,操作系统就在磁盘上划出多少空间给它,等到进程真正运行的时候,需要某些数据并且数据不在物理内存中,才会触发缺页异常,进行数据拷贝。
操作系统:epoll高效运行的原理 笔者准备介绍完epoll和NIO等知识点,然后写一篇Java网络IO模型的介绍,这样可以使Java网络IO的知识体系更加地完整和严谨。初学者也可以等看完IO模型介绍的博客之后,再回头看这些博客,会更加有收获。如果你顺利啃下这篇博客,恭喜你,nginx、redis和NIO等核心思想已经被你掌握了,可以顺势去拓展自己的理解。否则,只是孤立的看epoll,时间一长会很快忘记的。当然,这些核心思想,笔者也会在之后的博客慢慢做详细讲解,欢迎关注。
gcc:-pthread和-lpthread的区别 可见编译选项中指定 -pthread 会附加一个宏定义 -D_REENTRANT,该宏会导致 libc 头文件选择那些thread-safe的实现;由于 libc 用于适应 thread-safe 的宏定义可能变化,因此在编译和链接时都使用 -pthread 选项而不是传统的 -lpthread 能够保持向后兼容,并提高命令行的一致性。最近在使用linux mint15,里面自带的gcc时4.7的,当我编译多线程程序时,使用-lpthread居然说没有找到线程库函数!
http:请求中get和post方法的区别 一般我们在浏览器输入一个网址访问网站都是GET请求;再FORM表单中,可以通过设置Method指定提交方式为GET或者POST提交方式,默认为GET提交方式。HTTP定义了与服务器交互的不同方法,其中最基本的四种:GET,POST,PUT,DELETE,HEAD,其中GET和HEAD被称为安全方法,因为使用GET和HEAD的HTTP请求不会产生什么动作。不会产生动作意味着GET和HEAD的HTTP请求不会在服务器上产生任何结果。但是安全方法并不是什么动作都不产生,这里的安全方法仅仅指不会修改信息。
C++:mutable 关键字 类中的mutablemutable从字面意思上来说,是「可变的」之意。若是要「顾名思义」,那么这个关键词的含义就有些意思了。显然,「可变的」只能用来形容变量,而不可能是「函数」或者「类」本身。然而,既然是「变量」,那么它本来就是可变的,也没有必要使用mutable来修饰。那么,mutable就只能用来形容某种不变的东西了。C++ 中,不可变的变量,称之为常量,使用const来修饰。然而,若是const mutable联用,未免让人摸不着头脑——到底是可变还是不可变呢?事实上,
C++:const用于函数重载 但是char *a和char * const a,这两个都是指向字符串变量,不同的是char *a是指针变量 而char *const a是指针常量,这就和int i和const int i的关系一样了,所以也会提示重定义。最后说一下,对于引用,比如int &i 和const int & i 也是可以重载的,原因是第一个i引用的是一个变量,而第二个i引用的是一个常量,两者是不一样的,类似于上面的指向变量的指针的指向常量的指针。(1)const是函数类型的一部分,在实现部分也要带该关键字。
C++:实现委托机制 为了解决GUI 跨线程操作界面的导致主线程崩溃的情况, C++ 11 终于推出了自己的thread 类thread 类提供detach() 的方法, 让worker线程也具备了操作GUI的能力.在GUI开发中, 通过使用function和thread等C++ 11 新特性,能够更便捷的开发出高质量的程序, 同时回避开发过程中的问题。...
操作系统:临界资源与临界区的区别 进程进入临界区的调度原则是:①如果有若干进程要求进入空闲的临界区,一次仅允许一个进程进入。如已有进程进入自己的临界区,则其它所有试图进入临界区的进程必须等待。每个进程中访问临界资源的那段程序称为临界区(CriticalSection)(临界资源是一次仅允许一个进程使用的共享资源)。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。答:每个进程中访问临界资源的那段程序称为临界区(临界资源是一次仅允许一个进程使用的共享资源)。...
MySQL:如何实现事务提交和回滚 事务是由数据库中一系列的访问和更新组成的逻辑执行单元事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败举个最常见的例子,你早上出去买早餐,支付宝扫码付款给早餐老板,这就是一个简单的转账过程,会包含两步从你的支付宝账户扣款10元早餐老板的账户增加10元这两步其中任何一部出现问题,都会导致整个账务出现问题假如你的支付宝账户扣款10元失败,早餐老板的账户增加成功,那你就Happy了,相当于马云请你吃早餐了,O(∩_∩)O哈哈~...
算法:抢红包算法 随机法,每次抢红包时计算出本次能够获得的最小金额和最大金额,然后在这个区域间中取一个随机值并计算得出这次抢到的红包金额,这种方法,优点是实现简单,但是,先抢的人会很赚,抢到大红包的概率很高,越到后面的人越吃亏。第一个人抢的金额是 (0,20),抢到的数值,根据正态分布,应该是10左右,远低于10的概率很小,同样远大于10的概率和很小,这里假设第一个人抢到的数值是10;假设总金额是M元,N个人,每次抢的金额=(0, (M/N) *2),比如,还是之前说的条件,金额100,人数10,...
计算机网络:以太网中的MTU与MSS 当两台远程PC互联的时候,它们的数据需要穿过很多的路由器和各种各样的网络媒介才能到达对端,网络中不同媒介的MTU各不相同,就好比一长段的水管,由不同粗细的水管组成(MTU不同 :))通过这段水管最大水量就要由中间最细的水管决定。为了达到最佳的传输效能,TCP协议在建立连接的时候通常要协商双方的MSS值,这个值TCP协议在实现的时候往往用MTU值代替(需要减去IP数据包包头的大小20Bytes和TCP数据段的包头20Bytes)所以。以太网帧的帧头的14字节和帧尾CRC校验4字节共占了18字节,剩下的。...
Linux 扩容 / 根分区(LVM+非LVM) 目录:1,概述2,CentOS7,LVM根分区扩容步骤3,CentOS7,非LVM根分区扩容步骤:一、背景,概述对于传统的MBR分区方式,有很多的限制:1:最多4个主分区(3个主分区+1个扩展分区(扩展分区里面可以放多个逻辑分区)),无法创建大于2TB的分区,使用fdisk分区工具,而GPT分区方式不受这样的限制。2:GPT分区方式将不会有这种限制,使用的工具是parted;LVM管理导图1LVM管理导图2上图所示: 如果直接扩展/home逻辑卷目录,会提示逻辑卷组没有空间。LVM扩容思维流程:创建一个物理
技术:什么是docker 作为程序员我们应怎样理解docker?容器技术的起源假设你们公司正在秘密研发下一个“今日头条”APP,我们姑且称为明日头条,程序员自己从头到尾搭建了一套环境开始写代码,写完代码后程序员要把代码交给测试同学测试,这时测试同学开始从头到尾搭建这套环境,测试过程中出现问题程序员也不用担心,大可以一脸无辜的撒娇,“明明在人家的环境上可以运行的”。测试同学测完后终于可以上线了,这时运维同学又要重新从头到尾搭建这套环境,费了九牛二虎之力搭建好环境开始上线,糟糕,上线系统就崩溃了,这时心理素质好的程序员又可以施展演技了,