首页 > 编程语言 >CSAPP 并发编程

CSAPP 并发编程

时间:2024-11-15 16:41:41浏览次数:1  
标签:CSAPP 控制流 待处理 编程 并发 内核 信号 进程

image

from pixiv

前置知识

进程

逻辑控制流(简称逻辑流) CSAPP P508: 一系列的程序计数器PC的值唯一地对应于包含在程序的可执目标文件中的指令或包含在运行时动态链接到程序的共享对象指令。这个PC值的序列叫逻辑控制流

image

一个逻辑流的执行在时间上与另一个流重叠,称为并发流,这两个流被称为并发地运行。多个流并发地执行的现象也称为并发。

并行流是并发流的真子集。如果两个流并发地运行在不同的处理器核或计算机上,那么我们称它们为并行流,这两个流被称为并行地运行。多个流并行地执行的现象也称为并行


系统中的每个程序都运行在某个进程的上下文中。上下文是由程序正确运行所需的状态组成的,这个状态包括存放在内存中的代码和数据,它的栈,通用目的寄存器,程序计数器,环境变量,打开文件描述符的集合。

进程提供给应用程序的关键抽象:

  • 一个独立的逻辑控制流
  • 一个私有的地址空间

信号:一种更高层的软件形式的异常,称为Linux信号,允许进程或内核中断其他进程。

image

一个发出而没有被接收的信号叫做待处理信号(pending signal)。在任何时刻,一种类型至多只会有一个待处理信号。如果一个进程有一个类型为上的待处理信号,那么任何接下来发送到这个进程的类型为左的信号都不会排队等待;它们只是被简单地丢弃。

内核为每个进程在 pending 位向量中维护着待处理信号的集合。只要传送了一个类型为 k 的信号,内核就会设置 pending 中的第 k 位。

个进程可以有选择性地阻塞接收某种信号。当一种信号被阻塞时,它仍可以被发送,但是产生的待处理信号不会被接收,直到进程取消对这种信号的阻塞

内核为每个进程在blocked位向量中维护着被阻塞的信号集合。

当内核把进程 p 从内核模式切换到用户模式时(例如,从系统调用返回或是完成了一次上下文切换),它会检查进程 p 的未被阻塞的待处理信号的集合(pending &~blocked)。

如果这个集合为空(通常情况下),那么内核将控制传递到 p 的逻辑控制流中的下一条指令。

然而,如果集合是非空的,那么内核选择集合中的某个信号 k (通常是最小的 k),并且强制 p 接收信号 k。收到这个信号会触发进程采取某种行为。一旦进程完成了这个行为,那么控制就传递回 p 的逻辑控制流中的下一条指令

截屏2020-05-15 22.42.06.png

标签:CSAPP,控制流,待处理,编程,并发,内核,信号,进程
From: https://www.cnblogs.com/cilinmengye/p/18548242

相关文章

  • Python并发编程入门:使用concurrent.futures与asyncio
    Python并发编程入门:使用concurrent.futures与asyncio在现代应用中,并发编程已成为一种提升性能和效率的重要手段。Python提供了多种实现并发的方式,尤其是concurrent.futures和asyncio,分别适用于不同的并发场景。本文将带你深入了解这两种并发编程方式,帮助你轻松上手并......
  • 深入探索 C++11 第一弹:现代 C++ 编程的基石与革新
    1、C++的发展历史C++11是C++的第⼆个主要版本,并且是从C++98起的最重要更新。C++11对C++语言的发展具有深远的影响,它使C++语言更加现代化、高效、灵活和易于使用,为开发者提供了更强大的工具和更好的编程体验,推动了C++在各个领域的广泛应用和持续发展。话不多说,下......
  • 第16章 Shell企业编程基础
    说到Shell编程,很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,初学者可能刚开始接触Shell的时候,有各种想法,感觉编程非常困难,SHELL编程是所有编程语言中最容易上手,最容易学习的编程脚本语言。本章向读者介绍Shell编程入门、Shell编程变量、If、While、For、Case......
  • 仓颉原生应用编程语言教程(第5期)
    泛型视频:KCKCJY在现代软件开发中,泛型编程已成为提高代码质量、复用性和灵活性的关键技术。泛型作为一种参数化多态技术,允许开发者在定义类型或函数时使用类型作为参数,从而创建可适用于多种数据类型的通用代码结构。泛型带来的好处包括:代码复用:能够定义可操作多种类型的通用算法......
  • Shell并发执行
    在Shell脚本中,实现并发执行可以显著提高处理效率,特别是在处理大量任务或需要同时执行多个命令时。以下是一些常见的方法来实现Shell并发执行:1.使用&符号通过在命令末尾添加&符号,可以将命令放到后台运行,从而实现并发执行#!/bin/bashcommand1&command2&这种方法简单易用,......
  • Java 网络编程----初探Servlet
    JaveWeb是java面向web开发的相关技术,他是相关技术的统称,并不是指某一个单一的技术。在我之前的博客中(Java网络编程----通过实现简易聊天工具来聊聊BIO模型https://www.cnblogs.com/jilodream/p/17405923.htm),就已经写到过java可以作为一个服务器(如TCP/UDP),接收外部的请求。如使用T......
  • python多线程和网络编程
    一、多线程1.进程、线程和并行执行学习目标:了解什么是进程、线程,了解什么是并行执行进程比作公司,线程比作员工,多线程并行执行就比作公司的不同员工在同一时间去做不同的事。总结2.多线程编程学习目标:掌握使用threading模块完成多线程编程当你想实现唱歌和跳舞一......
  • xshell7上实现MapReduce初级编程实践:对给定的表格进行信息挖掘
      实验环境:操作系统:Linux(Centos7);  Xsell7Hadoop版本:3.4.0(这里的版本根据自己的修改,可能小部分版本的Hadoop不适用于本文实验)下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。输入文件内容如下:(保证之间空格为1,否则可能输出会出错)chi......
  • Rust 如何处理高并发场景?(Rust高并发、Rust并发问题)(Rust Arc、Rust Mutex、Rust RwLock
    Rust如何处理高并发场景Rust的设计原则注重内存安全与并发的平衡,在提供高性能的同时,确保程序的安全性。在并发编程中,Rust提供了多种工具和库,特别是通过所有权、线程安全的类型、异步编程模型和并发原语等方式,解决了高并发场景中的一些难题。1.所有权系统与并发的......
  • GPU编程
    来源:https://worktile.com/kb/p/2155928 gpu编程有什么用? 图形处理单元(GPU)编程具有多种用途,主要包括:1、加速大规模计算任务、2、图形和视频渲染、3、深度学习和机器学习。GPU编程在深度学习和机器学习领域尤为重要。它允许数据科学家和研究人......