目前在阿里巴巴搬砖
1 处于TUI模式的GDB 为了以TUI模式运行GDB,可以在调用GDB时在命令行上指定-tui选项,或者处于非TUI模式时在GDB中使用Ctrl+X+A组合键。如果当前处于TUI模式,后一种命令方式就会使你离开TUI模式。
gdb的gui用法 调试代码的时候,只能看到下一行,每次使用list非常烦,不知道当前代码的context http://beej.us/guide/bggdb/#compiling 简单来说就是在以往的gdb开始的时候添加一个-tui选项.
在CentOS6.4下使用gdb进行调试的时候, 使用bt(breaktrace)命令时,会弹出如下的提示: 头一天提示: Missing separate debuginfos, use: debuginfo-install glibc-2.
在用户应用程序在经常用到C库的进程间通信函数,实际上,这些进程间通信函数在内核中是通过系统调用好文件系统的机制实现的。 1 管道 管道是只用于连接读进程和写进程,以实现它们之间通信的共享文件。因而它又称共享文件。
链接是将各种各样代码和数据部门收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。链接可以执行于编译时,也就是在源代码被翻译成机器代码时;也可执行于加载时,也就是在程序被加载器加载的存储器并执行时;甚至执行于运行时,由应用程序来执行。
Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。系统调用实际上是内核中的一些C函数,它们都以sys开头的,如sys_mkdir()。它们通过一个指令int 0x80(软中断)把控制权交给内核,即进入特权级执行。
模块是内核的一部分(通常是设备驱动程序),按需动态装入模块可以保证内核达到最小并且使内核非常灵活。一旦装入一个Linux内核模块,那么它就像任何标准的内核代码一样成为内核的一部分,具有相同的权限和职责。
ramfs内存文件系统 ramfs是一个利用VFS自身结构而形成的内存文件系统。ranfs没有自己的文件存储结构,它的文件存储于page cache中,目录结构由dentry链表本身描述,文件则由VFS的inode结构本身描述。
对文件系统而言,文件仅是一系列可读写的数据块。文件系统并不需要了解数据块应该放到物理介质上什么位置。这些都是设备驱动的任务。无论何时,只要文件系统需要从包含它的块设备中读取信息或数据,它就将请求底层的设备驱动读取一个基本块大小整数倍的数据块。
Linux内核中的虚拟文件系统用来管理挂接各种具体文件系统。具体的文件系统可设计成可加载模块,在系统需要时进行加载。 挂载具体文件系统时,VFS读取它的超级块,得到具体文件系统的拓扑结构,并将这些信息映射到VFS超级块结构中。
1.概述 在面向对象开发过程中,通常我们会遇到这样的一个问题:我们知道一个算法所需的关键步骤,并确定了这些步骤的执行顺序。但是某些步骤的具体实现是未知的,或者说某些步骤的实现与具体的环境相关。
问题描述 现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。
1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性。如果已经存在的一个类缺少某些方法,或者须要给方法添加更多的功能(魅力),你也许会仅仅继承这个类来产生一个新类—这建立在额外的代码上。
1.概述 在软件开发中也常常遇到类似的情况,实现某一个功能有多种算法或者策略,我们可以根据环境或者条件的不同选择不同的算法或者策略来完成该功能。如查找、排序等,一种常用的方法是硬编码(Hard Coding)在一个类中,如需要提供多种查找算法,可以将这些算法写到一个类中,在该类中提供多个方法,每一个方法对应一个具体的查找算法;当然也可以将这些查找算法封装在一个统一的方法中,通过if…else…或者case等条件判断语句来进行选择。
设计模式一 工厂模式Factory 在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。
1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化。 例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器。
1. 概述 外观模式,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。例子1:一个电源总开关可以控制四盏灯、一个风扇、一台空调和一台电视机的启动和关闭。
设计模式概论 1. 设计模式 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
内容目录: 从一个示例开始 类之间的关系 时序图 附录:《图说设计模式》 看懂UML类图和时序图 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关系; 能看懂类图中各个类之间的线条、箭头代表什么意思后,也就足够应对 日常的工作和交流; 同时,我们应该能...
Given a range [m, n] where 0 >1; ++count; } return m
Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --> 6 --> 3 --> 4 --> 5 --> 6, val = 6Return: 1 --> 2 --> 3 --> 4 --> 5 注意是不是头结点就ok了。
题目描述: Write an algorithm to determine if a number is "happy". A happy number is a number defined by the following process: Starting with any positiv...
其中介绍了虚拟内存的机制以及mmap系统调用的实现。mmap允许直接将设备内存映射到用户进程的地址空间中。物理内存的管理,包括缓存的分配及回收,请页机制,交换空间等。 1)交换模块(swap) 这个模块负责控制内存内容的换入换出,它通过替换机制,使得物理内存的页框(RAM页)中保留有效的逻辑页,即从主存中淘汰最近没被访问的逻辑页,保存近来访问过的逻辑页。
内核逻辑地址和内核虚拟地址的区别 ********************************************************************** 1)凡是通过MMU页表访问的地址都叫虚拟地址,而一旦启用了MMU,那CPU发出的所有地址都是虚拟地址 内核用到的地址范...
关于虚拟内存有三点需要注意: 4G的进程地址空间被人为的分为两个部分--用户空间与内核空间。用户空间从0到3G(0xc0000000),内核空间占据3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间的虚拟地址。
kmalloc()和vmalloc()介绍kmalloc()用于申请较小的、连续的物理内存1. 以字节为单位进行分配,在中2. void *kmalloc(size_t size, int flags) 分配的内存物理地址上连续,虚拟地址上自然连续3.
在支持MMU的32位处理器平台上,Linux系统中的物理存储空间和虚拟存储空间的地址范围分别都是从0x00000000到0xFFFFFFFF,共4GB,但物理存储空间与虚拟存储空间布局完全不同。Linux运行在虚拟存储空间,并负责把系统中实际存在的远小于4GB的物理内存根据不同需求映射到整个4GB的虚拟存储空间中。
高端内存是指物理地址大于 896M 的内存。对于这样的内存,无法在“内核直接映射空间”进行映射。 为什么? 因为“内核直接映射空间”最多只能从 3G 到 4G,只能直接映射 1G 物理内存,对于大于 1G 的物理内存,无能为力。
内核中用于临界区保护下的互斥机制,它包括自旋锁、原子操作和信号量,三者保证了对临界资源访问的互斥型。 1.1 内核中的互斥机制 1.1.1 自旋锁 自旋锁用在多个CPU系统中。当一个线程在一个CPU上正使用资源,而另一个线程在另一个CPU上正忙等待这个资源的时候,就会用到自旋锁来保护临界资源。
1 .1 进程结构 每个进程都具有自己的属性,用一个task_struct数据结构来表示,它包含了进程的详细信息,主要有进程标识符(PID)、进程所占的内存区域、相关文件描述符、安全信息、进程环境、信号处理、资源安排、同步处理状态几个方面。
我们知道,水王问题:有N个数,其中有一个数出现超过一半,要求在线性时间求出这个数。那么,我的问题是,加强版水王:有N个数,其中有一个数刚好出现一半次数,要求在线性时间内求出这个数。 因为,很明显,如果是刚好出现一半的话,如此例: 0,1,2,1 : 方案一: 根据上面的例子,最后我们可能会输出不是符合条件的数字,那么仔细分析的话,占一半的数字,只能在两个变量中出现:candidate和arr[n-1]。
1 使用从大到小的优先队列保存最小的K个数,每次取出K个数之后的其余数和堆顶元素比较,如果比堆顶元素小,则将堆顶元素删除,将该元素插入 void topK(int arr[],int n,int k) { if(k>n) return; priority...
Description: Count the number of prime numbers less than a non-negative number, n Hint: The number n could be in the order of 100,000 to 5,000,000.
并发编程 如果逻辑控制流在实际上重叠,那么它们就是并发的,这种常见的现象称为并发,出现在计算机系统的许多不同层面上。 应用级并发在其他情况下也是很有用的: 访问慢速I/O设备。 与人交互。 通过推迟工作以降低延迟。
一、UNIX I/O 在UNIX系统中有一个说法,一切皆文件。所有的I/O设备,如网络、磁盘都被模型化为文件,而所有的输入和输出都被当做对相应文件的读和写来执行。这种将设备映射为文件的方式,允许UNIX内核引出一个简单、低级的应用接口,称为UNIX I/O,这使得所有的输入和输出都能以一种统一且一致的方式来执行。
虚拟存储器 虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。通过一个很清晰的机制,虚拟存储器提供了三个重要的能力: (1)它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。
linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址。
分析linux内存管理机制,离不了上述几个概念,在介绍上述几个概念之前,先从《深入理解linux内核》这本书中摘抄几段关于上述名词的解释: 一、《深入理解linux内核》的解释 逻辑地址(Logical Address) 包含在机器语言指令中用来指定一个操作数或一条指令的地址(有点深奥)。
1 思路: 自己实现一个栈,其中成员为标准库中的栈,一个存放全部的元素,一个存放最小元素,一个存放最大元素。 使用自己实现的栈来实现一个求最大值最小值的队列,其中包含两个成员,一个作为出队的栈,一个作为入队的栈。
一、题目概述:有一个没有排序,元素个数为2N的正整数数组。要求把它分割为元素个数为N的两个数组,并使两个子数组的和最接近。假设数组A[1..2N]所有元素的和是SUM。模仿动态规划解0-1背包问题的策略,令S(k, i)表示前k个元素中任意i个元素的和的集合。
上一篇文章分析了互联网的总体构思,从下至上,每一层协议的设计思想。 这是从设计者的角度看问题,今天我想切换到用户的角度,看看用户是如何从上至下,与这些协议互动的。 ============================================================== 互联网协议入门(二) 作者:阮一峰 (接上文) 七、一个小结 先对前面的内容,做一个小结。
我们每天使用互联网,你是否想过,它是如何实现的? 全世界几十亿台电脑,连接在一起,两两通信。上海的某一块网卡送出信号,洛杉矶的另一块网卡居然就收到了,两者实际上根本不知道对方的物理位置,你不觉得这是很神奇的事情吗? 互联网的核心是一系列协议,总称为”互联网协议”(Internet Protocol Suite)。
题目 你有10亿个url,每个url对应一个非常大的网页。你怎么检测重复的网页? 解答 网页大,数量多,要把它们载入内存是不现实的。 因此我们需要一个更简短的方式来表示这些网页。而hash表正是干这事的。
题目 有一个数组,里面的数在1到N之间,N最大为32000.数组中可能有重复的元素(即有的元素 存在2份),你并不知道N是多少。给你4KB的内存,你怎么把数组中重复的元素打印出来。 解答 我们有4KB的内存,一共有4 * 210 * 8位,大于32000,所以我们可以用Bit Map 来做这道题目。
题目 给你一个文件,里面包含40亿个整数,写一个算法找出该文件中不包含的一个整数, 假设你有1GB内存可用。 如果你只有10MB的内存呢? 解答 我们先来做个算术题,40亿个整数大概有多大? 40 * 10^8 * 4B = 16GB (大约值,因为不是按照2的幂来做单位换算) 这个明显无法一次性装入内存中。
题目 给你一个排好序的并且穿插有空字符串的字符串数组,写一个函数找到给定字符串的位置。 例子:在字符串数组 [“at”, “”, “”, “”, “ball”, “”, “”, “car”, “”,“”, “dad”, “”, “”] 中找到”ball”,返回下标4. 例子:在字符串数组 [“at”, “”, “”, “”, “”, “ball”, “car”, “”, “”, “dad”, “”, “”] 中找到”ballcar”,查找失败,返回-1. 解答 字符串数组已经是有序的了,所以,还是可以利用二分查找来找到指定的字符串。
题目 写一个函数对字符串数组排序,使得所有的变位词都相邻。 解答 首先,要弄清楚什么是变位词。变位词就是组成的字母相同,但顺序不一样的单词。 比如说:live和evil就是一对变位词。OK,那么这道题目的意思就很清楚了, 它并不要求我们将字符串数组中的字符串按字典序排序,否则我们直接调用STL中的sort 函数就可以了。
题目 原文: 写程序交换一个整数二进制表示中的奇数位和偶数位,用尽可能少的代码实现。 (比如,第0位和第1位交换,第2位和第3位交换…) 解答 这道题目比较简单。分别将这个整数的奇数位和偶数位提取出来,然后移位取或即可。
题目 给定一个字符串类型(string)表示的小数,打印出它的二进制表示。 如果这个数无法精确地表示为二进制形式,输出”ERROR”。 解答 整数部分通过不断地对2取余然后除以2来得到其二进制表示, 或是不断地和1按位与然后除以2得到其二进制表示。
题目 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。 进一步地, 为你的程序写测试用例。 解答 这道题目其实是要你就地(in place)将字符串中重复字符移除。