天气太热,辗转反侧。

UNIX从Multics吸取了很多重要的思想,于1968年出世,在1970年代获得了发展,最终成就了一个现代操作系统。

在1970年代中期,PC也开始发展,这得益于Intel微处理器的发展,便宜,轻巧。PC的发展一开始和UNIX并无任何交集,它是独立发展的。所以说,PC操作系统从来都没有吸取Multics&UNIX的经验和教训,甚至根本不知道在当时已经有一个现成的且伟大的现代操作系统了。

于是PC操作系统几乎是从零开始,DoS甚至可以说是一个古代操作系统。就像程控交换机替代接线员一样,DoS只是替代一些繁重的人工操作,比如程序录入,磁盘IO,结果输出,换下一个程序等等。

任何经验得到不断总结后,最终总是能化成理论,进而指导更近一步的实践。在1970年代UNIX获得发展的同时,现代操作系统理论也在不断被总结。到了1980,1990年代,无论是更新的MS-DoS还是Apple OS以及Windows,均借鉴了这些理论,最终Windows NT成为了除UNIX之外的 另一个现代操作系统典范。

Windows获得发展的时期,正是UNIX陷入纷争的时期,差一点就自废了武功。这一切都是穿西装?和皮鞋?的人在捣乱。完全不懂技术和艺术的死板的经理和律师的介入,阻滞了UNIX十年的发展。而此时,Windows却是如日中天。

恰逢此时,Linux前来救场,后来的Apache Web server让其还大获成功,各种初创公司雨后春笋般兴起,纷纷部署了Linux+Apache,这种空前的胜利让人冲昏了脑子,同样又是一帮穿西装的人,这次是来自华尔街,皮鞋踏来,最终导致了2000年前后的互联网泡沫的第一次崩溃。

泪目之后还得收尸,大量华而不实的厂子纷纷倒闭,比如蓝点Linux之类。有人说即便倒闭了也还是成就了大量千万富翁程序员,我看未必,可能因为程序员不穿西装吧,成败之间,钱永远都是穿西装的人拿走的,虽然西装者鄙,不能远谋。

UNIX厂商经理们和律师们的皮鞋底子也磨坏了,皮鞋帮子也断了,尘埃终于落定,世界上留下了Windows,UNIX,Linux三足鼎立。

在1990年代纷争的年代末以及尘埃落定的2000年代初,Windows趁虚而入了UNIX的服务器市场,此后UNIX却是被Linux不断蚕食,同时Linux也在桌面初有起色,而Windows却丝毫不惧,在服务器和桌面同时和不同的敌人作战。

现状看来,UNIX最为糟糕,这一切都是经理和律师穿着西装惹的祸,西装太紧,无法上架。

在人们关注Linux和Windows分别在桌面和服务器的份额不断变化的趋势曲线时,到了2000年代末,不知不觉,移动互联网时代来临,这下让Windows也措手不及了。

PC落幕了。

Windows曾经在移动端做过百般挣扎,但最终都失败了,无论是Windows CE还是WinMobile最终都没起色,而Linux内核却化身钻进了Android,继续和移动互联网的引战者iOS纷争。

不过无论如何,Windows依然是一个伟大的操作系统,在下一个时代真正到来前,Windows和UNIX都是伟大的,而Linux只是出现在了正确的时间而已,如果UNIX没有纷争,没有穿西装的搅局,如果GNU的内核Hurd早出来一年,就没Linux什么事了。

历史没有如果,今日看来,Linux持续进化,每天都有大量的粉丝拥泵为其贡献源码,为其bugfix,不强大才怪。在我的朋友圈里,有大概十来个人,他们貌似互相认识,他们视Linux内核为生命,每天都会为Linux内核的源码的细节而感慨万千,每天都在传播Linux文化,虽然我无意融进那个圈子,但我清楚的很,Linux内核早就是大大小小的圈子遍布全世界了,犹如宗教。


让我们分别看一条Windows和UNIX/Linux的基因构成的染色体吧。

先看Windows的一个典型的Win32程序,DevCPP自动生成的:

