2.进程和线程 您所在的位置:网站首页 程序进程和线程 2.进程和线程

2.进程和线程

2023-06-02 09:29| 来源: 网络整理| 查看: 265

程序、进程、线程 概述 程序是静态的代码集合进程是程序在执行过程中的实例,是操作系统分配资源的基本单位线程是进程内的执行单位,用于实现并发执行和共享资源 程序(Program)

程序是指一组指令的集合,它是静态的、存储在磁盘或其他存储介质上的代码。程序本身并没有在计算机上执行,只有在被加载到内存并由操作系统调度执行时,才成为一个活动的实体。

进程&线程 进程线程作用资源分配的单位、程序在执行过程中的实例。当程序被加载到内存中并开始执行时,操作系统会为该程序创建一个进程,分配给它所需的内存、CPU时间和其他系统资源。线程是CPU调度的d进程内的执行单位,用于实现并发执行和共享资源代码基础共享,不同的进程可以使用相同的程序代码作为基础,即它们可能是从同一个可执行文件加载的共享内存空间独立,每个进程都有自己独立的内存空间,包括代码、数据和堆栈。进程之间的数据不会直接通信和共享数据,除非它们显式地使用进程间通信(IPC) 机制(管道、共享内存、消息队列等)共享,线程在同一个进程内共享相同的地址空间,可以直接访问和修改进程中的共享数据(一个线程可以读、写、清除另一个线程的堆栈),通信可以直接通过共享内存进行资源分配独立,例如文件描述符、打开的文件、网络连接等。一个进程无法直接访问或操作另一个进程的资源共享,包括代码段、数据段、打开的文件、网络连接、信号处理程序等执行环境独立,例如PC和栈。一个进程的控制流程不会直接影响其他进程独立控制和状态独立,例如进程ID、父进程ID、优先级等。这些信息用于操作系统调度和管理进程,使它们能够独立运行和被管理独立异常和信号处理独立独立区别独立性:进程是独立的执行实体,每个进程有自己独立的地址空间和资源。进程之间相互隔离,一个进程的崩溃不会直接影响其他进程线程是进程内的执行单位,多个线程共享同一个进程的地址空间和资源,它们之间相互依赖,一个线程的崩溃可能会导致整个进程的崩溃区别错误隔离:进程之间相互隔离,一个进程的错误不会直接影响其他进程线程共享同一个进程的资源,一个线程的错误可能会影响其他线程区别创建和切换开销:较大,需要操作系统进行地址空间和资源的切换较小,因为它们共享进程的地址空间和资源,仅需要切换栈和寄存器等少量状态。区别并发性和共享:并发执行需要依靠进程间通信(IPC)机制,共享数据的开销较大线程之间可以并发执行,共享进程的资源,实现更高的并发性区别调度粒度:进程是操作系统分配资源的基本单位,调度粒度较粗线程是操作系统调度的基本单位,因为线程的切换开销较小,所以调度粒度较细联系执行单元:进程和线程都是执行代码的实体。进程是程序的执行实例,而线程是进程内的执行单位。联系共享资源:进程和线程都可以共享相同的内存资源,包括代码段、数据段和堆栈等。这使得它们能够相互通信和共享数据,提高程序的效率和灵活性。联系调度和管理:操作系统负责进程和线程的调度和管理。它们都可以被操作系统挂起、恢复和调度执行,以满足系统的需求。补充由于线程共享相同的地址空间,线程之间的共享数据访问需要进行适当的同步和互斥操作,以避免竞态条件和数据一致性问题。同步机制如互斥锁、信号量、条件变量等可以用于线程间的协调和数据保护线程局部存储:独立,每个线程可以有自己的线程局部存储(Thread Local Storage,TLS),允许线程在共享内存的同时拥有自己的独立存储空间,用于存储线程特定的数据。 进程 关键抽象

一个独立的逻辑控制流,提供一个假象,好像程序独占地使用处理器

并发:执行时间上重叠并行:并发地运行在不同的处理器核 在这里插入图片描述

一个私有的地址空间,提供一个假象,好像程序独占地使用内存系统

在这里插入图片描述

内核模式

“以管理员身份运行”和“内核模式”在不同的层次上进行授权和权限管理。

“以管理员身份运行”:用户对于操作系统资源的权限设置,授权用户可以执行特权操作。“内核模式”:操作系统本身的运行模式,只有操作系统内核及其相关组件才能运行在这个模式下,并具有对系统资源的直接访问能力。

在这里插入图片描述

进程的创建:fork()函数 系统初始化正在运行的程序执行了创建进程的系统调用用户请求创建一个新进程一个批处理作业的初始化

"fork"作为创建子进程的意思,是因为它描述了父进程在创建子进程时的行为,类似于一个进程在某个时间点分叉成两个独立的进程。

fork调用一次,返回两次并发执行:顺序不一定父进程中,fork返回子进程的PID;子进程中,返回0地址空间相同但独立:任何改变都是独立的,不会反映在另一个进程的内存中。共享文件

fork函数将两个进程中的每个页面都标记为只读,并将两个进程中的每个区域结构都标记为私有的写时复制。当fork在新进程中返回时,新进程现在的虚拟内存刚好和调用fork时存在的虚拟内存相同。当这两个进程中的任一个后来进行写操作时,写时复制机制就会创建新页面,因此,也就为每个进程保持了私有地址空间的抽象概念。

进程的状态

在这里插入图片描述

进程的加载和运行:execve()函数

在当前进程中加载并运行其他可执行文件。若成功则不返回,若失败则返回-1

int execve(const char *filename, char *const argv[], char *const envp[]); 删除已存在的用户区域映射私有区域(写时复制)映射共享区域(动态链接)设置PC指向代码区域的入口点

在这里插入图片描述

fork和execve的区别

fork在新的子进程运行相同的程序,子进程是父进程的复制品execve加载并运行新的程序,覆盖当前进程的地址空间,但不创建新进程,PID不变 进程的上下文切换

只发生在内核态,包含虚拟内存、栈、全局变量等用户空间的资源,也包括内核堆栈、寄存器等内核空间的资源

进程的终止 正常退出(自愿)出错退出(自愿)严重错误(非自愿)被其他进程杀死(非自愿) 父进程、子进程

继承的资源副本:

内存空间:子进程从父进程继承了相同的代码段、数据段和堆栈,使得子进程能够执行相同的程序代码。

文件描述符:子进程可以直接访问和操作父进程打开的文件,包括读取、写入和关闭文件。

环境变量:包括环境变量的名称和值,子进程可以直接使用这些环境变量。

控制信息:例如进程组ID、会话ID等。

信号处理程序:子进程会继承父进程对信号的处理方式,包括忽略、捕捉或执行默认操作。

执行上下文的属性:例如PC、寄存器状态和进程状态等。这些属性使得子进程能够从父进程中继续执行,并且能够在父进程终止后继续独立执行。

需要注意的是,虽然子进程从父进程那里继承了这些资源,但子进程会创建它们自己的独立副本,这样子进程对这些资源的修改不会影响其他进程。子进程的资源副本与父进程的资源是相互独立的。

回收子进程

父进程等待子进程的终止并获取其退出状态

waitpid()函数

waitpid()函数是一个用于等待子进程状态改变的系统调用函数。它用于在父进程中等待子进程的终止或其他状态变化,并获取子进程的退出状态。

#include #include pid_t waitpid(pid_t pid, int *status, int options); 参数解释

pid:指定要等待的子进程的进程ID。取值可以是以下几种:



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有