53k49 分钟

# 地址处理 # 大端地址和小端地址 # 大端法和小端法 大端法(Big-Endian) 在大端法中,一个多字节值的高位字节(即 “大端”)存储在内存的低地址端,而低位字节(即 “小端”)存储在高地址端。这种存储顺序使得大端法在字节对齐的内存访问中更为直观。 小端法(Little-Endian) 小端法与大端法相反,低位字节存储在内存的低地址端,而高位字节存储在高地址端。这种存储顺序在某些处理器架构中更为常见,如 x86 和 x64 架构。 TCP/IP 协议中的字节序 根据 TCP/IP 协议,当数据在网络上传输时,统一使用网络字节序,即大端法。这确保了不同主机间数据交换
32k29 分钟

# 应用层 在网络通信的层次结构中,应用层起着核心作用,它提供了用户与网络服务交互的平台。开发者可以依据具体的应用需求,实现定制化的逻辑和功能,使得网络服务在隐藏了底层复杂性的同时,能够灵活适应多样化的应用场景。 应用层包含了多种高级网络通信协议,如 HTTP 协议用于网页浏览、SMTP 协议用于电子邮件的发送、FTP 协议用于文件的传输等。这些协议确立了数据交换的标准格式和交互规则,促进了不同系统和程序之间的无缝通信。在众多协议中,HTTP 协议因其在 Web 开发中的广泛应用而尤为关键,它定义了客户端与服务器之间请求和响应的通信机制。 # HTTP 的概述 在 1989 年,瑞士 CERN
31k29 分钟

# 线程的同步和互斥 在多线程编程中,共享资源的使用是提高程序运行效率的关键,但同时也带来了一系列挑战。由于线程间缺乏隔离机制,共享同一内存地址的操作可能导致所谓的 “竞争条件”,这是指多个线程同时访问并试图修改同一资源时可能发生的问题。这种情况会导致程序的执行结果与预期出现显著偏差。 例如,在以下代码示例中,两个线程被设计为对一个共享变量进行递增操作,每个线程执行一百万次。然而,实际执行结果往往与预期的两百万次递增不符。 #include <pthread.h>#define TIMES 1000000int global = 0;void *increment(voi
32k29 分钟

# 线程概述 # 从进程到线程 在计算机系统中,多进程设计允许用户在同一台计算机上同时处理多个独立的工作任务。操作系统负责管理这些进程,通过调度算法合理地在它们之间分配 CPU 资源、内存、文件等资源。使用多进程设计不仅可以提高单个应用的吞吐量和响应时间,还可以在某个进程因死循环或等待 IO 操作而无法完成任务时,由操作系统调度其他进程来完成任务或响应用户请求。 例如,在文本处理程序中,可以并发地处理用户输入和保存已完成的文件任务。然而,随着进程数量的增加,系统在切换不同进程时会消耗更多的时间。这是因为进程执行过程中,CPU 寄存器中需要保存一些必要的信息,如堆栈、代码段等,这些状态被称为上下
28k25 分钟

# 信号基础 # 中断 中断是计算机系统中硬件和操作系统之间进行通信的一种基础机制,它使得系统能够响应紧急事件或需要立即处理的情况。中断分为两大类: 硬件中断:由硬件设备触发,例如键盘、鼠标、磁盘驱动器等。当这些设备需要 CPU 注意时,它们会发送一个信号给 CPU,请求进行某些操作,如数据传输或状态变更。 软件中断:由软件程序触发,通常是通过执行特定的中断指令来实现。软件中断用于实现系统调用,允许用户态程序请求操作系统提供的服务。 中断机制允许硬件设备或软件程序在需要时通知 CPU,从而确保了系统能够及时响应外部事件或程序请求。CPU 接收到中断信号后,会保存当前状态,转而执行相应的中断
17k16 分钟

# 管道 进程间通信(IPC)是多任务操作系统中的关键功能,允许进程之间交换信息。一种自然的 IPC 方式是利用文件系统作为中介: 基于文件的通信:在这种方式中,一个进程通过打开并读写文件来存储信息,而另一个进程则打开同一个文件来读取这些信息。尽管这种方法简单直观,但它依赖于磁盘 I/O 操作,这可能导致较低的通信效率。 为了提高通信效率,操作系统提供了一种特殊的文件系统对象,即 命名管道(Named Pipe,FIFO): 命名管道:这是一种特殊的文件,存在于文件系统中,但它允许进程通过内核维护的缓冲区直接交换数据,而不是通过磁盘。这种方式减少了磁盘 I/O 操作,从而提
38k34 分钟

# 进程控制 # 孤儿进程 在操作系统中,如果父进程在子进程退出之前终止,子进程的状态会发生变化,成为所谓的 “孤儿进程”。在这种情况下,操作系统会将孤儿进程自动分配给 PID 为 1 的特殊进程,即 init 进程,作为其新的父进程。 孤儿进程的处理: 收养机制:操作系统确保所有孤儿进程都有一个父进程。当父进程退出时,操作系统会介入,将孤儿进程的父进程设置为 init 进程(PID 为 1)。 资源清理:当孤儿进程退出时,它的资源清理工作将由其新的父进程 ——init 进程来完成。这确保了系统资源得到适当的释放和回收。 init 进程的角色:init 进程:在类 UNIX 系统中,ini
12k11 分钟

# 进程 # 操作系统的背景 批处理系统: 操作系统的最初原型是批处理系统,这种系统允许操作员将所有任务集中起来,由系统自动读取并执行。当一个任务完成后,系统会自动执行下一个任务。然而,批处理系统的主要问题是在任务执行过程中经常需要等待 IO 操作,导致 CPU 频繁空闲。 多道程序设计: 为了解决 CPU 空闲的问题,引入了多道程序设计技术。在这种设计中,内存被划分为多个区域,每个区域存储一个任务的指令和数据。这样,当一个任务等待 IO 操作时,另一个任务可以使用 CPU,从而提高 CPU 的利用率。 分时系统: 除了提高 CPU 利用率,程序员还希望计算机能够快速响应他们的操作。这种需求催
9.4k9 分钟

# 管道 # 通信的方式 在通信系统中,根据数据传输的方向和方式,通信可以被分为单工、双工和半双工三种模式。 通信方式 描述 单工通信 永远只能由一方向另一方发送数据 半双工通信 双方都可以收发数据,但是在同一时刻只能一端发另一端收 全双工通信 两端可以同时收发数据 # 命名管道 Linux 中的命名管道(named pipe)是一种特殊类型的文件,又称为 FIFO。它为进程提供一个独立于文件的实际 I/O 来源和目的地。在 Linux 系统中它是一种重要的进程间通信(IPC)的机制。 管道虽然看起来像是磁盘上的文件,但实际上是一个数据流或缓冲区,与匿名管
19k18 分钟

# 无缓冲文件流 带用户态缓冲区的文件流: 这类文件流属于语言的库函数,是对系统调用的封装。 它们使用用户态缓冲区来减少系统调用的次数,提高 I/O 操作的效率。 用户程序通过缓冲区与文件进行交互,而不需要直接进行系统调用。 用户态缓冲区的作用: 用户态缓冲区作为数据传输的中间层,由语言的标准库管理。 它的存在简化了用户程序的 I/O 操作,因为用户程序不需要关心缓冲区的内部管理。 无缓冲的文件 I/O: 在某些情况下,应用程序可能需要直接与内核进行数据交互,而不是通过用户态缓冲区。 无缓冲的 I/O 通常使用系统调用直接进行,这种 I&#x