程序运行的本质

计算机运行的本质是函数,而切换线程其实也是调用函数

graph LR A[Program Execution] --> B[Function Call] B --> C[Function Executes Task] C --> D[Another Function Call] D --> E{Thread Switch?} E -->|No| F[Continue in Same Thread] E -->|Yes| G[Save Current Thread State] G --> H[Load Next Thread State] H --> I[Switch to Next Thread] F --> J[Function Completes] I --> J J --> K[Program Completes]
  • Program Execution:程序的执行开始。

  • Function Call:程序执行时调用一个函数。

  • Function Executes Task:函数执行它的任务。

  • Another Function Call:函数可能调用另一个函数,进入下一个执行阶段。

  • Thread Switch?:在这个过程中,系统可能需要进行线程切换。

    • No:如果不需要切换线程,程序继续在同一个线程中执行。

    • Yes:如果需要切换线程,系统保存当前线程的状态。

  • Save Current Thread State:保存当前线程的执行状态。

  • Load Next Thread State:加载下一个线程的状态。

  • Switch to Next Thread:线程成功切换,进入新的线程。

  • Function Completes:无论是否进行了线程切换,函数执行完成。

  • Program Completes:整个程序执行完成。

程序运行的基本单位

1. 进程(Process):

- 进程是操作系统中运行的一个应用程序的实例。它包含了程序的代码、数据、内存空间等资源,并且是资源分配的基本单位。

- 每个进程都相互独立,拥有自己独立的内存地址空间。一个进程可以包含多个线程。

- 操作系统会为每个进程分配系统资源,例如内存、文件句柄等,进程之间通过进程间通信(IPC)来进行交互。

2. 线程(Thread):

- 线程是进程中的一个执行路径,通常被称为“轻量级进程”。它共享进程的内存和资源,但有自己的寄存器和堆栈。

- 多个线程可以并发地在同一个进程中运行,共享同一块内存。相比于进程,线程的创建和切换开销较小。

- 线程是执行的基本单位,多个线程可以通过同步机制来防止竞争条件。

3. 携程(Coroutine):

- 携程是一种轻量级的协作式并发模型,它允许函数在执行过程中可以挂起和恢复,不需要操作系统级别的上下文切换。

- 携程的切换通常由开发者自行控制,因此可以避免线程或进程切换的高开销。

- 携程常常用于异步编程场景,比如在 I/O 密集型操作中,携程能有效提高性能。Python、Go 等语言都有对携程的支持。

4. 纤程(Fiber):

- 纤程是一种比线程更加轻量级的并发执行单位,类似于携程。纤程之间的调度通常是在用户态完成的,而不是由操作系统内核来调度。

- 纤程在程序中通常通过用户自己手动调度来执行,不像线程那样由操作系统进行自动调度。

- 纤程的上下文切换开销极低,因为没有内核级别的调度参与。

解释与编译形语言

解释型语言和编译型语言是两种常见的编程语言分类,它们主要区别在于代码的执行方式和性能表现。下面是对这两者的详细解释:

1. 解释型语言(Interpreted Languages)

解释型语言的代码在执行时不需要提前编译成机器代码。相反,它依赖于解释器将代码逐行翻译成计算机可以理解的指令并执行。

特点:

  • 即时执行:代码在运行时由解释器逐行解析并执行,而不是提前编译成可执行文件。
  • 更容易调试:由于代码是逐行执行的,开发者可以在程序运行过程中随时查看和修改代码,调试变得相对简单。
  • 跨平台性:因为是通过解释器执行,通常解释器能在不同的平台上运行,所以同一段代码可以在不同操作系统上直接执行。
  • 速度较慢:由于代码需要在运行时逐行解析,性能通常不如编译型语言高效。

常见的解释型语言:

  • Python
  • JavaScript
  • Ruby
  • PHP

执行流程:

  • 编写代码 → 代码由解释器逐行解析和执行 → 输出结果。

2. 编译型语言(Compiled Languages)

编译型语言的代码在执行前需要经过编译器编译成机器代码(通常是二进制文件),然后由系统的 CPU 直接执行这些机器代码。

特点:

  • 提前编译:代码在运行之前需要编译成机器代码,生成一个可执行文件。
  • 运行速度快:编译后的程序直接在机器上运行,不需要再进行逐行解析,因此性能较高。
  • 依赖平台:编译后的二进制文件通常是与特定的操作系统和硬件相关的,跨平台性较差。为了在不同平台上运行,通常需要针对每个平台重新编译代码。
  • 调试相对复杂:由于编译型语言在运行之前已经被编译成机器码,调试过程较为复杂,通常需要依赖调试工具。

