操作系统笔记——进程同步、进程通信

操作系统学习笔记:进程同步与通信 进程间的相互作用、进程通信、死锁等相关延伸知识进行了详细的解说!操作系统学习复习之良品! 阅读详情

进程同步

临界资源

一次仅允许一个进程使用的资源称为临界资源。

临界区

对临界资源进行访问的那段代码称为临界区。

同步和互斥

同步: 多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
互斥: 多个进程在同一时刻只有一个进程能进入临界区。

信号量

进程之间经常会存在互斥和同步两种关系.为了有效的处理这两种情况,提出了信号量 (semaphore)和PV操作。

信号量是一个整形变量,可以对其执行PV操作。

  • P操作:也称为down()操作/wait()操作,使S=S-1,若S<0,进程暂停执行,放入信号量等待队列
  • V操作:也称up()/signal()操作,使S=S+1,若S<=0,唤醒等待队列中的一个进程。

PV操作被设计成原语,不可分割。

互斥量

如果信号量的取值只能为0或1,那么就成为了互斥量。

  • 0表示临界区加锁
  • 1表示临界区解锁

经典进程同步问题

生产者消费者问题

问题描述

使用一个缓冲区来存放物品,只有缓冲区没有满,生产者才可以放入物品;只有缓冲区不为空,消费者才可以拿走物品。

解释

缓冲区处于临界资源,因此,需要一个互斥量mutex来控制缓冲区的互斥访问。

为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以用信号量来统计,需要两个信号量:empty记录空缓冲区的数量,full记录满缓冲区的数量。

empty信号量是在生产者进程中使用,当empty不为零时,生产者才能放入物品;

full信号量是在消费者进程中使用的,方full信号量不为0时,消费者才可以取走物品。

注意

不能对缓冲区先进行加锁再测试信号量。即不能先P(mutex)再P(empty)。否则可能会出现如下情况。

生产者对缓冲区加锁,执行P(mutex)在执行P(empty)操作,发现empty=0,此时生产者睡眠。

消费者不能进入临界区,因为生产者对缓冲区加锁了,消费者就无法执行V(empty)操作,empty永远都是0,导致生产者永远等待,不释放锁,消费者也因此永远等待。

#define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;

void producer() {
    while(TRUE) {
        int item = produce_item();
        down(&empty);
        down(&mutex);
        insert_item(item);
        up(&mutex);
        up(&full);
    }
}

void consumer() {
    while(TRUE) {
        down(&full);
        down(&mutex);
        int item = remove_item();
        consume_item(item);
        up(&mutex);
        up(&empty);
    }
}

读者写者问题

描述

允许多个进程同时对数据进行读操作,但是不允许读和写以及写和写同时发生。

解决

  • 一个整形变量count记录在对数据进行读操作的进程数量
  • 一个互斥量count_mutex用于对count加锁
  • 一个互斥量data_mutex用于对读写的数据进行加锁
typedef int semaphore;
semaphore count_mutex = 1;
semaphore data_mutex = 1;
int count = 0;

void reader() {
    while(TRUE) {
    //  ---------------------------
        down(&count_mutex);
        count++;
        if(count == 1) down(&data_mutex); // 第一个读者需要对数据进行加锁,防止写进程访问
        up(&count_mutex);
    //  ---------------------------
        read();
        down(&count_mutex);
        count--;
        if(count == 0) up(&data_mutex);
        up(&count_mutex);
    //  ---------------------------
    }
}

void writer() {
    while(TRUE) {
        down(&data_mutex);
        write();
        up(&data_mutex);
    }
}

进程通信

  • 进程同步:控制多个进程按一定的顺序执行
  • 进程通信:进程间传输信息

匿名管道通信

管道是通过调用 pipe 函数创建的,pipefd[0] 用于读,pipefd[1] 用于写。

#include <unistd.h>
int pipe(int pipefd[2]);

调用pipe函数,会在内核中开辟出一块缓冲区用来进行进程间通信,这块缓冲区称为管道,它有一个读端和一个写端。

可以通过read(pipefd [0]);或者write(pipefd [1]) 操作管道

