导航:首页 > 程序命令 > 程序员独自写系统

程序员独自写系统

发布时间:2022-11-05 08:37:39

⑴ 现在程序员都是自己写代码吗还是直接复制网上的 那还有技术核心可言吗

代码的可变通性很高的,写一个删除垃圾的代码是自我发明,我把删除垃圾的代码改成删除系统文件的代码(改变扩展名);也是自我发明.这个不好讲,不管他复制不复制,互联网的根基就是资源共享,只要能达到造福彼此的目的,就够了吧我觉得.

⑵ 写ios系统和安卓系统的人到底有多牛

一句话来形容:牛掰的不像地球上的人物。

我们不谈技术,就简单介绍一下这写出IOS和安卓的两位大神。

很多朋友都以为IOS是乔布斯的作品,实际不然,IOS系统实际上更多的是出自斯科特·福斯特之手。但这个人实在太低调了,以至于很多人都没有听过他的名字。

乔布斯开创了苹果公司的巅峰,拉开了智能手机的新时代,而福斯特正是那个时代最亮眼的星。这位大神是斯坦福大学计算机系的高材生,才华横溢的他多负责幕后工作,曾被认为是乔布斯最理想的接班人。

福斯特尔是苹果的王牌软件设计师,他是Mac OS X系统以及Aqua用户界面的最初设计者之一,iOS广为人知的多点触控界面就出自福斯特尔的手笔,备受好评的IOS生态也借鉴了不少他的研究成果。

遗憾的是,福斯特在后期有些膨胀了,再加上漏洞百出的苹果地图,让他得罪了不少领导。乔布斯病逝后,福斯特与上层不和,最终选择辞职,一代大神从此销声匿迹。

这个名字听上去好像还是听陌生的,但说起另一个名词大家肯定不会陌生:安卓。

而安德·鲁宾正是写出安卓系统的人。

安德·鲁宾有多厉害呢,焊接,编程,运维,PLC……几乎就没有他不会的东西。他23岁的时候就是卡尔蔡司机器人公司的设计师,这份履历足以让他吃香喝辣的了。但安德·鲁宾并不满足,1986年他进入了苹果公司,那时候苹果还是以技术人员为主。鲁宾刚去苹果公司就搞了个大新闻——他对公司的内部电话系统进行了重新编程,结果很多同事在那天都接到了老板的电话,声称要给他们股票奖励。

安德·鲁宾在苹果公司主要搞研发,苹果首款塔式电脑Quadra和 历史 上第一个软modem就出自他手。这人是个工作狂,一天24小时吃住全在办公室,他曾设计出一款智能手机操作系统和UI——Magic Cap,却因为理念太过超前没有被大众认可,1997年,心高气傲的他离开了苹果,又去了微软。

在微软他也闲不住,很快又闯了大祸,他做一款机器人被黑客入侵,微软安全小组表示这会泄露公司机密。在微软没呆够三年的他又跑路了,跑去斯坦福大学当教授了。

也是在这段时间,安德·鲁宾设计出了安卓的雏形,也遇到了贵人——谷歌创始人拉里·佩奇和谢尔盖·布林。不久后谷歌收购了安卓,安德•鲁宾也成为了谷歌的副总裁。

最后说个题外话,相比美国,我们确实缺少这样的才华横溢的技术性人才,也许是大环境的原因,我们至今也做不出像安卓和IOS这样优秀的操作系统。希望鸿蒙能在做好系统生态后,给大家带来惊喜吧。

本人10年开发培训经验,期间经历了Java Web,android,H5,大数据,PHP等多个不同的方向的开发,也做过软件培训公司的金牌讲师,很有兴趣回答你这个问题。

以我自身的体会来说吧,程序员也是要分三六九等的。这个世界上绝大多数程序员都是做应用层面开发的,什么意思呢?就是说都是开发具体的App,网站,应用等的程序员。

但是这些程序员数量这么多,为啥子呢?因为大多数程序员达不到开发操作系统的能力呗,当然包括我自己。

所以这个世界上,也就只有一小部分程序员可以参与到操作系统的研发之中,他们可以说是程序员这个金字塔的塔尖部分。

而iOS或Android,都属于操作系统,那么开发这种系统的人,当然是很牛了。就好比Linux系统内核的开发者Linus,他很狂妄的说过:I'm your God! 没办法,人家有狂妄的资本。


如果有Java,Android,H5等开发方面的问题,或者是开发求职方面的问题,都可以在评论区留言,或者私信我!

研发一个系统不难,难的是如何让系统活下来并且占有较高的市场份额,除了大家熟悉的安卓和iOS之外,三星的Bada和Tizen、微软的Windows Phone、黑莓的BlackBerry OS、诺基亚的塞班等等,加在一起也有十余个了,但是最终还是被安卓和iOS分摊了市场。

这些系统并不是因为本身的技术问题死在了沙滩上,更多的原因是因为没有形成一个生态链!

在iOS刚开发出来时,乔布斯甚至打算让iOS全封闭,拒绝苹果公司以外的人开发应用程序,iPhone刚推出时,乔布斯表示将拒绝外部开发人员开发iOS应用程序,他认为这些外部开发人员开发iOS应用程序会破坏iPhone的体验完整性,把iPhone搞得乱七八糟, 让iPhone感染病毒 带来安全隐患。

好在后来被说服让开发者进来,不然现在我们很可能都见不到iOS系统了,因为生态圈的建设是最重要的,光有一个系统没有应用的支持也是白瞎,而安卓由于做的是开源系统,因此有巨量的开发者进入安卓开发应用,iOS和安卓的生态圈已经形成并且趋于稳定,其它企业要想再研发一个系统就比较困难了。

