- 浏览: 141068 次
最新评论
文章列表
python中迭代器的定义方式主要有两种,一种是通过类实现__iter__()方法,其返回一个实现了__next__()方法的object,如果该类自身实现了__next__(),则只需直接返回self即可,如下是一个拥有逆置功能的类:
#创建过程:
class Reverse:
def __init__(self, data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__( ...
说明:本文示例摘自《深入理解计算机系统》第五章----优化程序性能。
在程序优化时,对于这样一种现象不得不注意,即存储器别名使用。
那么什么是存储器别名使用呢?
简单来说,就是“两个指针可能同时指向同一个存储地址的情况”。
示例为证,考虑下面的代码序列:
x = 1000;
y = 3000;
*q = y;
*p = x;
t1 = *q;
最终t1是多少呢?可能很多人会不假思索就回答3000,然而事实上它是完全有可能等于1000的,这种情况取决于指针p和q是否指向同一个地址,即p是否等于q。
再来看另一个例子:
void twiddle1(int *xp, int ...
对于条件变量,我一直感到很困惑,搞不清其与互斥锁到底有啥区别,网上搜了很多资料,终于皇天不负有心人,被我找到一个让我瞬间彻悟的博文,此处就不多说,原址奉上,相信各位读者也会认同:http://hipercomer.blog.51cto.com/4415661/914841
话不言多,推崇备至,程序员必须知道的10大基础实用算法及其讲解:
http://www.kuqin.com/shuoit/20140623/340736.html
CPU与磁盘的交互过程
- 博客分类:
- 操作系统
对于计算机系统底层技术,想必很多人都和我一样不太了解,最近在学相关书籍,了解到了CPU与磁盘交互时大致发生了哪些事情,现记录如下:
首先,我们得先了解到CPU与磁盘是通过I/O总线关联到一起的,CPU操作磁盘是通过一种叫做存储器映射I/O的技术来实现的。这种技术会在两者交互时单独划分出一块地址,每个这样的地址就称作I/O端口,然后磁盘就会映射到一个或多个I/O端口,用以绑定地址。
其次,CPU依次向磁盘发送指令:磁盘读(或写)命令、逻辑块号、主存地址。
然后,发送完指令后,CPU会转去执行其它任务(为了提高效率),磁盘则会将逻辑块号转换成对应的盘片、磁道、扇区组成的三元组,从而定位到了数 ...
python中有很多类似于__del__(self)这样的特殊方法,有一些比如 __gt__()、__le__()等等从名字就可猜出其大概功能,但有些却不能这样这样随意猜测(当然也有可能是只有我一人会这样),比如此处即将登场的__del__()和del,以前我以为当del一个对象时,__del__()就会被调用,然而在经历了一次次的笔试失败后,我才开始审查起这些较为细微的地方了 ^_^ !
闲话少说,进入正题!
我们知道del是删除一个对象,其实准确的说,应该是使该对象的引用计数减一。但是注意,并不是每次调用它的时候,__del__()就会调用,因为__del__()是在该对象的引用计数降为0时 ...
对于操作系统,我们知道,越靠近CPU的存储器,其存储速度就会越来越快,如果将整个存储系统视作一个金字塔,CPU作为塔顶,那么从上到下,访问速度会越来越慢,但存储容量越来越大,价格越来越低,按照常用的存储系统分类,分别为寄存器、高速缓存、主存、磁盘,后面可能还有网络文件等。
为了加快访问速度,在每一层,存储器会被划分为连续的数据对象块,一般大小是固定的(也有可能不同,比如远程的HTML文件),每一层的上一层都是作为该层的缓存,因为上一层的访问速度要快些,而存储容量要小些,所以上一层的数据对象块会少些。由于层与层之间是以数据对象块为单位传送,所以任意时刻上一层的缓存都是下一层的子集。另外,为了弥补 ...
python中用with关键字可以创建一个上下文管理器,其为我们带来了很多便利,比如常见的文件的打开关闭操作等,是否觉得它用起来很酷?想不想定义自己的上下文管理器?现在就让我们一起来瞧瞧它的底层实现。
其实要定义自己的上下文管理器也很简单,只需要实现两个方法:
1、__enter__(self)
2、__exit__(self, exc_type, exc_value, traceback)
其中__enter__()方法会在创建时调用,可以把它返回的对象绑定到as指定的变量上,而__exit__()方法则会在退出上下文管理器时调用,它的三个参数描述了退出时发生的异常,没有发生的话就为None ...
我知道很多人都知道异常处理,但可能对其底层并不太了解,现在我们就来简单的聊一聊。
在此啰嗦一句(仅为自己记录需要^_^,与本主题无多大关系),异常是位于硬件和操作系统交界的部分,系统调用是为应用程序提供到操作系统的入口点的异常,而进程和信号位于应用和操作系统的交界处。
现在正式开始。
异常说白了就是控制流中的突变,用来响应处理器状态中的某些变化。在处理器中,状态被编码成了不同的位和信号。状态变化就被称为事件,事件可能和当前指令的执行直接相关,例如发生虚拟存储器缺页、算术溢出等,但也可能和当前指令无关,比如一个系统定时器产生信号或者一个I/O请求完成。
异常可分为四类:中断、陷阱、故障、终止, ...
一篇比较详细的关于红黑树插入和删除的文章,因为无法转载,所以只能给个链接了:
http://www.cnblogs.com/fornever/archive/2011/12/02/2270692.html
友情提示:其中删除部分需要提前知道“替换点”是怎么回事,然后适合再细看,不然会有点痛苦。
在开始之前,我们得先明确两个概念,即强符号和弱符号。
所谓强符号,就是指函数和已初始化的全局变量。自然弱符号就是指未初始化的全局变量。
在unix系统中,链接器采取以下规则来处理多重定义的全局符号:
1、同一个文件中不允许有多个相同强符号。
2、如果一个对象有一个强符号和多个弱符号,则选择强符号。
3、如有多个弱符号,则任选一个。
现在改说人话,稍微以例子解释一下各个规则。
1、多个强符号的情况:
//main.c
#include<stdio.h>
void foo();
int x = 1513; //强符号
int main(void){
...