原文链接 工作至今,一直对Makefile半知半解。突然某天幡然醒悟,觉得此举极为不妥,只得洗心革面从头学来,以前许多不明觉厉之处顿时茅塞顿开,想想好记性不如烂笔头,便来说说Makefile那些事儿。   Makefile到底是个啥玩意儿   Makefile就是一文本文件。 ----------------------------------------------- $ file Makefile Makefile: ASCII make commands text -----------------------------------------------      一般来说,我们平时所称的Makefile是指make命令以及Makefile文件,Makefile文件中记录着各种规则,make命令通过分析Makefile执行规则中的操作。       看看百度百科的定义: make是一个命令工具,它解释Makefile 中的指令(应该说是规则)。在Makefile文件中 继续阅读 >>


王瑞欣 16/10/17 17:36:10
简单的分页模型 分页的内存管理模式是我们再熟悉不过的了,因为这是我们一贯的工作方式.在处理器中有负责分段管理的段部件.每个程序或任务都有自己的段,这些段都用段描述符定义.随着程序的执行,当要访问内存时,就用段地址上偏移量,段部件就会输出一个线性地址.在单纯的分段模式下,线性地址就是物理地址. 然而一旦决定采用页式内存管理,就应当把4GB内存分为大小相同的页.但是,页在物理内存中位置是有讲究的,并不是在内存中随便找个位置.页的最小单位是4KB,也就是4096个字节,用十六进制数表示就是0x1000,可以将4GB的内存划分为1048576(0x100000)个页.很显然,页的物理地址,其低12为始终是全0. 段管理机制对于Intel处理器来说是最基本的,任何时候都无法关闭.所以即使启用了页管理功能,分段机制依然是起作用的,段部件也依然工作.分页机制也没有增加程序员的负担,程序依然是按段来组织的. 问题在于,如何将较大的段,映射到大小相同的页上? 如图: 在分页模式下,操作系统可以创建一个为所 继续阅读 >>


王瑞欣 16/08/31 19:00:52
在处理大量并发任务的时候,如果按照传统的方式,一个请求一个线程来处理请求任务,大量的线程创建和销毁将消耗过多的系统资源,还增加了线程上下文切换的开销,而通过线程池技术就可以很好的解决这些问题,线程池技术通过在系统中预先创建一定数量的线程,当任务请求到来时从线程池中分配一个预先创建的线程去处理任务,线程在完成任务之后还可以重用,不会销毁,而是等待下次任务的到来. 分层 半同步半异步线程池分为三层: 同步服务层: 它处理来自上层的任务请求,上层的请求可能是并发的,这些请求不是马上就会被处理的,而是将这些任务放到一个同步排队层中,等待处理. 同步排队层: 来自上层的任务请求都会加到排队层中等待处理. 异步服务层: 这一层中会有多个线程同时处理排队层中的任务,异步服务层从同步排队层中取出任务并行的处理. 线程池实现 #include <list> #include <mutex> #include <thread> #include <co 继续阅读 >>


王瑞欣 16/08/18 15:15:05
C++11增加了线程及线程相关的累,很方便的支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高. 线程的创建 用std::thread 创建线程非常的简单,只需要提供线程函数或者函数对象即可,并可以同时指定线程的参数: #include<iostream> #include<thread> #include<chrono> using namespace std; //线程函数 void func(int a, int b, int c) { std::this_thread::sleep_for(std::chrono::seconds(3)); cout << a << " " << b << " " << c << endl; } int main() { //创建线程对象t1,绑定线程函数为func std::thread t1 继续阅读 >>


王瑞欣 16/08/13 11:31:14
两种基本的任务切换方式 协同式:从一个任务切换到另一个任务,需要当前任务主动地请求暂时放弃执行权,或者在通过调用门请求操作系统服务时,由操作系统”趁机”将控制转移到另一个任务.这种方式依赖于每个任务的”自律”性,当一个任务失控时,其他任务可能得不到执行的机会. 抢占式:这种方式下,可以安装一个定时器中断,并在中断服务程序中实施任务切换.硬件中断信号总会定时出现,不管处理器当时在做什么,中断都会适时地发生,而任务切换也就能够顺利进行.在这种情况下,每个任务都能获得平等的执行机会.而且,即使一个任务失控,也不会导致其他任务没有机会执行. 任务切换前置 所有任务共享一个全局空间,这是内核或者操作系统的,包括了系统服务程序和数据;同时,每个任务还有自己的局部空间,每个人物的功能都不一样,所以,局部空间包含的是一个任务区别于其他任务的私有代码和数据.如下图: 在一个任务内,全局空间和局部空间具有不同的特区级.使用门,可以在任务内将控制从3特权级别的局部空间转移到0特权级的全局空间,以使用内核或 继续阅读 >>