常见的编译型语言:

  • C
  • C++
  • Rust
  • Go

执行流程:

  • 编写代码 → 通过编译器编译生成二进制文件 → 直接执行该二进制文件。

3. 解释型与编译型的对比

特性 解释型语言 编译型语言
执行方式 逐行解析并执行 提前编译成机器代码
运行速度 较慢 较快
跨平台性 较强(依赖解释器) 较弱(依赖平台和硬件)
调试难度 较容易 较难
代码修改后执行 立即运行 需重新编译

4. 混合型语言

有些语言结合了解释和编译的优势,采用了混合执行模式,例如 Java 和 C#。它们的代码首先编译成中间代码(字节码),然后由虚拟机(解释器)在不同的平台上执行这个字节码。

常见的混合型语言:

  • Java
  • C#
  • Kotlin

执行流程:

  • 编写代码 → 编译成中间代码 → 加载字节码到虚拟机 → 即时编译(JIT 编译) → 机器码执行

这种混合模式提供了较好的跨平台性,同时也能在一定程度上提升执行速度。

CAP定理(CAP Theorem)

1. 一致性(Consistency):

  • GPT版本

    • 一致性指的是每次读操作都能返回最新的写操作结果。换句话说,当数据被写入系统后,任何读取操作都应该获得相同的结果。
    • 在分布式系统中,如果一个写入操作成功执行,则任何节点都能立刻读取到这个写入操作的结果。
  • 理解版本

    • 一致性指的是对数据进行任何操作,读取的数据一定是完成了操作后的数据。
    • 在分布式系统中,完成操作后,所有的节点应该也完成了相应的操作

2. 可用性(Availability):

  • GPT版本

    • 可用性指的是每个请求都能得到一个响应,即使系统中的部分节点发生故障。简而言之,系统始终处于可用状态,能够处理读写请求。
    • 在分布式系统中,系统不会由于某个节点的故障而完全失效,其他节点依然可以处理请求。
  • 理解版本

    • 可用性是指系统中的核心代码不被损坏,那么系统就能继续运行。
    • 在分布式中,部分节点故障,但是其他节点依然能运行或者替代故障节点的职责。

3. 分区容错性(Partition Tolerance):

  • GPT版本

    • 分区容错性指的是系统能够容忍网络分区的存在,且仍然能够继续工作。在分布式系统中,网络分区指的是由于网络故障,系统中的节点无法相互通信。
    • 分布式系统中通常会发生网络分区,因此系统必须能够继续工作,即使在一些节点之间无法通信的情况下。
  • 理解版本

    • 在网络故障的时候系统依然能够运行下去

预加载与懒加载

预加载(Preloading)

预加载指的是在程序或网页初始化时,提前加载所需的资源,即使这些资源在初期并不一定会立刻被使用。通过这种方式,预加载可以确保在需要这些资源时,它们已经在内存或缓存中,从而可以快速访问,不会因为延迟加载而导致性能下降。

特点:

  • 提前加载:无论资源是否立即需要,都会提前加载。

  • 减少等待时间:当用户或程序需要使用这些资源时,已经加载好的资源可以快速访问,减少加载时的等待时间。

  • 增加初始加载时间:因为所有资源在初始阶段都会加载,可能会导致页面或应用程序的启动时间变长。

  • 常用于关键资源:预加载通常用于那些至关重要的资源,如初始页面渲染所需的 CSS、JavaScript 文件,或者用户界面中的核心图像资源。

适用场景:

  • 在页面初始化时需要确保某些资源的快速响应,比如页面布局所依赖的 CSS 文件。

  • 需要快速访问的静态资源,比如首页的重要图片或脚本。

🛈Note

  • 预加载可以用于确保关键资源(如样式文件、页面结构相关的脚本)在页面加载时已经准备好,提升用户的首屏体验。

  • 对于后端而言我可用将非常可能会用到的大数据预先存储于Redis等内存数据库中。

  • 对于游戏开发而言,线性的地图链接,可用将用户即将到达的地方预加载。

懒加载(Lazy Loading)

懒加载则是指在资源确实需要时才进行加载,即资源只有在用户请求或访问到时才会被加载到内存中。这种方式可以有效减少初始加载的时间和资源开销,提升应用程序或网页的性能,特别是在处理大量资源(如图片、视频等)时非常有用。

特点:

  • 按需加载:只有当资源确实需要时,才会进行加载。

  • 减少初始加载时间:通过避免不必要的资源加载,可以显著减少页面初始加载的时间,提升用户体验。

  • 适用于大文件或延迟加载的资源:尤其适用于那些不会立即使用的资源,例如滚动到页面下方才会展示的图片。

  • 可能引入延迟:当资源需要使用时才加载,可能会引起短暂的延迟,尤其是在网络速度较慢时。