开发手机系统是个很庞大的工程,不但要有雄厚的资金还要有一支技术过硬的开发团队,别所自主研发系统,有时候开发一款软件都要需要一支团队昼夜不休的工作几个月甚至更长时间。

android操作系统本身是使用Java开发,使用JNI调用本地的C语言库,由操作系统实现对底层调用。iOS系统是苹果自己开发的,核心合适C语言。

一个新操作系统要运转起来,不只意味着上亿行代码,还需要生态系统运转起来,获得用户和开发者的支持。所以不是新开发操作系统是否容易,而是要养成新生态要花多久的时间。

当然是非常厉害了,看看我们身边的程序员在干什么事就知道了(很多根本就不够资格入行),能够进行系统开发的那部分人都是顶级高手,能写出安卓IOS那就更是高手中的高手了。

苹果IOS系统是由一位叫斯科特·福斯特尔带队孵化出的产品,至于这个系统的优点就不多说,毫无疑问目前没有任何移动端系统能与之媲美。苹果能一直领先业界,这款系统是有很大功劳的。那么斯科特是一位厉害的人吗,答案是肯定的,若光凭运气没有智慧是绝不可能把如此优秀的系统做出来的。

与一般的学霸差别并不大,福斯特的经历算不上传奇,在斯坦福大学获得符号系统学位和计算机科学学位后,97年一起和乔布斯加入了苹果。可能是习惯于幕后吧,大概是十年后大家才知道这位厉害的人物。2008年,提升为高级副总裁;12年,转任CEO库克的个人顾问,后因个人原因离职。

在进入苹果之前,他已经有一家自己软件公司,IOS就是在原有的基础上开发出来。IOS虽然是团队的产物,但若没有原始的积累是不可能发展如此顺利。

安卓最初的创始人是安迪·鲁宾,与福斯特的经历比较相似,最初的独立闯荡并没有出众的作品让他出名,都是在找到志同道合的合作伙伴才逐渐将自己的才华展现出来。不过鲁宾的从业经验的确非常丰富,可能也正是这些经历,让他在后来的职业生涯中能充满灵感。

1986年,取得尤蒂卡学院计算机学学士学位后,成为了卡尔·蔡司公司担任机器人工程师,当时的他只有23岁。1989年,他又顺利进入苹果,并且在苹果还狠狠干了一票。不久后又溜到了微软,只不过因为搞个人项目太猖狂,微软领导看不惯他,没有让他的作品发行。

可能安迪也想不到,他还能觅到知音,在斯坦福大学的一次授课中,安迪遇到了他人生中最懂他的两位贵人,他们就是谷歌创始人拉里·佩奇和谢尔盖·布林。几人不谋而合,终于做出了世界上最流行的手机操作系统——安卓。

如很多朋友所言,可能做一款系统难度的确不是最高的,很多国家都能办到,但是要做到像IOS或者安卓这么受欢迎也不是易事。所以连网络、阿里这样的巨头都曾放弃过,原因不言而喻。从现在华为鸿蒙的动作同样能看出,虽然谷歌苦苦相逼,但鸿蒙上线并不干脆。

不管是什么原因,这两个人能够做出如此优秀的系统,肯定不是一般软件开发人员能相比的。不过要论个人魅力,安迪可能要更加全面,动手能力、动脑能力、口才都非常厉害,安卓能在如此短的时间超越IOS规模离不开他的谋略。

当然,人都是有审美疲劳的,虽然现在的系统已经非常好用,但若有新系统出现,比如现在的鸿蒙,个人还是非常愿意一试的。

乱世出英雄,时代不同环境不同,如果谷歌总想着通过不良竞争打压别人,那么后来者的机会可能也就来了。

有的人总是说生态的问题,那是看新闻看多了,外行人看热闹看多了,难道真的以为这世界上只有热闹就够了,没有真正的技术了?

做一个操作系统是非常难的,全世界那么多软硬件巨头,而操作系统的数量一个手就能数的过来。常说的生态难,那只是第二步,而第一步是要把操作系统做出来,这绝不是简单的事。

一个操作系统,是创造一片生态,让全世界都能在你创造的环境内生存,并且还要用你定的规则来开发各种各样的软件。这里面需要做的事太多太多,需要一个很强大的团队,用数年的时间才能开发出来。然后就是核心问题了,你做的系统好不好用,功能合不合理?强不强大?万一系统设计的不行,不好用,没人用,那你这前期巨大的资金和数年的时间可就全白费了!这就算是世界级巨头也难以承受的损失。

正因为如此难,所以全世界也没有几个做操作系统的,现在华为做的系统,也是在安卓系统的基础上做的,也就是说,别人做好的系统,拿来改一改,都已经花了几千亿了。而最近宣传的电脑端的深度Deepin系统,也是在LINUX基础上做的,也就是说:还是别人的系统,咱们只是拿过来改了改而已!

一、当然挺牛的

iOS的负责人是福斯特,1997年陷入困境的苹果收购了乔布斯创立的NeXT公司,乔布斯带领福斯特等人加入苹果公司,随后福斯特负责了MAC OS的开发,将NeXTSTEP一些架构和设计理念引入MAC OS中。

后来乔布斯计划开发智能手机,委派福斯特负责iOS系统的开发,并且从那时候起他就是iOS系统负责人,直到离职,可以说福斯特是这两大操作系统的奠基者和长期负责人。

而Android操作系统最初由Andy Rubin开发的,他最开始想做的是互联网手机,所以创办Android,开始启动下一代智能手机的开发。最后安卓被谷歌收购,开启了安卓的辉煌历程。

二、但更牛的是生态,比系统本身难多了

