电脑组装好就能直接用吗?


那时候买电脑,经常是这样一个情景:三五个哥们儿一起来到电脑城,呼啦呼啦采购了一大堆硬件,

  • 有密密麻麻都是针脚的 CPU
  • 有铺满各种复杂电路的一块板子,也就是主板
  • 还需要买块显卡,用来连接显示器
  • 还需要买个网卡,里面可以插网线
  • 还要买块硬盘,将来用来存放文件
  • 然后还需要一大堆线,将这些设备和主板连接起来
  • 最终再来一个鼠标,一个键盘,还有一个显示器。设备差不多啦,准备开整!

操作系统其实就像一个软件外包公司,其内核就相当于这家外包公司的老板。

在操作系统中,也有同样的问题,例如多个进程都要往打印机上打印文件,如果随便乱打印进程,就会出现同样一张纸,第一行是 A 进程输出的文字,第二行是 B 进程输出的文字,全乱套了。所以,打印机的直接操作是放在操作系统内核里面的,进程不能随便操作。但是操作系统也提供一个办事大厅,也就是系统调用(System Call)。

系统调用也能列出来提供哪些接口可以调用,进程有需要的时候就可以去调用。这其中,立项是办事大厅提供的关键服务之一。同样,任何一个程序要想运行起来,就需要调用系统调用,创建进程。 

在操作系统中,进程的执行也需要分配 CPU 进行执行,也就是按照程序里面的二进制代码一行一行地执行。于是,为了管理进程,我们还需要一个进程管理子系统(Process Management Subsystem)。如果运行的进程很多,则一个 CPU 会并发运行多个进程,也就需要 CPU 的调度能力了。

在操作系统中,不同的进程有不同的内存空间,但是整个电脑内存就这么点儿,所以需要统一的管理和分配,这就需要内存管理子系统(Memory Management Subsystem)。

不过,无论是别人写的程序,还是你写的程序,运行起来都是进程。如果你是一家外包公司,一个项目的运行要使用公司的服务,那就应该去办事大厅,也就是说,你写的程序应该使用系统调用。

立项服务与进程管理


首先,我们得有个项目,那就要有立项服务。对应到 Linux 操作系统中就是创建进程。

创建进程的系统调用叫fork。这个名字很奇怪,中文叫“分支”。为啥启动一个新进程叫“分支”呢?

在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程(Parent Process),新的进程叫作子进程(Child Process)。

前面我们说过,一个进程的运行是要有一个程序的,就像一个项目的执行,要有一个项目执行计划书。本来老的项目,按照项目计划书按部就班地来,项目执行到一半,突然接到命令,说是要新启动一个项目,这个时候应该怎么办呢?

一个项目的执行是很复杂的,需要涉及公司各个部门的工作,比如说,项目管理部门需要给这个项目组开好 Jira 和 Wiki,会议室管理部要为这个项目分配会议室等等。

所以,我们现在有两种方式,一种是列一个清单,清单里面写明每个新项目组都要开哪些账号。但是,这样每次有项目,都要重新配置一遍新的 Jira、Wiki,复杂得很。另一种方式就是咱们程序员常用的方式,CTRL/C + CTRL/V。也就是说,如果想为新项目建立一套 Jira,但又觉得一个个填 Jira 里面的选项太麻烦,那就可以拷贝一个别人的,然后根据新项目的实际情况,将相应的配置改改。

Linux 就是这样想的。当父进程调用 fork 创建进程的时候,子进程将各个子系统为父进程创建的数据结构也全部拷贝了一份,甚至连程序代码也是拷贝过来的。按理说,如果不进行特殊的处理,父进程和子进程都按相同的程序代码进行下去,这样就没有意义了。

所以,我们往往会这样处理:对于 fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号。这样首先在返回值这里就有了一个区分,然后通过 if-else 语句判断,如果是父进程,还接着做原来应该做的事情;如果是子进程,需要请求另一个系统调用execve来执行另一个程序,这个时候,子进程和父进程就彻底分道扬镳了,也就产生了一个分支(fork)了。

同样是“先拷贝,再修改”的策略,你可能会问,新进程都是父进程 fork 出来的,那到底谁是第一个呢?

作为一个外包公司老板,有了新项目当然会分给手下做,但是当公司刚起步的时候呢?没有下属,只好自己上了。先建立项目运行体系,等后面再做项目的时候,就都按这个来。

对于操作系统也一样,启动的时候先创建一个所有用户进程的“祖宗进程”。这个在讲系统启动的时候还会详细讲,我这里先不多说。

有时候,父进程要关心子进程的运行情况,这毕竟是自己身上掉下来的肉。有个系统调用waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。

所以说,所有子项目最终都是老板,也就是祖宗进程 fork 过来的,因而它要对整个公司的项目执行负最终的责任。

