当前位置: 首页 > news >正文

建设工程合同备案网站1个ip可以做几个网站吗

建设工程合同备案网站,1个ip可以做几个网站吗,wordpress如何设置外网访问,企业网站做电脑营销目录 前言#xff1a; 1. 程序地址空间回顾 2. 进程空间是什么 3. 进程地址空间与内存 4. 进程地址空间和内存的关联 5. 为什么要有进程地址空间 前言#xff1a; 我们在平时学习的过程当中总是听到栈、堆、代码段等等储存空间#xff0c;但是这些东西到底是什么   1. 程序地址空间回顾 2. 进程空间是什么 3. 进程地址空间与内存 4. 进程地址空间和内存的关联 5. 为什么要有进程地址空间 前言   我们在平时学习的过程当中总是听到栈、堆、代码段等等储存空间但是这些东西到底是什么我们又怎么理解呢本篇就为大家解惑。 1. 程序地址空间回顾 相信大伙们对于这张图片还是很熟悉吧特别是对于堆和栈这一片区域堆向上延伸栈向下扩展基本上是共同使用这一片空间。这片空间这样使用主要是服务于我们的动态库。 如果大伙想要验证这一张图片的正确性可以自己验证一下低地址代码地址长度更小高地址更大。代码如下 #define _CRT_SECURE_NO_WARNINGS 1#includestdio.h #includestdlib.hint global_uval; //全局变量未初始化 int global_val 1; //全局变量初始化int main(int argc, char* argv[],char* envp[]) {const char* point hello world; //栈内指针和常量区字符串char* heap (char*)malloc(100); //栈内指针和堆区空间printf(代码区起始地址 %p\n, main);printf(常量区字符串 %p\n, point);printf(全局变量初始化 %p\n, global_val);printf(全局变量未初始化 %p\n, global_uval);printf(堆区地址 %p\n, heap);printf(栈区地址 %p\n, point);printf(命令行参数 %p\n, argv[0]);printf(环境变量 %p\n, envp[0]);return 0; } Linux下可以看到地址空间的变化逐渐增加也正好对应了我们的地址空间的图。 但是同样的代码在vs下却运行出了不同的结果如下 仔细看vs下运行堆区地址和栈区地址大小与Linux下运行相反具体原因我也不是很清楚博主在这里也疑惑了半天估计是vs悄悄的改了一些实现方法。 2. 进程空间是什么 看了上面的解释也没有理解啥是进程地址空间博主知道你很急但是你先别急什么非要看好吧请看下方结论 进程地址空间不是真实物理地址而是虚拟地址 知道了吗没看懂是不这就对了还是等我徐徐道来。 请先看下方代码 利用fork创建了一个子进程count用于计数当循环走过两次时a被修改为100 1 #includestdio.h2 #includeunistd.h3 #includesys/types.h4 5 int main()6 {7 int a 100;8 int count 0;9 pid_t res fork(); //创建一个子进程 10 11 while(1)12 {13 if(res 0)14 {15 printf(我是一个子进程a %d, a %p\n,a,a);16 sleep(1);17 }18 else{19 if(count 2)20 a 200;21 printf(我是一个父进程a %d, a %p\n,a,a);22 count;23 sleep(1);24 25 }26 }27 28 29 return 0;30 }运行结果如下 上图中大家有发现什么不对的地方吗首先变量a定义在两个进程分流之前那么父子进程应该拿到的是同一块数据通过查看地址再对应值确实如此但继续往下看当计数两次之后我们将父进程的a修改了父进程的a也确实被更改了值但是父子进程拿到了同一块数据为什么子进程的a没有被改变呢更离谱的是它们两个的地址竟然一模一样这合理吗这很不合理。 根据我们学习语言所知同一块空间只能只能存一个数据这里竟然存了两个数据那么根据理论而言我们能够分析出我们获取到的地址不可能是真实的物理地址而是虚拟地址。 但是根据我们学习的计算机体系结构可以知道任何一个磁盘上的内容想要跑到CPU中被运行必须经过被载入内存这一过程但是上面又显示我们拿到的不是真实的物理地址就不可能是再内存当中的难道是我们的冯诺依曼体系在这里出错了很明显不可能所以只有一种可能那就是我们在程序中获取到的地址与我们的内存之间有联系。 3. 进程地址空间与内存 这一部分有些抽象所以我先为大家讲一个故事吧。这个故事是博主去别人哪里copy的博主认为十分生动形象。 咱们在学校总是经历过划分三八线这种事情吧。就是给桌子划分区域假设有小明和小妞两个人他们有自己的区域不能越过区域到别人的领域去。如下 我们可以想一下他们是怎么区分他们自己的区域的呢不就是记录自己区域的起始结束位置嘛也就是说小妞想要表示自己的位置那就是如下 struct xiaoniu_area{         size_t begin 0;         size_t end 50; }; 小明也是同理也就是说他们自己知道这一片空间的所属就行不过呢小明和小妞关系很好可以亲亲抱抱的那种所以这一条三八线也就是当作一个提醒罢了。所以呢小妞有一天要画画她需要更大的位置操作那么她就向小明说我想要多一点点位置之后还你小明说“反正现在我也不用你用吧”。这样小妞的位置就变为了如下 struct xiaoniu_area{         size_t begin 0;         size_t end 70; }; 那么相对的小明的位置就被缩减了图如下 看到上面的图大伙有没有将我们的地址分配图联系起来呢我们的进程地址也就是通过这个方式表示的就像是我们的栈、堆等等它的位置都是能够被调整的。 在Linux当中有一个struct mm_struct这样的结构体用于表示各个区所对应的位置。如下 struct mm_struct {     //代码区     unsigned long code_start;     unsigned long code_end;    //堆区     unsigned long heap_start;     unsigned long heap_end;     //栈区     unsigned long stack_start;     unsigned long stack_end; } 也就相当于整个进程地址空间的使用被这样一个结构体划分的明明白白。 但是这又跟我们的内存有什么联系呢别着急接着看。 我先给出结论 每个进程都可以独占整个内存空间 怎么理解上面这句话呢咋一看是不是感觉很奇怪仔细一看更奇怪了是不 我还是举一个例子。 有一个10亿家产的富豪他有2个私生子这两个私生子不知道彼此的存在此时呢富豪对两个孩子分别说了只要我寄了这10亿就是你的了所以呢这两个还是都认为这10亿自己稳得了。这时大儿子说老爸我想要20万买个车上班富豪说行好好加油之后小儿子又说老爸给我5个亿我要单开一家公司做大做强富豪转身就抽出了七匹狼你要皮带不要小儿子就跑了。但是对于大儿子和小儿子来说他们认为这10还是自己得吗肯定是啊。 这里的富豪就是操作系统10亿就是内存而两个儿子就是进程他们可以向操作系统申请空间操作系统也可以拒绝他们的请求但是他们能得到的空间是内存大小的空间。这也就表明了每一个进程都认为自己是可以独占内存的但是操作系统是能够自己判断是否给你这么多。 4. 进程地址空间和内存的关联 进程地址空间通过页表和内存关联起来。 什么是页表 页表就是进程将自己的代码和数据首先放在虚拟地址空间的对应的区域在这其中会有一种表结构叫做页表页表的核心工作就是完成虚拟地址到物理地址之间的映射最终我们的可执行程序的代码和数据可以加载到物理内存的任意位置因为最终只需要建立代码和数据与物理内存之间的映射关系就可以通过虚拟地址找到物理内存的对应地址。 咱们可以想到每一个进程都是独立的父子进程也是不例外的那么每一个进程也都有属于知道的页表去对应真实的内存。看到这里想必大家也能回到之前父子进程不同值地址相同得问题了吧。那就是父子进程得虚拟地址相同但是这个虚拟地址存在于两张页表当中这两个页表通过相同的虚拟地址却映射了两个内存空间。 那么这两个映射不会映射到一个空间吗 不会还记得我之前讲的mm_struct结构体内存将这些空间用结构体划分了起来并且划分之后还会标识这片区域已经被某个进程使用了那么页表就知道了这篇空间不能使用了它就会换一片区域去映射。如下 看到上面的图我们可以认为父子进程是完全独立的吗 其实不能因为我们的操作系统是十分会节省空间的也就是当父进程或子进程的数据没有被改变的时候两个页表指向的真实空间也是相同的只有在数据发生改变的时候操作系统会为这一个空间开辟一个新的空间然后对应给页表但是页表的虚拟内存没有改变。这一过程被称为写时拷贝。 5. 为什么要有进程地址空间 我们使用malloc时操作系统在我们申请内存的时候并没有直接的给我们那一片地址但是这一片空间并不能被其他的进程使用该片地址会处于一个闲置状态。这篇地址不能使用是这一个进程不能使用而是其它进程可以使用但是操作系统会保证数据不会冲突。 也就是说我们能够获取到虚拟地址但是我们没有在意到底有没有实际的物理地址在哪里反正我们要使用的时候操作系统能给我们就是了。所以这样做就让我们的进程管理和内存管理之间解耦了。 还有就是当操作系统要加载一个很大的程序比如32个G这样一个程序一定是不可能全部运行起来的所以操作系统会慢慢的加载没有被使用的部分就被先睡眠起来了。我们唯一的感受也就是程序变慢了。 并且通过进程地址空间我们操作系统能够清楚地知道你写的进程是否正确有没有越界如果越界了那么操作系统就会让你的进程崩溃因为你的指针或者其它数据指向了其它进程的区域保证了进程之间的独立性和安全性。 以上就是我对进程地址空间的全部理解咯有问题请帮忙指出啦博主也是努力进步当中哈哈。
http://www.hkea.cn/news/14277155/