当然,再加到系统本身,其实研发一个系统,本身并不是那么的难,国内很多厂商都有研发系统的能力,比如阿里有系统,华为有系统,要研发系统,再发展出一个成熟的生态,才是真的困难。

微软多厉害,三星也多厉害,但微软的手机系统,三星的手机系统都可以说是失败了,这个才是真正的难点。

目前华为推出HMS,其实也是为了生态,而鸿蒙发布了没有使用在手机上,也是因为生态不行,华为不敢也不能冒这个险,继续便宜安卓。

当年,红极一时的诺基亚我想大家不陌生吧。当年素有"机王"的称号,据相关信息显示,自1996年起,诺基亚连续14年占据手机市场份额第一。当时搭载的是塞班系统。2011年的时候,诺基亚手机被安卓跟苹果系统反超。错失世界第一的霸主地位。尽管诺基亚的暗淡有自己的决策问题,但是苹果跟安卓系统对他也是致命的打击。我有时候在想,当初的诺基亚是不是对这两哥们恨之入骨呢?这点不难看出这两哥们是蛮牛。

目前国内市场品牌手机商,比如华为,小米,oppo对android进行了修改,完善。有了自己的EMUI MIUI ColorOS系统。国人的手机要么是安卓机,要么是苹果机。其他系统的份额很小。尽管我们有华为的操作系统,但是不够完美。如果没有这两牛人系统,会不会影响到我们手机的使用呢?这点不难看出这两哥们是蛮牛。

近几年,移动互联网一直很火爆,也正因为这两系统。才使得这么多安卓与iOS开发人员那么多。试想,如国没有这个系统了,那会有多少开发人员会出现短暂的失业呢?从这点不难看出这两哥们是蛮牛。


跟乔帮主相比,可能很多人都不认识他,但是不管怎么样。他所做的贡献是铁板钉钉的事了。iOS出自他手。这哥们是苹果软件业务的灵魂人物,他在软件设计方面非常有天赋。外界一致认为他是继乔帮主之后的下一位帮主人选。但是乔帮主走后,他也没能继位。反而是选择了辞职。根据相关资料显示,也有他自己的原因吧,大神的世界我们不懂啊。

鼎鼎有名的安卓系统就是出自他手,我觉得有技术在手就是拽,他的就业跳槽经历也是蛮丰富的。1986年获得计算机学士学位。1989年仅26岁的他加入苹果公司。到后面加入微软。又再从微软离职。人生当中一直没有遇到伯乐啊。几经波折,最后遇到了伯乐谷歌,2005年他写的安卓系统被谷歌收购。他从苹果的一个开发人员,凭借着Android一直干到了Google移动平台副总裁、Android主管。并于2014年10从谷歌离职。

以上讲了这么多足足可以看出这两系统的优秀。以及市场份额庞大。但值得庆幸的是近几年面对美国的管制,为了不受制于人。我国 科技 巨头似乎也明白这个道理,也在涉足操作系统的研发。虽然目前完全取代Android系统是不可能的,但是未来可期啊。

你觉得我国的操作系统会超过安卓系统吗?欢迎评论区留言讨论!

谢谢您的问题。福斯特与鲁宾,确实有过人之处。

福斯特在苹果公司的牛。 福斯特于1992年加入了乔布斯创办的NeXT公司,1997年苹果收购NeXT,福斯特跟随乔布斯加盟苹果。按照苹果与乔布斯安排,福斯特先后负责了MAC OS与iOS系统的开发,是两大重要贡献的重要贡献者、奠基者。之后,福斯特负责的软件业务出现了两大失误,包括失败的苹果地图与不完善的Siri服务,福斯特不愿意道歉,他很可能是苹果公司设计、硬件两方高管意见不合、决策失误的牺牲品。作为乔布斯继任人选之一,福斯特不想在苹果继续任职,2012年离开苹果。

福斯特离开苹果公司的牛。 福斯特离职后,随着苹果产品的更加丰富、生态愈加完善,优化iOS系统更不容易,iOS系统升级后问题增加,iOS和MacOS的继任者显然不如福斯特深刻理解自己的产品。另一方面,福斯特又开启了自己另外一段开挂的人生,他联合制作的百老汇新音乐剧《欢乐窝》成功上映,技术狂人也有浪漫满屋。

安迪·鲁宾(Andy Rubin)的牛与不牛 。鲁宾也是技术发烧友,而且能做成产品。他设计了家庭影院系统、电脑程序控制的直升机、无人值守的POS 系统,很多想法在现在都是前瞻性。 2003 年,鲁宾基于长期持有的域名 Android.com 开发了 Android,安卓系统关键在于其开源,兼容五花八门的智能手机,逐步占有市场,其间鲁宾又投资了谷歌自动驾驶事业。不过,鲁宾有提前预判10年的眼光与能力,但是缺乏耐心、出手过急,技术之后的 社会 、文化和 科技 环境并不成熟,市场并不买账,导致其翻了一些跟头。
欢迎关注,批评指正。

一座摩天大楼,从来都不是凭空而来。同样的道理,好操作系统和生态环境,也都非一朝一夕。

这个世界上主流的操作系统内核,为什么只有Windows NT和Linux Kernel,因为他们的确很优秀啊,但是为什么基于这两种内核,最强大的生态系统只有Windows Desktop和Android?不仅仅是因为有个强大的爹,召集了全世界的开发者去帮它完善生态,但同样,它们自身也要足够优秀对不对?

所以,不要总是想着,人家的生态环境已经占领了市场,我们无法与之匹敌。那当年的Android又是如何把诺基亚,黑莓,微软等一众强大到可怕的敌人一一淘汰的?

⑶ 程序员的梦想:自己写一个操作系统有多难

