程序员自我修养--链接、装载与库
第一部分
问题:
对于一个C程序而言,要清楚以下几个问题:
1、程序为什么要被编译器编译了之后才可以运行?
2、编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的?
3.最后编译出来的可执行文件里面是什么?除了机器码还有什么?他们怎么存放的,怎么组织的?
4、#include<stdio.h> 是什么意思?
5、不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(windows、linux等),最终编译出来的结果一样吗?为什么?
6、hello world程序是怎么运行起来的?操作系统是怎么装在它的?它从哪里开始执行,到哪儿结束?main函数之前发生了什么?main函数结束以后又发生了什么?
7、如果没有操作系统,hello world可以运行吗?如果要在一台没有操作系统的机器上运行hello world需要什么?应该怎么实现?
8、printf是怎么实现的?它为什么可以有不定数量的参数?为什么它能够在终端上输出字符串?
9、hello world程序在运行是,他在内存中是什么样子的?
对于系统开发者来说,有三个部件最值得关注:中央处理器CPU、内存和I/O控制芯片,这三个不见是计算机的核心。
人们在制造CPU的工艺方面已经达到了物理极限,CPU的频率被现在的4GHz限制。因此,人们从另外一个角度来提高CPU的速度,就是增加CPU的计算机,其中最常见的是对称多处理器(SMP)。增加cpu就可以提高运行速度,但也并非如此,比如生孩子。
系统软件可以分成两块,一块是平台性的,比如操作系统内核。驱动程序、运行库,另外一块是用于程序开发的,比如编译器、汇编器、连接器等开发工具和开发库。
每个层次之间都需要相互通信,必要有一个通信的协议,称为接口。接口的下面那层是接口的提供者,由它定义接口:接口上面那层是接口的使用者,它使用该接口来实现所需要的功能。每个中间层都是对它下面的那层的包装和扩展。
在软件体系中,位于最上层的是应用程序,比如网络浏览器等。开发工具与应用程序时属于同一个层次的,使用同一个接口,操作系统应用程序编程接口。
运行库使用操作系统提供的系统调用接口,系统调用接口在实现中以软件终端的方式提供。
分时系统:可以同时运行多道程序,每个程序运行一段时间以后都主动让出CPU给其他程序。但如果一个程序在进行一个很耗时的计算,霸占CPU不放,操作系统也没办法。
多任务系统:操作系统接管所有的硬件资源。所有应用程序都以进程的方式运行在比操作系统权限更低的级别,每个进程都有自己的独立的地址空间,使得进程之间的地址空间相互隔离。CPU由操作系统同一进行分配,每个进程根据进程优先级的高低都有机会得到CPU,如果运行时间超出了一定的时间,操作系统会暂停该进程,将CPU资源分配给其他等待运行的进程。这种分配方式叫做抢占式。
硬盘结构:
硬盘基本存储单位为扇区,每个扇区一般为512字节。一个硬盘有多个盘片,每个盘片分两面,每面按照同心圆划分为若干个磁道,每个刺刀划分为若干个扇区。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了