本站动态:
第二章: 进程概念
作者:shosh 日期:2009-11-14
第一章: 操作系统引论
作者:shosh 日期:2009-11-13
都是概念性的东西,稍微了解下即可。
操作系统的功能:
- 存储器管理
- 内存分配
- 地址映射:把逻辑地址映射为内存的物理地址
- 内存保护:各程序之间的内存如何做到不冲突
- 内存扩充:提供虚拟内存
- 处理机管理
- 作业调度
- 进程调度
- 进程控制
- 进程通信
- 设备管理
- 缓冲区管理
- 设备分配
- 设备驱动
- 设备无关性:方便编程使用
- 文件管理
- 文件存储空间管理
- 文件操作
- 目录管理
- 读写管理和存取控制
- 用户接口
- 命令界面
- 程序界面
- 图形界面
操作系统的特点:
- 并发(宏观上的,与并行相区分)
- 共享
- 异步
操作系统的类型:
- 批处理系统:单道+多道(作业)批处理系统
- 多道批处理系统虽然多个作业成批进行,但是缺乏与用户的交互性
- 分时系统
- 分时:若干并发程序对CPU时间的共享
- 多个用户终端共用主机
- 特点:
- 同时性:多个用户同时使用
- 交互:用户可控制程序的运行
- 独立:用户感觉不到其它用户的存在,感觉自己在独立使用计算机
- 及时:计算机对命令及时响应
- 实时系统
- 响应时间更短,比分时系统的“及时”更为“及时”
- 特点:
- 专用
- 实时
- 高可靠
- 个人机系统
- 分类
- 单用户操作系统
- 多用户操作系统
- 分类
- 网络操作系统
- 多个主机通过网络互联
- 特征
- 分布式
- 自治性:各台主机可自行运行
- 互连性
- 可见性:知道对方计算机地址
- 分布式操作系统
- 特征
- 分布式处理
- 模块化结构
- 利用信息通信
- 实施整体控制
- 特点
- 透明:不知道资源位于何处
- 灵活:得益于模块化结构,系统的修改很方便
- 可靠:一部分发生故障并不影响整体的使用
- 高性能
- 可扩充
- 特征
win7下同步播放麦克风声音
作者:shosh 日期:2009-11-13
在windows 7 下,如何让麦克风的声音直接从电脑上的扬声器输出呢?
右击任务栏角上的小喇叭,选择Recording devices(录音设备),可以看到下图窗口:
如果不能看不到上图中的麦克风和立体声混音,在窗口内部空白处右击,在弹出的右键菜单中选中"Show Disconnected Devices(显示未连接设备)"即可。
以下几张图是麦克风的属性设置:

此处关键,usage必须选中“Use this device (enable)”(使用此设备)

此处关键,必须选中“Listen to this device(监听此设备)”。其实原理就是监听麦克风的输入,通过回放设备(扬声器)进行播放。以后要不要播放麦克风的声音,就是在这里控制切换的。


