<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cppgp的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cppgp</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cppgp]]></copyright><item><title><![CDATA[程序员的自我修养 -- 链接、装载与库]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/8213947</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/8213947</guid><author>cppgp</author><pubDate>Thu, 22 Nov 2012 20:36:33 +0800</pubDate><description><![CDATA[首先声明，这是一本好书。:)


-- 但是存在一些问题，也有可能是我理解的不够。。 ？


2012.11.22

1.6.2 线程安全
互斥量（Mutex）描述说，哪个线程获取了互斥量，哪个线程就要负责释放，其他线程越俎代庖去释放互斥量是无效的。
---------------------------------
这里说法是错误的，最起码针对Linux实现的pthread]]></description><category></category></item><item><title><![CDATA[GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (2) 多目录和动态链接库]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7262923</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7262923</guid><author>cppgp</author><pubDate>Wed, 15 Feb 2012 23:55:49 +0800</pubDate><description><![CDATA[0. 基础
    先阅读GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (1) 简单示例并成功执行、理解所说内容。
1. 先提供一个脚本。拷贝所有内容保存为文件atdir.sh并添加可执行权限，然后执行。注意，最好不要以根用户身份执行它。

#!/bin/sh

echo "Autotools for autotools]]></description><category></category></item><item><title><![CDATA[GNU Autotools (autoconf, automake, libtool, etc.) 自动化编译 (1) 简单示例]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7258875</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7258875</guid><author>cppgp</author><pubDate>Tue, 14 Feb 2012 17:40:22 +0800</pubDate><description><![CDATA[0. 操作平台: Linux


1. 软件包安装(Debian)

yes | sudo apt-get install gcc make autoconf automake libtool

2. 从一个例子谈起。
    2.0 完整拷贝如下代码直接在终端执行或者保存为auto-example.sh，添加执行权限执行。或者参考2.1~2.5逐步执行。
echo "creat]]></description><category></category></item><item><title><![CDATA[Introduction to Algorithms 算法导论 第4章 递归式 学习笔记及习题解答]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7247050</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7247050</guid><author>cppgp</author><pubDate>Thu, 09 Feb 2012 22:41:00 +0800</pubDate><description><![CDATA[第4章 递归式

主方法: 
        n=1:
                T(n) = Θ(1)
        n>1:
                T(n) = aT(n/b) + Θ(n)   (a≥1, b>1)

4.1 代换法
1). 猜测解的形式
2). 用数学归纳法找出使解真正有效的常数
改变变量：
T(n) = 2T(⌊n^(1/2)⌋)]]></description><category></category></item><item><title><![CDATA[Introduction to Algorithms 算法导论 第3章 函数的增长 学习笔记及习题解答]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7179073</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7179073</guid><author>cppgp</author><pubDate>Thu, 05 Jan 2012 17:51:39 +0800</pubDate><description><![CDATA[3.1 渐近记号
表示算法的渐近运行时间的记号是用定义域为自然数集N = {0, 1, 2, ...}的函数来定义的。这些记号用来表示最坏情况运行时间T(n)。

Θ记号
    Θ(g(n)) = {f(n): 存在正常数c1,c2和n0，使对所有的n≥n0，有0 ≤ c1*g(n) ≤ f(n) ≤ c2*g(n)}
O记号
    O(g(n)) = {f(n): 存在正常数c和]]></description><category></category></item><item><title><![CDATA[Introduction to Algorithms 算法导论 第2章 算法入门 学习笔记及习题解答]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7161701</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7161701</guid><author>cppgp</author><pubDate>Thu, 29 Dec 2011 15:42:12 +0800</pubDate><description><![CDATA[2.1 插入排序

插入排序解决的问题：
    输入：n个数构成的序列
    输出：排序输入序列为，满足a1' ≤ a2' ≤ ... ≤ an'

伪码：
    INSERTION-SORT(A)
      for j <- 2 to length[A]
        do key <- A[j]
            i <- j - 1
            whi]]></description><category></category></item><item><title><![CDATA[Introduction to Algorithms 算法导论 第1章 基础知识 学习笔记及习题解答]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7110868</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7110868</guid><author>cppgp</author><pubDate>Thu, 29 Dec 2011 02:05:01 +0800</pubDate><description><![CDATA[什么是算法
﻿    定义良好的计算过程，取一个或者一组值作为输入，产生一个或一组输出值﻿。

1.1-1 给出一个真实世界的例子，其中包括着下列的某种计算问题：排序，确定多矩阵相乘的最佳顺序，或者找出凸壳。﻿
    ﻿排序：
    ﻿    这个是最常见的。比如﻿：
        某公司市场部季度销售额排名。
        Alexa网站排名。（什么是Alexa？http:]]></description><category></category></item><item><title><![CDATA[Introduction to Algorithms (算法导论） 学习笔记 -- Chapter 9]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7098085</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7098085</guid><author>cppgp</author><pubDate>Fri, 23 Dec 2011 14:56:24 +0800</pubDate><description><![CDATA[Chapter 9 Medians and Order Statistics (中位数和顺序统计)


n个元素中查找最小或最大元素，需要进行n-1次比对。



同时查找最小和最大的元素，最坏情况下需要进行⌈3n/2 - 2⌉次比较（⌈⌉为上取整）
证明：
对于n为奇数，初始设置min和max均为第一个元素，剩下n-1个元素为偶数，
对于n为偶数，比对前两个元素，设置较小的为]]></description><category></category></item><item><title><![CDATA[形形色色的计算机语言]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/7066173</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/7066173</guid><author>cppgp</author><pubDate>Tue, 13 Dec 2011 11:27:56 +0800</pubDate><description><![CDATA[PostScript（PS）
        PostScript（PS）是主要用于电子产业和桌面出版领域的一种页面描述语言和编程语言。
            
http://en.wikipedia.org/wiki/PostScript
            
http://zh.wikipedia.org/zh-cn/PostScript]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 03 diskboot.S 3.3 diskboot.S详细注释]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6408235</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6408235</guid><author>cppgp</author><pubDate>Tue, 10 May 2011 09:09:00 +0800</pubDate><description><![CDATA[转载注明出处(cppgp: http://blog.youkuaiyun.com/cppgp
)diskboot.S位于grub-1.98/boot/i386/pc/目录，采用AT&T汇编语法编写。详细注释如下：/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 1999,2000,2001,2002,2006,2007,2009,2010   Free Software Foundation, Inc.
 *
 *  GRUB is fre]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 03 diskboot.S 3.1 diskboot.S执行时的环境 & 3.2 diskboot.S代码结构]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6408231</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6408231</guid><author>cppgp</author><pubDate>Tue, 10 May 2011 09:05:00 +0800</pubDate><description><![CDATA[转载注明出处(cppgp: http://blog.youkuaiyun.com/cppgp
)diskboot.S位于目录boot/i386/pc/，最终生成diskboot.img。这部分指令被加载到0x8000~0x81FF。diskboot.img加载GRUB内核到0x8200开始的内存位置，并将系统控制权交给GRUB内核。用到的BIOS例程和boot.S中相同。因此本章只描述如下内容：
  1)    diskboot.S执行时的环境
  2)    diskboot.S代码结构
  3)    di]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 02 boot.S 2.5 MBR过程模拟实现]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6361066</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6361066</guid><author>cppgp</author><pubDate>Mon, 25 Apr 2011 11:18:00 +0800</pubDate><description><![CDATA[2.5 MBR过程模拟实现
现在，我们对系统引导的第一步已经有了一个详细的认识。为了更深一步的理解MBR和这些BIOS调用，提供一些测试题目：
  1)    开机后在屏幕上输出”Hello cppgp”，并在一定时间后重复输出。
  2)    开机后紧跟着读取第二个扇区，并且显示整个扇区512字节到屏幕上。
实现上述功能，编译生成512字节的IMG文件，设置虚拟机通过软盘引导，选择使用软盘镜像文件，设置镜像文件为我们编译生成的IMG文件，就可进行测试。
下文首先简单介绍虚拟机配置，然后实现上述]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 02 boot.S 2.4 boot.S详细注释]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6361020</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6361020</guid><author>cppgp</author><pubDate>Mon, 25 Apr 2011 11:08:00 +0800</pubDate><description><![CDATA[grub 1.98 深入理解 boot.S 详细 注释]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 02 boot.S 2.2 MBR结构 2.3 boot.S代码结构]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6361000</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6361000</guid><author>cppgp</author><pubDate>Mon, 25 Apr 2011 11:05:00 +0800</pubDate><description><![CDATA[<br />转载注明出处(cppgp: http://blog.youkuaiyun.com/cppgp
)<br /> <br />2.2 MBR结构<br />
历史悠久的MBR结构自从IBM兼容PC出现以来一直就没变过（但是为支持2TiB以上硬盘而出现的GUID/EFI结构将更改MBR结构）。MBR结构分为三部分，分别是引导指令、分区表DPT (Disk Partition Table)、幻数Magic (Magic=0x55AA)。其中引导指令占用446字节（0~0x1BD），DPT占用64字节（0x1BE]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 02 boot.S 2.1 相关BIOS例程]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6360976</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6360976</guid><author>cppgp</author><pubDate>Mon, 25 Apr 2011 10:59:00 +0800</pubDate><description><![CDATA[转载注明出处(cppgp: http://blog.youkuaiyun.com/cppgp)。2. boot.S: GRUB引导第一步
boot.S位于目录boot/i386/pc/。这部分指令被加载到0x7C00~0x7DFF。主要工作包括：配置寄存器；设置堆栈；检测引导盘；检测引导盘读取模式；读取另一扇区指令。这个过程用到几个BIOS例程，并且对主引导记录（MBR, Master Boot Record）结构有很大的依赖。因此boot.S我们分作四步进行详细描述：
1)    相关BIOS例程
2)    ]]></description><category></category></item><item><title><![CDATA[深入理解 GNU GRUB - 01 ]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6360939</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6360939</guid><author>cppgp</author><pubDate>Mon, 25 Apr 2011 10:52:00 +0800</pubDate><description><![CDATA[1. 概述1.1 GRUB是什么
GNU GRUB是一款多重引导程序。简单来讲，引导程序是计算机开机运行的第一个软件，它的使命是装载操作系统并运行。实际上，由于平台、存储介质、操作系统、文件系统等的多样性，引导程序都很复杂，同时，引导程序要求有更高安全性、健壮性。
GNU GRUB支持多平台（例如X86、PowerPC等）、多存储介质（例如硬盘、软盘、光盘、U盘）、多操作系统（例如Linux、Gnu Hurd等）、多重引导（例如Windows等）、多文件系统（例如Ext2、Ext3、Ext4、FAT32]]></description><category></category></item><item><title><![CDATA[Linux总线驱动-02: struct bus_type 结构体]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6333359</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6333359</guid><author>cppgp</author><pubDate>Tue, 19 Apr 2011 13:41:00 +0800</pubDate><description><![CDATA[本文测试系统为：Ubuntu 10.10 x86_64 2.6.35-24-generic上节中，除了简单的框架，我们还看到了一个和总线驱动相关的结构体bus_type。这个结构体的定义在include/linux/device.h中。本节先简单介绍结构体中的成员，再对每个成员作详细描述。struct bus_type {
	const char		*name;
	struct bus_attribute	*bus_attrs;
	struct device_attribute	*dev_attrs;]]></description><category></category></item><item><title><![CDATA[Linux总线驱动-01: 一个简单的示例]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/6323666</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/6323666</guid><author>cppgp</author><pubDate>Thu, 14 Apr 2011 17:02:00 +0800</pubDate><description><![CDATA[本文测试系统为：Ubuntu 10.10 x86_64 2.6.35-24-generic在新的驱动核心支持下，实现一个什么都不做的总线驱动是很简单的。如下，拷贝代码并保存为ycbus.c：/*
 * ycbus: a software bus driver (virtual bus driver)
 *
 * a trivial ycbus driver
 */
#include 
#include 
struct bus_type ycbus_type = {
  .name      ]]></description><category></category></item><item><title><![CDATA[C Reference Manual Reading Notes: 010 Definition and Replacement]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/4480361</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/4480361</guid><author>cppgp</author><pubDate>Mon, 24 Aug 2009 21:45:00 +0800</pubDate><description><![CDATA[1. synopsis     The #definepreprocessor command causes a name (identifier) to become defined as amacro to the preprocessor.  A sequences of tokens, called the body ofthe macro, is associat]]></description><category></category></item><item><title><![CDATA[C Reference Manual Reading Notes: 009 Preprocessor Lexical Conventions]]></title><link>https://blog.youkuaiyun.com/cppgp/article/details/4476532</link><guid>https://blog.youkuaiyun.com/cppgp/article/details/4476532</guid><author>cppgp</author><pubDate>Sun, 23 Aug 2009 23:05:00 +0800</pubDate><description><![CDATA[    The preprocessor does not parse the source text, but it doesbreak it up into tokens for the purpose of locating macro calls. Thelexical conventions of the preprocessor are somewhat different f]]></description><category></category></item></channel></rss>