操作系统线索-UNIX&PC_unix pc

天气太热,辗转反侧。

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, so
        this 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 256

void 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卡,就有人说我在开玩笑,还有人说加内存解决,我很难过可能是我没有说清楚前提,所以我补充了此文。

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

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

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


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

原文链接: https://blog.csdn.net/dog250/article/details/98291949

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    操作系统线索-UNIX&PC_unix pc

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/406501

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月26日 上午9:53
下一篇 2023年4月26日 上午9:53

相关推荐