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

空间建网站dedecms 购物网站

空间建网站,dedecms 购物网站,muse转换wordpress,丢盖网logo设计免费官网戳蓝字“CSDN云计算”关注我们哦#xff01;作者 | popsuper1982责编#xff5c;阿秃这是通过三国演义串起操作系统的原理。第一回#xff1a;宴桃园豪杰三结义#xff0c;开放平台启动内核话说天下大势#xff0c;分久必合#xff0c;合久必分。IT江湖起起伏伏#xff… 戳蓝字“CSDN云计算”关注我们哦作者 | popsuper1982责编阿秃这是通过三国演义串起操作系统的原理。第一回宴桃园豪杰三结义开放平台启动内核话说天下大势分久必合合久必分。IT江湖起起伏伏风云变化。19世纪80年代ATT开始经营长途电话业务在20世纪30年代一统有线通信市场却终在2000年后跌落神坛。20世纪30年代Motorola摩托罗拉诞生第一台摩托罗拉牌汽车收音机问世20世纪90年代登上无线通信宝座却终在201X年痛失江山。20世纪90年代互联网行业开始崛起先是网景微软雅虎后是谷歌Facebook至今仍然风光无限。在计算机领域内也经历着同样的变化孕育着一代又一代英雄刘备就是其中的一员。本来大一统的日子里面刘备是没有机会的在相当漫长的一段时间内IBM作为大型计算机的巨无霸从20世纪50年代一直独领风骚到70年代才遭遇到苹果公司在PC机上的小股骚扰。终于在1980年IBM开始稍微重视一下个人计算机市场但由于可能还是不太重视的缘故(因为大型机照样能够让IBM赚很多很多钱)IBMPC的研发并没有让华生实验室来完成而是单独成立一个团队要求一年内研制成功IBMPC然而时间紧任务重为了最快地研制出一台 PC 这个只有十几人的小组不得不打破以前自己开发计算机全部软硬件的习惯采用了英特尔公司 8088 芯片作为该电脑的处理器使用MS-DOS作为其操作系统从而缔造了日后的微软和英特尔两大帝国。1981年第一款IBMPC问世一经推出就抢掉了apple四分之三的市场。IBM仍然无敌。但是1982年事情发生了一些变化IBM陷入美国司法部反垄断官司IBM 必须公开一些技术从而导致了后来无数 IBM-PC 兼容机公司的出现。从而惠普康柏戴尔联想等兼容机相继推出从而进入了诸侯混战的阶段这就是开放的X86时代。这让刘备感到机会来了。刘备自幼熟读兵书通晓历史他知道要想在这乱世立足要有两样东西一是人也即兵二是地也即战场。同理在开放的X86时代兵也即执行命令的CPU地也即兵驰骋的战场也即CPU指令所操作的内存。招募的兵CPU要有三方面的能力控制单元兵不需要有太多的思想而是要服从命令指哪儿打哪儿运算单元兵的执行力要强杀人速度要快数据单元兵要能够抢占地盘在战场快速移动机动灵活刘备知道在乱世X86平台要会用兵要会打仗抢地盘要熟悉X86平台上CPU和内存的合作模式虽然他现在还没有兵但是这个场景他已经在梦中重复了N次了。兵CPU是没有思想的需要他去指挥才能作战。每次作战他都应该先制定好作战计划写好程序作战计划既包括宏观的兵法例如围魏救赵欲擒故纵等多进程多线程协作模式也包括微观的阵型例如蛇形阵八门金锁阵一个个函数当这些都准备好了就可以交给部队去执行创建进程。同一个兵法和阵型可以用在不同的战斗中例如兵分两路一路进攻A城市一路进攻B城市可以使用相同的兵法和阵型一个程序可以创建多个进程。对于每次作战战场内存都分为两部分一部分为中军大营发号施令的元帅在这部分代码段一部分是前方战场拼杀发生在这部分数据段。士兵CPU通过不断的从中军大营代码段获取指令执行指令一般包含两部分CPU指令也包含两部分第一部分是操作例如攻击防守移动CPU指令第一部分是操作例如加法减法位移第二部分是目标例如战场上的某个高地某个洼地CPU指令第二部分是操作哪些数据。只要作战计划制定完善士兵们执行得力在战场上就无往而不胜。CPU会通过指令指针寄存器不断的从代码段获取指令交给运算单元执行从内存读取数据到数据单元用指令操作数据将结果写回数据单元并最终写回内存当所有的指令都执行完毕进程就成功运行完毕了。刘备对这些战法了然于胸但是还处于纸上谈兵的状态属于通用的知识真正干起来还需要结合实际情况不过一旦有了这个创业思想便是创业的开端了通用的知识就像BIOS对于任何一个系统来讲都是一样的不像将来计算机启动之后的操作系统可以根据用户的输入进行相应的处理但是BIOS的启动是整个系统启动的第一步。带着这个思想刘备虽孑身一人便开始四处寻找创业伙伴。终于在招兵告示那里遇到了关羽和张飞。兄弟三人一见如故相谈甚欢刘备说我自幼熟读兵书创业想法已久但是一没钱二没人。张飞说“吾颇有资财当招募乡勇与公同举大事如何。”于是三人桃园结义祭罢天地复宰牛设酒聚乡中勇士得三百余人。这家创业公司就这样成立了。这就像系统启动初始只有有1M的内存空间。在1M空间最上面的0xF0000到0xFFFFF这64K映射给ROM通过读这部分地址可以访问这个BIOS里面的指令。BIOS要检查一些系统的硬件是不是都好着呢然后建立基本的中断向量表和中断服务程序至少要能够使用键盘和鼠标。接下来刘备就要带着关羽和张飞以及这仅有的三百人开始闯荡江湖了。接下来BIOS就要开始寻找和加载内核启动系统了第二回战吕布陶谦让徐州保护模式空间更大刘备首先建立的功业是帮助平定黄巾起义从而被封为安喜县县尉也即县公安局长这是刘备事业起步的第一跃。在启动盘的第一个扇区512K的大小我们通常称为MBRMaster Boot Record主引导记录/扇区。这里保存了boot.imgBIOS手册会将他加载到内存中的0x7c00来运行在安喜县刘备并没有实现自己的抱负反而受督邮欺压从而鞭打督邮后投奔公孙瓒因军功封为平原县县令事业再上升一步。boot.img做不了太多的事情。他能做的最重要的一个事情就是加载grub2的另一个镜像core.img。core.img由lzma_decompress.img、diskboot.img、kernel.img和一系列的模块组成boot.img将控制权交给diskboot.img后diskboot.img的任务就是将core.img的其他部分加载进来先是解压缩程序lzma_decompress.img再往下是kernel.img最后是各个模块module对应的映像。这个阶段刘备依旧是小打小闹但是很快情况就有了改观。从diskboot.img到lzma_decompress.img系统一直处于实模式在1M的内存空间里面打转但是从lzma_decompress.img开始他会调用real_to_prot切换到保护模式这样就能在更大的寻址空间里面关羽先是温酒斩华雄后来三兄弟更是三英战吕布这下在诸侯里面算是打出了名声。刘备得知陶谦有难从公孙瓒处借得两千人马与勇将赵云会同本部三千人随北海太守孔融一起去救徐州。陶谦为保徐州见刘备乃汉室宗亲才德兼备欲将徐州让与刘备。经三辞三让最终刘备答应权领徐州终于得到了创业路上的第一块大的军事重镇从此摆脱了小打小闹。系统进入保护模式后可访问的内存空间增大对于32位系统可达4G对于64位系统可达256TB的空间在徐州刘备还得到了几个内部管理的文臣人才孙乾口才好擅长外交糜竺曾经大力资助刘备并将妹妹许配给刘备就是糜夫人你不要小看糜竺以为此人在三国演义上低位不高在历史上取西川后糜竺爵位在诸葛亮之上深得刘备器重。从此刘备有文有武就像他对水镜先生说的一样“备虽不才文有孙乾、糜竺、简雍之辈武有关、张、赵云之流竭忠辅相颇赖其力。”从而有了内外的分别整个班子才算完整。系统进入保护模式后开始区分内核态和用户态用户态不能随便访问内核态需要通过系统调用在徐州的三辞三让使得刘备进一步确认了自己的创业公司的文化内核——仁义。这个内核是刘备将来成功的根基就像他自己说的“今与吾水火相敌者曹操也。操以急吾以宽操以暴吾以仁操以谲吾以忠每与操相反事乃可成。若以小利而失信义于天下吾不忍也。”从而也奠定了他的失败根源。kernel.img里面的grub_main会给展示操作系统的列表让用户进行选择。无论是枭雄的内核还是仁义的内核就在这一刻选定了以后不会再变了第三回领徐州刘备初创业启内核模块初始化占据徐州之后刘备有了自己的领地可以开始规划作为一个创业公司的“主公”应该做哪些事情了。内核的启动首先天下还不太平不免要打仗仗怎么打如果保障作战过程中部队的有序管理要有一个作战管理体系。由于前期打仗的时候都是刘备亲自上的由于关羽张飞尚无经验所以刘备制定第一个作战管理的模板0号进程但是是虚拟的不对应一个真实的战斗操作系统的0号进程init_task是进程列表的第一个不对应任何一个运行中的进程。如果是大一些的战役可能由多次战斗组成还需要刘备居中协调所以一个作战调度系统也是需要的。sched_init进程调度初始化兵马未动粮草先行为了让前方的将士可以很好的请求后方的资源需要有一个作战请求响应体系只要关羽张飞给后方发一个信号后方的糜竺孙乾就可以开始拨发粮草。操作系统trap_init设置了很多中断门Interrupt Gate用于处理各种中断以便快速响应突发事件还可以提供系统调用方便进程请求内核资源。终于有了徐州城这个唯一的地盘要好好的规划管理起来。mm_init用于初始化内存管理系统这一切都规划完毕接下来兄弟们就要干起来外部的事情就交给关羽张飞内部的事情就交给糜竺孙乾。内核初始化最后调用rest_init里面第一件事情是调用kernel_init运行1号进程。这个1号进程会在用户态运行init进程。这是第一个以用户态运行的进程之所以叫init就是做初始化的工作他是将来所有用户态进程的祖先进程。第二件事情是调用kthreadd运行2号进程。这个2号项目是内核进程的祖先。将来所有的进程都有父进程、祖先进程会形成一棵进程树。第四回攻袁术中计失徐州建立进程管理体系占据徐州以后刘备接到的第一个作战任务是攻打袁术其实是曹操的驱虎吞狼之计。糜竺曰“此又是曹操之计。”玄德曰“虽是计王命不可违也。”遂点军马克日起程孙乾曰“可先定守城之人。”玄德曰“二弟之中谁人可守”关公曰“弟愿守此城。”玄德曰“吾早晚欲与尔议事岂可相离”张飞曰“小弟愿守此城。”玄德曰“你守不得此城你一者酒后刚强鞭挞士卒二者作事轻易不从人谏。吾不放心。”张飞曰“弟自今以后不饮酒不打军士诸般听人劝谏便了。”刘备托付完张飞便和关羽一起商议攻打袁术的作战计划。由于两人都是读过兵书的所以比较容易达成一致但是必须要变成士兵们比较容易理解的指令于是二人对着阵图敲定细节后方才出发。C/C语言都是接近人类的语言CPU无法执行需要通过编译转换为CPU可以听懂的二进制语言。编译好的文件有固定的格式ELF格式。代码的执行从父进程fork一个子进程然后在子进程中调用exec系统调用 然后到了内核里面通过load_elf_binary将ELF二进制执行文件加载到子进程内存中交给CPU执行。虽然前方作战还算顺利然后后方出了篓子。张飞在戒酒宴上劝吕布岳父曹豹饮酒曹豹不饮被张飞鞭打。曹豹连夜差人送信与吕布约布袭取徐州。张飞因醉后不能力战只得抛下刘备家眷出东门而去。徐州为吕布所有刘备无奈只好向吕布求和暂屯小沛。这次失败让刘备意识到前面都是小打小闹可以通过兄弟情义治军如果将来治理大的地盘还是需要军法严明靠制度而非人治。应该建立进程管理系统所有进程都放在一个task_struct列表中对于每一个进程都非常详细地登记了他方方面面的信息。每一个进程都应该有一个ID作为这个进程的唯一标识。到时候调度啊、发送信号啊等等都按ID来就不会产生歧义。进程应该有运行中的状态TASK_RUNNING并不是说进程正在运行而是表示进程在时刻准备运行的状态。这个时候要看CPU有没有空有空就运行他没空就得等着。有时候进程运行到一半需要等待某个条件才能运行下去这个时候只能睡眠。睡眠状态有两种。一种是TASK_INTERRUPTIBLE可中断的睡眠状态。这是一种浅睡眠的状态也就是说虽然在睡眠等条件成熟进程可以被唤醒。另一种睡眠是TASK_UNINTERRUPTIBLE不可中断的睡眠状态。这是一种深度睡眠状态不可被唤醒只能死等条件满足。有了一种新的进程睡眠状态TASK_KILLABLE可以终止的新睡眠状态。进程处于这种状态中他的运行原理类似TASK_UNINTERRUPTIBLE只不过可以响应致命信号也即虽然在深度睡眠但是可以被干掉。一旦一个进程要结束先进入的是EXIT_ZOMBIE状态但是这个时候他的父进程还没有使用wait()等系统调用来获知他的终止信息此时进程就成了僵尸进程。EXIT_DEAD是进程的最终状态。另外进程运行的统计信息也非常重要。例如有的CPU很长时间都在执行一个进程这个时候你就需要特别关注一下再如有的时候进程切换过于频繁这会大大影响他的工作效率。在进程的运行过程中会有一些统计量例如进程在用户态和内核态消耗的时间、上下文切换的次数等等。进程之间的亲缘关系也需要维护任何一个进程都有父进程。所以整个进程其实就是一棵进程树。而拥有同一父进程的所有进程都具有兄弟关系。另外对于进程来讲权限的控制也很重要。例如我这个进程能否访问某个文件能否访问其他的进程以及我这个进程能否被其他进程访问等等另外进程运行过程中占用的资源例如内存、文件系统也需要在进程管理系统里面登记。刘备下令以后所有的作战任务都要按军法来才能保证战斗的胜利。但是此次失败让刘备丢了来之不易的徐州。后来虽然白门楼计除了吕布但是生活在曹操和袁绍的夹缝之中先投奔曹操被煮酒论英雄吓了个半死后来投奔袁绍兄弟三人分离险些被杀害直到关羽千里走单骑兄弟三人古城相会事业又重新回到了起点。经此一劫刘备也深深感到自己虽然熟读兵书但是在兵法方面还是欠缺需要觅得贤士相助才能成就大业。第五回觅贤才玄德得徐庶多进程调度有秘方在荆州经过司马徽指点刘备决定去寻找一个可以运筹帷幄的人才。水镜问曰“吾久闻明公大名何故至今犹落魄不偶耶”玄德曰“命途多蹇所以至此。”水镜曰“不然。盖因将军左右不得其人耳。”玄德曰“备虽不才文有孙乾、糜竺、简雍之辈武有关、张、赵云之流竭忠辅相颇赖其力。”水镜曰“关、张、赵云皆万人敌惜无善用之之人。若孙乾、糜竺辈乃白面书生非经纶济世之才也。”玄德急问曰“奇才安在果系何人”水镜曰“伏龙、凤雏两人得一可安天下。”刘备得到的第一个人才既不是卧龙也非凤雏而是徐庶这是刘备的第一个军师从此刘备才有了复杂的战场运筹调度机制。徐庶辅佐刘备初次用兵连败曹操使赵云一举破了八门金锁阵关羽也取了樊城。并破解了曹仁的劫寨。却说单福正与玄德在寨中议事忽信风骤起。福曰“今夜曹仁必来劫寨。”玄德曰“何以敌之”福笑曰“吾已预算定了。”遂密密分拨已毕。至二更曹仁兵将近寨只见寨中四围火起烧着寨栅。曹仁知有准备急令退军。赵云掩杀将来。仁不及收兵回寨急望北河而走。将到河边才欲寻船渡河岸上一彪军杀到为首大将乃张飞也。曹仁死战李典保护曹仁下船渡河。曹军大半淹死水中。曹仁渡过河面上岸奔至樊城令人叫门。只见城上一声鼓响一将引军而出大喝曰“吾已取樊城多时矣”众惊视之乃关云长也。仁大惊拨马便走。云长追杀过来。曹仁又折了好些军马星夜投许昌。于路打听方知有单福为军师设谋定计。在遇到徐庶之前刘备的战场调度都是单线的和谁打如何打之类的。有了徐庶战场调度就变成了多线配合的将一场战役分为多个战斗多个将领配合完成互相接应。在Linux里面无论是进程还是线程到了内核里面我们统一都叫任务由一个统一的结构task_struct进行管理。对于操作系统来讲他面对的CPU的数量是有限的干活儿都是他们但是进程数目远远超过CPU的数目因而就需要进行进程的调度有效地分配CPU的时间既要保证进程的最快响应也要保证进程之间的公平。如何调度呢一种方式就是排队。一个CPU上有一个队列队列里面是一系列sched_entity每个sched_entity都属于一个task_struct代表进程或者线程。调度要解决的第一个问题是每一个CPU每过一段时间都要想一下CPU的队列里面有这么多的进程或者线程应该取出哪一个来执行这就是调度规则或者调度算法的问题。在Linux里面讲究的公平可不是一般的公平而是CFS调度算法CFS全称是Completely Fair Scheduling完全公平调度。这个算法主要由fair_sched_class实现fair就是公平的意思。CPU会提供一个时钟过一段时间就触发一个时钟中断。就像咱们的表滴答一下这个我们叫Tick。CFS会为每一个进程安排一个虚拟运行时间vruntime。如果一个进程在运行随着时间的增长也就是一个个Tick的到来进程的vruntime将不断增大。没有得到执行的进程vruntime不变。显然那些vruntime少的原来受到了不公平的对待需要给他补上所以会优先运行这样的进程。这有点儿像让你把一筐球平均分到N个口袋里面你看着哪个少就多放一些哪个多了就先不放。这样经过多轮虽然不能保证球完全一样多但是也差不多公平。有时候进程会分优先级如何给优先级高的进程多分时间呢这个简单就相当于N个口袋优先级高的袋子大优先级低的袋子小。这样球就不能按照个数分配了要按照比例来大口袋的放了一半和小口袋放了一半里面的球数目虽然差很多也认为是公平的。函数update_curr用于更新进程运行的统计量vruntime CFS还需要一个数据结构来对vruntime进行排序找出最小的那个。在这里使用的是红黑树。红黑树的的节点是sched_entity里面包含vruntime。调度算法的本质就是解决下一个进程应该轮到谁运行的问题这个逻辑在fair_sched_class.pick_next_task中完成。调度要解决的第二个问题是什么时候切换任务也即什么时候CPU应该停下一个进程换另一个进程运行主要有两种方式。方式一A进程做着做着里面有一条指令sleep也就是要休息一下或者等待某个I/O事件。那没办法了要主动让出CPU然后可以开始做B进程。主动让出CPU的进程会主动调用schedule()函数。在schedule()函数中会通过fair_sched_class.pick_next_task在红黑树形成的队列上取出下一个进程然后调用context_switch进行进程上下文切换。进程上下文切换主要干两件事情一是切换进程空间也即进程的内存。二是切换寄存器和CPU上下文记录下来方便以后接着干。方式二A进程做着做着旷日持久实在受不了了。是时候切换到B进程了。这个时候叫作A进程被被动抢占。抢占还要通过CPU的时钟Tick来衡量进程的运行时间。时钟Tick一下是很好查看是否需要抢占的时间点。时钟中断处理函数会调用scheduler_tick()他会调用fair_sched_class的task_tick_fair在这里面会调用update_curr更新运行时间。当发现当前进程应该被抢占不能直接把他踢下来而是把他标记为应该被抢占打上一个标签TIF_NEED_RESCHED。另外一个可能抢占的场景发生在当一个进程被唤醒的时候。一个进程在等待一个I/O的时候会主动放弃CPU。但是当I/O到来的时候进程往往会被唤醒。这个时候是一个时机。当被唤醒的进程优先级高于CPU上的当前进程就会触发抢占。如果应该发生抢占也不是直接踢走当然进程而也是将当前进程标记为应该被抢占打上一个标签TIF_NEED_RESCHED。真正的抢占还是需要上下文切换也就是需要那么一个时刻让正在运行中的进程有机会调用一下schedule。调用schedule有以下四个时机。对于用户态的进程来讲从系统调用中返回的那个时刻是一个被抢占的时机。对于用户态的进程来讲从中断中返回的那个时刻也是一个被抢占的时机。对内核态的执行中被抢占的时机一般发生在preempt_enable()中。在内核态的执行中有的操作是不能被中断的所以在进行这些操作之前总是先调用preempt_disable()关闭抢占。再次打开的时候就是一次内核态代码被抢占的机会。在内核态也会遇到中断的情况当中断返回的时候返回的仍然是内核态。这个时候也是一个执行抢占的时机。可是好景不长徐庶被曹操用计骗取了。但是徐庶回马荐诸葛推荐了一个新的调度人才。第六回顾茅庐知三分天下内存空间管理有序于是刘备三顾茅庐请诸葛亮出山。刘备惊喜的发现诸葛亮可不仅仅是一个战场的调度人才而是一个更高高度的战略人才对全局形势了如支撑。在Linux操作系统中内存管理包含下面的三个部分。第一物理内存的管理相当于诸葛亮对于整个地盘的规划第二虚拟地址的管理也即在某次战斗的视角相当于诸葛亮对于某次战斗的阵法布局第三虚拟地址和物理地址如何映射的问题也即如何通过一次次战斗来赢得整个地盘。首先在隆中对里面诸葛亮先分析了当前的局势。孔明曰“自董卓造逆以来天下豪杰并起。曹操势不及袁绍而竟能克绍者非惟天时抑亦人谋也。今操已拥百万之众挟天子以令诸侯此诚不可与争锋。孙权据有江东已历三世国险而民附此可用为援而不可图也。荆州北据汉、沔利尽南海东连吴会西通巴、蜀此用武之地非其主不能守是殆天所以资将军将军岂有意乎益州险塞沃野千里天府之国高祖因之以成帝业今刘璋暗弱民殷国富而不知存恤智能之士思得明君。将军既帝室之胄信义著于四海总揽英雄思贤如渴若跨有荆、益保其岩阻西和诸戎南抚彝、越外结孙权内修政理待天下有变则命一上将将荆州之兵以向宛、洛将军身率益州之众以出秦川百姓有不箪食壶浆以迎将军者乎诚如是则大业可成汉室可兴矣。此亮所以为将军谋者也。惟将军图之。”诸葛亮将全国的地盘分成几个块逐次分析。Linux对于物理内存的管理也是同样的思路。物理内存分节点每个节点用struct pglist_data表示。每个节点里面再分区域用于区分内存不同部分的不同用法。ZONE_NORMAL是最常用的区域。ZONE_MOVABLE是可移动区域。我们通过将物理内存划分为可移动分配区域和不可移动分配区域来避免内存碎片。每个区域用struct zone表示也放在一个数组里面。每个区域里面再分页。默认的大小为4KB。物理页面分配的时候使用伙伴系统。空闲页放在struct free_area里面每一页用struct page表示。把所有的空闲页分组为11个页块链表每个块链表分别包含很多个大小的页块有1、2、4、8、16、32、64、128、256、512和1024个连续页的页块。最大可以申请1024个连续页对应4MB大小的连续内存。每个页块的第一个页的物理地址是该页块大小的整数倍。例如要请求一个128个页的页块时我们要先检查128个页的页块链表是否有空闲块。如果没有则查256个页的页块链表如果有空闲块的话则将256个页的页块分成两份一份使用一份插入128个页的页块链表中。如果还是没有就查512个页的页块链表如果有的话就分裂为128、128、256三个页块一个128的使用剩余两个插入对应页块链表。把物理页面分成一块一块大小相同的页这样带来的另一个好处是当有的内存页面长时间不用了可以暂时写到硬盘上我们称为换出。一旦需要的时候再加载进来就叫作换入。这样可以扩大可用物理内存的大小提高物理内存的利用率。在内核里面有一个进程kswapd可以根据物理页面的使用情况对页面进行换入换出。另外诸葛亮在阵法排兵布阵上也是相当有一套的。Linux在虚拟地址管理上是这样管理的虚拟空间一切二一部分用来放内核的东西称为内核空间一部分用来放进程的东西称为用户空间。用户空间在下在低地址我们假设是0号到29号会议室内核空间在上在高地址我们假设是30号到39号会议室。这两部分空间的分界线因为32位和64位的不同而不同。对于普通进程来说内核空间的那部分虽然虚拟地址在那里但是不能访问。这就像作为普通员工你明明知道财务办公室在这个30号会议室门里面但是门上挂着“闲人免进”你只能在自己的用户空间里面折腾。我们从最低位开始排起先是Text Segment、Data Segment和BSS Segment。Text Segment是存放二进制可执行代码的位置Data Segment存放静态常量BSS Segment存放未初始化的静态变量。接下来是堆段。堆是往高地址增长的是用来动态分配内存的区域malloc就是在这里面分配的。接下来的区域是Memory Mapping Segment。这块地址可以用来把文件映射进内存用的如果二进制的执行文件依赖于某个动态链接库就是在这个区域里面将so文件映射到了内存中。再下面就是栈地址段了主线程的函数调用的函数栈就是用这里的。如果普通进程还想进一步访问内核空间是没办法的只能眼巴巴地看着。如果需要进行更高权限的工作就需要调用系统调用进入内核。一旦进入了内核就换了一副视角。刚才是普通进程的视角觉着整个空间是它独占的没有其他进程存在。当然另一个进程也这样认为因为它们互相看不到对方。这也就是说不同进程的0号到29号会议室放的东西都不一样。但是到了内核里面无论是从哪个进程进来的看到的是同一个内核空间看到的是同一个进程列表。虽然内核栈是各用个的但是如果想知道的话还是能够知道每个进程的内核栈在哪里的。所以如果要访问一些公共的数据结构需要进行锁保护。也就是说不同的进程进入到内核后进入的30号到39号会议室是同一批会议室。内核的代码访问内核的数据结构大部分的情况下都是使用虚拟地址的。虽然内核代码权限很大但是能够使用的虚拟地址范围也只能在内核空间也即内核代码访问内核数据结构只能用30号到39号这些编号不能用0到29号因为这些是被进程空间占用的。而且进程有很多个。你现在在内核但是你不知道当前指的0号是哪个进程的0号。在内核里面也会有内核的代码同样有Text Segment、Data Segment和BSS Segment内核代码也是ELF格式的。另外诸葛亮对于如何通过一次一次的战役最终获得整块版图也是有规划的。在Linux中我们需要找到一种策略实现从虚拟地址到物理地址的转换。为了能够定位和访问每个页需要有个页表保存每个页的起始地址再加上在页内的偏移量组成线性地址就能对于内存中的每个位置进行访问了。虚拟地址分为两部分页号和页内偏移。页号作为页表的索引页表包含物理页每页所在物理内存的基地址。这个基地址与页内偏移的组合就形成了物理内存地址。32位环境下虚拟地址空间共4GB。如果分成4KB一个页那就是1M个页。每个页表项需要4个字节来存储那么整个4GB空间的映射就需要4MB的内存来存储映射表。如果每个进程都有自己的映射表100个进程就需要400MB的内存。对于内核来讲有点大了 。页表中所有页表项必须提前建好并且要求是连续的。如果不连续就没有办法通过虚拟地址里面的页号找到对应的页表项了。那怎么办呢我们可以试着将页表再分页4G的空间需要4M的页表来存储映射。我们把这4M分成1K1024个4K每个4K又能放在一页里面这样1K个4K就是1K个页这1K个页也需要一个表进行管理我们称为页目录表这个页目录表里面有1K项每项4个字节页目录表大小也是4K。页目录有1K项用10位就可以表示访问页目录的哪一项。这一项其实对应的是一整页的页表项也即4K的页表项。每个页表项也是4个字节因而一整页的页表项是1k个。再用10位就可以表示访问页表项的哪一项页表项中的一项对应的就是一个页是存放数据的页这个页的大小是4K用12位可以定位这个页内的任何一个位置。这样加起来正好32位也就是用前10位定位到页目录表中的一项。将这一项对应的页表取出来共1k项再用中间10位定位到页表中的一项将这一项对应的存放数据的页取出来再用最后12位定位到页中的具体位置访问数据。你可能会问如果这样的话映射4GB地址空间就需要4MB4KB的内存这样不是更大了吗当然如果页是满的当时是更大了但是我们往往不会为一个进程分配那么多内存。比如说上面图中我们假设只给这个进程分配了一个数据页。如果只使用页表也需要完整的1M个页表项共4M的内存但是如果使用了页目录页目录需要1K个全部分配占用内存4K但是里面只有一项使用了。到了页表项只需要分配能够管理那个数据页的页表项页就可以了也就是说最多4K这样内存就节省多了。当然对于64位的系统两级肯定不够了就变成了四级目录分别是全局页目录项PGDPage Global Directory、上层页目录项PUDPage Upper Directory、中间页目录项PMDPage Middle Directory和页表项PTEPage Table Entry。第七回善内政诸葛兴农业全系统一切皆文件另外刘备还发现诸葛亮是个内政天才。战场是打完就走的但是领土是不断积累的如何发展农业保障后援如果管理粮草诸葛亮也是有一套的。在《诸葛亮集便宜策》中他指出“唯劝农业无夺其时唯薄赋敛无尽民财如此富国安家不以宜乎”同理在内存中的数据是随着进程执行完毕而消失的需要长期保存的数据需要写到文件系统上。规划文件系统的时候需要考虑以下几点。第一点文件系统要有严格的组织形式使得文件能够以块为单位进行存储。这就像图书馆里我们会给设置一排排书架然后再把书架分成一个个小格子。有的项目存放的资料非常多一个格子放不下就需要多个格子来进行存放。我们把这个区域称为存放原始资料的仓库区。对于操作系统硬盘分成相同大小的单元我们称为块。一块的大小是扇区大小的整数倍默认是4K用来存放文件的数据部分。这样一来如果我们像存放一个文件就不用给他分配一块连续的空间了。我们可以分散成一个个小块进行存放。这样就灵活得多也比较容易添加、删除和插入数据。第二点文件系统中也要有索引区用来方便查找一个文件分成的多个块都存放在了什么位置。这就好比图书馆的书太多了为了方便查找我们需要专门设置一排书架这里面会写清楚整个档案库有哪些资料资料在哪个架子的哪个格子上。这样找资料的时候就不用跑遍整个档案库只要在这个书架上找到后直奔目标书架就可以了。在Linux操作系统里面每一个文件有一个Inodeinode的“i”是index的意思其实就是“索引”。inode里面有文件的读写权限i_mode属于哪个用户i_uid哪个组i_gid大小是多少i_size_io占用多少个块i_blocks_io。“某个文件分成几块、每一块在哪里“这些信息也在inode里面保存在i_block里面。第三点如果文件系统中有的文件是热点文件近期经常被读取和写入文件系统应该有缓存层。这就相当于图书馆里面的热门图书区这里面的书都是畅销书或者是常常被借还的图书。因为借还的次数比较多那就没必要每次有人还了之后还放回遥远的货架我们可以专门开辟一个区域放置这些借还频次高的图书。这样借还的效率就会提高。第四点文件应该用文件夹的形式组织起来方便管理和查询。这就像在图书馆里面你可以给这些资料分门别类比如分成计算机类、文学类、历史类等等。这样你也容易管理项目组借阅的时候只要在某个类别中去找就可以了。在文件系统中每个文件都有一个名字我们访问一个文件希望通过他的名字就可以找到。文件名就是一个普通的文本所以文件名经常会冲突不同用户取相同的名字的情况会经常出现的。要想把很多的文件有序地组织起来我们就需要把他们做成目录或者文件夹。这样一个文件夹里可以包含文件夹也可以包含文件这样就形成了一种树形结构。我们可以将不同的用户放在不同的用户目录下就可以一定程度上避免了命名的冲突问题。第五点Linux内核要在自己的内存里面维护一套数据结构来保存哪些文件被哪些进程打开和使用。这就好比图书馆里会有个图书管理系统记录哪些书被借阅了被谁借阅了借阅了多久什么时候归还。这个图书管理系统尤为重要如果不是很方便使用以后项目中积累了经验就没有人愿意往知识库里面放了。无论哪个进程都可以通过write系统调用写入知识库。对于每一个进程打开的文件都有一个文件描述符。files_struct里面会有文件描述符数组。每个一个文件描述符是这个数组的下标里面的内容指向一个struct file结构表示打开的文件。这个结构里面有这个文件对应的inode最重要的是这个文件对应的操作file_operation。如果操作这个文件就看这个file_operation里面的定义了。每一个打开的文件都有一个dentry对应虽然我们叫作directory entry但是他不仅仅表示文件夹也表示文件。他最重要的作用就是指向这个文件对应的inode。如果说file结构是一个文件打开以后才创建的dentry是放在一个dentry cache里面的。文件关闭了他依然存在因而他可以更长期的维护内存中的文件的表示和硬盘上文件的表示之间的关系。inode结构就表示硬盘上的inode包括块设备号等。这个inode对应的操作保存在inode operations里面。真正写入数据是写入硬盘上的文件系统例如ext4文件系统。至此刘备集团从战略到战术到管理体系才算完全建立下一篇我们来看一下刘备是如何建立基业的吧。福利扫描添加小编微信备注“姓名公司职位”入驻【CSDN博客】加入【云计算学习交流群】和志同道合的朋友们共同打卡学习推荐阅读亚马逊计划明年推出云游戏服务紧追微软谷歌华为GaussDB数据库推出双分布式架构腾讯擎天5G智慧灯杆助智慧城市服务升级……TPC-C中跑赢Oracle的OceanBase最近有何惊艳区块链“中国制造”一文看懂区块链如何提升供应链金融活力与效能AutoML未来可期工程师的明天何去何从乔布斯的简历 120 万被拍卖HR 看了想打人揭秘支撑双 11 买买买背后的硬核黑科技真香朕在看了
http://www.zqtcl.cn/news/440787/