#include <windows.h>/* This is where all the input to the window goes to */
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {switch(Message) {/* Upon destruction, tell the main thread to stop */case WM_DESTROY: {PostQuitMessage(0);break;}/* All other messages (a lot of them) are processed using default procedures */default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}/* The 'main' function of Win32 GUI programs: this is where execution starts */
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {WNDCLASSEX wc; /* A properties struct of our window */HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */MSG msg; /* A temporary location for all messages *//* zero out the struct and set the stuff we want to modify */memset(&wc,0,sizeof(wc));wc.cbSize         = sizeof(WNDCLASSEX);wc.lpfnWndProc    = WndProc; /* This is where we will send messages to */wc.hInstance    = hInstance;wc.hCursor         = LoadCursor(NULL, IDC_ARROW);/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);wc.lpszClassName = "WindowClass";wc.hIcon      = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */wc.hIconSm        = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */if(!RegisterClassEx(&wc)) {MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, /* x */CW_USEDEFAULT, /* y */640, /* width */480, /* height */NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}/*This is the heart of our program where all input is processed and sent to WndProc. Note that GetMessage blocks code flow until it receives something, sothis loop will not produce unreasonably high CPU usage*/while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */TranslateMessage(&msg); /* Translate key codes to chars if present */DispatchMessage(&msg); /* Send it to WndProc */}return msg.wParam;
}

这就是Windows程序的逻辑流程,即便你是在写MFC程序,其背后也依然是这个,MFC只是让编码更加方便而已。

Win32程序的逻辑:

  • 接收键盘,鼠标事件。
  • 事件转化为消息,排入消息队列。
  • 线程获取消息,分发消息到窗口。
  • 线程处理消息,绘制屏幕,处理数据。

这是一个典型的人机交互逻辑。在Windows系统中,后台的服务并非主要的,前台的消息循环才是。