就如同你一个人造一艘航空母舰。windows系统是召集了全世界最优秀的2000多个技术人员写的,你可以思考一下,你什么时候能进入全世界优秀的人才中的2000人内,就是第一步。

⑷ 程序员必备知识(操作系统5-文件系统)

本篇与之前的第三篇的内存管理知识点有相似的地方

对于运行的进程来说,内存就像一个纸箱子, 仅仅是一个暂存数据的地方, 而且空间有限。如果我们想要进程结束之后,数据依然能够保存下来,就不能只保存在内存里,而是应该保存在 外部存储 中。就像图书馆这种地方,不仅空间大,而且能够永久保存。

我们最常用的外部存储就是 硬盘 ,数据是以文件的形式保存在硬盘上的。为了管理这些文件,我们在规划文件系统的时候,需要考虑到以下几点。

第一点,文件系统要有严格的组织形式,使得文件能够 以块为单位进行存储 。这就像图书馆里,我们会给设置一排排书架,然后再把书架分成一个个小格子,有的项目存放的资料非常多,一个格子放不下,就需要多个格子来进行存放。我们把这个区域称为存放原始资料的 仓库区 。

第二点,文件系统中也要有 索引区 ,用来方便查找一个文件分成的多个块都存放在了什么位置。这就好比,图书馆的书太多了,为了方便查找,我们需要专门设置一排书架,这里面会写清楚整个档案库有哪些资料,资料在哪个架子的哪个格子上。这样找资料的时候就不用跑遍整个档案库,在这个书架上找到后,直奔目标书架就可以了。

第三点,如果文件系统中有的文件是热点文件,近期经常被读取和写入,文件系统应该有 缓存层 。这就相当于图书馆里面的热门图书区,这里面的书都是畅销书或者是常常被借还的图书。因为借还的次数比较多,那就没必要每次有人还了之后,还放回遥远的货架,我们可以专门开辟一个区域, 放置这些借还频次高的图书。这样借还的效率就会提高。

第四点,文件应该用 文件夹 的形式组织起来,方便管理和查询。这就像在图书馆里面,你可以给这些资料分门别类,比如分成计算机类.文学类.历史类等等。这样你也容易管理,项目组借阅的时候只要在某个类别中去找就可以了。

在文件系统中,每个文件都有一个名字,这样我们访问一个文件,希望通过它的名字就可以找到。文件名就是一个普通的文本。 当然文件名会经常冲突,不同用户取相同的名字的情况还是会经常出现的。

要想把很多的文件有序地组织起来,我们就需要把它们成为 目录 或者文件夹。这样,一个文件夹里可以包含文件夹,也可以包含文件,这样就形成了一种 树形结构 。而我们可以将不同的用户放在不同的用户目录下,就可以一定程度上避免了命名的冲突问题。

第五点,Linux 内核要在自己的内存里面维护一套数据结构,来保存哪些文件被哪些进程打开和使用 。这就好比,图书馆里会有个图书管理系统,记录哪些书被借阅了,被谁借阅了,借阅了多久,什么时候归还。

文件系统是操作系统中负责管理持久数据的子系统,说简单点,就是负责把用户的文件存到磁盘硬件中,因为即使计算机断电了,磁盘里的数据并不会丢失,所以可以持久化的保存文件。

文件系统的基本数据单位是 文件 ,它的目的是对磁盘上的文件进行组织管理,那组织的方式不同,就会形成不同的文件系统。

Linux最经典的一句话是:“一切皆文件”,不仅普通的文件和目录,就连块设备、管道、socket 等,也都是统一交给文件系统管理的。

Linux文件系统会为每个文件分配两个数据结构: 索引节点(index node) 和 目录项(directory entry) ,它们主要用来记录文件的元信息和目录层次结构。

●索引节点,也就是inode, 用来记录文件的元信息,比如inode编号、文件大小访问权限、创建时间、修改时间、 数据在磁盘的位置 等等。 索引节点是文件的唯一标识 ,它们之间一一对应, 也同样都会被 存储在硬盘 中,所以索引节点同样占用磁盘空间。

●目录项,也就是dentry, 用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成 目录结构 ,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是 缓存在内存 。

由于索引节点唯一标识一个文件,而目录项记录着文件的名,所以目录项和索引节点的关系是多对一,也就是说,一个文件可以有多个别字。比如,硬链接的实现就是多个目录项中的索引节点指向同一个文件。

注意,目录也是文件,也是用索引节点唯一标识,和普通文件不同的是,普通文件在磁盘里面保存的是文件数据,而目录文件在磁盘里面保存子目录或文件。

(PS:目录项和目录不是一个东西!你也不是一个东西(^_=), 虽然名字很相近,但目录是个文件。持久化存储在磁盘,而目录项是内核一个数据结构,缓存在内存。

如果查询目录频繁从磁盘读,效率会很低,所以内核会把已经读过的目录用目录项这个数据结构缓存在内存,下次再次读到相同的目录时,只需从内存读就可以,大大提高了 文件系统的效率。

目录项这个数据结构不只是表示目录,也是可以表示文件的。)

磁盘读写的最小单位是 扇区 ,扇区的大小只有512B大小,很明显,如果每次读写都以这么小为单位,那这读写的效率会非常低。

所以,文件系统把多个扇区组成了一个 逻辑块 ,每次读写的最小单位就是逻辑块(数据块) , Linux中的逻辑块大小为4KB,也就是一次性读写 8个扇区,这将大大提高了磁盘的读写的效率。

以上就是索引节点、目录项以及文件数据的关系,下面这个图就很好的展示了它们之间的关系:

