原创 嘗試爲nodejs貢獻代碼

1 需求背景 一直都有在看一些開源項目的代碼,但是還沒有試過提交pr。因爲最近在研究websocket和keep-alive。而websocket涉及到長連接,過多無用的長連接對系統來說是負擔,是否可以儘快發現對端是否已經掉線,從

原创 通過linux源碼分析nodejs的keep-alive

之前已經分析過了keep-alive,最近在使用nodejs的keep-alive的時候發現了遺漏了一個內容。本文進行一個補充說明。我們先看一下nodejs中keep-alive的使用。 enable:是否開啓keep-aliv

原创 使用wireshark分析tcp

今天使用wireshark來分析一下tcp的一些原理。首先我們建立一個tcp服務器。 const net = require('net'); net.createServer().listen(11111); 再建立一個tcp客

原创 imweb團隊招聘

​騰訊深圳imweb團隊招聘T7及以上的前端。​​歡迎投遞。團隊介紹https://imweb.io/。

原创 理解websocket的原理

首先我們看一下websocket的出現背景,我們知道http系列協議是建立在tcp上的,理論上,他是可以可以雙向通信的。但是http1.1之前,服務器沒有實現推送的功能。每次都是客戶端請求,服務器響應。下面看一下http協議關於請

原创 通過源碼分析nodejs的進程架構

我們知道nodejs是單進程(單線程)的,但是nodejs也爲用戶實現了多進程的能力,下面我們看一下nodejs裏多進程的架構是怎麼樣的。     nodejs提供同步和異步創建進程的方式。我們首先看一下異步的方式,nodejs創

原创 io複用之poll源碼分析(基於linux2.6.13.1)

poll系統調用是io複用早期的實現,和select、epoll類似。今天來分析一下他的原理。先看一下poll的聲明。 int poll(struct pollfd *fds, nfds_t nfds, int timeout);

原创 從nginx1.17.9源碼理解nginx -s reload

使用nginx的時候,我們經常會使用nginx -s reload命令重啓。下面我們就分析一下,執行這個命令的時候,nginx裏發生了什麼?我們從nginx的main函數開始。在main函數裏,執行ngx_get_options函

原创 nginx1.17.9源碼分析之線程池

我們發現事件驅動的軟件都得配一個線程池。libuv和nginx都是。因爲事件驅動的軟件是單線程。但是有些事情總會引起線程阻塞。所以這個事情就不能放到主線程裏做。這就是爲什麼事件驅動都要配一個線程池。把任務交給線程池中的線程。主線程

原创 js實現展開一個數組

function flatten(arr) { let result = []; for (let i = 0; i < arr.length; i++) { if (Array.isArray(arr[i])) {

原创 通過tinyhttpd-0.1.0源碼理解服務器原理

tinyhttpd是一個demo版的服務器。代碼幾百行。源碼分析在這。從中可用一窺服務器的基礎原理。他採用的是一個請求新開一個線程處理的方式。裏面涉及了多進程、多線程、進程間通信等知識。     我們從main函數開始分析。 in

原创 進程的執行和掛起

1 進程總覽 進程是對邏輯的抽象,我們從操作系統的書籍中對進程有了很多的認識,但是對進程的實現可能不太瞭解,這篇文章嘗試解釋一下關於進程實現的大致原理。     進程的實現,其實和我們平時寫代碼的時候一樣,比如我們要表示一個東西,

原创 通過源碼分析nodejs線程架構

nodejs支持了進程之後,又支持了線程。類似瀏覽器端的web worker。因爲nodejs是單線程的,但是底層又實現了一個線程池,接着實現了進程,又實現了線程。一下變得混亂起來,我們要了解這些功能的實現原理,才能更好地使用他。

原创 進程睡眠原理(基於linux2.6.12.1)

進程是一個動態的實體,滿足條件的情況下,他一直在執行,但是有時候,進程需要條件得不到滿足的時候,他就會被掛起。但這是被動的,不是進程控制的,也就是說,進程訪問一個資源的時候,如果不能被滿足,進程會被系統掛起,等到條件滿足的時候,系

原创 關於進程使用資源的限制(基於linux1.2.13)

如今的操作系統都是支持多任務、多用戶的,計算機的資源是各個用戶和任務共享的。操作系統通過setrlimit系統調用提供控制資源使用的方法。該函數的實現在各版本的內核裏不盡相同,現在也支持了更多的能力,本文通過1.2.13的內核大致