unix 订阅
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域。 [1] 展开全文
Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。Unix作为一种开发平台和台式操作系统获得了广泛使用,目前主要用于工程应用和科学计算等领域。 [1]
信息
学    科
计算机科学
外文名
UNIX
类    型
多用户、多任务操作系统
中文名
尤尼克斯
设计原则
简洁至上、提供机制而非策略
unix发展历史
UNIX系统是一个分时系统。最早的UNIX系统于1970年问世。此前,只有面向批处理作业的操作系统,这样的系统对于需要立即得到响应的用户来说是太慢了。在60年代末,Kenneth Thompson和Dennis Ritchie都曾参加过交互方式分时系统Multics的设计,而开发该系统所使用的工具是CTSS。这两个系统在操作系统的发展过程中都产生过重大影响。在此基础上,在对当时现有的技术进行精选提炼和发展的过程中,K.Thompson于1969年在小型计算机上开发UNIX系统,后于1970年投入运行。 [2]  1973年,DennisRitchie开发出C语言,用来改写原来用汇编语言编写的UNIX,由此产生了UNIX VersionV。1974年,Kenneth Thompson和Dennis Ritchie合写的“The UNIX Time-Sharing System"在Communication of ACM上发表,正式向外界披露了UNIX系统。 [2]  当时,PDP-11系列小型计算机在世界各地已经得到广泛应用,UNIX系统一开发后便广泛配备于美国各大学的PDP-11系列计算机上,由此为UNIX的广泛应用创造了物质条件。 [2]  1978年,UNIX Version VI发表,随后又于1979年用于VAX-11超级小型机。以后,不断地出现各种新的版本。美国电话电报公司分别于1981年和1983年发表AT&T UNIX SystemII和UNIX SystemV。美国加州大学伯克莱分校也先后发表了UNIX的版本BSD4.1,BSD4.2和BSD4.3。 [2]  现在UNIX系统的用户日益增多,应用范围也日益扩大。无论在各种类型的微型机、小型机,还是在中、大型计算机,以及在计算机工作站甚至个人计算机上,很多都已配有UNIX系统。不仅新推出的机型配有UNIX系统,而且一些历史较久的生产厂商,也竞相将原有机型配上UNIX系统以便打开销路、争取市场。 [2] 
收起全文
精华内容
下载资源
问答
  • Unix/Linux fork前传

    万次阅读 多人点赞 2019-09-09 08:15:00
    本文是《Linux fork那些隐藏的开销》的前传。fork的由来fork的思想在UNIX出现几年前就出现了,时间大概是1963年,这比UNIX在PDP-7上的第一个版本...

    本文是《Linux fork那些隐藏的开销》的前传。

    fork的由来

    fork的思想在UNIX出现几年前就出现了,时间大概是1963年,这比UNIX在PDP-7上的第一个版本早了6年。

    1963年,计算机科学家Melvin Conway(以Conway’s Law闻名于世)写下一篇论文,正式提出了fork思想,该论文链接:A Multiprocessor System Design:

    https://archive.org/details/AMultiprocessorSystemDesignConway1963/page/n7

    fork的思想最初是Conway作为一种 多处理器并行 的方案提出来的,这个想法非常有意思。简而言之,fork思想来源于流程图。

    我们看一个普通的流程图:640?wx_fmt=png

    你看,流程图的分枝处,fork-叉子,多么形象!

    一个流程图上的分支点分裂出来的分支显然是逻辑独立的,这便是可并行的前提,于是它们便可以表现为不同的 处理进程(process) 的形式,当时的表达还只是“process”这个术语,它还不是现代操作系统意义上的“进程”的概念。

    join同步点表现为多个并行处理的进程由于某种原因不得不同步的点,也就是多个并行流程汇合的点,直到现在,在多线程编程中,这个点依然叫join。比如Java Thread的join方法以及pthread库的pthread_join函数。

    广义来讲,join也表示诸如临界区等必须串行通过的点, 减少join点的数量将会提高并行的效率。

    我们来看看Conway论文中关于fork的原始图示:640?wx_fmt=png

    Conway在论文中的另一个创举是,他将处理进程(也就是后来操作系统中的process的概念)以及执行该进程的处理器(即CPU核)分离了开来,抽象出了schedule层。

    大意是说, “只要满足系统中的活动处理器数量是总处理器数量和并行处理进程的最小值即可。” 这意味着调度程序可以将多处理器系统的所有处理器和系统所有处理进程分别看作是统一的资源池和消费者,执行统一调度:640?wx_fmt=png在UNIX引入fork之后,这种多处理器并行的设计思想就深入到了UNIX的核心。这个思想最终也影响了UNIX以及后来的Linux,直到现在。

    关于这个设计思想为什么可以影响UNIX这么久,我想和Conway本人的“Conway’s law”不无关系,在这个law中,他提到:Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.

    好了,fork本身的由来我们已经了解,就像做菜一样,现在我们把它放在一边备用。

    花开两朵,各表一枝。接下来看UNIX fork的另一个脉络。

    早期UNIX的覆盖(overlaying)技术

    1969年最初的UNIX用一种在现在看来非常奇怪的方式运行。

    一般的资料都是从UNIX v6版本开始讲起,那个版本已经是比较 “现代” 的版本了,所以很少有人能看到最初的UNIX是什么样子的。即便是能查阅到的1970年的PDP-7上运行的UNIX源码,也是引入fork之后的版本,在那之前的最原始版本几乎找不到了(你可能会说,那时的UNIX不叫UNIX,but who cares…)。

    1969年的汤普森版UNIX超级简陋,这可以在Dennis M. Ritchie的一篇论文中见一斑:The Evolution of the Unix Time-sharing System:

    http://www.read.seas.harvard.edu/~kohler/class/aosref/ritchie84evolution.pdf

    最初的UNIX是一个分时系统,它只有两个shell进程,分别属于两个终端:640?wx_fmt=png

    分时系统最初并不是基于进程分时的,那时根本还没有完整的进程的概念,分时系统是针对终端分时的,而操作员坐在终端前,为了让每个操作员在操作过程中感觉上是在独占机器资源,每个终端享受一段时间的时间片,在该时间片内,该终端前的操作员完全享受机器,但是为了公平,超过了时间片,时间片就要给另一个终端。

    就是这样,最初的UNIX为了体现分时特性,实现了最少的两个终端。注意,最初的UNIX没有fork,没有exec,甚至没有多进程的概念,为了实现分时,系统中仅有两个朴素的shell进程。

    事实上,最初的UNIX用只有两个元素的表来容纳所有进程(显然,这看起来好笑…),当然,这里的 “表” 的概念也是抽象的朴素概念,因为当时的系统是用PDP-7的汇编写的,还没有后来C语言数据结构。

    我们现在考虑其中一个终端的shell进程如何工作。马上问题就来了, 这个shell进程如何执行别的命令程序??

    如果说系统中最多只能容纳两个进程,一个终端只有一个shell进程的话,当该终端的shell进程执行其它命令程序时,它自己怎么办?这个问题得思考一会儿…

    注意,不要用现代的眼光去评价1969年的初版UNIX,按照现代的眼光,执行一个程序必然要生成一个新的进程,显然这在初版UNIX中并不正确。

    答案是根本不用产生新的进程,直接将命令程序的代码载入内存并 覆盖 掉shell进程的代码即可!当命令执行完后,再用shell的代码覆盖掉命令程序的代码,针对单独的终端,系统其实一直在执行下面的覆盖循环(摘自论文的Process control 章节):640?wx_fmt=png

    然而,在fork被引入UNIX之前,事实就是这样。一个终端上一直都是那一个进程,一会儿它执行shell的代码,一会儿它执行具体命令程序的代码,以下是一个覆盖程序的结构(图片来自《FreeBSD操作系统设计与实现》一书):640?wx_fmt=png

    然而,当时毕竟还没有将这个逻辑封装成exec系统调用,这些都是每一个进程显式完成的:

    • 对于shell执行命令程序而言,shell自己执行disk IO来载入命令程序覆盖掉自身;

    • 对于命令程序执行结束时,exit调用内部执行disk IO载入shell程序。

    exec逻辑是shell程序的一部分,由于它会被所有的命令程序所使用,该逻辑也被封装到了exit调用中。

    fork引入UNIX前的表象

    好了,目前为止,我们看完了两条线索:

    1. 1963年Melvin Conway提出了fork思想,作为在多处理器中并行执行进程的一个手段。

    2. 1969年汤普森版UNIX仅有两个shell进程,使用覆盖(overlaying)技术执行命令。

    截止目前,我们看到的表象是:

    • 汤普森版UNIX没有fork,没有exec,没有wait,仅有的库函数般的exit也和现在的exit系统调用大相径庭,显然汤普森版UNIX并非一个多进程系统,而只是一个可以跑的简陋的两终端分时系统!

    UNIX fork的诞生

    fork是如何引入UNIX的呢?

    这还要从采用覆盖技术的汤普森版UNIX所固有的问题说起,还是看论文原文:640?wx_fmt=png

    若要解决这些问题,很简单的方案汤普森都想到了:

    • 保持shell进程的驻留而不是销毁。命令执行时,将其交换到磁盘便是了

    很显然,命令程序是不能覆盖掉shell进程了。解决方案是使用 “交换” 技术。

    交换技术和覆盖技术其实都是解决有限内存的多进程使用问题的,不同点在于方向不同:

    • 覆盖技术指的是用不同的进程磁盘映像覆盖当前的进程内存映像。

    • 交换技术指的是用将进程的内存映像交换到磁盘,载入一个别的进程磁盘映像。

    使用交换技术解决覆盖的问题,意味着要创建新的进程:

    • 在新的进程中执行命令程序。

    UNIX需要进行改动,两个配额的进程表显然不够用了。当然,解决方案也并不麻烦:640?wx_fmt=png

    要讲效率,创造不如抄袭,创建新进程的最直接的就是copy当前shell进程,在copy的新进程中执行覆盖,命令程序覆盖copy的新进程,而当前的终端shell进程则被交换到磁盘保得全身。

    覆盖和交换相结合了,UNIX离现代化更近了一步!

    确定了copy当前进程的方案后,进一步的问题是如何来copy进程。

    现在要说回fork了。

    Conway提出fork思想后,马上就有了fork的实现原型(正如Conway自己所说,他只是提出了一个可能造就存在的想法,并没有实现它),Project Genie算是实现fork比较完善的系统之一了。

    Project Genie系统的fork不仅仅是盲目地copy进程,它对fork的过程拥有精细的控制权,比如分配多大的内存空间,copy哪些必要的资源等等。显然,Project Genie的fork是冲着Conway的多处理器并行逻辑去的。

    还是那句话,创造不如抄袭,UNIX若想实现进程copy,有一个现成的模版就是Project Genie,但是Project Genie的fork对于UNIX太过复杂,太过精细化了,UNIX显然用不到这些精细的控制, UNIX仅仅是想让fork出来的新进程被覆盖,而不是让它去执行什么多处理器上的并行逻辑。

    换句话说,UNIX只是借用了fork的copy逻辑的实现,来完成一件别的事。

    于是,UNIX非常粗暴的实现了fork!即完全copy父进程,这就是直到现在我们依然在使用的fork系统调用:640?wx_fmt=png

    取了个巧,奇技淫巧:

    • fork本来就不是让你用来覆盖新进程的,不然为何多此一举。fork是让你来分解程序流程得以并行处理的。

    UNIX fork就此诞生!

    我们再次回顾一下UNIX fork诞生之前的景象:640?wx_fmt=png

    再来看看fork诞生之后的景象:640?wx_fmt=png640?wx_fmt=png

    于是UNIX正式迈开了现代化建设的步伐,一直走到了今天。

    UNIX fork-exec

    关于exec,故事没什么好讲的,它事实上就是关于上述覆盖逻辑的封装,此后程序员不必自己写覆盖逻辑了,直接调用exec系统调用即可。

    于是经典的UNIX fork-exec序列便形成了。

    UNIX fork/exec/exit/wait

    值得一提的是,fork被引入UNIX后,exit的语义发生了巨大的改变。

    在原始的1969年汤普森版UNIX中,由于每一个终端有且仅有一个进程,这意味着覆盖永远是在shell程序和某个命令程序之间进行的:

    • shell执行命令A:命令程序A覆盖内存中的shell代码。

    • 命令A执行结束:shell覆盖结束的命令A的内存代码。

    然而,在fork被引入后,虽然shell执行某个命令依然是特定的命令程序覆盖fork出来的shell子进程,但是当命令执行完毕后,exit逻辑却不能再让shell覆盖当前命令程序了,因为shell从来就没有结束过,它作为父进程只是被交换到了磁盘而已(后来内存到了,可以容纳多个进程时,连交换都不需要了)。

    那么exit将让谁来覆盖当前进程呢?

    答案是不用覆盖,按照exit的字面意思,它只要结束自己就可以了。

    本着 自己的资源自己管理的责任原则 exit只需要清理掉自己分配的资源即可。比如清理掉自己的内存空间以及一些其它的数据结构。

    对于子进程本身而言,由于它是父进程生成的,所以它便由父进程来管理释放。于是经典的UNIX进程管理四件套正式形成:640?wx_fmt=png                                                   (完)

    浙江温州皮鞋湿,下雨进水不会胖!

    查看我们精华技术文章请移步: Linux阅码场原创精华文章汇总

    更多精彩,尽在"Linux阅码场",扫描下方二维码关注

    640?wx_fmt=png

    感谢您的耐心阅读,请随手转发一下或者点个“在看”吧~

    展开全文
  • 本文为《程序员》2.0第一期内容,与UNIX的开发者之一、UNIX命名者布莱恩·克尼汉(Brian W. Kernighan)畅谈技术与人生。 作者 | 《程序员》编辑部 在软件历史中,UNIX是一个传奇。自1969年在贝尔实验室的阁楼...

    《程序员》于2000年创刊,其理念为技术改变世界,创新驱动中国。2021年,全新的《程序员》2.0重新起航,以专业的内容为立足点,以音视频、图文专栏等丰富的多媒体形式为载体,立足当下,放眼未来,为读者带来全方位的技术和产业解读。

    本文为《程序员》2.0第一期内容,与UNIX的开发者之一、UNIX命名者布莱恩·克尼汉(Brian W. Kernighan)畅谈技术与人生。

    作者 | 《程序员》编辑部

    在软件历史中,UNIX是一个传奇。自1969年在贝尔实验室的阁楼中诞生以来,UNIX的发展远远超出了创造者们的想象。它带动了许多创新软件的开发,影响了无数程序员,如果没有它,Linux、macOS和Android系统可能不会存在,人们依赖的导航软件、智能家电、智能手机、物联网也会缺失。

    近日,《程序员》采访了UNIX的研发者与命名者布莱恩·克尼汉(Brian W. Kernighan)教授,他也是AMPL(数学编程语言)与AWK(文本处理工具)的共同创造者之一,曾和C 语言之父丹尼斯·里奇(Dennis MacAlistair Ritchie)共同写作了C语言的第一本著作《C程序设计语言(The C Programming Language)》。我们和布莱恩·克尼汉教授聊了聊UNIX的成功之道,以及操作系统的未来走向。在访谈中,我们惊讶于这位大师的真实和坦诚,也为这跨越半个世纪的史诗般的程序人生所深深感动。

    重点速览:

    • 谈贝尔实验室的吸引点:贝尔实验室研究环境的独特之处在于没有“繁重的工作量”,大家都在做自己认为有趣或重要的事情,没有要求、没有产品,也没有可交付的成果,所以一切进度压力都是员工自己给自己的。
    • 谈程序员该培养何种技能:一是学习如何写,二是学习如何说。专业的程序员应该可以熟练掌握几门语言,并且熟悉5-10种其他的语言。
    • 谈独行侠与多人协作:如今的系统规模和环境都庞大且复杂,因此独行侠式的天才能发挥的作用是十分有限的。但许多大型系统在开始时的规模都非常小,核心贡献者也非常少。大多数编程语言都是由两三个人创建的。
    • 谈C语言中的指针设计空指针可以说是一个“错误”,但我认为,更应该说这是一个在当时很合理的设计选择,这种设计选择的代价极其高昂。
    • 谈面向对象编程:面向对象编程在许多语言中得到了很好的支持,在有的语言中则完全没有支持,它仅仅是一种编程技术,适合解决某些类型的问题,但或许不是解决其他问题的正确方法。
    • 谈现代操作系统:现代操作系统需要服务一个更加复杂的世界,所以它们相应地也会更加复杂。
    • 谈人工智能:利用AI自动生成代码在某些情况下会有帮助,当我们对某些特定的计算任务理解得足够透彻,以至于可以自动化生成代码时,我们就已经取得了很大的进步。
    • 谈开源:开源使我们可以在他人的工作基础上进行构建,实现共同进步,我希望开源可以继续成为世界的重要组成部分。

    50年程序人生

    《程序员》:你曾说是理查德·汉明(Richard Hamming)启发你写了《UNIX传奇:历史与回忆》(UNIX:A History and a Memoir)这本书。那么,在的职业生涯中,哪个人对的影响最大呢?

    Brian:我主要想提三个人。首先是迪克·汉明(Dick Hamming,汉明码发明者,“迪克”是“理查德”的非正式称呼),是他激发了我写这本书的灵感,并给我提供了各种各样的好建议,他是我的人生挚友。

    其次是道格·麦克罗伊(Douglas McIlroy,著名数学家,UNIX 开发者),他是我见过的最聪明的人之一(我见过非常多的聪明人)。1967年,我在贝尔实验室第一次实习时就是在他的手下,他曾对我的博士论文的内容和写作提出了很好的优化建议,我们一起共事了近30年,他在任何领域都是我的“智多星”——编程、写作、科学、技术、数学等等。

    第三个人是林申(Shen Lin)。1968年,我在贝尔实验室第二次实习期间,和林申一起研究了“图划分问题”(Graph Partitioning Problem),这后来也成为了我博士论文的基础。1969年,当我以正式员工的身份回到贝尔实验室时,我又和林申一起研究了“旅行商问题”(Travelling Salesman Problem)、以及其他组合优化的问题,甚至还一起完成了一些网络设计工具。他具备一种惊人的能力,在上手一些小例子之后,就能总结出普适的方法论。如果没有他,我是无法顺利完成论文的。

    《程序员》:从实习到退休,你在贝尔实验室工作了30年,那里最吸引你的是什么?如今在技术领域,跳槽已然成为一件十分普遍的事情,你对此有什么看法呢?

    Brian:在贝尔实验室的时候,我先是实习,然后转为全职。那是个神奇的地方,在那里,有数以千计的一流科学家和工程师在研究多个领域中有趣又有关联的各类问题。公司(AT&T,贝尔实验室的母公司)具备开放、合作的环境和长远的眼光,所以我们可以用很长的时间(甚至数年)去完成自己想要完成的任何事。因此,大家自然而然地就会在那里一直工作下去,没有理由要离开。

    如今,这种环境已经不存在了,但同时工作机会却很多,尤其是对于程序员来说,所以人们在短时间内频繁地更换工作就不足为奇了。虽然这并不是我个人的工作风格,但似乎对很多人而言都是理所应当的。我倒是觉得,尽管这种工作流动性在短期内有一定的好处,但可能也会带来一些长期的负面影响,比如许多公司内部都缺乏连续性,丧失了一以贯之的企业文化和传承。

    贝尔实验室给当今企业的启示

    《程序员》:谈到企业文化(Organization Culture),这也是UNIX成功的一个重要原因。在这方面,认为其他企业和实验室可以从贝尔实验室中学到什么?假设现在带领的团队工作量很大,并且员工都分散在不同的时区,将如何确保代码质量

    Brian:贝尔实验室研究环境的独特之处在于没有“繁重的工作量”,大家都在做自己认为有趣或重要的事情,没有要求、没有产品,也没有可交付的成果,所以一切进度压力都是员工自己给自己的。因为所有人都生活在同一个地区,因此不存在时区问题。当然,有些人习惯于传统的白天工作,而有些人则习惯在夜间工作,还有一些人的工作时间很长(比如Ken Thompson),所以他们有时会和白天的人同步,有时会和夜间的人同步。因为所有的程序员都很优秀,所以代码本身的质量也很高,而且所有的代码都在文件系统中,任何人都可以读取并修改;但唯一的要求是,如果你修改了一个程序的代码,那么你就要对这个程序负责,从而提醒大家要谨慎。

    《程序员》:你曾说贝尔实验室创造的所有伟大发明都得益于其开放的氛围和充足的资金支持但如今的公司往往只注重短期效益。这是否意味着将越来越难以见证UNIX这样伟大发明的诞生?目前,公司在研发方面还有其他可行的方式吗?

    Brian:我确实认为,过多地聚焦在短期目标和钱上是现金企业的一个问题。当然,企业必须要完成特定的工作并交付相应的产品,这样才能有收入维持企业的运转。但是,如果一切都以短期目标来衡量的话,就没有办法去充分地仔细考虑其他选择,或者寻找更好的行事方式以及为未来投资。然而,和很多事情一样,这是一个权衡利弊的过程,我们不难发现,许多优秀甚至伟大的产品都来自研发风格截然不同的公司。

    《程序员》:你书中提到,伟大的项目往往是由个人建立起来的,然而现在的公司往往都更强调合作和头脑风暴。你认为两者之间是否存在“矛盾”?还是说前者是只适用于“天才”的行事方式?

    Brian:在UNIX的早期阶段,程序规模要小得多,所以对团队的关注度并没有那么高。同一个项目可能会由两个人共同完成,但如果三人一组的话就有点多了。工作中必然会产生合作,合作的过程是有机的,而不是由管理层刻意创造的。现在所说的头脑风暴在过去也有:人们探讨各自的想法,在黑板上写写画画,编写程序来测试想法。

    如今的系统规模和环境都庞大且复杂,因此独行侠式的天才能发挥的作用是十分有限的。但许多大型系统在开始时的规模都非常小,核心贡献者也非常少。我们可以想一想编程语言及其编译器、Linux或各种主要开发工具。不难发现,我们大多数的编程语言都是由一两个或两三个人创建的。Linux也是从一个人开始发展起来的。

    《程序员》:UNIX在发展过程中经历了版本分叉、标准竞争和诉讼,这些也是当今企业不得不面对的成长之痛,你对这些企业有什么建议吗?

    Brian:我认为一个企业总是会很自然地想要通过创造新的、有用的系统、工具、语言和功能来吸引客户,并且用这些东西来留住自己的客户。从短期来看这没什么错,但从长远来看,我认为选择合作会更好。

    优秀程序员所具备的能力与素质

    《程序员》:作为一位“传奇程序员”,你也曾和许多同样具有传奇色彩的程序员合作过,那在你看来,一名优秀的程序员应该具备什么样的素质呢?

    Brian:其实说实话,我是一个非常普通的程序员,但我有幸与一些十分杰出的程序员合作过,比如肯·汤普森(Ken Thompson,UNIX 创造者)和丹尼斯·里奇(Dennis Ritchie,C 语言创始人)。尤其是肯(Ken),他似乎具备一种发现事物的统一性和通用性的天赋,这使他的代码简单、干净且功能强大。他的工作效率高得令人难以置信,能够在短时间内写出大量优秀的代码,而且他可以把这些东西全都记在脑子里。他是我认识的最好的程序员。

    《程序员》:肯(Ken)用3周的时间创建了UNIX道格(Doug)在几天内就提出了“管道(pipe)”的想法,是什么让你们有如此高的工作效率?

    Brian:因为他们是“别人家的程序员”,我从来没有这么高效过!当然,肯(Ken)和道格(Doug)(以及其他一些人)确实是有天赋的,但我认为,他们的生产力有一部分来自于他们过去大量的工作经验,对于一些工作他们已经形成了条件反射,从而可以非常有效地创造新事物。

    《程序员》:在遇到麻烦或新问题时,你的解决风格是怎样的?是如何建立自己的思维体系的呢?

    Brian:这个问题很笼统。我没有什么特别的方法,但如果可能的话,我会尽可能地拖延,祈祷问题消失或自行解决。当然,这种方法也不一定总会奏效,但它确实让我的潜意识有机会来消化这个问题,这对编程是非常有帮助的。

    《程序员》对于软件工程师来说,在职业生涯的不同阶段需要培养什么样的技能或心态呢?

    Brian:下面这两个技能,不仅仅是对软件工程师,对每个人而言都很重要。一是学习如何写,二是学习如何说。如果你能写好、说好,并且能有效地把技术语言传达给非技术人员的话,这将在你一生的职业生涯中发挥难以想象的价值。同时,我还认为,要对“有趣”或“值得学习”的事物保持开放的心态。不要让自己变得狭隘,要保持广泛的兴趣。法国伟大的科学家路易斯·巴斯德(Louis Pasteur)曾说过:“机会是留给有准备的人”。所以,你看的东西越多,想的东西越多,探索的东西越多,你就越有可能在某件事上变得越幸运。

    未来操作系统猜想

    《程序员》:一般来说,我们将MULTICS和UNIX的诞生看作是现代操作系统的起源。你认为操作系统发生了哪些变化?你对现在的主流操作系统,比如Windows、macOS、Android、iOS有什么看法?

    Brian:对这个问题我其实没有什么看法。但是由于现代操作系统确实需要服务一个更加复杂的世界,所以它们相应地也会更加复杂。例如,现在的处理器通常都是多核的,所以多处理成为了操作系统的一部分,这与50年前截然不同。现在内存比以往要大得多,外设也更多。网络也逐渐凸显了其重要性。就我个人而言,因为我用的是MacBook,所以使用macOS系统,但我大部分时间只用它来运行标准的UNIX命令。我有一部Android手机,但是手机编程太不好玩了,所以我也就没怎么尝试了。

    《程序员》:随着云计算、人工智能和量子计算的发展,会不会对操作系统提出新的要求和挑战?会不会出现新的操作系统概念?

    Brian:因为我不是很了解量子计算,所以可能没办法给出有价值的看法。但我认为人工智能并不会改变我们对操作系统的看法。如果云计算使用起来更容易一些的话,人们可能会说它只是50、60年前出现的MULTICS和UNIX等分时操作系统的现代实现。所以我想说,这并不是一个新概念,只是一个旧概念的新版本。

    《程序员》 曾预言,对于编程而言,语言将会更容易且更安全。就这一点而言,这特定的“语言”会是什么呢?Rust或者是更多面向应用程序的语言,比如JavaScript、TypeScript、Dart、Swift、Julia或其他语言?

    Brian:如今的大部分编程语言都更安全、简单,这是批量的而非单一的。每种语言都有其最适合的任务类型,比如适合嵌入式系统和高效库实现的C语言,适合大型系统的C++,以及适合作为简单通用语言的Python,等等。我想,专业的程序员应该可以熟练掌握几门语言,并且熟悉5~10种其他的语言。旧的语言永不会消亡,它们中的大多数都还在继续发展,当然,有一些程序的嵌入式系统基础太大、太复杂,难以重写。但是,人们在创造新语言方面有着无穷的创造力,他们希望这些新的语言能够取代旧的语言,但这从未实现过。

    《程序员》指针(Pointer)是C语言的重要组成部分,程序员需要对内存进行管理,这对于初学者甚至是高级程序员都是十分困难的。ALGOL的创建者之一东尼·霍尔(Tony Hoare)称,空指针(null-pointer)是他的一个“10亿美元的错误”,你认为它在语言设计上是一个错误吗?

    Brian:在1972年前后C语言被创造出来的时候,计算机的速度比今天慢了一百万倍,内存也比今天少了一百万倍。此外,C语言的目的是取代汇编语言来编写关键的系统程序,最终取代操作系统本身。因此,这种语言必须简单且高效,它必须使程序员能够表达所有的计算,包括访问位置为0的内存。当然,大多数程序员从来不会刻意这么做,都是不小心做的(我们都做过很多次)。所以空指针可以说是一个“错误”,但我认为,更应该说这是一个在当时很合理的设计选择。只不过随着计算机的功能越来越强大,当然,也随着越来越多天赋不如丹尼斯·里奇(Dennis Ritchie)和肯·汤普森(Ken Thompson)的程序员编写C代码,最终证明,这种设计选择的代价极其高昂。

    《程序员》:你曾提到过:“在计算领域中只有两个真正的问题:计算机太难使用和太难编程”。认为人工智能(自动生成代码)的进步会让编程变得更简单吗?

    Brian:现在谈论现代人工智能的发展还为时过早,但我猜想利用AI自动生成代码在某些情况下会有帮助。当我们对某些特定的计算任务理解得足够透彻,以至于可以自动化生成代码时,我们就已经取得了很大的进步,编译器就是一个很好的例子。所以我想也会有类似的情况,一个程序可以从程序中学习如何编写新的程序。但是!别问我细节。

    《程序员》:你是否能预见面向对象编程(Object-Oriented Programming)未来的发展?或者说它是否已经进入了稳定停滞期?

    Brian:面向对象编程只是组织计算的一种方法,但肯定不是唯一的方法。它在许多语言中得到了很好的支持,在一些语言中得到了部分支持,而在有的语言中则完全没有支持。但我并不认为它是一种独立的事物,仅仅是一种编程技术,它适合解决某些类型的问题,但或许并不是解决其他问题的正确方法。当然,当人们真的要使用它时,仍然要好好地加以利用,以避免深度且脆弱的类层次结构,这需要技巧和练习。

    《程序员》:你如何看待“开源”的发展及其对世界的影响?它在未来将走向何方?在这个过程中,特别是对于中国的开发者来说,有哪些值得期待的呢?

    Brian:开源是一件非常好的事情,并且对软件行业的发展至关重要(现在几乎所有东西都和开源有关)。如今我们其实已经取得了很大的进步,主要的软件系统,如操作系统、编译器和工具都可以作为高质量商品免费提供。开源使我们可以在他人的工作基础上进行构建,实现共同进步。虽然我无法准确地预测未来,但我希望开源可以继续成为世界的重要组成部分。而且,我强烈希望中国的程序员们能够为现有的项目作出贡献,并创建出更多的新项目。

    One More Thing

    《程序员》:《UNIX传奇:历史与回忆》(UNIX:A History and a Memoir)一书写于2019年,该书的中文版业已问世,你写这本书一共花了多长时间?有什么想对中国读者说的吗?

    Brian:这本书的大部分内容是我在2019年夏天的一个长假期间在英国写的。写作的过程其实很快,因为我很了解这个主题,而且我还得到了多年来参与UNIX开发的各位朋友和同事的宝贵支持。整个写作过程都非常有趣,既可以追忆过去的美好时光,也可以和很久没接触的朋友联系。

    我衷心希望中国的读者能在这本书中收获乐趣。今天的世界与UNIX早期的世界已经大不相同了,但人还是一样的。书里总结了很多经验:UNIX是如何产生的、富有创造力的人该如何合作、以及公司该如何有效地管理他们。我认为,这些经验教训同样适用于今天,也或多或少地适用于不同国家的开发者。

    《程序员》:关于UNIX的历史,你还有什么要补充的吗?

    Brian:我很幸运。UNIX早期的日子对我而言是非常美好的。贝尔实验室的环境很好,我身边有很多了不起的同事,他们在各个领域不断地创新。UNIX就是在这种独特的环境中诞生的。从这个意义上来说,我认为UNIX是独一无二、不可复制的,但在其他地方一定有人也同样幸运,可以像UNIX那样为改变世界作出贡献。我希望我的读者都是这样的幸运儿。

    从Unix开发者Brian W. Kernighan,到OpenCV创始人Gary Bradski,再到Vue.js作者尤雨溪……《程序员》2.0第一期以「开发者的黄金十年」为主题,与多位国内外知名的技术领袖和新锐代表进行了深度对话,希望为中国开发者打开新时代的「机遇之窗」。

    除了技术引领,我们也希望透过技术对行业进行深入洞察。因此,《程序员》2.0第一期也邀请到了来自快手、滴滴、贝壳找房、作业帮等知名企业的技术负责人,用案例实践为读者阐述直播、出行、居住、在线教育等多个行业变革背后的技术架构和技术引擎。

    《新程序员·开发者黄金十年》正式发布

    由近百位专家参与、经数月打磨后,《新程序员001:开发者黄金十年》面向所有开发者正式官宣发布!不仅包含了开发者们一如既往期待与喜爱的全球技术大师深邃思考、优秀开发者技术创造等深度内容,更以数字多媒体的新形态让开发者们随时随地阅读、观看,带来视频图文的多重体验。

    用一位开发者和我们说的话来表达:“当年的那个《程序员》回来了!”

    当年的那个《程序员》不仅回来了,而且洋溢着新的活力。

    加入新程序员读者俱乐部:

    移动端的同学也可以扫码下方二维码加入

     

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • unix 浏览器unix 浏览器unix 浏览器unix 浏览器unix 浏览器unix 浏览器unix 浏览器unix 浏览器
  • unix教程 unix

    2008-10-07 21:44:31
    unix教程 unix教程unix教程 unix教程
  • unix客户端unix客户端unix客户端
  • Unix编程指南Unix Programming Guide
  • dos2unix unix2dos

    2018-02-18 12:54:39
    unix文件拷贝到windows系统,就会丢失换行标识, windows文件拷贝到类unix系统,就会出现"^M"标识 可以用于解决Ftp上传二进制文件时没加binary, dos2unix 没加binary上传的文件. unix2dos集成在dos2unix
  • UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册UNIX用户手册
  • unix 教材 unix 教材

    2009-05-13 22:28:20
    unix 教材unix 教材unix 教材unix 教材
  • UNIX教材UNIX教材

    2009-04-19 11:58:18
    UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材UNIX教材
  • dos2unix,unix2dos,mac2unix,unix2mac
  • UNIX和类Unix操作系统

    万次阅读 2020-09-08 09:55:23
    UNIX和类Unix操作系统 Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。 Linux的起源可以追溯到古老的UNIX系统。正因为受到了UNIX的影响,才诞生了Linux。 Linux...

    UNIX和类Unix操作系统

    Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单机操作系统使用。
    Linux的起源可以追溯到古老的UNIX系统。正因为受到了UNIX的影响,才诞生了Linux。
    Linux继承了UNIX的许多优良传统,例如强大的网络功能、完善的命令以及良好的健壮性与稳定性。无论是从外观上,还是从功能上,UNIX与Linux都是非常相似的。
    #UNIX System V家族
        A/UX、AIX、HP-UX、IRIX、LynxOS、SCO OpenServer、Tru64、Xenix、Solaris、OS/2
    #BSD UNIX-386BSD家族
        BSD/OS、FreeBSD、NetBSD、NEXTSTEP、Mac OS X、iOS、OpenBSD、SUN OS、OpenSolaris
    #UNIX-Like
        GNU、Linux、Android、Debian、Ubuntu、Red Hat、Linux Mint、Minix、QNX、GNU/Linux、GNU/Hurd、Debian GNU/Hurd、GNU/kFreeBSD、StartOS
    #其他
        DOS、MS-DOS、Windows、React OS
    
    展开全文
  • dos2unixunix2dos

    2018-09-07 11:32:03
    结合popt可以编译出dos2unix以及unix2dos,编译时候需要添加LIBRARY_PATH,设置popt库目录。
  • Unix编程环境Unix编程环境Unix编程环境Unix编程环境
  • UNIX基本系统管理命令Basic UNIX system administration commands
  • unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程unix高级编程
  • UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统编程UNIX系统...
  • unix常用命令unix常用命令unix常用命令unix常用命令
  • unix2dos 用来实现 DOS <=> UNIX text file 转换 。 功能是将DOS/MAC下的文件转化为UNIX的文本文件格式.
  • Unix编程指南

    2018-12-04 22:17:30
    Unix编程指南 学习Unix的入门教程 Unix知识的宝库!
  • UNix操作手册UNix操作手册UNix操作手册UNix操作手册UNix操作手册
  • 华为unix系统 UNIX入门

    2010-10-19 18:32:28
    华为unix系统 华为unix系统 华为unix系统 华为unix系统 华为unix系统 华为unix系统
  • Unix shell

    2011-11-04 16:15:42
    Unix shell Unix shell Unix shell Unix shell Unix shell Unix shell
  • UNIX系统的基本介绍,包括一些UNIX常用命令,比较适合于UNIX入门的读者。
  • UNIX超级工具

    2018-03-23 11:39:56
    高清 UNIX超级工具! 高清 UNIX超级工具! 高清 UNIX超级工具! 高清 UNIX超级工具! 高清 UNIX超级工具!
  • unix缺陷

    2011-05-20 13:51:29
    unix缺陷unix缺陷unix缺陷unix缺陷unix缺陷unix缺陷
  • Unix手册 Unix手册 unix 用户手册 unix 用户手册 unix 用户手册
  • UNIX环境高级编程,从程序设计人员的角度快速浏览UNIX,介绍UNIX提供的各种服务
  • UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程UNIX环境高级编程

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 997,189
精华内容 398,875
关键字:

unix