索引节点是存储在硬盘上的数据,那么为了加速文件的访问,通常会把索引节点加载到内存中。

另外,磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。

●超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。

●索引节点区,用来存储索引节点;

●数据块区,用来存储文件或目录数据;

我们不可能把超级块和索引节点区全部加载到内存,这样内存肯定撑不住,所以只有当需要使用的时候,才将其加载进内存,它们加载进内存的时机是不同的.

●超级块:当文件系统挂载时进入内存;

●索引节点区:当文件被访问时进入内存;

文件系统的种类众多,而操作系统希望 对用户提供一个统一的接口 ,于是在用户层与文件系统层引入了中间层,这个中间层就称为 虚拟文件系统(Virtual File System, VFS) 。

VFS定义了一组所有文件系统都支持的数据结构和标准接口,这样程序员不需要了解文件系统的工作原理,只需要了解VFS提供的统一接口即可。

在Linux文件系统中,用户空间、系统调用、虚拟机文件系统、缓存、文件系统以及存储之间的关系如下图:

Linux支持的文件系统也不少,根据存储位置的不同,可以把文件系统分为三类:

●磁盘的文件系统,它是直接把数据存储在磁盘中,比如Ext 2/3/4. XFS 等都是这类文件系统。

●内存的文件系统,这类文件系统的数据不是存储在硬盘的,而是占用内存空间,我们经常用到的/proc 和/sys文件系统都属于这一类,读写这类文件,实际上是读写内核中相关的数据。

●网络的文件系统,用来访问其他计算机主机数据的文件系统,比如NFS. SMB等等。

文件系统首先要先挂载到某个目录才可以正常使用,比如Linux系统在启动时,会把文件系统挂载到根目录。

在操作系统的辅助之下,磁盘中的数据在计算机中都会呈现为易读的形式,并且我们不需要关心数据到底是如何存放在磁盘中,存放在磁盘的哪个地方等等问题,这些全部都是由操作系统完成的。

那么,文件数据在磁盘中究竟是怎么样的呢?我们来一探究竟!

磁盘中的存储单元会被划分为一个个的“ 块 ”,也被称为 扇区 ,扇区的大小一般都为512byte.这说明即使一块数据不足512byte,那么它也要占用512byte的磁盘空间。

而几乎所有的文件系统都会把文件分割成固定大小的块来存储,通常一个块的大小为4K。如果磁盘中的扇区为512byte,而文件系统的块大小为4K,那么文件系统的存储单元就为8个扇区。这也是前面提到的一个问题,文件大小和占用空间之间有什么区别?文件大小是文件实际的大小,而占用空间则是因为即使它的实际大小没有达到那么大,但是这部分空间实际也被占用,其他文件数据无法使用这部分的空间。所以我们 写入1byte的数据到文本中,但是它占用的空间也会是4K。

这里要注意在Windows下的NTFS文件系统中,如果一开始文件数据小于 1K,那么则不会分配磁盘块来存储,而是存在一个文件表中。但是一旦文件数据大于1K,那么不管以后文件的大小,都会分配以4K为单位的磁盘空间来存储。

与内存管理一样,为了方便对磁盘的管理,文件的逻辑地址也被分为一个个的文件块。于是文件的逻辑地址就是(逻辑块号,块内地址)。用户通过逻辑地址来操作文件,操作系统负责完成逻辑地址与物理地址的映射。

不同的文件系统为文件分配磁盘空间会有不同的方式,这些方式各自都有优缺点。

连续分配要求每个文件在磁盘上有一组连续的块,该分配方式较为简单。

通过上图可以看到,文件的逻辑块号的顺序是与物理块号相同的,这样就可以实现随机存取了,只要知道了第一个逻辑块的物理地址, 那么就可以快速访问到其他逻辑块的物理地址。那么操作系统如何完成逻辑块与物理块之间的映射呢?实际上,文件都是存放在目录下的,而目录是一种有结构文件, 所以在文件目录的记录中会存放目录下所有文件的信息,每一个文件或者目录都是一个记录。 而这些信息就包括文件的起始块号和占有块号的数量。

那么操作系统如何完成逻辑块与物理块之间的映射呢? (逻辑块号, 块内地址) -> (物理块号, 块内地址),只需要知道逻辑块号对应的物理块号即可,块内地址不变。

用户访问一个文件的内容,操作系统通过文件的标识符找到目录项FCB, 物理块号=起始块号+逻辑块号。 当然,还需要检查逻辑块号是否合法,是否超过长度等。因为可以根据逻辑块号直接算出物理块号,所以连续分配支持 顺序访问和随机访问 。

因为读/写文件是需要移动磁头的,如果访问两个相隔很远的磁盘块,移动磁头的时间就会变长。使用连续分配来作为文件的分配方式,会使文件的磁盘块相邻,所以文件的读/写速度最快。

连续空间存放的方式虽然读写效率高,但是有 磁盘空间碎片 和 文件长度不易扩展 的缺陷。

如下图,如果文件B被删除,磁盘上就留下一块空缺,这时,如果新来的文件小于其中的一个空缺,我们就可以将其放在相应空缺里。但如果该文件的大小大于所

有的空缺,但却小于空缺大小之和,则虽然磁盘上有足够的空缺,但该文件还是不能存放。当然了,我们可以通过将现有文件进行挪动来腾出空间以容纳新的文件,但是这个在磁盘挪动文件是非常耗时,所以这种方式不太现实。

另外一个缺陷是文件长度扩展不方便,例如上图中的文件A要想扩大一下,需要更多的磁盘空间,唯一的办法就只能是挪动的方式,前面也说了,这种方式效率是非常低的。