通信步骤

  1. 父进程创建管道,pipefd[]指向管道的两端
    在这里插入图片描述
  2. 利用fork函数创建出子进程,子进程的pipefd[]指向同一管道
    在这里插入图片描述
  3. 父进程关闭读端(pipe[0]),子进程关闭写端pipe[1],则此时父进程可以往管道中进行写操作,子进程可以从管道中读,从而实现了通过管道的进程间通信。

特点

  • 只能在父子进程或者兄弟进程中使用
  • 是一种半双工通信,单向交替传输

命名管道通信(FIFO)

在这里插入图片描述
匿名管道,由于没有名字,只能用于亲缘关系的进程间通信。为了克服这个缺点,提出了命名管道(FIFO)。

命名管道不同于匿名管道之处在于它提供了一个路径名与之关联,以命名管道的文件形式存在于文件系统中,这样,即使与命名管道的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过命名管道相互通信,因此,通过命名管道不相关的进程也能交换数据。

命名管道遵循先进先出原则,对匿名管道及命名管道的读总是从开始处返回数据,对它们的写则把数据添加到末尾。命名管道的名字存在于文件系统中,内容存放在内存中。

信号

信号是Linux系统中用于进程间互相通信或者操作的一种机制,信号可以在任何时候发给某一进程,而无需知道该进程的状态。

信号量

信号量本质上是一个计数器,用于多进程对共享数据对象的读取,它和管道有所不同,它不以传送数据为主要目的,它主要是用来保护共享资源,使得资源在一个时刻只有一个进程独享。

共享存储

  • 允许多个进程共享一个给定的存储区。是最快的一种 IPC,因为数据不需要在进程之间复制。
  • 为了在多个进程间交换信息,内核专门留出了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接读写这一块内存而不需要进行数据的拷贝,从而大大提高效率。
  • 由于多个进程共享一段内存,因此需要依靠如信号量来达到进程间的同步及互斥。

套接字

借助套接字,要进行通信的进程,可以在本地单机上进行,也可以跨网络进行。
它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。

消息队列

  • 消息队列是存放在内核中的消息链表,每个消息队列由消息队列标识符表示。
  • 消息队列允许一个或多个进程向它写入与读取消息。
  • 消息队列的通信数据都是先进先出的原则。
  • 读进程可以根据消息类型有选择地接收消息。
读者与写者的进程同步问题的程序源代码 这是操作系统的经典进程同步问题,这是源代码,大家通过源代码可以更清楚的了解进程同步问题,对读者与写者的问题也会有更深的认识 立即下载

相关推荐

浅谈车联网概述-1

车联网技术目前在车企中应用广泛,车联网通过车载传感器、无线通信等技术,能够将车辆上百的传感器数据上传至云端,当前智能网联车辆可以理解为一个“大号”手机。

Hello, World! 新能源汽车智能网联工程师,分享日常工作思考。 559

进程间通信及同步

1、pipe(无名管道)(最简单,仅支持有血缘关系的) 半双工通信 #include <unistd.h> int pipe(int pipefd[2]); // pipefd 读写描述符, fd[0]代表读 fd[1]代表写 // 返回值:成功返回-1 成功返回0 // 创建管道在fork之前 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g

DefiniteGoal的博客 1463

未来智能家居解决方案:AI应用架构师的前沿探索

当你加班到深夜回家时,门锁自动识别你的脚步声解锁,玄关灯渐亮成你最爱的暖光,空调早已调到25℃(你夏天的习惯温度),音箱播放着最近循环的爵士乐,茶几上的智能水壶烧好了温水——这不是科幻电影,而是未来智能家居的日常。如何让“冰冷的设备”变成“懂你的伙伴”。我们将深入探讨五大前沿技术(边缘AI、多模态融合、联邦学习、数字孪生、个性化推荐)的底层原理,用“家里的小管家”“邻居互相学习”等生活化比喻简化复杂概念,结合代码示例与架构图还原实现流程,并通过智能卧室、智能厨房等真实案例展示落地路径。

AI天才研究院 1410

利用PV操作实现进程的同步的理论意义