适用场景:

  • 资源体积较大且不一定会立即使用的场景,比如用户长页面滚动中的图片、视频。

  • 需要优化页面的首屏加载速度,减少不必要的资源请求

🛈Note

懒加载则用于优化大文件或非关键资源(如图片、视频、第三方库等)的加载,确保在用户需要时才获取这些资源,减少初始加载时间和带宽占用。

这种处理可以提高系统的整体性能,不会因为大文件而导致系统的卡顿。

特性 预加载(Preloading) 懒加载(Lazy Loading)
加载时机 初始化时提前加载资源 需要使用时才加载资源
初始性能 初始加载时间较长,影响页面启动速度 初始加载时间短,页面快速启动
资源访问 访问资源时无需等待,立即可用 访问资源时可能会有短暂的加载延迟
资源利用率 可能加载了暂时不需要的资源,浪费带宽 只加载需要的资源,节省带宽
适用场景 核心资源(如样式、脚本)或用户界面 大量图片、视频、滚动加载的资源

现实中的应用

  • 网页优化:在网页优化中,通常会将首屏需要的资源进行预加载,以保证页面渲染速度,而将页面下方或其他次要资源通过懒加载的方式进行处理。

  • 单页应用(SPA):在单页应用中,开发者可以预加载某些关键页面的静态资源,而将其他不经常访问的页面组件懒加载,提升应用的响应速度和用户体验。

协议

常见的20种协议

  1. DNS(Domain Name System):用于将域名解析为IP地址,帮助浏览器等客户端找到服务器的实际位置。

  2. IMAP(Internet Message Access Protocol):用于从服务器上接收电子邮件,并允许在服务器上管理邮件。

  3. POP3(Post Office Protocol 3):另一种接收电子邮件的协议,通常用于将邮件下载到本地计算机上并从服务器删除。

  4. DHCP(Dynamic Host Configuration Protocol):用于自动分配IP地址、子网掩码、网关等网络配置信息,简化设备的网络配置。

  5. SSH(Secure Shell):用于通过安全加密的连接远程登录和控制服务器,通常用于系统管理员远程管理服务器。

  6. Telnet:一种早期的远程登录协议,与SSH类似,但数据传输不加密,安全性较差。

  7. NTP(Network Time Protocol):用于同步计算机系统之间的时间,使设备保持准确的时间。

  8. SNMP(Simple Network Management Protocol):用于管理和监控网络设备,如路由器、交换机、服务器等。

  9. SFTP(SSH File Transfer Protocol):基于SSH的安全文件传输协议,比FTP更安全。

  10. TFTP(Trivial File Transfer Protocol):一种简化的文件传输协议,通常用于局域网中的设备配置和启动,功能较少且不提供加密。

  11. RTP(Real-time Transport Protocol):用于音视频等实时媒体数据的传输,通常与VoIP和流媒体服务一起使用。

  12. RTSP(Real-Time Streaming Protocol):用于控制媒体流的传输,如播放、暂停和停止流媒体视频的协议。

  13. MMS(Microsoft Media Server Protocol):一种用于流媒体内容分发的协议,主要由微软开发并用于Windows Media服务。

  14. LDAP(Lightweight Directory Access Protocol):用于访问和维护分布式目录信息服务(如用户身份认证、组织目录等)。

  15. SIP(Session Initiation Protocol):用于建立、修改和终止多媒体通信会话(如语音和视频呼叫)。

  16. HTTPS(HyperText Transfer Protocol Secure):是HTTP的安全版本,通过TLS(或SSL)加密数据传输,确保数据安全性和隐私。

  17. ICMP(Internet Control Message Protocol):用于发送网络状态报告和错误消息,例如通过ping命令测试网络连接时使用。

  18. UDP(User Datagram Protocol):一种简单的、无连接的数据传输协议,比TCP更轻量,但没有数据重传和保证顺序的机制,适用于实时应用如视频流和在线游戏。

  19. RDP(Remote Desktop Protocol):由微软开发的协议,用于远程连接到另一台计算机进行桌面操作。

  20. SMB(Server Message Block):主要用于网络文件共享,特别是在Windows系统中。

网络协议的作用

广义上,网络协议的作用是**定义通信规则**,确保不同设备、系统、软件在网络上能够互相**理解**并**交换数据**。具体来说,网络协议的作用可以归纳为以下几个方面:

