计算机系统的理解一

爱钻牛角尖的毛病又来了。仅仅是因为以前的一个c语言free内存报错。

我们知道,malloc分配的内存是从堆里获得的,而堆是由操作系统维护的,也就是说,在没有malloc前,内存空间是不属于该进程空间的,malloc函数务必调用了操作系统的系统函数(参考前边linux内存管理heap篇可知,是brk和sbrk)。也就是说,brk和sbrk是linux的系统调用,在没有linux系统之前,是没有这两个函数的。比如我之前写过的DSP裸机驱动,虽然也是用的c语言,但是是不可能有brk和sbrk及malloc函数的。brk和sbrk函数向操作系统申请内存时,操作系统会打破该进程原有的虚拟地址空间(准确的说是增加虚拟地址空间),操作系统负责维护新增的虚拟地址和物理地址的映射(需要硬件MMU等的支持,这里暂不讨论)这时候,申请过的对空间就和该进程空间融合到一起了。内存使用完毕后,调用free函数释放内存时,其实没有被真正的释放,操作系统维护堆内存的方式是通过chunks,free时仅仅是把chunks标记为可用状态(参考上一篇博客),操作系统维护这些chunks是用了一个结构体:

struct mem_control_block {
    int is_available;    //这是一个标记?
    int size;            //这是实际空间的大小
    };

当我们free时,实质是:

 void free(void *ptr)
{
       struct mem_control_block *free;
       free = ptr - sizeof(struct mem_control_block);
       free->is_available = 1;
       return;
}

当该进程下一次通过malloc申请内存时,操作系统首先会检查该进程空间的chunks,如果有chunks可用,就直接使用,否则才会调用brk和sbrk系统调用来重新分配内存,这样做的好处时,可以减少不必要的系统调用,提高效率,因为系统调用是很耗系统资源的。
  由此,再加上我做DSP裸机驱动的经验,可以大概探测出整个计算机硬件和操作系统及编译器之间的联系:硬件支持二进制指令,通过二进制指令开发出一种程序,这种程序可以翻译我敲进去的会变得代码,这个程序就是汇编编译器。通过汇编语言开发一种程序,这种程序可以把c源码翻译成汇编,再交由汇编编译器翻译成为二进制,这种程序就是c语言编译器。通过c语言编译器开发一种程序,这种程序可以对计算机硬件进行管理,并且可以有多进程的功能……这种程序就是计算机操作系统比如linux。开发linux时可能也是有一个c语言的主函数,但是不会有brk和sbrk、malloc、free、printf等等这些函数,因为这些函数都是起作用在linux之上的。那为什么我们在linux系统之写c源码时,就可以使用printf、brk、malloc等等这些函数了呢?开发linux系统时不能使用,现在为什么就能使用了呢?问这个问题的人还是混淆了编译器和库(也就是写好的调用,写好的程序)的概念。linux操作系统上的编译器还是开发那个开发linux系统时的编译器,功能一点都没有增加,但是多了许多库可以调用。就好比,一个人来到一个荒漠,他通过自己的能力构建了一个豪华别墅,并且把别墅预留了很多接线口,水龙头等,虽然说,人还是那个人,还是只有能的功能,但是这时候他已经可以通过。

计算机系统的理解一,布布扣,bubuko.com

时间: 2024-10-10 07:16:37

计算机系统的理解一的相关文章

程序员必读书单

作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文地址:http://www.cnblogs.com/figure9/p/developer-reading-list.html 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing

经验_思想_方法_总结

感谢: 感谢每一个打开这篇文章的人,听我在这里瞎扯!至于我为什么会有闲情写这篇文章呢?因为我每天想的是为什么要给我这样的需求,背后的人性是什么,我能再做些什么能让他更好.久而久之,我也稍微有了些自己的思维,善于去思考事物的本质,然后,我就有了点感悟,一些我觉得正能量的东西,一些我觉得值得传递的东西,如果我的磁场吸引了你的话,我很高兴,但请你以开放的心态来看待我所讲的东西,不要陷入我的思维里,你该有你的思维,读完我的文章后,你应该从中得到一些启迪,避免全盘接收,抛弃你传统的中国填鸭式的思维方式吧!

程序员必读书

前言 Reading makes a full man; conference a ready man; and writing an exact man. Francis Bacon 优秀的程序员应该具备两方面能力: 良好的程序设计能力: 掌握常用的数据结构和算法(例如链表,栈,堆,队列,排序和散列): 理解计算机科学的核心概念(例如计算机系统结构.操作系统.编译原理和计算机网络): 熟悉至少两门以上编程语言(例如C++,Java,C#,和Python): 专业的软件开发素养: 具备良好的编程

程序员必读书单(转)

作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing an exact man.

终于懂了:Delphi的函数名不是地址,取地址必须遵守Object Pascal的语法(Delphi和C的类比:指针、字符串、函数指针、内存分配等)good

这点是与C语言不一样的地方,以前我一直都没有明白这一点,所以总是不明白:函数地址再取地址算怎么回事? ---------------------------------------------------------------------------------------------------------------- 在学习Delphi的时候,一个很好的建议是和C/C++去类比着学习,从指针,到内存管理,到数组,到面向对象……各个方面,都是有很多可以相似和或者也有不同的方,类比着学习,一

程序员必读书目

作者:Lucida 微博:@peng_gong 豆瓣:@figure9 原文链接:http://lucida.me/blog/developer-reading-list/ 关于 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing an exact man.

程序员必读书单 1.0

程序员必读书单 1.0 发表于 2015-02-25   |   分类于 阅读  |   暂无评论 转自:http://zh.lucida.me/blog/developer-reading-list/ 本文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍,必读书籍,以及延伸阅读.旨在成为最好最全面的程序员必读书单. 前言 Reading makes a full man; conference a ready man; and writing an

Linux2.6.11版本:classic RCU的实现

转载自:http://www.wowotech.net/kernel_synchronization/linux2-6-11-RCU.html 一.前言 无论你愿意或者不愿意,linux kernel的版本总是不断的向前推进,做为一个热衷于专研内核的工程师,最大的痛苦莫过于此:当你熟悉了一个版本的内核之后,内核已经推进到一个新的版本,你曾经熟悉的内容可能会变得陌生(这里主要说的是该模块的内部实现,实际上,内核中的每一个子系统都是会尽量保持接口API的不变).怎么应对这种变化呢?一方面,具体的实现

《统计自然语言处理》读书笔记 一.基础知识及概念介绍

最近准备学习自然语言处理相关的知识,主要参考<统计自然语言处理·宗成庆>和<Natural Language Processing with Python>,推荐大家阅读.第一篇主要介绍的是NLP的基础知识和概念介绍,其实也是我关于NLP的读书笔记吧,希望对大家有所帮助. 一. 概念介绍 自然语言处理 自然语言处理(Natural Language Processing,简称NLP)技术的产生可追溯到20世纪50年代,它是一门集语言学.数学(代数.概率).计算机科学和认知科学等于一