相关文章:

  • 网页设计作业网站素材和效果图夏天做啥网站致富
  • 利用帝国软件如何做网站网站友链交换平台
  • 简述网站开发技术深圳网站设计合理刻
  • wordpress网站名称寻找销售团队外包
  • 一浪网站建设网页qq邮箱
  • 做网站需要注册公司吗夫唯seo系统培训
  • 沈阳人流哪个医院好安全百度关键词优化怎么做
  • 1688网站怎么做分销高质量的网站内容建设
  • 网站建设公司济宁网站转跳怎么做
  • 镇江网站设计多少钱企业网络部署方案
  • 建网站的公司浩森宇特wordpress登录缓存
  • 便宜建站空间战队头像在线制作免费
  • 做招聘网站赚钱吗厦门网站建设哪里好
  • 新乡网站建设哪家公司好阿里巴巴做国际网站多少钱
  • 怎么在悉尼做网站dede做手机网站
  • 企业网站模板免费下载品牌建设专家库推荐表
  • 辽宁智能网站建设推荐网络营销推广方案创意
  • 安阳做一个网站多少钱东营做网站公司
  • 深圳市罗湖网站建设百度自助建站官网
  • 网站开发安装环境网站建设销售话术
  • 网站权重网站栏目划分的原则
  • 国际网站建设的目的我的百度账号登录
  • 温州网站设计定制博客和网站的区别
  • 益阳建设网站wordpress加载图片慢
  • 网站官网阜新网站开发公司
  • 适合做网站的图片印刷公司网站模板
  • 南昌哪家网站建设最好网站建设的方法有
  • 东莞做网站 动点官网百度开户流程
  • 中力建设网站怎么做自己的门户网站
  • 做的网站必须放做音乐网站的目地