如果按照以上设置,你就可以对这麦克风说话,你的声音就直接从扬声器上播出了。只不过效果肯定没KTV的好,它会有一定的滞后(不过不怎么严重),用来说话扩音是没有问题的,如果是K歌的话,可能会影响你的发挥。
再说strcpy + 面试中的算法题笔试
作者:shosh 日期:2009-11-06
strcpy这个函数是很考验一个人的,其实很早(大二的时候)就看过林锐的《高质量C/C++代码》,里面对strcpy做了很详细的分析,以及哪些需要注意的地方。
其实C语言课上的时候,老师也分析过strcpy,甚至老师将该函数体的循环部分简化为一个语句。另外,本人也一直对自己的编码风格、C语言和一些比较常见的算法都很自信的,不过今天自己写了strcpy()这个函数,回来后发现自己还是载在了这个上面(其实也不是太影响面试结果)。反省一下!
当时写strcpy函数的时候,有几个没有记清的地方的:
1、strcpy会不会主动给strDest的末尾加上'\0',当时当成不加了来处理。
2、参数是否该去检测NULL,因为strcpy作为比较常用的库函数,感觉程序员理应为主动为其保证正确性(现在想起来林锐当时好像用的是assert),不过我们写嵌入式的好像不怎么习惯用assert,也可能是我个人的情况。),即使可以保证指针为有效的地址值,也无法保证strDest分配的空间是足够的。不过这个判断语句还是写上了,因为写上去至少不会说是错。
3、其他错误(如果调试运行一下就可以发现)。
不怕丢脸,贴出我写的那个错误版本的strcpy函数:
- char* strcpy(char *strDest, const char *strSrc)
- {
- char *p = strSrc;
- if (NULL == strDest || NULL == strSrc)
- return NULL;
- while ('\0' != *p)
- {
- *strDest = *p;
- strDest++;
- p++;
- }
- return strDest;
- }
函数中申请了临时变量p,不过没有用它来存放strDest。当初只想着把传入的strDest返回去就好了,结果忽略了过程中把它移动了。所以,其实这个是最大的错误,但是调试运行一下是很容易发现的。当时给strSrc设置了个变量的原因是因为const,其实我知道这里const修饰的是char*,也就是说地址strSrc指向的那片空间的数据在本函数中是不可以去修改的。但是当时也是为了“双保险”,就来了个char* p = strSrc; 。实际上这句话是有warning的,如果当时调试了,估计就把它删除掉了(因为我更讨厌强转,且这句话是非必须的)。
建议大家玩英文版的孤岛惊魂FarCry
作者:shosh 日期:2009-11-01
记得在大学的时候在同学的电脑上玩过一款射击类游戏,画面很逼真,也很刺激很好玩。不过没记住那款有时叫什么。
毕业后买了这台笔记本,是联想的Y530,Pei的那一款,P8600的CPU,9600m gs的显卡,4g的DDR3内存。想起大学里玩的那款游戏,后来发现原来名叫FarCry,中文名为孤岛惊魂。当是在vista下下载并安装了FarCry的Demo版,就几百兆的,是英文版的(估计也没人愿意给他汉化),如果把配置调高了,会玩不起来(画面不正常),但是如果合理地选择高级视频选项,还是可以玩起来的(多数设置成中或低)。后来下了个中文版,不管怎么设置都玩不起来。
后来安装了windows 7,前几天又更新了驱动程序(包括显卡驱动程序)。在更新驱动之前(使用Vista上的驱动),Windows Experience Index(Windows体验指数)的各项分数如下:
win7计算机右键管理功能失效的解决方法
作者:shosh 日期:2009-10-31
这个好像是比较容易碰到的问题,网上问的比较多,不过多数没有给出正确的解决方案。
不过解决该问题也简单,只需要将本文的附件 shoComputerManage.reg 导入到注册表即可(下载后双击打开,弹出询问窗口的时候选择确定即可)。
懒得下载的朋友可以自己制作该文件,文件内容如下:
windows7下删除多余的启动菜单
作者:shosh 日期:2009-10-31
1、以管理员身份启动cmd窗口
2、输入并执行命令bcdedit,得到如下结果:
C:\Windows\system32>bcdedit
让windows 7不再弹出操作确认窗口的方法
作者:shosh 日期:2009-10-31
按住Win + R打开运行窗口,输入C:\Windows\System32\UserAccountControlSettings.exe (如果系统安装在C盘的话),然后回车,即可打开用户账号控制设置窗口(如果不是这个路径,可以直接在启动菜单里输入UserAccountControlSettings.exe,或者简单地输入UAC,windows很快就会找到的)。
用户账号控制设置窗口的左边有上下滑动的滑块,如果调到最上面,则所有windows的设置修改都会弹出提示,而如果调到最下面,则永远不会弹出确认提示窗口了,不过并不推荐这样做,因为存在一定的安全隐患。
C++中的多重继承
作者:shosh 日期:2009-10-30
和Java不同,C++允许多重继承。所谓多重继承,是指一个类可以同时继承自多个类,使其本身同时具有这些类的特征。这样就会有一个问题,如下面的继承关系:
A->B1->C1->D, A->B2->C2->D,我们将这里的箭头看成是“派生出”,所以这里A派生出了B1和B2,B1派生出C1,B2派生出C2,而D同时继承自C1和C2,即D是从C1和C2多重继承出来的。我们知道,派生类是可以访问基类的数据成员的,那对于D的对象要访问间接基类A的成员,是访问第一条路线的A呢,还是访问第二条路线的A呢(两个A还不一样吗?不一样,因为在构造D的时候,会先去构造C1和C2,而在构造C1的时候,会先去构造B1,构造C2的时候会先去构造B2,而在构造B1的时候,会先去构造A,在构造B2的时候,也会先去构造A——这里说的构造X是指构造类X的对象。所以最后D中包含了两个A的对象)?也就是说,产生了二义性。如果你没有访问基类A的成员,没有关系,编译不会发现这个错误,但是如果有去访问A类的数据了,就会出错,因为编译器不能决定使用哪个对象的成员来编译。为了解决这个问题,C++使用虚基类的概念来解决这个问题的。即在指定派生类的直接基类的时候,使用virtual关键字指明该直接基类作为虚基类来继承。这里比较麻烦的是各级派生类的构造函数的写法。我们知道:对于没有不带参数的构造函数的基类(只提供带有参数的构造函数),其直接派生类的构造函数必须显式地调用其直接基类的构造函数(否则可以不用显示调用,编译器会默认帮你调用直接基类的无参构造函数),这个规则对于这里提到的多重继承也是适合的。不过这里又多了一条规则:如果派生类的各级基类包含有虚基类,该类的构造函数除了上一条规则提到的需要调用其直接基类的构造函数外,还需要调用虚基类的构造函数,如果虚基类的构造函数只提供带参数的构造函数,则必须显式调用,否则编译器也会帮助你调用虚基类的无参构造函数。
对于前面的例子:A->B1->C1->D, A->B2->C2->D, 我编写了如下的测试代码:
//in header file(.h):
class A
{
public:
A(int lv) : level(lv)
{
cout << "A" << endl;
}
/* A()
{
cout << "A" << endl;
level = 0;
}
*/
void dispLevel(void)
{
cout << level << endl;
}
private:
int level;
};
{
public:
B1(void) : A(11)
{
cout << "B1" << endl;
}
};
{
public:
B2(void) : A(12)
{
cout << "B2" << endl;
}
};
{
public:
C1(void) : B1(), A(21)
{
cout << "C1" << endl;
}
};
{
public:
C2(void) : B2(), A(22)
{
cout << "C2" << endl;
}
};
{
public:
D(void) : C1(), C2(), A(3)
{
cout << "D" << endl;
}
};
int main(void)
{
D objD = D();
objD.A::dispLevel();
return 0;
}
A
B1
C1
B2
C2
D
3
(1)虚基类的构造函数在非虚基类之前调用;
(2)若同一层次中包含多个虚基类,这些虚基类的构造函数按它们说明的次序调用;
(3)若虚基类由非虚基类派生而来,按照先基类构造,再派生构造的顺序.
[转]Sidebar Gadget开发教程
作者:shosh 日期:2009-10-20
翻译了两篇Sidebar Gadget的文章后,决定自己写一个教程,与准备投身于Sidebar Gadget开发的劳苦大众们分享一下经验。也当作自己个人学习Gadget开发的一些总结,使自己可以学习得深入一些。欢迎大家就这一系列文章提出批评斧正。本部分准备介绍一些基础知识。
关于SideBar
SideBar是Windows Vista特有的一个显示子系统(曾经宣布为Windows XP以及Windows Server 2003也开发Sidebar,但该项目现已取消),在中文系统中称之为“边栏”。其执行程序,我们可以在以下目录中找到[SystemInstalledDriver:]\program files\Windows Sidebar,此文件夹 结构大体如右图所示,各文件夹以及文件的具体作用如下:
- Sidebar.exe:此文件即Sidebar.exe的主执行文件,如果你在Windows Vista当中未打开边栏,可以直接执行该文件即打开。
- Sbdrop.dll:Sidebar拖抻支持文件;
- settings.ini: Sidebar设置文件,可以设置默认启动Gadget等特性。
- wlstrvc.dll: Weather Gadget(即显示天气的小工具)所依赖的ActiveXControl,显示RSS信息的Gadget所依赖的ActiveX控件是置身在System32目录下msfeeds.dll文件;
- en-us: 英文相关的资源文件;
- zh-CN:简体中文相关的资源文件;
- Gadgets文件夹:该文件夹中包括多个子文件夹,每个子文件夹均是Windows Vista默认自带的Gadgets解压后的形式。
- Shared Gadget:存储在此文件夹中的Gadget可以供同一机器上的多用户共同使用。
而用户自行安装的Gadget可以在[SystemInstalledDriver:]\users\[user name]\appdata\local\microsoft\windows sidebar\gadgets\中查找到。
关于Gadget