进程的同步是由于进程间合作引起的相互制约的问题,要实现进程的同步可用一个信号量与消息联系起来。当信号量的值为0时表示希望的消息未产生,当信号量的值为非0时表示希望的消息己经存在。假定用信号量S表示某条消息,进程可以通过调用P操作测试消息是否到达,调用V操作发送消息已准备好的通知。 例题 利用进程同步的意义解题 进程的同步是由于进程间合作引起的相互制约的问题,要实现进程的同步可用一个信号量与消息联系起来。 进程间的同步就是互相传递制约信息的过程; 使用信号量可以承载制约信息; 上面前驱图中展现出来的制

来啊 快活啊 5972

国产HDMI2.0芯片GSV2011怎么选?手把手教你用它设计音视频采集卡(附FPGA/海思对接指南)

本文详细解析国产HDMI2.0芯片GSV2011在音视频采集卡设计中的应用,涵盖芯片选型、硬件设计要点及与FPGA/海思平台的对接指南。GSV2011凭借4K@60Hz支持、音频提取嵌入功能和高集成度,成为音视频设备的核心选择,助力开发者快速实现高性能采集卡设计。

weixin_30181209的博客 332

FPGA以太网通信实战(一):实现MDIO接口驱动,掌控PHY芯片的钥匙

本文介绍了以太网通信技术及其核心组件。首先概述了以太网的发展历程,从标准以太网(10Mbps)到万兆以太网(10Gbps)的技术演进。重点分析了以太网接口的两大核心部件:MAC控制器负责数据链路层协议处理,PHY芯片负责物理信号转换和连接管理。文章详细解读了MDIO接口规范,包括帧格式和读写时序,并以YT8531 PHY芯片为例,介绍了其寄存器配置方法。最后设计了一个FPGA实现方案,通过MDIO接口完成PHY芯片的软复位和状态监测功能,并利用LED指示灯实时显示网络连接速率。

weixin_64402689的博客 1661

操作系统笔记03-进程同步与通信

进程同步与互斥 什么是进程同步 知识点回顾:进程具有异步性的特征。异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进 引言 读进程和写进程并发地运行,由于并发必然导致异步性,因此“写数据”和“读数据”两个操作执行的先后顺序是不确定的 而实际应用中,又必须按照“写数据→读数据”的顺序来执行的。 如何解决这种异步问题,就是 “进程同步”所讨论的内容 定义 同步亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系 进程

笔记|思路|总结 2035

Python爬虫实战:如何优雅地处理BOSS直聘的反爬机制与Cookie失效问题

本文详细介绍了如何通过Python爬虫技术优雅应对BOSS直聘的反爬机制与Cookie失效问题。从多账号轮换、动态请求头生成到代理IP管理,提供了一套完整的解决方案,帮助开发者构建稳定高效的数据采集系统,有效提升爬虫成功率与数据质量。

weixin_30733003的博客 1562

进程间的通讯与同步

一、进程之间的通信机制 首先进程的通讯方式有这么几种:管道、信号、共享内存、消息队列、套接字。 管道:分为有名管道和无名管道。 有名管道:用于任意进程之间的通讯 。 其接口mkfifo/mkfifo()。有名管道是有名有形的,Linux中为其设立了一个专门的特殊的文件系统 --管道文件,它存在于文件系统中,任何进程可以在任何时候通过有名管道的路径和文件名来访问管道。但是在磁盘上其只是...

yourenAs的博客 964

从频谱分析到硬件加速:用ZYNQ-7020+FFT IP核实现实时信号处理的完整方案

本文详细介绍了如何利用ZYNQ-7020和FFT IP核实现实时信号处理的完整方案,涵盖系统架构设计、硬件加速实现及性能优化。通过异构计算架构,该方案将1024点FFT处理延迟压缩至28μs,显著提升工业自动化和无线通信等领域的实时频谱分析效率。

weixin_33704234的博客 467

29、高速低功耗采样保持放大器设计

本文详细介绍了适用于低功耗模数转换器的高速低电压采样保持放大器(SHA)的设计技术,包括传统SHA的局限性、采样技术分类以及全NPN型和BiCMOS型SHA的具体设计实现。同时,文章深入探讨了优化输入电容、采样开关驱动及低功耗设计等具体措施,并提供了10位ADC前端和无线通信应用中的实例分析,为相关领域的工程师提供有价值的参考。

weixin_30600615的博客 424

【操作系统】西电(汤小丹)第四版 读书笔记——第二章《进程的描述与控制》(2)