你可以把Linux内核当成一家软件外包公司的老板相关推荐

  1. 趣谈Linuxn操作系统:03你可以把Linux内核当成一家软件外包公司的老板

    [该文章知识来源<极客时间刘超老师-趣谈Linux操作系统>向大神致敬. 趣谈Linux操作系统(极客时间)链接: http://gk.link/a/10iXZ 欢迎大家来一起交流学习,一 ...

  2. 00 Linux内核就像软件外包公司的老板

    Linux就是核心与系统呼叫(系统调用)层那两层.至于应用程式算不算Linux呢?当然不算啦!这点要特别注意喔! 然后,我们进行以下类比: 操作系统:软件外包公司: 内核:外包公司老板: 用户:操作系 ...

  3. 如何寻找软件外包公司?

    做软件外包的公司和个人太多了,暂不说个人做私活的程序员,光注册的外包公司都2万多家,从2万家里面挑选靠谱的有多么困难. 现在的软件外包商可以分为三类: 解决方案提供商,这是大公司,一般只承接大项目: ...

  4. 软件外包公司对比:海辉、软通、东软集团,中软国际等

    软件外包公司对比:海辉.软通.东软集团等 WELLTEN 2013-10-24 21:33:05  25610  收藏 4 分类专栏: 行业应用 原文链接:http://tech.sina.com.c ...

  5. 程序员入职软件外包公司的注意事项!!

    点击上方蓝色字体,选择"标星公众号" 优质文章,第一时间送达 作者:yanyue404 来源:github.com/yanyue404/blog/issues/84 定义 公司类型 ...

  6. 软件外包公司对比:海辉、软通、东软集团等

    原文链接:http://tech.sina.com.cn/it/2011-11-23/16196375290.shtml 一.行业概况 从总体来看,中国软件外包公司成立较晚,规模也不如印度著名公司大. ...

  7. 实习与就业--软件外包公司(二)

    (接上一篇)这次来我院招聘实习生的海辉国际排在第5,属于实力雄厚的软件外包公司,下面是海辉国际的介绍: 公司概况 海辉软件(国际)集团公司成立于 1996 年,是一家一流的全球 IT 外包服务提供商, ...

  8. 一个软件公司需要多少前端_内幕!软件外包公司开发一个软件需要多少钱?

    软件外包公司坑?开发一个软件要多少钱? 当你已经了解到软件能给你带来的好处之后,是不是有些动心了? 想要开发一款属于自己的APP小程序,可是却不知道该如何开始? 万事开头难,想着去软件外包公司问一下价 ...

  9. 浩鲸科技是外包公司吗_软件外包公司开发软件可靠吗

    企业想要开发软件,对于大多数企业来说都愿意选择软件开发外包公司来开发,但由于外包开发市场的原因,对于一些企业来说,软件及外包让很多企业感觉并不可靠. 一个外包项目是否靠谱取决于需求方.软件外包公司共同 ...

最新文章

  1. LeetCode-动态规划基础题-63. 不同路径II
  2. WordPress的默认循环
  3. SQL_Server_2008完全学习之第八章Transact-SQL编程
  4. “睡服”面试官系列第三篇之变量的结构赋值(建议收藏学习)
  5. python相对引用_Python 模块相对引用
  6. vue的实例属性$options
  7. 报错:Uncaught TypeError: 获取的元素节点.setAttribute is not a function
  8. facet与compiler不匹配
  9. 跟我学Kafka之zookeeper的存储结构
  10. Linux下分割、合并文件——dd和cat
  11. 以下哪些可以成为html文件的扩展名_今天在我的visual studio code里装了以下插件,现在用着很爽...
  12. ReID中PCB模型输出维度_搞定PCB信号完整性,只需9步!都可以学会
  13. Node-RED使用指南:22:定制化Node的使用方法
  14. 赶集网mysql36条军规_赶集网MySQL的36条军规
  15. 你还在抱怨职场的不公吗?
  16. excel之常用vba代码
  17. 计算机专业毕业实习心得
  18. lucene Lucene Spatial
  19. 神兵利器推荐——你一定不能错过的chrome插件
  20. 从DLL中动态加载一个函数:LoadLibrary和GetProcAddress的使用

热门文章

  1. 2M字节Flash Rom存储器W25Q16/W25X16 认识Flash
  2. 基于 Amazon 和西门子工业边缘的云边协同方案
  3. 手机便签怎么导出到另一个手机 便签内容一键传输方法
  4. win10——microsoft同步用户主题桌面背景的本地位置、默认背景位置、双屏双背景图设置
  5. html 苏宁首页,简单实现
  6. 【新知实验室】手把手实现腾讯云音视频应用
  7. 外置MOS 开关型 PWM调光 降压恒流驱动芯片
  8. Python性能分析,Python可是无所不能的!
  9. 熬夜慢性自杀全过程曝光 | 程序员入坑必读
  10. PAT_1022_D进制的A+B