应用层 在网络通信的层次结构中,应用层起着核心作用,它提供了用户与网络服务交互的平台。开发者可以依据具体的应用需求,实现定制化的逻辑和功能,使得网络服务在隐藏了底层复杂性的同时,能够灵活适应多样化的应用场景。 应用层包含了多种高级网络通信协议,如 HTTP 协议用于网页浏览、SMTP 协议用于电子邮件的发送、FTP 协议用于文件的传输等。这些协议确…
线程的同步和互斥 在多线程编程中,共享资源的使用是提高程序运行效率的关键,但同时也带来了一系列挑战。由于线程间缺乏隔离机制,共享同一内存地址的操作可能导致所谓的“竞争条件”,这是指多个线程同时访问并试图修改同一资源时可能发生的问题。这种情况会导致程序的执行结果与预期出现显著偏差。 例如,在以下代码示例中,两个线程被设计为对一个共享变量进行递增操作,…
线程概述 从进程到线程 在计算机系统中,多进程设计允许用户在同一台计算机上同时处理多个独立的工作任务。操作系统负责管理这些进程,通过调度算法合理地在它们之间分配 CPU 资源、内存、文件等资源。使用多进程设计不仅可以提高单个应用的吞吐量和响应时间,还可以在某个进程因死循环或等待 IO 操作而无法完成任务时,由操作系统调度其他进程来完成任务或响应用户…
信号基础 中断 中断是计算机系统中硬件和操作系统之间进行通信的一种基础机制,它使得系统能够响应紧急事件或需要立即处理的情况。中断分为两大类: 硬件中断:由硬件设备触发,例如键盘、鼠标、磁盘驱动器等。当这些设备需要 CPU 注意时,它们会发送一个信号给 CPU,请求进行某些操作,如数据传输或状态变更。 软件中断:由软件程序触发,通常是通过执行特定的中…
管道 进程间通信(IPC)是多任务操作系统中的关键功能,允许进程之间交换信息。一种自然的 IPC 方式是利用文件系统作为中介: 基于文件的通信:在这种方式中,一个进程通过打开并读写文件来存储信息,而另一个进程则打开同一个文件来读取这些信息。尽管这种方法简单直观,但它依赖于磁盘 I/O 操作,这可能导致较低的通信效率。 为了提高通信效率,操作系统提供…
进程控制 孤儿进程 在操作系统中,如果父进程在子进程退出之前终止,子进程的状态会发生变化,成为所谓的“孤儿进程”。在这种情况下,操作系统会将孤儿进程自动分配给 PID 为 1 的特殊进程,即 init 进程,作为其新的父进程。 孤儿进程的处理: 收养机制:操作系统确保所有孤儿进程都有一个父进程。当父进程退出时,操作系统会介入,将孤儿进程的父进程设置…
进程 操作系统的背景 批处理系统: 操作系统的最初原型是批处理系统,这种系统允许操作员将所有任务集中起来,由系统自动读取并执行。当一个任务完成后,系统会自动执行下一个任务。然而,批处理系统的主要问题是在任务执行过程中经常需要等待 IO 操作,导致 CPU 频繁空闲。 多道程序设计: 为了解决 CPU 空闲的问题,引入了多道程序设计技术。在这种设计中…
管道 通信的方式 在通信系统中,根据数据传输的方向和方式,通信可以被分为单工、双工和半双工三种模式。 通信方式 描述 单工通信 永远只能由一方向另一方发送数据 半双工通信 双方都可以收发数据, 但是在同一时刻只能一端发另一端收 全双工通信 两端可以同时收发数据 命名管道 Linux 中的命名管道(named pipe)是一种特殊类型的文件, 又称为…
无缓冲文件流 带用户态缓冲区的文件流: 这类文件流属于语言的库函数,是对系统调用的封装。 它们使用用户态缓冲区来减少系统调用的次数,提高 I/O 操作的效率。 用户程序通过缓冲区与文件进行交互,而不需要直接进行系统调用。 用户态缓冲区的作用: 用户态缓冲区作为数据传输的中间层,由语言的标准库管理。 它的存在简化了用户程序的 I/O 操作,因为用户程…
文件系统编程概述 三种类型的函数对比 ISO C 标准库函数: 这些函数是由 ISO(国际标准化组织)提供的,具有最好的通用性和跨平台性。在所有遵循 ISO 标准的现代 C 编译平台上,这些函数的行为都是一致的。 这些函数提供了一些通用的功能实现,例如:printf、scanf、fopen、malloc 等。 它们在 man 手册的第 3 部分(3…