粗暴理解一下进程顺便扯一下静态链接和动态链接

       把点收获写下来,请大家指摘。

       以前理解进程总是感到不够感性,现在有了点了解,跟大家来聊聊。

 

       把一个应用程序(你也可以理解为.exe)运行后,这个应用程序就以二进制代码的形式被加载进内存,这样就创建了一个进程。

       我们来看看这个内存印象包含了什么,也就是这个进程包含了什么。我的理解很粗暴,这段内存印象包含了:

       1、代码段

            代码段是应用程序的二进制代码,是只读的。

 

       2、数据段

            代码中初始化过的全局变量和常量。

 

       3、BSS段

            代码中没有初始化的全局变量。

 

        4、堆区

             程序中用malloc动态申请的内存空间都将挂在这个堆区,等你把申请的堆空间free后,系统就会把这个堆里挂着的内存还给系统。

        

        5、栈区

             栈区没什么好说的,分配和回收都由系统来控制。

 

        以上是一个进程的主要部分,数据段和BSS段还有堆就称为一个进程的资源。当然一个进程不只包含以上几个成分,还有其它组成是用来管理进程信息的,这里不祥述。有人问,既然已经有了数据段,为什么还要把未初始化的全局变量放到一个BSS段呢?因为把未初始化的全局变量放到一个段方便管理。实际上,假如有一个10000个元素的int 型的静态的数组,如果你没有把这个数组初始化,那么编译器会把所有的元素都初始化为0。那么,既然刚开始(还未使用)这些元素都是0,我可不可以考虑编译的时候不给它们分配空间呢,我只有把这个静态数组的信息(包含多少个元素,每个元素的初始值为0)写到一个地方,到使用时再给它分配空间,这样不就节省生成的.exe大小吗?对了,就这么办,把未初始化的静态或全局变量的信息都写在一个叫做BSS段的地方吧!于是,那帮人就真的这么干了。

        非智能手机的话,一般是一个进程多线程的编程,我有空写一篇粗暴了解线程。一个进程可以产生多个线程,这些线程共享这个进程的资源,包括数据段,BSS段里的数据和堆。对于全局变量这个资源是被线程共享的,每个线程在被创建的时候,会把父进程的资源拷贝一份放到属于自己的资源空间。大家要记住,对于所有线程来说,这些资源都是同样从父进程那拷贝来的,所以这些资源应该是要保持一样的。于是通过线程来改变全局变量的时候,要通知其它线程,“我把这个变量更改了,告诉你们一声”。

以上打红色部分只是我的一些猜想,我不想误人子弟,如果您能看出来了错误,请赶紧指出来。

        

 

 

我们再来聊聊静态链接和动态链接。

      我一直以为静态链接是要把一个lib或者.a文件都链进.exe中,错了。

无论是静态链接还是动态链接,都只是把函数库中具体到需要的那个函数链接起来。不同的是,静态链接把这个函数的二进制代码链到.exe里了,而动态链接则是把这个函数的入口写到.exe。这样两者产生的.exe大小就不一样了。静态链接不如动态链接的地方主要不是.exe的大小。而是动态链接便于程序的升级和维护。如果你写了个大型应用,采用了动态链接。那么有一天如果你发现你链接的动态链接库中你调用的那个函数有BUG,你怎么办?你就得先把那个混蛋人写的程序改正过来, 但是改过来又怎么样,之前错误的代码都被你链接到.exe里了。那你就得把程序重新链接一次了,链接新改好的函数库,产生新的.exe,老的就不要了。那么我们来看看动态链接 。

      等等,我饭熟了,今天炒了葱爆羊肉,好吃实惠。广州这两天很冷,但是女孩子穿得还是很清凉,不可否认,女孩子穿黑丝袜很性感,配上红色高跟鞋更吸引人眼球,让我的眼睛回到屏幕上来吧,咱们继续。

      动态链接只是把函数库里需要的函数入口写到了.exe中,也就是说,.exe中是不包含函数库函数的二进制代码的。这样,如果库函数出了BUG或者需要更改升级,你不需要重新链接函数库去产生新的.exe,你什么都不用干。也许你会问,不把库函数的二进制代码链到.exe中,.exe还能运行吗?这么问对了,所以要运行动态链接的.exe,电脑中必须要有函数库的存在。运行.exe时,程序会根据你链接的库函数接口在你电脑中找到这个函数的二进制代码,然后把这段代码映射到内存中,于是.exe就可以运行了。还有,你可能不只运行一个.exe,而是好几个,而这些.exe可能都调用同一个库函数。但是系统只要把这个库函数的二进制代码映射一份到内存给这些.exe共享就行。你看,动态链接是不是有很多好处?它的坏处是,如果你的电脑没有.exe需要的函数库,那完了,.exe不能运行。而静态链接就不会,有利有弊。

 

我要去洗碗了,咱们改天再聊。

 

 

 

         

     

             

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值