计算机基础知识(持续更新)
程序运行的本质
计算机运行的本质是函数,而切换线程其实也是调用函数
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种协议
DNS(Domain Name System):用于将域名解析为IP地址,帮助浏览器等客户端找到服务器的实际位置。
IMAP(Internet Message Access Protocol):用于从服务器上接收电子邮件,并允许在服务器上管理邮件。
POP3(Post Office Protocol 3):另一种接收电子邮件的协议,通常用于将邮件下载到本地计算机上并从服务器删除。
DHCP(Dynamic Host Configuration Protocol):用于自动分配IP地址、子网掩码、网关等网络配置信息,简化设备的网络配置。
SSH(Secure Shell):用于通过安全加密的连接远程登录和控制服务器,通常用于系统管理员远程管理服务器。
Telnet:一种早期的远程登录协议,与SSH类似,但数据传输不加密,安全性较差。
NTP(Network Time Protocol):用于同步计算机系统之间的时间,使设备保持准确的时间。
SNMP(Simple Network Management Protocol):用于管理和监控网络设备,如路由器、交换机、服务器等。
SFTP(SSH File Transfer Protocol):基于SSH的安全文件传输协议,比FTP更安全。
TFTP(Trivial File Transfer Protocol):一种简化的文件传输协议,通常用于局域网中的设备配置和启动,功能较少且不提供加密。
RTP(Real-time Transport Protocol):用于音视频等实时媒体数据的传输,通常与VoIP和流媒体服务一起使用。
RTSP(Real-Time Streaming Protocol):用于控制媒体流的传输,如播放、暂停和停止流媒体视频的协议。
MMS(Microsoft Media Server Protocol):一种用于流媒体内容分发的协议,主要由微软开发并用于Windows Media服务。
LDAP(Lightweight Directory Access Protocol):用于访问和维护分布式目录信息服务(如用户身份认证、组织目录等)。
SIP(Session Initiation Protocol):用于建立、修改和终止多媒体通信会话(如语音和视频呼叫)。
HTTPS(HyperText Transfer Protocol Secure):是HTTP的安全版本,通过TLS(或SSL)加密数据传输,确保数据安全性和隐私。
ICMP(Internet Control Message Protocol):用于发送网络状态报告和错误消息,例如通过ping命令测试网络连接时使用。
UDP(User Datagram Protocol):一种简单的、无连接的数据传输协议,比TCP更轻量,但没有数据重传和保证顺序的机制,适用于实时应用如视频流和在线游戏。
RDP(Remote Desktop Protocol):由微软开发的协议,用于远程连接到另一台计算机进行桌面操作。
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)帮助有效传输音频、视频等多媒体数据,支持实时的流媒体播放和控制。
总结而言,网络协议是**通信规则和标准的集合**,它们规定了数据在网络上传输的**格式、顺序、安全性、确认机制**,从而确保各种网络设备之间可以**安全、高效、可靠**地进行信息交换和协同工作。
本地协议
由于本地协议大多数是文件访问与通信的,下面也就只列出常见的文件访问和通信协议
file://
用途:用于访问本地文件系统上的文件和目录。
适用系统:Linux、Windows
说明:这是最常见的本地文件资源访问协议,用于在浏览器、文件管理器或应用程序中打开本地文件。
smb://
用途:用于通过 SMB(Server Message Block)协议访问局域网中的共享文件夹和打印机。
适用系统:Linux、Windows
说明:主要用于Windows网络共享,但Linux上也可以通过CIFS(Common Internet File System)挂载网络共享目录。
ftp://
用途:通过FTP协议访问远程或本地的FTP服务器上的文件。
适用系统:Linux、Windows
说明:通常用于文件传输,但在局域网中也可以用于访问本地FTP服务器的文件资源。
nfs://
用途:通过NFS(Network File System)协议在网络中共享和访问文件。
适用系统:Linux(原生支持),Windows(需要安装NFS客户端)
说明:主要在Linux和UNIX系统中广泛使用,但Windows可以通过安装NFS客户端来支持NFS协议的文件访问。
cifs://
用途:用于通过 CIFS 协议访问网络共享,CIFS 是 SMB 协议的一种扩展。
适用系统:Linux、Windows
说明:类似于 smb://,但在Linux系统中可以使用 mount -t cifs 挂载 Windows 共享目录。
dav://
或 webdav://
用途:用于通过WebDAV协议访问基于HTTP的文件系统。
适用系统:Linux、Windows
说明:WebDAV 是 HTTP 的扩展,支持文件的读写操作,广泛用于云存储服务和网络文件系统。
sshfs://
用途:通过SSH协议(Secure Shell)在网络中挂载和访问远程文件系统。
适用系统:Linux、Windows(需要安装工具如WinSCP或SSHFS)
说明:允许通过安全加密的SSH连接将远程文件系统挂载为本地文件系统,常见于Linux,Windows需要第三方软件支持。
afs://
用途:通过AFS(Andrew File System)访问分布式文件系统。
适用系统:Linux、Windows(需要特定客户端)
说明:AFS 是一种分布式文件系统,支持跨网络的文件共享,但需要特定的客户端软件才能使用。