相关文章:

  • 陇南比亚网站建设美美哒免费高清影院在线观看
  • 无法打开网页是怎么回事有南昌网站优化公司
  • 官方网站入口辽宁阜新建设学校官方网站
  • 网站推广文案网站客户续费
  • 网站优化防范提高工作效率总结心得
  • 网站要怎么备案wordpress语言切换
  • .net开发网站的优点做网站没资源
  • 婚纱网站建设目的企业开源网站系统
  • 国外做电商网站有哪些wordPress登不上数据库
  • 做网站广告收入互联网软件公司排名
  • 双语网站代码如何做一个网站
  • 那个网站做排列五头比较准ps企业网站模板免费下载
  • 潍坊网站建设报价费用2022最新小学生新闻
  • 网站推广的心得网站服务器能更换吗
  • 软件外包网站服务行业网站建设
  • 网站建设步骤完整版四川省四川省住房和城乡建设厅网站
  • 重庆最大的网站制作公司公路机电工程建设网站
  • 单位网站建设制作个人网站制作成品图片
  • 网页网站开发淘宝网站SEO怎么做
  • 广州开发网站建设北京电力交易中心
  • 最专业的做网站公司哪家好网业协同具体指什么
  • 外贸移动端网站模板网站建设sem账户搭建
  • 外贸谷歌网站推广切削工具东莞网站建设
  • 灰色网站网站在线修图编辑器
  • 做网站一天能赚多少钱遵义网站开发
  • 河南平顶山网站建设公司免费发做网站
  • 镇江网站建设包括哪些专业网站建设平台代理商
  • 贵州专业网站建设费用南通市建设局网站6
  • 高端企业网站建设蓦然郑州网站建设wordpress进不到后台
  • 做外账要登什么网站wordpress jekyll 选择