计算机系统知识
リュウセイリョウ
这个作者很懒,什么都没留下…
展开
-
内存映射mmap
1、什么是内存映射内存映射,准确来说是指内存映射文件,即把磁盘上的文件映射到进程的虚拟地址空间中(在磁盘上)。当进程需要访问这段虚拟地址时,发生缺页中断,这样就会把页面swap进物理内存。这其中只发生了一次DMA拷贝,即把页面从磁盘拷贝到内核空间的页缓存 (page cache),然后将用户空间的虚拟地址映射到内核的page cache,这样不需要再将页面从内核空间拷贝到用户空间了。如果进程改变了页面的内容,一段时间后,OS会把脏页面写回到磁盘。2、内存映射的优点内存映射可以只加载文件的一部分内容原创 2021-08-27 11:06:05 · 276 阅读 · 0 评论 -
IO多路复用的三种机制Select、Poll、Epoll
select、poll和epoll都是IO多路复用机制,可以监视多个文件描述符fd(每个fd关联了对应的socket),一旦某个fd有事件发生,就能够通知程序进行相应的IO操作。(select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。)epoll是linux2.6以后Linux特有的实现机制,select则是一般OS都有的实现机制。1、sele原创 2021-05-08 18:00:48 · 259 阅读 · 0 评论 -
基于分段、分页技术的虚拟内存技术
1、分段段的定义:把程序与其相关的数据划分到几个段中,比如数据段、代码段和堆栈段。段的长度有限制,但是不要求所有程序的所有段长度都一样。分段:一个程序的所有段被装入内存中时,同样不要求这些段是连续的。分段类似于动态分区,当进入放入内存中时,系统会为这些段分配容量相等的内存空间,随着大小不同的段被放入内存,渐渐会产生外部碎片,即段外部的内存小碎片。如图,放了进程1、2、3之后内存剩余4MB,很难再放入其他段了,这就是外部碎片。段表:段表中的每一项表示一个段,由于段的长度可以不同,所以段表项不仅要给出这原创 2020-11-09 15:41:00 · 686 阅读 · 1 评论 -
了解进程和线程的基本原理
1、进程的生命周期1)五状态模型:包括新建态、就绪态、运行态、阻塞态和退出态。空—>新建态:创建一个新的进程。新建态—>就绪态:进程被放入内存中后,就可以变成就绪态。就绪态—>运行态:进程被cpu调度执行。运行态—>就绪态:分给该进程的时间片被耗尽,或者更高优先级的进程抢占了cpu。运行态—>退出态:进程已运行完成或取消。运行态—>阻塞态:进程等待某些事件的发送,如I/O操作。阻塞态—>就绪态:进程等待的事件已发生。就绪态—>退出态:子进原创 2020-10-31 16:57:41 · 711 阅读 · 0 评论 -
如何编写缓存友好的代码
1、存储器层次结构中的缓存存储器的层次结构自顶向下通常是:寄存器——高速缓存L1——高速缓存L2——高速缓存L3——主存——本地磁盘——远程二级存储 (比如分布式文件系统、web服务器)。自顶向下,存储设备的速度越来越慢,价格越来越便宜。上述层次结构中,每一层都缓存来自较低一层的数据对象。本地磁盘可以作为通过网络从远程磁盘取出的文件 (比如web页面) 的缓存,主存可以作为本地磁盘数据的缓存,高速缓存可以作为主存的缓存,依次类推。每一层的缓存包含了下一层数据子集的副本。缓存命中:当程序需要第k+1层原创 2020-10-18 23:21:15 · 602 阅读 · 0 评论 -
如何协助编译器生成高效代码
优化程序性能的基本策略,一个是选择合适的数据结构和算法,另一个是遵循基本编码规则,避免限制优化的因素,协助编译器产生高效的代码。本文从C语言的层面介绍协助编译器代码优化的一些建议,其他语言比如C++、Java亦可借鉴。示例代码:typedef struct{ long len; data_t* data;}vec_rec, *vec_ptr;//实际程序中,数据类型data_t可以被声明为int、long、double等基本数据类型//从数组中获取一个元素,保存在dest所指位置i原创 2020-10-17 18:01:55 · 189 阅读 · 0 评论 -
两个正数相加可能会变负?0.1+0.2不等于0.3??
本文并没有系统性的介绍计算机中信息的表示方式,只介绍了一些用户编程时需要注意的的小问题。1、为什么有符号整数负数可表示范围比正数多一个?有符号整数是用补码表示的。具体的表示形式如下,其中,向量的每个元素表示了整数的每一位。负数的最高位是1,非负数最高位是0。假设有符号整数共w位,那么最小的负数最高位为1,其他为0,即 -2^w。最大的正数最高位为0,其他位为1,即 2w-1**。因此有符号整数可表示的范围为**[-2w, 2^w-1]。负数和非负数各占了取值范围的一半,而非负数中有一个数是0,这也就原创 2020-10-14 17:05:12 · 2172 阅读 · 0 评论 -
HelloWorld从编译到运行,计算机底层到底发生了什么?
本文简要描述了一个简单的HelloWorld程序,从编译到执行,计算机底层做了哪些工作。以 C 程序为例。示例代码:#include <stdio.h>int main(){ printf("hello, world\n"); return 0;}使用文本编辑器编写上述代码,并保存在文本文件中,文件名为hello.c。一、源代码以字节序列的形式存储在文件中源文件 hello.c 是由0和1组成的位序列,8位组成1个字节,每个字节表示程序中的某个文本字符。大部分计算机系统原创 2020-10-13 12:20:17 · 1207 阅读 · 0 评论