本系列文章为西安电子科技大学出版社的《操作系统》所做笔记,可供复习,预习,408使用。本章节所使用的课件截图来自于网课操作系统本文页数对应:P52--------------->P90。

网瘾中心呼唤爱的博客 1393

Unity-TextMeshPro如何扩展材质实现字体Face+Outline流光效果

前言 TexeMeshPro 是Unity的一个Text文本插件,实现了比UGUI的Text,更好看的效果,跟高效的性能,所以深受大家的喜欢,但是再好的插件,也不是万能的,比如我们的策划有个新需求,要我们的VIP的名字比普通玩家有更好看的效果,例如:字体流光,外发光颜色扰动,字体贴图等等。那我们就需要去扩展TextMeshPRo的shader功能了。如下图所示 本文,我就带大家一起来扩展一下:如何扩展TextMeshProUGUI TextMesh原始面板 扩展功能后的面板 扩展TextMeshPro

TxNet 9675

操作系统 (二): 进程与线程

本文为《现代操作系统》的读书笔记 目录程序顺序执行与并发执行进程的定义进程的状态转换进程控制块进程控制 程序顺序执行与并发执行 进程的定义 进程的状态转换 进程控制块 进程控制

连理o的博客 545

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

操作系统笔记

其他进程发送给进程Q,应该被接受的消息放在进程Q的PCB,进程p给进程q发送消息,需要使用到发送原语,send(Q,msg),会导致操作系统内核接收到这消息,会把这个消息放在进程Q的消息队列中,进程Q需要使用接收原语,receive(P,&msg),会检查消息队列中哪些消息是由P发过来的,操作系统会把P的消息复制到进程Q的地址空间。内存已经不够用了,一个处于就绪态的进程,会被系统调到外存中,进入暂时挂起状态,一直到内存空间空闲,或者这个进程需要继续执行,才会激活,把她的数据又挪回内存中。

huazhaonian的博客 857

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

四级网络工程师笔记-操作系统(中)

四级网络工程师笔记-操作系统(中)前言:第四章 并发与同步1. 进程同步与进程互斥2. 进程互斥解决方法3. 资源共享 3 个层次4. 相互感知度划分:5. 临界资源的访问过程6. 进程同步机制准则7. 进程互斥的硬件方法8. 硬件方法优缺点9. 信号量10. PV 操作11. PV 处理过程12. 前趋关系13. 管程14. 解决进程通信 3 类方案第五章 内存管理1. 存储体系构成2.

你的猴子呀 1248

功能图法

功能图法 操作系统的四大管理功能:存储器管理、文件管理、设备管理、处理机管理 处理机管理:进程控制、进程同步、进程通信、进程调度 功能图法步骤 案例 QQ登录界面为例 第一轮分析 ...

jialin99的博客 752

【操作系统】进程同步与通信

进程同步是指对多个相关进程在执行次序上进行协调,使得它们能够按照一定的规则和顺序来访问共享资源或者协同完成某项任务。在多进程环境下,如果没有合适的同步机制,各个进程随意地访问共享资源,就很容易出现数据不一致、程序逻辑混乱等问题,所以进程同步对于保证系统的正确性和稳定性至关重要。例如,在一个火车票售票系统中,多个售票窗口(可看作多个进程)同时售卖同车次的车票,车票剩余数量就是它们共享的资源。如果没有同步机制,可能会出现多个窗口同时卖出同一张车票的情况,导致数据出错。

Guiat的博客 1141

【操作系统】课程 3进程同步与通信 同步测练 章节测验

(1)了解进程通信的机制和通信方式。 (2)理解多道程序环境下进程间通信的机制;消息传递系统的实现。 (3)掌握临界资源和临界区的概念和访问准则;信号机制及控制进程间同步和互斥的模型。 【本节知识点】 并发是操作系统的特征之一。当多个进程并发执行时,就会产生冲突和合作的问题。并发的进程可以按多种方式进行交互,而在交互的过程中产生的主要问题是同步和互斥。解决进程同步和互斥的有效技术是信号量机制。进程通信是指进程之间的信息交换。各进程在执行过程中为合作完成一项共同任务,需要协调步伐,交流信息。进程通信方式

Kika写代码的博客 1508

【操作系统】第三章进程同步与进程通信