那么有没有更好的方式来解决上面的问题呢?答案当然有,既然连续空间存放的方式不太行,那么我们就改变存放的方式,使用非连续空间存放方式来解决这些缺陷。

非连续空间存放方式分为 链表方式 和 索引方式 。

链式分配采取离散分配的方式,可以为文件分配离散的磁盘块。它有两种分配方式:显示链接和隐式链接。

隐式链接是只目录项中只会记录文件所占磁盘块中的第一块的地址和最后一块磁盘块的地址, 然后通过在每一个磁盘块中存放一个指向下一 磁盘块的指针, 从而可以根据指针找到下一块磁盘块。如果需要分配新的磁盘块,则使用最后一块磁盘块中的指针指向新的磁盘块,然后修改新的磁盘块为最后的磁盘块。

我们来思考一个问题, 采用隐式链接如何将实现逻辑块号转换为物理块号呢?

用户给出需要访问的逻辑块号i,操作系统需要找到所需访问文件的目录项FCB.从目录项中可以知道文件的起始块号,然后将逻辑块号0的数据读入内存,由此知道1号逻辑块的物理块号,然后再读入1号逻辑块的数据进内存,此次类推,最终可以找到用户所需访问的逻辑块号i。访问逻辑块号i,总共需要i+ 1次磁盘1/0操作。

得出结论: 隐式链接分配只能顺序访问,不支持随机访问,查找效率低 。

我们来思考另外一个问题,采用隐式链接是否方便文件拓展?

我们知道目录项中存有结束块号的物理地址,所以我们如果要拓展文件,只需要将新分配的磁盘块挂载到结束块号的后面即可,修改结束块号的指针指向新分配的磁盘块,然后修改目录项。

得出结论: 隐式链接分配很方便文件拓展。所有空闲磁盘块都可以被利用到,无碎片问题,存储利用率高。

显示链接是把用于链接各个物理块的指针显式地存放在一张表中,该表称为文件分配表(FAT, File Allocation Table)。

由于查找记录的过程是在内存中进行的,因而不仅显着地 提高了检索速度 ,而且 大大减少了访问磁盘的次数 。但也正是整个表都存放在内存中的关系,它的主要的缺点是 不适 用于大磁盘 。

比如,对于200GB的磁盘和1KB大小的块,这张表需要有2亿项,每一项对应于这2亿个磁盘块中的一个块,每项如果需要4个字节,那这张表要占用800MB内存,很显然FAT方案对于大磁盘而言不太合适。

一直都在,加油!(*゜Д゜)σ凸←自爆按钮

链表的方式解决了连续分配的磁盘碎片和文件动态打展的问题,但是不能有效支持直接访问(FAT除外) ,索引的方式可以解决这个问题。

索引的实现是为每个文件创建一个 索引数据块 ,里面存放的 是指向文件数据块的指针列表 ,说白了就像书的目录一样,要找哪个章节的内容,看目录查就可以。

另外, 文件头需要包含指向索引数据块的指针 ,这样就可以通过文件头知道索引数据块的位置,再通过索弓|数据块里的索引信息找到对应的数据块。

创建文件时,索引块的所有指针都设为空。当首次写入第i块时,先从空闲空间中取得一个块, 再将其地址写到索引块的第i个条目。

索引的方式优点在于:

●文件的创建、增大、缩小很方便;

●不会有碎片的问题;

●支持顺序读写和随机读写;

由于索引数据也是存放在磁盘块的,如果文件很小,明明只需一块就可以存放的下,但还是需要额外分配一块来存放索引数据,所以缺陷之一就是存储索引带来的开销。

如果文件很大,大到一个索引数据块放不下索引信息,这时又要如何处理大文件的存放呢?我们可以通过组合的方式,来处理大文件的存储。

先来看看 链表+索引 的组合,这种组合称为 链式索引块 ,它的实现方式是在 索引数据块留出一个存放下一个索引数据块的指针 ,于是当一个索引数据块的索引信息用完了,就可以通过指针的方式,找到下一个索引数据块的信息。那这种方式也会出现前面提到的链表方式的问题,万一某个指针损坏了,后面的数据也就会无法读取了。

还有另外一种组合方式是 索引+索引 的方式,这种组合称为多级索引块,实现方式是通过一个索引块来存放多个索引数据块,一层套一层索引, 像极了俄罗斯套娃是吧๑乛◡乛๑ 

前面说到的文件的存储是针对已经被占用的数据块组织和管理,接下来的问题是,如果我要保存一个数据块, 我应该放在硬盘上的哪个位置呢?难道需要将所有的块扫描一遍,找个空的地方随便放吗?

那这种方式效率就太低了,所以针对磁盘的空闲空间也是要引入管理的机制,接下来介绍几种常见的方法:

●空闲表法

●空闲链表法

●位图法

空闲表法

空闲表法就是为所有空闲空间建立一张表,表内容包括空闲区的第一个块号和该空闲区的块个数,注意,这个方式是连续分配的。如下图:

当请求分配磁盘空间时,系统依次扫描空闲表里的内容,直到找到一个合适的空闲区域为止。当用户撤销一个文件时,系统回收文件空间。这时,也需顺序扫描空闲表,寻找一个空闲表条目并将释放空间的第一个物理块号及它占用的块数填到这个条目中。

这种方法仅当有少量的空闲区时才有较好的效果。因为,如果存储空间中有着大量的小的空闲区,则空闲表变得很大,这样查询效率会很低。另外,这种分配技术适用于建立连续文件。

空闲链表法

我们也可以使用链表的方式来管理空闲空间,每一个空闲块里有一个指针指向下一个空闲块,这样也能很方便的找到空闲块并管理起来。如下图:

当创建文件需要一块或几块时,就从链头上依次取下一块或几块。反之,当回收空间时,把这些空闲块依次接到链头上。

这种技术只要在主存中保存一个指针, 令它指向第一个空闲块。其特点是简单,但不能随机访问,工作效率低,因为每当在链上增加或移动空闲块时需要做很多1/0操作,同时数据块的指针消耗了一定的存储空间。

空闲表法和空闲链表法都不适合用于大型文件系统,因为这会使空闲表或空闲链表太大。

位图法

位图是利用二进制的一位来表示磁盘中一个盘块的使用情况,磁盘上所有的盘块都有一个二进制位与之对应。

当值为0时,表示对应的盘块空闲,值为1时,表示对应的盘块已分配。它形式如下:

在Linux文件系统就采用了位图的方式来管理空闲空间,不仅用于数据空闲块的管理,还用于inode空闲块的管理,因为inode也是存储在磁盘的,自然也要有对其管理。

前面提到Linux是用位图的方式管理空闲空间,用户在创建一个新文件时, Linux 内核会通过inode的位图找到空闲可用的inode,并进行分配。要存储数据时,会通过块的位图找到空闲的块,并分配,但仔细计算一下还是有问题的。

数据块的位图是放在磁盘块里的,假设是放在一个块里,一个块4K,每位表示一个数据块,共可以表示4 * 1024 * 8 = 2^15个空闲块,由于1个数据块是4K大小,那么最大可以表示的空间为2^15 * 4 * 1024 = 2^27个byte,也就是128M。

也就是说按照上面的结构,如果采用(一个块的位图+ 一系列的块),外加一(个块的inode的位图+一系列的inode)的结构能表示的最大空间也就128M,

这太少了,现在很多文件都比这个大。

在Linux文件系统,把这个结构称为一个 块组 ,那么有N多的块组,就能够表示N大的文件。

最终,整个文件系统格式就是下面这个样子。

最前面的第一个块是引导块,在系统启动时用于启用引导,接着后面就是一个一个连续的块组了,块组的内容如下:

● 超级块 ,包含的是文件系统的重要信息,比如inode总个数、块总个数、每个块组的inode个数、每个块组的块个数等等。

● 块组描述符 ,包含文件系统中各个块组的状态,比如块组中空闲块和inode的数目等,每个块组都包含了文件系统中“所有块组的组描述符信息”。

● 数据位图和inode位图 ,用于表示对应的数据块或inode是空闲的,还是被使用中。

● inode 列表 ,包含了块组中所有的inode, inode 用于保存文件系统中与各个文件和目录相关的所有元数据。

● 数据块 ,包含文件的有用数据。

你可以会发现每个块组里有很多重复的信息,比如 超级块和块组描述符表,这两个都是全局信息,而且非常的重要 ,这么做是有两个原因:

●如果系统崩溃破坏了超级块或块组描述符,有关文件系统结构和内容的所有信息都会丢失。如果有冗余的副本,该信息是可能恢复的。

●通过使文件和管理数据尽可能接近,减少了磁头寻道和旋转,这可以提高文件系统的性能。

不过,Ext2 的后续版本采用了稀疏技术。该做法是,超级块和块组描述符表不再存储到文件系统的每个块组中,而是只写入到块组0、块组1和其他ID可以表示为3、5、7的幂的块组中。

在前面,我们知道了一个普通文件是如何存储的,但还有一个特殊的文件,经常用到的目录,它是如何保存的呢?

基于Linux 一切切皆文件的设计思想,目录其实也是个文件,你甚至可以通过vim打开它,它也有inode, inode 里面也是指向一些块。

和普通文件不同的是, 普通文件的块里面保存的是文件数据,而目录文件的块里面保存的是目录里面一项一项的文件信息 。

在目录文件的块中,最简单的保存格式就是 列表 ,就是一项一项地将目录下的文件信息(如文件名、文件inode.文件类型等)列在表里。

列表中每一项就代表该目录下的文件的文件名和对应的inode,通过这个inode,就可以找到真正的文件。

通常,第一项是“则”,表示当前目录,第二项是.,表示上一级目录, 接下来就是一项一项的文件名和inode。

如果一个目录有超级多的文件,我们要想在这个目录下找文件,按照列表一项一项的找,效率就不高了。

于是,保存目录的格式改成 哈希表 ,对文件名进行哈希计算,把哈希值保存起来,如果我们要查找一个目录下面的文件名,可以通过名称取哈希。如果哈希能够匹配上,就说明这个文件的信息在相应的块里面。

Linux系统的ext文件系统就是采用了哈希表,来保存目录的内容,这种方法的优点是查找非常迅速,插入和删除也较简单,不过需要一些预备措施来避免哈希冲突。

目录查询是通过在磁盘上反复搜索完成,需要不断地进行/0操作,开销较大。所以,为了减少/0操作,把当前使用的文件目录缓存在内存,以后要使用该文件时只要在内存中操作,从而降低了磁盘操作次数,提高了文件系统的访问速度。

