基础概念回忆录(一)

avatar
作者
猴君
阅读量:0

文章目录


一、进程和线程的区别?

进程(Process)和线程(Thread)都是操作系统中重要的概念,它们在多任务处理和并发执行方面发挥着核心作用。下面是进程和线程的一些主要区别:

进程(Process)

进程是程序的一次执行过程,它是系统进行资源分配和调度的基本单位。
切换不同的进程会涉及切换不同的地址空间,因此上下文切换的开销较大。
进程之间相对独立,可以并发执行,但是进程之间的通信和同步较为复杂。

线程(Thread)

线程是进程内的一个执行单元,它是处理器调度和分派的基本单位。
线程之间的上下文切换开销较小,因为它们共享相同的地址空间。
线程之间的并发性较好,但需要注意线程安全性和同步问题。

总结

资源消耗:进程占用更多的资源,而线程则更加轻量级。
切换成本:线程间的切换成本较低,而进程间的切换成本较高。
通信方式:进程间通信比较复杂,而线程间通信直接且简单。
并发执行:线程更适合于高并发环境下的程序设计。

通常情况下,一个程序启动时会创建一个初始进程,在这个进程中可以创建多个线程。进程适合于需要隔离的应用场景,而线程适合于需要高度并发的应用场景。

二、操作系统调度的是进程还是线程?

在现代操作系统中,调度既可以针对进程也可以针对线程,这取决于操作系统的具体设计和实现。

调度级别

内核级调度:

操作系统内核负责调度进程和线程。
在多线程环境中,内核可以调度线程,将处理器时间分配给不同的线程。
内核级线程的上下文切换和通信通常由操作系统内核完成。

用户级调度:

用户级线程由应用程序或库来调度,而不是由操作系统内核直接管理。
用户级线程的上下文切换和通信不需要内核介入,这可以减少上下文切换的开销。
用户级线程通常在一个进程内部实现,并且只能并发执行到进程被调度的程度。

综合调度

在大多数现代操作系统中,操作系统通常同时支持进程和线程的调度。这意味着,操作系统首先调度进程,然后在选定的进程中调度线程。这种模型允许更细粒度的并发控制,并且能够更有效地利用系统资源。

实例

Linux:

Linux 内核支持多线程调度,线程作为轻量级进程(Lightweight Process, LWP)来实现。
Linux 使用完全抢占式调度策略,可以调度进程中的任何线程。

Windows:

Windows 操作系统也支持多线程调度。
Windows 的线程调度机制允许在多核或多处理器系统上实现高效的任务并行执行。

总之,现代操作系统通常支持多进程和多线程,并且能够在进程和线程级别进行调度。调度的具体实现取决于操作系统的具体设计和实现细节。

三、TCP和UDP的区别?

TCP(Transmission Control Protocol,传输控制协议)和 UDP(User Datagram Protocol,用户数据报协议)是两种广泛使用的传输层协议,它们在 OSI 模型中处于第四层。这两种协议各有特点,适用于不同的应用场景。下面是 TCP 和 UDP 的主要区别:

TCP (Transmission Control Protocol)

面向连接:

TCP 是一种面向连接的协议,意味着在数据传输之前,必须先建立一个连接。
建立连接的过程称为三次握手,确保双方准备好进行数据传输。

可靠性:

TCP 提供可靠的数据传输服务,确保数据包按序到达接收方。
TCP 使用确认应答机制来确保数据包被成功接收,如果未收到确认应答,则会重新发送

数据包。

TCP 还能检测丢失的数据包并重新发送。

排序:

TCP 能够确保数据包按序到达。

开销:

相对于 UDP,TCP 的开销较大,因为它需要进行连接的建立、维护和释放。

应用场景:

TCP 适用于需要可靠数据传输的应用,例如 Web 浏览、文件传输 (FTP)、电子邮件 (SMTP) 等。

UDP (User Datagram Protocol)

无连接:

UDP 是一种无连接的协议,发送数据前无需建立连接。
发送方直接发送数据报,接收方接收数据报。

不可靠:

UDP 不保证数据报能够到达接收方,也不保证数据报按序到达。
UDP 不提供重传机制,如果数据包丢失,发送方不会知道也不会重新发送。

低开销:

UDP 的头部开销小,只有 8 字节,因此处理速度快,延迟低。

广播和多播:

UDP 支持广播和多播,可以向多个接收方同时发送数据。

应用场景:

UDP 适用于实时应用,例如语音通话 (VoIP)、视频会议、在线游戏、实时流媒体等,这些应用通常对延迟敏感而对数据丢失的容忍度较高。

总结

可靠性:TCP 提供可靠的传输,而 UDP 提供的是尽力而为的服务。
连接性:TCP 是面向连接的,而 UDP 是无连接的。
开销:TCP 的开销较大,而 UDP 的开销较小。
应用场景:TCP 更适合于需要可靠数据传输的应用,而 UDP 更适合于实时性和低延迟要求高的应用。
选择使用哪种协议取决于具体的应用需求。对于需要高可靠性的应用,TCP 是更好的选择;而对于实时性要求高、可以容忍一定程度数据丢失的应用,则通常会选择 UDP。

四、端口范围是多少?

端口范围是指在网络通信中用于标识特定服务或进程的端口号的数值范围。端口号是一个 16 位的无符号整数,因此端口范围是从 0 到 65535。

端口范围划分

端口号被划分为以下几个部分:

公认端口(Well-Known Ports):

范围:0 到 1023
这些端口被保留用于广为人知的服务,例如 HTTP(80)、HTTPS(443)、FTP(21)、SSH(22)等。
这些端口通常由 IANA(Internet Assigned Numbers Authority)分配给特定的服务或协议。

注册端口(Registered Ports):

范围:1024 到 49151
这些端口也被 IANA 分配给特定的服务或应用程序,但不像公认端口那样广泛使用。
许多常见的服务和应用使用注册端口。

动态或私有端口(Dynamic or Private Ports):

范围:49152 到 65535
这些端口通常用于临时端口分配,例如客户端发起的出站连接。
这些端口可供任何服务使用,但通常用于临时或私有的服务。

为什么端口范围是0-65535?

端口范围之所以是 0 到 65535,是因为端口号是一个 16 位的无符号整数。在计算机科学中,一个 n 位的无符号整数可以表示的最大值是 2n - 1,因此,对于 16 位的无符号整数,它可以表示的范围是从 0 到 216 - 1。

具体计算如下:

216 = 65536
216 - 1 = 65535

所以,16 位无符号整数的最大值是 65535,加上最小值 0,端口范围就是 0 到 65535。

端口范围的背景

端口号用于标识网络通信中的特定服务或进程。在 TCP/IP 协议栈中,端口是传输层的一部分,用于区分不同的服务。每个服务或进程都有一个唯一的端口号,以便网络通信中的数据包能够正确地被路由到目标服务或进程。

为什么选择 16 位?

历史原因:早期的计算机网络设计时,16 位被认为足够大,可以支持大量的服务,并且在当时的技术限制下,16 位端口已经是一个合理的折衷方案。
实用性:65536 个端口足以满足大多数服务的需求,并且为将来可能出现的新服务留有足够的空间。

效率:16 位端口在处理数据包时更加高效,因为它们的大小适中,既不太大导致不必要的开销,也不太小以至于限制了服务的数量。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!