1. 数据传输管理:协议规定了如何将数据在设备之间进行传输,包括数据的格式、大小、顺序等。例如,TCP协议通过分组来确保数据完整传输,而HTTP协议规定了如何在Web浏览器与服务器之间传输网页内容。

数据在网络中传输一定是需要协议的,协议能保证数据传输的可靠性,协议是整个互联网甚至是计算机的基础

2. 数据完整性和可靠性:许多协议(如TCP、HTTPS)通过校验、确认、重传等机制,确保数据在传输过程中不丢失或损坏,并提供确认机制确保数据正确到达目的地。

3. 设备间的互通性:协议为不同设备、不同操作系统、不同软件的通信提供了统一标准,确保它们能够互相理解并有效合作。例如,FTP协议允许不同操作系统的计算机通过统一的规则来共享文件。

4. 安全性保障:一些协议(如HTTPS、SSH、SFTP)为数据传输提供加密和认证,防止数据在传输过程中被窃取或篡改,确保通信的机密性和完整性。

5. 资源访问和共享:许多协议(如FTP、HTTP、SMB)允许不同设备之间共享文件、网页、资源等数据。它们通过定义访问权限、传输方式,使得网络资源能够在多设备间安全高效地共享。

6. 网络控制与管理:一些协议(如ICMP、SNMP、DHCP)用于监控、管理和维护网络设备及其性能,确保网络的正常运行、故障排查以及设备配置。

7. 实时通信:某些协议(如WebSocket、RTP、SIP)支持低延迟、实时的双向通信,适用于视频会议、VoIP电话、在线游戏等场景。

8. 身份验证与授权:某些协议(如LDAP、OAuth)用于用户身份验证和授权,确保只有经过授权的用户才能访问系统资源或服务。

9. 多媒体传输:一些专门的协议(如RTSP、MMS)帮助有效传输音频、视频等多媒体数据,支持实时的流媒体播放和控制。

总结而言,网络协议是**通信规则和标准的集合**,它们规定了数据在网络上传输的**格式、顺序、安全性、确认机制**,从而确保各种网络设备之间可以**安全、高效、可靠**地进行信息交换和协同工作。

本地协议

由于本地协议大多数是文件访问与通信的,下面也就只列出常见的文件访问和通信协议

  1. file://
  • 用途:用于访问本地文件系统上的文件和目录。

  • 适用系统:Linux、Windows

  • 说明:这是最常见的本地文件资源访问协议,用于在浏览器、文件管理器或应用程序中打开本地文件。

  1. smb://
  • 用途:用于通过 SMB(Server Message Block)协议访问局域网中的共享文件夹和打印机。

  • 适用系统:Linux、Windows

  • 说明:主要用于Windows网络共享,但Linux上也可以通过CIFS(Common Internet File System)挂载网络共享目录。

  1. ftp://
  • 用途:通过FTP协议访问远程或本地的FTP服务器上的文件。

  • 适用系统:Linux、Windows

  • 说明:通常用于文件传输,但在局域网中也可以用于访问本地FTP服务器的文件资源。

  1. nfs://
  • 用途:通过NFS(Network File System)协议在网络中共享和访问文件。

  • 适用系统:Linux(原生支持),Windows(需要安装NFS客户端)

  • 说明:主要在Linux和UNIX系统中广泛使用,但Windows可以通过安装NFS客户端来支持NFS协议的文件访问。

  1. cifs://
  • 用途:用于通过 CIFS 协议访问网络共享,CIFS 是 SMB 协议的一种扩展。

  • 适用系统:Linux、Windows

  • 说明:类似于 smb://,但在Linux系统中可以使用 mount -t cifs 挂载 Windows 共享目录。

  1. dav:// 或 webdav://
  • 用途:用于通过WebDAV协议访问基于HTTP的文件系统。

  • 适用系统:Linux、Windows

  • 说明:WebDAV 是 HTTP 的扩展,支持文件的读写操作,广泛用于云存储服务和网络文件系统。

  1. sshfs://
  • 用途:通过SSH协议(Secure Shell)在网络中挂载和访问远程文件系统。

  • 适用系统:Linux、Windows(需要安装工具如WinSCP或SSHFS)

  • 说明:允许通过安全加密的SSH连接将远程文件系统挂载为本地文件系统,常见于Linux,Windows需要第三方软件支持。

  1. afs://
  • 用途:通过AFS(Andrew File System)访问分布式文件系统。

  • 适用系统:Linux、Windows(需要特定客户端)

  • 说明:AFS 是一种分布式文件系统,支持跨网络的文件共享,但需要特定的客户端软件才能使用。