感谢您的阅读,希望您能摄取到知识!加油!冲冲冲!(发现光,追随光,成为光,散发光!)我是程序员耶耶!有缘再见。<-biubiu-⊂(`ω´∩)

⑸ 微软的一个程序员编一个计算机操作系统需要多长时间

首先一个操作系统不可能是又一个人进行完成的,微软的操作系统都是有一个极其庞大的团队花费数年的时间才可以完成一个新的操作系统。
就那server系统举例,server2003、server2008、server2012。一般都是时隔几年才会出一个新的系统。
所以你问题一个程序员编写一个计算机操作系统基本上是不可能完成的任务。都需要一个团队多年的努力才能写出来。

⑹ 程序员如何在电脑上编程的

说到如何在电脑上编程。首先需要知道下面这个问题的答案:“程序到底是什么?”计算机程序是指令集,它告诉计算机如何执行特殊的任务。VB~VC~VF~C~C#~C++~JAVA~.NET~这些都是编程 ASP~CGI~PHP~JSP这些是WEB编程。。 虽然都是编程,但编出来的程序可是不一样的。 目标是什么?开发?创业?还是去公司上班?还是业余爱好? 如果想业余编小程序,推荐VB~VC~容易上手。简单。也蛮强大。 如果想学好了去企业上班,推荐C++~~~.net~~~JAVA之类的大型项目开发。 如果想做网站,就学ASP~CGI~PHP~JSP,这4个就JSP最最最难,先学ASP。现在是人工智能时代,国家出台了很多政策鼓励人工智能发展,无人超市、无人驾驶、无人银行、AI人脸识别层出不穷,我觉得以后人工智能渗透的领域肯定也会越来越多,所以我推荐让孩子学习python语言,python语言适合做人工智能的开发。简单容易上手,学好了以后对学习、出国留学、就业什么的也会有好处。首先,工程师根据你的需求给你一个合适的方案,这个方案包括硬件搭建、软件架构。 然后,在你满意的方案下为你选用设备 最后,程序员按照你的要求编写软件 各种设备有自己的命令解释器,程序员写出来的软件是可以按照机器能解读的编码编写的,这些不需要用户知道,用户只要知道怎么使用,怎么维护就可以了,如果知道的更多,那就可以成了开发者

⑺ 微软的一个程序员编一个计算机操作系统需要多长时间

这个我认为不可能吧,一个程序员给它一百年都难,因为作为一个操作系统,要开发规范性硬件接口支持、网络标准、外设、移动产品接口,除非回到八十年代的DOS时代还说的过去。一个操作系统的开发要许多程序员共同开发、规范、技术经验积累等等。我们不说远的,就安桌和苹果系统就当初由十三家公司共同制定和部分开发,谷哥公司投入更大。

⑻ 单独找程序员写一套简单的crm后台系统,大概多少钱

根据复杂程度和所需时间定价。
其实你不如买个现成的,稍微加一点定制开发费用让供应商帮你改,
或者找个熟悉你购买的系统的程序员二次开发,这样来的快而且代价小。
找程序员从头开发,就算你找到了靠谱的技术好有责任心的也代价不小。

⑼ 程序员是做什么的

程序员一般的工作是从事程序开发、程序维护。

程序员是从事程序开发、程序维护的专业人员。一般将程序员分为程序设计人员和程序编码人员,软件从业人员分为初级程序员、中级程序员、高级程序员(现为软件设计师)、系统分析员,系统架构师,测试工程师六大类。具体工作职责如下:

1、负责软件项目的详细设计、编码和内部测试的组织实施,对小型软件项目兼任系统分析工作,完成分配项目的实施和技术支持工作。

2、协助项目经理和相关人员同客户进行沟通,保持良好的客户关系。

3、参与需求调研、项目可行性分析、技术可行性分析和需求分析。

4、熟悉并熟练掌握交付软件部开发的软件项目的相关软件技术。

5、负责向项目经理及时反馈软件开发中的情况,并根据实际情况提出改进建议。

6、参与软件开发和维护过程中重大技术问题的解决,参与软件首次安装调试、数据割接、用户培训和项目推广。

7、负责相关技术文档的拟订。

8、负责对业务领域内的技术发展动态。

(9)程序员独自写系统扩展阅读:

职业要求

一般的程序员都有四年的在专业领域的学习,需要一个在程序领域的学士学位获得者,不论是数学方面的还是工程方面的都是可以的。

大约有20%的人在这一领域的计算机科学和工程学拥有更高的学位。还有很小一部分程序员是自学的,尽管一些专业性的学校或者综合大学可以提供,但是也需要一些别的途径来提供相关的人才。

尽管学历是比较重要的,但是公司经常把重点放在应聘者的工作经验上,很多刚从大学毕业的大学生虽然有引人注目的学位证书,但是他们找不到工作是因为他们缺乏经验。

一个程序员虽然没有正规的学历,但是如果一个人拥有程序设计的深厚知识背景或者丰富的工作经验的话,那么他的机会要比有学历的应届毕业生大得多。

对于职业程序员,另外一个重要的方面就是,程序员需要不断提升自己的业务技术,他的技术必须一直保持在一个较高的水平,并且要不断发展,程序员也要寻找贸易的机会,要参加研讨会,在周刊上发表文章和接受职业教育,这些使程序员在自己的领域中分级或者不断并排前进。

阅读全文

与程序员独自写系统相关的资料

热点内容
加强数字货币国际信息编译能力 浏览:580
购买的app会员怎么退安卓手机 浏览:889
程序员的种类及名称 浏览:290
美国程序员薪资 浏览:12
黑石通汇证券服务器什么时候到期 浏览:391
东方财富app里我的关注怎么看 浏览:747
bm3d单反级降噪算法 浏览:457
华为安卓机激活时间怎么查询 浏览:850
如何用优盘重装服务器系统 浏览:317
日本结婚三代算法 浏览:920
皓强工具解压步骤 浏览:690
部队抗洪抢险命令范文 浏览:888
欧姆龙plc编程软件使用教程 浏览:594
ai文件pdf 浏览:912
腾讯云服务器挂载混合云 浏览:758
智能小车用什么单片机 浏览:463
java怎么给窗口关闭 浏览:940
列举51单片机的寻址方式 浏览:706
剪辑app怎么写长篇文字 浏览:400
app专属流量过月租怎么不更新 浏览:656