存档在 2013年4月

主分区和逻辑分区

2013年4月29日

分区有主分区(Primary)、扩展分区(Extended)和逻辑分区(Logical)之分。主分区能够激活,通常用来引导系统。扩展分区本身并不能直接用来存放数据,逻辑分区是扩展分区进一步分割出来的区块,通常用来存储数据。如果将逻辑分区比作房间,那么扩展分区就好比客房区(包括若干个房间)。disk
通常我们会先在硬盘上划分一个主分区,就是我们常说的C分区,用于安装操作系统,然后将其他的空间全部作为扩展分区,并根据需要,将扩展分区分成几个逻辑分区,即D、E等分区。
在“分区类型”下拉列表中,有FAT、FAT32、NTFS等分区类型,根据你要安装的操作系统,选择合适的分区类型。
如何选择文件系统
文件系统是用来管理资料存储的机制,就是将程序、资料和信息等主要内容按文件的形式保留在磁盘上。对于整个计算机系统的软件结构来说,文件系统扮演着分配存储空间、搜索资料文件等很重要的角色。一般来讲,每一个操作系统都要搭配相应的文件系统,专门负责存取资料。下面是几种常见的文件系统格式。
FAT16:采用16位的文件分配表,广泛应用在DOS、Windows 3.x和Windows 95等操作系统中。
FAT32:随着硬盘容量的不断增大,微软为了突破FAT16最大只能够管理2GB文件的限制,从Windows 95 OSR2、Windows 98开始将文件系统改为FAT32格式,并向下兼容FAT文件,这是一种效率更高、更加节省空间的文件系统。
NTFS:是New Technology File System的缩写,是一个特别为网络和磁盘定额、文件加密等管理安全特性而设计的磁盘格式。NTFS也是以簇为单位来存储数据文件的,但NTFS中簇的大小并不依赖于磁盘或分区的大小。簇尺寸的缩小不但减少了磁盘空间的浪费,还减少了产生磁盘碎片的可能。Windows 2000/XP可采用NTFS分区格式,当然,由于是向下兼容的,所以也可以采用FAT32格式。
Ext2:是Linux主系统使用的文件系统,Linux交换分区则使用Swap文件系统。

如何让自己的迭代器融入标准的STL框架

2013年4月27日

任何迭代器,如果想能与STL完美兼容,也即是能够使用STL的各种算法与各种工具。那么就得遵循它的要求,那就是有5个内嵌类型必须定义,这样就可以让traits萃取。但是在每个迭代器都去自己写这些确实容易遗忘,但是这里有一个较简单的方法来实现。那就是STL提供的iterator这个类,可以让自己定义的新的迭代器继承他。

template <class Category, class T, class Distance = ptrdiff_t,
          class Pointer = T*, class Reference = T&>
struct iterator {
  typedef Category  iterator_category;
  typedef T         value_type;
  typedef Distance  difference_type;
  typedef Pointer   pointer;
  typedef Reference reference;
};

» 阅读更多: 如何让自己的迭代器融入标准的STL框架

4-20雅安地震默哀

2013年4月27日

chrysanthemum-42
愿逝者安息,生者坚强!
愿我多灾多难的四川同胞平安快乐!

STL中的特性萃取机iterator_traits

2013年4月26日

很早以前,第一次看STL源码,第一次接触iterator_traits,我觉得他是一个巧妙的发明。
而现在再来看他,我觉得他变得更加绝妙。

iterator_traits是和迭代器在一起的,是针对迭代器来说的。也就是说通过iterator_traits可以了解到迭代器的信息和迭代器所指向元素的信息。
在编码的时候,往往需要定义一个迭代器指向对象类型的变量或者对象,我们可以利用函数模板推导来获得value_type类型。

template <class I, clss T>
void _func(I iter, T t)
{
	T tmp;
	/*---*/
}

template <class I>
void func(I iter)
{
	_func(iter, *iter);
}

» 阅读更多: STL中的特性萃取机iterator_traits

Linux进程的状态

2013年4月26日

我们先看Linux的进程五态模型及其转换:

这些状态是task_struct结构的一部分:

1  R (task_running) : 可执行状态

只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程 处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的 可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。

很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态。 » 阅读更多: Linux进程的状态

byte转成8位二进制

2013年4月26日

使用Convert即可
string binaryData = Convert.ToString(tmpBuf[i], 2).PadLeft(8, ‘0’);

STL的第二级空间配置器代码分析[2]

2013年4月26日

上面描诉了allocate函数,这个函数是标准配置器的接口函数。在该函数中,首先判断区块大小是否大于128字节,如果大于则调用第一级配置器,小于则检查对应的自由链表,如果对应的自由链表有可用的块则直接使用,否则将区块大小上升到8的倍数,调用refill重新填充空间。再来看看allocate的对立面deallocate,具体的意思看代码里的注释。

   /* p may not be 0 */
  static void deallocate(void *p, size_t n)
  {
    obj *q = (obj *)p;
		//用于指向16个自由链表中最合适哪一个
    obj * __VOLATILE * my_free_list;
		//大于128字节则交给第一级配置器处理
    if (n > (size_t) __MAX_BYTES) {
        malloc_alloc::deallocate(p, n);
        return;
    }
		//确定自由链表
    my_free_list = free_list + FREELIST_INDEX(n);
    // acquire lock
#       ifndef _NOTHREADS
        /*REFERENCED*/
        lock lock_instance;
#       endif /* _NOTHREADS */
	//将p指向的内存块添加到自由链表里
    q -> free_list_link = *my_free_list;
		//修改自由链表的指向
    *my_free_list = q;
    // lock is released here
  }

» 阅读更多: STL的第二级空间配置器代码分析[2]

STL的第二级空间配置器代码分析[1]

2013年4月25日

STL的第二级空间配置器里有很多经典的思想,确实值得细细品味。
为什么使用如下的代码:

  static size_t ROUND_UP(size_t bytes) {
        return (((bytes) + __ALIGN-1) & ~(__ALIGN - 1));
  }

他的原理可以看这里

» 阅读更多: STL的第二级空间配置器代码分析[1]