操作系统
我把葡萄酿成酒
吾日三省吾身
展开
-
链接原理
链接分为静态目标文件链接,静态库链接,动态共享库链接,动态共享库加载四种。1.1 静态目标文件链接每个代码文本文件都生成一个.O文件,链接器链接所有的目标文件到一个可执行文件。链接器完成的两个任务有:1. 符号解析。就是为每一个未知的符号找到它的定义。2. 重定位。编译阶段生成的目标文件都是从地址0开始的,链接器修改这些地址。1.2原创 2015-05-09 11:04:47 · 1397 阅读 · 0 评论 -
局部性原理
尽量提高程序的空间局部性和时间局部性倾向于引用邻近时间内引用过的数据,或者邻近空间引用过的数据。原理:使用高速缓存来存储最近被引用的指令和数据----LRU。类似的,操作系统用主存缓存磁盘文件系统中最近被用到的磁盘块。程序数据引用的局部性:int sumarrayrows(int a[M][N]){ int i,j,sum=0;原创 2015-07-19 22:51:06 · 700 阅读 · 0 评论 -
ELF文件格式
elf指executable and linking format,不仅包含可执行文件,也包含库文件,包括静态库和动态库。准备的说,也就是三种(这不废话吗):可执行文件静态链接库动态链接库要观察ELF的具体信息,可以用以下几个工具nm: Lists symbols from object files.objdump: Displays detailed info原创 2015-07-18 14:46:00 · 414 阅读 · 0 评论 -
补码的数学原理
计算机是用n位0和1来表示数字的,这样很容易表示正数,但是怎么表示负数呢?人类聪明的大脑想到了用第一位来表示符号,0代表正数,1代表负数。这种表示方法最好理解,叫做原码。但是计算机在计算的时候,为了简化,需要把减法当做加法运算。这个很简单,负数不就是干这个的吗?比如2-1=2+(-1)。但是负数如果按照原码表示的话,就不好办了,比如:2-1=2+(-1)=00000010+1000原创 2015-03-08 11:28:21 · 2125 阅读 · 0 评论 -
浅谈Binder的基本原理
网上有一堆关于Binder原理的文章,都很长,我希望能尽量把这个问题讲得简短些。1)关于binder驱动Binder在Android里被设计成了一个驱动,安装在/dev/binder,这也是Android和linux的重要区别之一:Android提出了一个新的进程间通信方式(IPC)。另外,这种方式是通过远程过程调用(RPC)实现的。对Binder的操作和对其它驱动的操作是一样的,看这原创 2015-01-02 12:00:26 · 498 阅读 · 0 评论 -
线程间通信
从操作系统的角度讲,线程间通信比进程间通信要容易的多,因为线程之间可以共享进程的内存空间。因此,他们可以共享位于进程全局数据区和栈和堆上的所有内容。唯一只属于某个线程的就是线程的栈----它可以存放只属于线程的对象。线程间通信方式:1. 共享进程的变量。但要注意不要共享栈上的变量,因为它随时可能被某个线程销毁,而另一个线程就无法访问它了。所以Java编译器不允许使用栈上的变量来原创 2015-01-02 12:00:29 · 756 阅读 · 0 评论 -
Android线程的生命周期
1. 线程的生命周期开始于start()方法,终止于run()函数运行结束。2. 守护线程的生命周期还和JVM有关系,当别的线程都dead时,JVM会kill掉所有守护线程然后退出。3. 怎么优雅的kill掉一个线程呢?就是想办法让它的run函数结束,比如这么写run()函数:public void run() { try { while(!Threa原创 2015-01-02 12:00:32 · 2617 阅读 · 0 评论 -
ARM的中断和时钟中断
ARM核的中断支持重点引用了这篇文章: http://www.iti.uni-stuttgart.de/~radetzki/Seminar06/08_report.pdfARM处理器有7种操作模式 User (usr) Normal program execution mode原创 2015-01-02 12:02:48 · 2491 阅读 · 0 评论 -
线程间通信原理
从操作系统的角度讲,线程间通信比进程间通信要容易的多,因为线程之间可以共享进程的内存空间。因此,他们可以共享位于进程全局数据区和栈和堆上的所有内容。唯一只属于某个线程的就是线程的栈-------它可以存放只属于线程的对象。下面逐一解读线程间通信方式:1. 共享进程的变量这是最基本的通信方式,但要注意不要共享线程栈上的变量,因为它随时可能被某个线程销毁,而另一个线程就无法访问它了原创 2015-03-29 11:08:45 · 1367 阅读 · 0 评论 -
浅谈Binder的基本原理
网上有一堆关于Binder原理的文章,都很长,我希望能尽量把这个问题讲得简短些。1)关于binder驱动Binder在Android里被设计成了一个驱动,安装在/dev/binder,这也是Android和linux的重要区别之一:Android提出了一个新的进程间通信方式(IPC)。另外,这种方式是通过远程过程调用(RPC)实现的。对Binder的操作和对其它驱动的操作是一样的,原创 2015-04-11 09:24:40 · 582 阅读 · 0 评论 -
线程通信原理之一:线程本地存储(TLS)
定义Thread Local Storage (TLS) is the method by which each thread in a given multithreaded process can allocate locations in which to store thread-specific data. (https://msdn.microsoft.com/en-us/libr原创 2015-05-09 17:10:20 · 599 阅读 · 0 评论 -
Linux内核(2.6)进程调度算法
1.1 进程状态在Sched.h(include\linux)中定义了进程的状态。/* *Task state bitmask. NOTE! These bits are also *encoded in fs/proc/array.c: get_task_state(). * * Wehave two separate sets of flags: task原创 2015-05-31 22:38:10 · 2753 阅读 · 0 评论 -
浮点运算是怎么实现的?
浮点运算有软件和硬件两种实现方式,对硬件实现来说,需要有一个浮点运算单元,也就是FPU;对软件实现来说,需要用整型数的运算来模拟浮点运算。用软件来模拟这个事情是编译器做的,它会用内联的浮点库替换掉浮点操作,使得生成的机器码完全不含浮点指令,但是又能够完成正确的浮点操作。 管理员在2009年8月13日编辑了该文章文章。 -->原创 2015-01-02 12:00:09 · 3093 阅读 · 0 评论 -
fork(),vfork() 和 clone() 的区别和联系
以前英文写的,懒得翻译了。。。以后再慢慢扩充吧!The fork(),vfork() and clone() all call the do_fork() to do the real work, but with different parameters.asmlinkage int sys_fork(struct pt_regs regs){ return原创 2015-01-02 12:00:34 · 500 阅读 · 0 评论 -
Android Framework层线程设计
framework层的thread是c++实现的,定义在utils/threads.h,实现在Threads.cpp (system\core\libutils)。首先看看定义:class Thread : virtual public RefBase{public: // Create aThread object, but doesn't create or start原创 2015-04-03 22:07:25 · 992 阅读 · 0 评论 -
浅谈Binder的基本原理
关于binder驱动Binder在Android里被设计成了一个驱动,安装在/dev/binder,这也是Android和linux的重要区别之一:Android提出了一个新的进程间通信方式(IPC)。另外,这种方式是通过远程过程调用(RPC)实现的。 对Binder的操作和对其它驱动的操作是一样的,看这个结构体: static const struct file_operations原创 2015-10-11 15:02:17 · 1145 阅读 · 0 评论