王瑞欣 16/08/03 22:55:24
任务全景图 任务,任务的LDT和TSS 程序是记录在载体上的指令和数据,其正在执行中的一个副本,叫做任务(Task)。而用户程序就是任务,内核程序就是操作系统的缩影。 LDT 我们把所有的段描述符都放在GDT中。为了有效的在任务之间实施隔离,处理器建议每个任务都应该具有自己的描述符表LDT,并且把专属自己的那些段放到LDT中。 和GDT一样,LDT也是用来存放描述符的。不同之处在于,LDT只属于某个任务。或者说,每个任务都有自己的LDT,每个任务私有的段,都应当在LDT中进行描述。另外,LDT的第一个描述符(0号槽位)是有效的,可以使用的。 和GDT不同,局部描述符表(LDT)的数量则不止一个,具体有多少,视任务的多少而定。为了追踪和访问这些LDT,处理器使用了局部描述符表寄存器LDTR。 因为LDTR寄存器只有一个,所以它只用于指向当前任务的LDT。每当发生任务切换时,LDTR的内容被更新,以指向新任务的LDT。 在引用一个段时,需要给出段选择子,选择子的位2(TI位) 继续阅读 >>


王瑞欣 16/08/02 23:05:36
在最近的学习中,我试着把自己学习的知识点先记录在本子上,然后总结所学。 在之前有一段时间比较迷茫,因为感觉大部分的博客都是在抄书,在思考博客抄书究竟有什么价值,东抄抄,西抄抄还不如看书呢。最后总结发现,博客不是不可以抄书,因为我还是学生,更多的学习途径是看书,所以难免会不自觉的去抄书,最后发现,我觉得可以更多的是对书本上知识的总结,对所学知识的回顾,并将它写出来。好了闲话不多说了,还是进入主题吧。 由实模式进入保护模式 首先,我们先考虑为什么需要从实模式进入保护模式呢,难道我们不能直接就进入保护模式么。 实际上,这是为了确保传统操作系统的向前兼容性,因为所有的X86CPU都在实模式下开机,在任何保护模式的特性可用之前,它们都必须由某些程序手动的切换到保护模式,这便是操作系统在开机时通常必须完成的第一件任务。 其次,让我们说一说实模式与保护模式的不同: 我觉得实模式与保护模式最大的不同之处就是进程内存空间(安全性增加)是否受保护。 实模式:用CS:IP(即物理地址=左移4位的段地址+ 继续阅读 >>


王瑞欣 16/07/28 17:37:09
GDT的由来: 在Protected Mode下,一个重要的必不可少的数据结构就是GDT(Global Descriptor Table)。 为什么要有GDT?我们首先考虑一下在Real Mode下的编程模型: 在Real Mode下,我们对一个内存地址的访问是通过Segment:Offset的方式来进行的,其中Segment是一个段的Base Address,一个Segment的最大长度是64 KB,这是16-bit系统所能表示的最大长度。而Offset则是相对于此Segment Base Address的偏移量。Base Address+Offset就是一个内存绝对地址。由此,我们可以看出,一个段具备两个因素:Base Address和Limit(段的最大长度),而对一个内存地址的访问,则是需要指出:使用哪个段?以及相对于这个段Base Address的Offset,这个Offset应该小于此段的Limit。当然对于16-bit系统,Limit不要指定,默认为最大长度64KB,而 16-bi 继续阅读 >>


王瑞欣 16/07/28 16:59:28
0386开始,CPU有三种工作方式:实模式,保护模式和虚拟8086模式。只有在刚刚启动的时候是real-mode,等到操作系统运行起来以后就切换到protected-mode。实模式只能访问地址在1M以下的内存称为常规内存,我们把地址在1M 以上的内存称为扩展内存。在保护模式下,全部32条地址线有效,可寻址高达4G字节的物理地址空间; 扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持,而且为实现虚拟存储器提供了硬件支持; 支持多任务,能够快速地进行任务切换(switch)和保护任务环境(context); 4个特权级和完善的特权检查机制,既能实现资源共享又能保证代码和数据的安全和保密及任务的隔离; 支持虚拟8086方式,便于执行8086程序。 实模式(Real Mode) 它是 Intel公司80286及以后的x86(80386,80486和80586等)兼容处理器(CPU)的一种操作模式。实模式被特殊定义为20位地址内存可访问空间上,这就意 继续阅读 >>


王瑞欣 16/07/26 16:25:47
今天看到了一个关于使用python向execl中写入数据的小demo 首先需要做的是下载xlwt第三方的库才可以做,然而这个库的下载也是浪费了我一段时间: 先需要将xlwt下载下来:下载地址 然后执行./setup.py install 这样就将这个第三方库下载下来了。 下来就是实现了: #!/usr/bin/env python # coding=utf-8 from xlwt import * #需要xlwt库的支持 #import xlwt file = Workbook(encoding = 'utf-8') #指定file以utf-8的格式打开 table = file.add_sheet('aaa') #指定打开的文件名 data = {\ "1":["张三",150,120,100],\ "2":["wang",90,99,95],\ "3":["wu",60,66,68]\ 继续阅读 >>


王瑞欣 16/07/22 17:45:33