管程:是一种封装了共享资源和同步操作的机制,进程通过调用管程的过程(函数)来访问资源,管程内部保证同一时刻仅一个进程执行其过程(自动实现互斥)。好处:例如 “生产者 - 消费者” 用管程实现时,无需手动管理mutex信号量,管程自动保证互斥;同时通过条件变量实现同步,代码更简洁、安全(避免 PV 操作顺序错误)。进程通信方式:包括管道、消息队列、共享内存、信号量、套接字等。管道:是一种基于文件的半双工通信机制,用于父子 / 亲缘进程间通信,数据以字节流形式传输。匿名管道:特点:仅用于亲缘进程;

2303_80799640的博客 1192

[操作系统系列]进程同步与通信

操作系统的进程同步与通信 博主本科生复习的时候整理的一些操作系统的系列笔记。大部分都是一些性概念的东西。博主会持续更新其他的部分。有侵权问题或者学术上的问题都可以联系博主邮箱(博主邮箱在博主简介)博主欢迎欢迎大家一起讨论。 并发的多个进程之间有些进程是独立的,有些可能存在和其他好=进程有着间接或直接的关系:竞争资源、协作执行、传递信息,共享数据。要使得这些并发进程都能正确执行,操作系统必须提供一定...

薛定谔的猫 1159

操作系统之进程同步和通信——进程同步的基本概念及其实现方式、进程通信及其实现方式

进程同步和通信 进程同步 在OS中引入进程后,一方面使系统的吞吐量和资源的利用率得到提升,另一方面也使得系统变得复杂,如果没有合理的方式对进程进行妥善的管理,必然会引起进程对系统资源的无序竞争,使系统变得混乱;为了实现对并发进程的有效管理,在多道程序系统中引入了同步机制,常见的同步机制有:硬件同步机制、信号量机制、管程机制等,利用它们确保程序执行的可再现性; 进程同步的基本概念 ...

博采众长,自成一派; 1万+

操作系统实验进程通信与进程同步CTGU实验资料:深入理解进程协作

操作系统实验进程通信与进程同步CTGU实验资料:深入理解进程协作 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 操作系统实验进程通信与进程同步CTGU实验资料是一套专为操作系统课程设计的实践教程。它通过丰富的实验内容和实际操作,帮助学习者深入理解进程间通信及同步机制,培养解决实际编程问题的能力。 项目技术分析 该项目主要围绕进程通信(Inter-Process Com...

gitblog_06765的博客 306

3 操作系统--进程同步与进程通信

P0把turn设为1,P1把turn设为0,表示自己优先想让对方使用临界资源被阻塞的P2和P3已经执行过wait,下次被唤醒的时候,并且获得了CPU,直接从开始使用打印机执行,信号量的value值不会再被减一。mutex:互斥;互斥锁;互斥体;互斥对象;互斥量mutex:代表进入临界区的名额,名额还有剩余的话就可以顺利进入临界区。P,V操作:简单理解为加一减一实现互斥在同一个进程中进行一对PV操作实现同步是在其中一个进程中执行P,另一个进程中执行V。

qq_74234591的博客 1190

计算机操作系统 进程管理 -- 进程与线程、进程状态的切换、进程调度算法、进程同步、进程通信

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。 线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换。不同进程的线程切换会引起进程切换。由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。......

天行健 君子以自强不息,地势坤 君子以厚德载物。 2872

操作系统:王道笔记

文章目录操作系统(Operating System,OS)一.认识操作系统1.1_1:操作系统的概念,功能和目标1.1_2:操作系统的特征1.1_3 操作系统的分类与发展1.1_4 操作系统的运行机制体系结构与1.1_5: 中断和异常1.1_6:系统调用第二章:进程管理2.1:进程的概念、组成、特征2.1.1:进程的概念2.1.2:进程的组成图片2.1.3:进程的特征图片2.2:进程的状态、进程的组织2.2.1:进程的状态2.2.2:进程状态的转换图片图片2.2.3:进程的组织*2.2小结:图片2.3:进程

m0_52280758的博客 3106
上一篇: 操作系统笔记——进程、线程、进程调度
下一篇: 操作系统笔记——死锁
PdKingLiu
博客等级 码龄9年 89粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值