再看UNIX/Linux的:

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <unistd.h>#define MAXBUF 256void child_process(void)
{while (1) {// 1. 网络IO// 2. 处理// 3. 磁盘IO-结果或者日志}
}int main(int argc, char **argv)
{for (...) {if (fork() == 0) {child_process();exit(0);}}sockfd = socket(AF_INET, SOCK_STREAM, 0);bind(sockfd,(struct sockaddr*)&addr ,sizeof(addr));listen (sockfd, 5);while (1) {select(max+1, &rset, NULL, NULL, NULL);for (...) {if (FD_ISSET(fds[i], &rset)){accept_or_dispatch(...);}}}return 0;
}

这是一个典型的守护进程,UNIX/Linux系统中基本都是这种,所谓的守护进程,和Windows的Win32程序相反,它是一种后台进程,即无法从键盘鼠标接收输入,也没有什么东西会输出到显示器,结果就是这种守护进程的输入输出就只剩下单一的网络和磁盘了。

我们看到了Windows和UNIX/Linux的对比:

  • Windows:主要为前台进程,接受键盘鼠标作为输入,显示器为输出。后台服务基本都是干杂事的。
  • UNIX/Linux:主要后台进程,不接受键盘鼠标,网络,磁盘作为输入和输出。干杂事的是一些util工具程序,类似iproute2,iptables,sed,awk这种。

在我前面的几篇对比Windows和Linux的调度器,内存管理的文章中,我一再强调这两种系统的发展轨迹,设计初衷以及用途不同导致了它们遵循了不同的设计理念,可是很多读者并没有get到这个,反而是抓住一些细节为了怼而怼,着实悲哀。比如我说Linux桌面比Windows卡,就有人说我在开玩笑,还有人说加内存解决,我很难过可能是我没有说清楚前提,所以我补充了此文。

为一些小细节而惊喜,这就是生活。当然,我知道在操作系统方面,我并不专业,绝大多数人都比我专业,人家都不写文章,我却天天逼逼,这看上去有点尴尬,但我并不惭愧,因为我本来就不是为了写操作系统方面的文档,这只是思考的结果。

就在此时,东方卫视在讲关于外卖的事情,我一边看这个一遍写这篇文章。

节目里提到了,外卖竟然发展到了可以替人买东西的地步,这太让人赞叹,竟然还可以要求外送小哥送的时候,一定要鬼鬼祟祟…拍案惊奇啊!这些事情绝大多数人都不以为然,但我比较老土,但这种司空见惯的俗事,让我感到了惊喜。


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

操作系统线索-UNIXPC相关推荐

  1. 操作系统的起源|开源运动的兴起

    周末的时间主要是看了两部片子,然后停下来进行了一些思考: 操作系统革命 https://www.bilibili.com/video/av9512574/ 书呆子的胜利1 https://www.bi ...

  2. 操作系统下代码设计与走读方法—业务线索法

    前言 个人总结,阅读代码有以下4大线索: 1.线程线 :线程线索的简称,观察创建了多少个线程,以线程运行流程的角度理解程序. 2.数据线 :数据结构线索的简称,观察创建了多少个全局变量或对象,以数据流 ...

  3. 发布AI操作系统、应用市场,开源机器学习数据库和AI操作系统内核,第四范式这波操作有点秀!

    "AI的发展经历了'高期望--能否落地--落地是否有用"等多次潮起潮落.今天,AI的价值再次引发一些讨论和怀疑." 第四范式创始人兼首席执行官戴文渊在近日举行的新品发布会 ...

  4. 梅宏院士:操作系统变迁有20年周期律,泛在计算是一片新蓝海

    梅宏 来源:观察者网 作者:梅宏院士 中国科学院院士.发展中国家科学院院士.欧洲科学院外籍院士.IEEE FELLOW,中国计算机学会理事长,北京大学信息技术高等研究院智能软件技术与应用研究中心首席科 ...

  5. 《网络操作系统》课后习题答案

    第一章 网络操作系统引论 1. ①操作系统的定义:操作系统是控制和管理计算机系统的硬件和软件资源.合理地组织工作流程以及方便用户的程序集合. ②现代操作系统的基本特征:1.并发性2.共享性3.虚拟性4 ...

  6. Google 神秘 Fuchsia OS 的开源线索

    LWN 和 IEEE Spectrum 发表了两篇文章讨论了 Google 神秘的操作系统 Fuchsia.Google 目前 没有披露多少 Fuchsia 的正式消息,但因为它是作为一个开源项目开发 ...

  7. Linux操作系统报:read-only file system

    在对集群测试过程中发现系统中某一节点中的磁盘变成read-only file system,从而导致测试任务出错,从网上查找资料,找到以下解决方案: 这个报错的意思是硬盘属性变成只读,不可写入: VO ...

  8. 【渝粤题库】广东开放大学 Linux操作系统 形成性考核

    ​ 题目: C语言头文件一般以什么名称结尾? 题目:  以下哪个不属于操作系统? 题目:  以下描述正确的是? 题目: 使用gcc编译后的目标文件一般以什么名称结尾? 题目: 进程通信的方式有(). ...

  9. windows调用python_如何在Windows操作系统中从R调用Python?

    我正在寻找一种在Windows操作系统上调用R中的python的方法.因为似乎没有可用的R包(至少没有最近更新的包),我正在寻找如何在R脚本中编写一组命令的线索,然后可以以批处理模式发送蟒蛇. 简而言 ...

最新文章

  1. xmpp 开源项目选择_如何选择和维护安全的开源项目
  2. easyui 去掉按钮 虚线框
  3. 物理化学 多组成系统热力学
  4. 爬虫 | urllib入门+糗事百科实战
  5. 利用vector实现一对一(pair<int,int>)
  6. 算法与数据结构基础 - 堆(Heap)和优先级队列(Priority Queue)
  7. 猪八戒玉华王:老码农的7项灵魂思考
  8. java 抛出异常效率_Java异常处理机制
  9. Windows Server 2003下配置IIS6.0+php5+MySql5+PHPMyAdmin环境
  10. 下载proteus-isis时出现的错误
  11. 录屏软件|录屏软件下载|录屏软件哪个好用电脑无水印版
  12. Qt:局域网文件同步工具
  13. Safari 浏览器插件(扩展)开发
  14. 怎么进入云计算这个行业?新手怎么学习云计算?
  15. ios 应用闪退原因
  16. 用二分法定义平方根函数(Bisection method Square Root Python)
  17. 加州伯克利计算机科学录取,全美TOP1-伯克利EECS录取驾到!
  18. python判断火车票座位号分布图_火车票座位号分布图图解(是否靠窗)
  19. 毕业设计 基于单片机的小型简易录音机
  20. QT中$$PWD的意思

热门文章

  1. 13篇基于Anchor free的目标检测方法
  2. WSL 0x80070003错误处理
  3. linux怎么修改ens33文件,linux 修改centos7的网卡ens33修改为eth0
  4. Unity3D Shader:动态翅膀
  5. matlab去雾处理是视频,一种快速视频去雾方法与流程
  6. python中括号的作用_python里面方法后面的小括号作用是什么?
  7. 数据结构常考题 —— 八种经典内部排序算法
  8. OOA面向对象分析方法
  9. 《Linux Device Drivers》第六章 高级字符驱动程序操作——note
  10. powerdesigner添加mysql的字符集ENGINE和DEFAULT CHARACTER SET