
线程与进程
文章平均质量分 91
线程与进程
猫猫的小茶馆
用心做开发。专注于嵌入式技术,熟悉linux驱动开发,Linux系统搭建与移植,fpga,dsp,arm开发,pcb工艺,汇集了工作多年遇到的问题,与一些总结,有些是linux内核的源码级别的讲解,同时整个博客构建成了嵌入式的知识体系,专注于服务从事嵌入式软件开发的朋友。
展开
-
【进程与线程】Linux文件 I/O 编程中的生产者与消费者案例
生产者与消费者问题是经典的多线程同步问题,通常用于描述两个进程之间共享资源的协作。在 Linux 文件 I/O 中,我们这里使用来实现生产者与消费者模型。有名管道是一个特殊的文件,(非亲缘进程)。原创 2025-02-18 05:00:39 · 387 阅读 · 0 评论 -
【进程与线程】Linux 线程、同步以及互斥
线程是操作系统与多线程编程的基础知识。系统为每个用户进程创建一个来描述该进程:该结构体中包含了一个指针指向该进程的虚拟地址空间映射表:实际上和地址空间映射表一起用来表示一个进程。由于进程的地址空间是私有的,因此在进程间上下文切换时,系统开销比较大,因此,为了提高系统的性能,许多操作系统规范里引入了轻量级进程的概念,也被称为线程。在同一个进程中创建的线程共享该进程的地址空间,Linux里同样用来描述一个线程。线程和进程都参与统一的调度。接下来我们会详细的介绍线程共享资源和私有资源,还有线程库如。原创 2025-02-17 03:57:46 · 2132 阅读 · 0 评论 -
【进程与线程】System V IPC:消息队列(Message Queue)
消息队列是先进先出的队列,实际中消息队列允许根据消息类型进行读取,不完全是FIFO。消息的格式为:消息类型加消息正文 ——> 例如,在C语言中如何使用struct来定义消息,其中必须包含一个长整型的消息类型字段,然后是消息正文。因此,消息队列并不是严格的FIFO,但默认情况下可能是按发送顺序接收的,除非指定了不同的消息类型优先级。消息队列的优点在于可以异步通信,数据有结构,缺点是需要内核操作,效率不如共享内存,且存在系统限制(如最大消息数、消息大小限制)。,即使进程结束,消息队列仍然存在,除非显式删除;原创 2025-02-16 19:50:18 · 766 阅读 · 0 评论 -
【进程与线程】信号量(Semaphore)
信号量不传输数据,只用于同步,它的用途是协调进程,而不是传递信息。所以代码中要时刻留意信号量的初始化和释放,需要正确管理信号量,避免资源泄漏。信号量是 System V IPC 中实现进程同步的核心工具,通过 PV 操作和计数器机制协调多进程对共享资源的访问。涉及对信号量的底层实现,以及信号量集如何在内核中管理。理解内核中信号量的工作原理是非常必要的环节。IPC创建的是信号灯集:System V IPC中的信号量不是单个而是以集合的形式存在。下面的代码中会创建信号量集,并初始化其中的信号量。原创 2025-02-15 05:31:39 · 821 阅读 · 0 评论 -
【进程与线程】共享内存(Shared Memory)
并且,共享内存的生命周期独立于进程,需要显式删除,否则会一直存在,可能导致资源泄漏 ——> 同步机制与异步机制不同,在使用共享内存的过程中尤其需要注意这一点,比如需要使用信号量或互斥锁来避免数据不一致。共享内存的读操作通常不会阻塞,因为数据一旦写入就存在,但如果没有同步机制,读进程可能读到不完整的数据,或者写进程覆盖数据导致问题。的作用只是将内存区域置零,但共享内存本身仍然存在。阻塞的原因则是因为进程在读取时没有数据可读,但共享内存本身并不管理数据的可用性,需要额外的同步机制,比如信号量,来协调读写操作。原创 2025-02-15 03:27:44 · 872 阅读 · 0 评论 -
【进程与线程】信号(Signal)
/ 注册 SIGUSR1 的处理函数// 阻塞等待信号pause();// 暂停进程,直到收到信号return 0;# 编译运行# 输出 PID 后,在另一个终端发送信号:五. 信号的优缺点与适用场景用户触发中断如Ctrl+C发送SIGINT终止前台进程,Ctrl+Z发送SIGTSTP暂停进程。内核异常处理内存错误(SIGSEGV)、算术错误(SIGFPE)、非法指令(SIGILL)等异常事件。进程间通信通过kill()系统调用发送SIGUSR1SIGUSR2触发自定义逻辑。原创 2025-02-13 01:32:03 · 1032 阅读 · 0 评论 -
【进程与线程】有名管道(FIFO)
有名管道(FIFO)和无名管道的主要区别:无名管道只能用于有亲缘关系的进程,而有名管道(FIFO)通过文件系统中的命名文件实现,允许无关进程通信(非亲缘进程间的 通信)。这篇文章是解释有名管道FIFO的底层原理:包括内核如何管理FIFO的缓冲区、读写机制以及文件系统的交互形式。附上代码:包括FIFO文件的创建过程,比如使用mkfifo函数或命令,以及它在文件系统中的表现。此外,内核如何维护FIFO的缓冲区,处理阻塞和非阻塞模式,以及数据原子性等问题都需要详细说明。原创 2025-02-12 16:04:28 · 1075 阅读 · 0 评论 -
【进程与线程】无名管道(匿名管道,Pipe)
无名管道主要用于具有亲缘关系的进程间通信,比如父子进程,它通过文件描述符进行读写,是一种半双工的通信方式(即数据只能单向流动)。无名管道在内核中的实现机制涉及到内核中的数据结构,比如管道缓冲区。当调用pipe()函数时,内核会创建一个管道,并返回两个文件描述符,一个用于读,一个用于写。这两个描述符指向同一个管道对象,其中包含一个环形缓冲区,用于存储数据。当写端向管道写入数据时,数据被复制到内核缓冲区;读端从缓冲区读取数据时,数据被复制到用户空间。如果缓冲区满,写操作会阻塞;如果缓冲区空,读操作也会阻塞。原创 2025-02-12 15:13:05 · 997 阅读 · 0 评论 -
【进程与线程】进程之间的通信
这篇文章详细解释进程间通信(IPC)的各种方式,包括早期的方法、System V的机制以及现代的套接字。早期的是。System V的包括。现在主要使用,特别是网络编程中的应用,套接字实现了不同主机之间的通信,是现在最常用的主流通信方式。原创 2025-02-11 18:05:28 · 873 阅读 · 0 评论 -
【进程与线程】dup 函数
这篇文章用于解释这样一件事:dup函数 将文件重定向之后,两个文件描述符指向同一个文件,剩下的那个文件依旧存在,但那个文件没有文件描述符指向它↓在 Linux 系统中,或函数用于复制文件描述符。当使用或进行文件描述符重定向时,会出现两个文件描述符指向同一个文件的情况。如上图所示。原创 2025-02-11 10:03:29 · 911 阅读 · 0 评论 -
【进程与线程】如何编写一个守护进程
如何编写一个守护进程。我们首先需要理解守护进程是什么。守护进程是在后台运行的进程,通常没有控制终端,用于执行系统任务,比如服务器或者定时任务。 用户可能想创建一个长期运行的服务,比如Web服务器或者日志监控程序。首先,守护进程的创建通常包括几个步骤:fork子进程,让父进程退出,这样终端会认为命令执行完毕,子进程继续运行。然后调用setsid创建新的会话,脱离终端。接着改变工作目录到根目录,避免占用可卸载的文件系统。还要设置文件创建掩码,通常是0,以拥有更大的灵活性。关闭不需要的文件描述符,比如标准输入、输原创 2025-02-10 23:10:09 · 1992 阅读 · 0 评论 -
【进程与线程】临界区
原理:屏障是一种同步机制,用于使一组线程在某个点上等待,直到所有线程都到达该点后再继续执行。合理设计临界区不仅能提高程序的正确性和可靠性,还能提升性能,避免常见的并发问题。临界区是并发编程中的核心概念,用于保护共享资源的安全访问。原理:互斥锁是一种二值锁(0 或 1),用来确保只有一个线程能够访问临界区。原理:原子操作是一种不可分割的操作,能够在硬件层面实现对共享变量的安全访问。原理:线程在等待锁时会不停地检查锁的状态,而不是进入休眠。原理:信号量是一个计数器,用于控制线程对共享资源的访问。原创 2025-02-10 01:49:13 · 706 阅读 · 0 评论 -
【进程与线程】进程的基础
进程是程序的一次执行过程,进程是一个独立的可调度的任务,进程是资源管理的最小单位,线程是CPU调度的最小单位。原创 2025-01-17 21:52:31 · 837 阅读 · 0 评论 -
【进程与线程】进程常见的API函数
在操作系统中,进程的生命周期可以形象地比喻为“生老病死”,即进程的创建、运行、异常以及终止。进程的生命周期贯穿了创建、运行、异常和终止的全过程,理解这些状态有助于开发者更好地管理和调试程序。进程的“出生”是指操作系统创建一个新的进程。进程创建通常是通过系统调用(如Linux中的。进程的老:进程任务状态的切换—>允许我们在一个进程中去执行另一个进程的任务。,是进程生命周期的自然结束。进程的退出通常是通过调用。函数后,当前进程的地址空间会被新程序的代码完全覆盖。,替换掉当前进程的内容,而。原创 2025-01-17 21:46:48 · 837 阅读 · 0 评论 -
【进程与线程】进程的状态
在操作系统中,进程是执行中的程序实例。这些状态帮助操作系统更加高效地管理 CPU 和系统资源。原创 2025-01-16 21:31:02 · 1283 阅读 · 1 评论 -
【进程与线程】前端进程与后端进程
前端进程和后端进程经常需要通信以完成用户请求、数据处理等任务,通信方式因场景和系统架构而异。通信方式适用场景特点进程间通信(IPC)同一台机器上的前端进程与后端进程通信。适用于本地通信,效率高。网络通信(Socket)前端进程与后端进程可能在同一台机器或不同机器上(如客户端与服务器)。适用于分布式系统,支持跨网络通信。消息队列(Message Queue)前端和后端通过队列交换数据,适合解耦通信和异步处理场景。适用于需要异步通信或高并发的数据传递场景。文件系统。原创 2025-01-16 18:09:46 · 1369 阅读 · 0 评论 -
【进程与线程】fork() 和 vfork() 函数
在操作系统中,fork()和vfork()是两种用于创建子进程的系统调用。虽然它们的目的都是创建一个新的子进程,但在实现和行为上有显著差别。原创 2025-01-16 15:25:43 · 606 阅读 · 0 评论 -
【进程与线程】父子进程与进程亲缘关系
在操作系统中,进程之间有着复杂的关系,特别是父子进程、亲缘进程、孤儿进程等,它们的管理涉及到系统资源的分配和回收。父进程通过系统调用(如 )来创建子进程。子进程会继承父进程的大部分属性(例如文件描述符、环境变量等)。父进程和子进程可以独立运行,但通过进程间通信(IPC)可以协作。假设有两个进程:进程 1 创建了 进程 2,那么:进程 1 是 父进程;进程 2 是 子进程。2. 亲缘进程亲缘进程是指具有相同父进程的多个进程;如果两个进程有相同的父进程,则它们是彼此的“兄弟进程”。虽然兄弟进程之间没有直原创 2025-01-15 22:50:56 · 890 阅读 · 0 评论 -
【进程与线程】进程的PID
PID(Process Identifier,进程标识符)是操作系统为每个进程分配的一个唯一标识,用于标识系统中的每个进程。PID 是一个非负整数,通常从 1 开始分配;每个运行中的进程都有一个唯一的 PID,通过 PID,操作系统可以区分不同的进程并对它们进行管理。简单点理解为操作系统为进程分配的身份证号。原创 2025-01-15 21:42:10 · 1191 阅读 · 0 评论 -
【进程与线程】进程的调度
进程调度是操作系统中管理多任务并发执行的核心功能,在调度的过程中,需要解决以下问题:进程互斥、进程同步、临界资源访问,以及针对死锁的处理。原创 2025-01-15 17:19:43 · 555 阅读 · 0 评论 -
【进程与线程】进程控制块(Process Control Block, PCB)
进程控制块(PCB) 是操作系统中用来描述和管理进程的重要数据结构。每个进程在创建时,操作系统都会为其分配一个 PCB,PCB 中保存了该进程的所有重要信息,包括进程的状态、资源使用情况以及与其他进程的关系。PCB 是操作系统管理进程的核心数据结构,每个进程都有一个唯一的 PCB。进程控制块 的主要作用是维护进程的状态和信息,以便操作系统能够高效地管理和调度进程。 作用有很多,包括:PCB 是一个复杂的数据结构,通常包含以下几类信息:在 Linux 操作系统中,进程控制块(PCB)被定义为一个结构体,称为原创 2025-01-15 10:59:26 · 1289 阅读 · 0 评论 -
【进程与线程】程序和进程在内存中的表现
程序是一个静态实体,表示一组写好的指令和数据的集合,一般存储在磁盘上(如.exe.out文件)。程序本身不占用运行时的系统资源(如 CPU、内存等),它是一个静态文件,它仅包含代码和数据的固定内容,表示完成某种任务的一组指令集合。静态性:程序只是存储在磁盘中的文件,不会动态变化(程序是静态的文件,不占用运行时资源无运行环境:程序没有运行时需要的栈、堆、寄存器等概念(程序没有运行时动态分配的内存(如堆和栈))。程序本身不包含对操作系统资源(如 CPU、内存)的使用能力。原创 2025-01-14 22:02:53 · 1162 阅读 · 0 评论