操作系统Ubuntu(实验三四)

实验三四

  • 3._实验三:Linux进程/线程的异步并发执行
    • 3.1_fork()函数创建子进程
    • 3.2_创建线程
      • pthread_create();
  • 4._实验四:使用信号量进行互斥与同步
    • 4.1_信号量初使用
      • (1)信号量简单介绍
      • (2)信号量以及P、V操作的使用方法
      • (2)利用信号量实现同步互斥

3._实验三:Linux进程/线程的异步并发执行

3.1_fork()函数创建子进程

fork()函数用法解释
个人观点

#include <unistd.h>  
#include <stdio.h>   
int main ()   
{   pid_t fpid; //fpid表示fork函数返回的值  int count=0;  fpid=fork();   if (fpid < 0)   printf("error in fork!");   else if (fpid == 0) {  printf("i am the child process, my process id is %d/n",getpid());   printf("我是爹的儿子/n");//对某些人来说中文看着更直白。  count++;  }  else {  printf("i am the parent process, my process id is %d/n",getpid());   printf("我是孩子他爹/n");  count++;  }  printf("统计结果是: %d/n",count);  return 0;  
}  

当执行到代码段fpid=fork(); 时,此时新建了一个子进程,其直观图如下:
在这里插入图片描述
练习:
画出流程图

#include <unistd.h>
#include <stdio.h>
int main(){pid_t son_pid,daughter_pid;int count = 1;son_pid = fork();if(son_pid == 0){count++;printf("i am son,count = %d\n",count);}else{daughter_pid = fork();if(daughter_pid == 0){count++;printf("i am daughter, count = %d\n",count);}else{count++;printf("i am father,ID = %d, count = %d\n",daughter_pid,count);waitpid(son_pid,NULL,0);waitpid(daughter_pid,NULL,0);}}
}

在这里插入图片描述

3.2_创建线程

pthread.h的使用

pthread_create();

在这里插入图片描述
创建两个线程即函数son()和函数daughter();两者执行顺序随机且同步

4._实验四:使用信号量进行互斥与同步

4.1_信号量初使用

(1)信号量简单介绍

Linux提供两种信号量:
内核信号量:用于内核中资源共享控制
用户态信号量:主要包括POSIX信号量和SYSTEM V信号量。其中POSIX信号量分为两类。
无名信号量:主要用于线程间同步,也可用于进程间(由fork产生)同步。
有名信号量:既可用于进程间同步,也可用于线程间同步。

(2)信号量以及P、V操作的使用方法

POSIX有名信号量主要包括:

sem_t* sem_open(const char *name, int oflag, mode_t mode, int value);
//例如:创建一个互斥信号量mutex,初值为1即mutex = 1,访问权限为0666(我也不知道啥意思),
//如信号量存在,则打开之,如不存在,则创建  
sem_t* mutex("mutex",O_CREATE,0666,1);

①name: 文件名路径,如’mysem’,会创建/dev/shm/sem.mysem
②oflagO_CREATEO_CREATE | O_EXCL
O_CREATE:如信号量存在,则打开之,如不存在,则创建
O_CREATE | O_EXCL:如信号量已存在,则返回error
③mode:信号量访问权限,如0666
④value:信号量初始化值

int sem_wait(sem_t *sem)

测试指定的信号量的值,相当于P操作
sem > 0,则减1立刻返回;
sem = 0,则睡眠直到sem > 0,此时立刻减1,然后返回

int sem_post(sem_t *sem)

释放资源,相当于V操作,信号量sem的值加1,唤醒正在等待该信号量的进程/线程

int sem_close(sem_t *sem)

关闭有名信号量
进程中,如果使用完信号量,应使用该函数关闭有名信号量

int sem_unlink(const char *name)

删除系统中的信号量

(2)利用信号量实现同步互斥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/545398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实战:Redis哨兵模式(上)

上一篇我们讲了主从复制模式,它是属于 Redis 多机运行的基础,但这种模式本身存在一个致命的问题,当主节点奔溃之后,需要人工干预才能恢复 Redis 的正常使用。 例如,我们有 3 台服务器做了主从复制,一个主服务器 A 和两个从服务器 B、C,当 A 发生故障之后,需要人工把 B…

计算机网络(第四章网络层)

第四章网络层4.1_网络层提供的两种服务&#xff08;1&#xff09;虚电路服务&#xff08;2&#xff09;数据报服务4.2_网络协议4.2.1_虚拟互连网络4.2.2_分类的IP地址&#xff08;1&#xff09;分类IP地址三种分类方法IP 地址的一些重要特点4.2.3_IP地址与硬件地址4.2.4_地址解…

实战:Redis 主从同步

主从同步(主从复制)是 Redis 高可用服务的基石,也是多机运行中最基础的一个。我们把主要存储数据的节点叫做主节点 (master),把其他通过复制主节点数据的副本节点叫做从节点 (slave),如下图所示: 在 Redis 中一个主节点可以拥有多个从节点,一个从节点也可以是其他服务…

idea连接sqlserver及数据库操作

idea连接sqlserver及操作一、在连接过程中遇到的问题&#xff1a;&#xff08;1&#xff09;数据库登录失败&#xff08;2&#xff09;登录成功之后数据库端口号怎么查看二、代码连接数据库①加载驱动和连接数据库三、数据库操作连接详解链接 总体流程链接 操作实例链接 一、…

实战:Redis 集群模式(上)

Redis Cluster 是 Redis 3.0 版本推出的 Redis 集群方案,它将数据分布在不同的服务区上,以此来降低系统对单主节点的依赖,并且可以大大的提高 Redis 服务的读写性能。 Redis 将所有的数据分为 16384 个 slots(槽),每个节点负责其中的一部分槽位,当有 Redis 客户端连接集…

案例:Redis 问题汇总和相关解决方案

本文收集了一些 Redis 使用中经常遇到的一些问题,和与之相对应的解决方案,这些内容不但会出现在实际工作中,也是面试的高频问题,接下来一起来看。 缓存雪崩 缓存雪崩是指在短时间内,有大量缓存同时过期,导致大量的请求直接查询数据库,从而对数据库造成了巨大的压力,严…

加餐:Redis 的可视化管理工具

因为 Redis 官方只提供了命令行版的 Redis 客户端 redis-cli,以至于我们在使用的时候会比较麻烦,通常要输入一堆命令,而且命令行版的客户端看起来也不够直观,基于以上两个原因我们需要找一个可视化的 Redis 客户端,下面是我这些年使用过的一些 Redis 可视化客户端,分享给…

第一次创建springboot框架项目

第一次创建springboot框架项目1.1_创建步骤2.1_启动时遇到的问题2.2_启动响应网页测试2.3_连接数据库尝试1.1_创建步骤 &#xff08;1&#xff09;创建spring项目 &#xff08;2&#xff09; &#xff08;3&#xff09; 加入引擎 下一步即可 2.1_启动时遇到的问题 &a…

springboot工程的热部署

springboot工程的热部署&#xff08;1&#xff09;第一步配置pom.xml&#xff08;2&#xff09;第二步更改IDEA设置什么是热部署配置呢&#xff1f; 我们在开发中反复修改类、页面等资源&#xff0c;每次修改后都是需要重新启动才生效&#xff0c;这样每次启动都很麻烦&#xf…

第一二章(PTA复习)

第一二章因为3默认是整形&#xff0c;整形长度大于short型&#xff0c;如果让short型 short型 int型&#xff0c;可能会溢出&#xff0c;所以编译报错 例如&#xff1a; 答案&#xff1a;D switch 语句中的变量类型可以是&#xff1a; byte、short、int 或者 char。从 Java …

异常类型及处理

异常类型及处理检查型异常与非检查型异常&#xff1a; 非检查型异常是指机器运行之前永远都不能自动检测出来的异常&#xff0c;例如idea不会报红的但有可能发生异常的代码。error类和RunTime类及其子类 异常类型及处理 finally使用

侧边菜单栏 android-menudrawer

这是github上的一款开源项目&#xff0c;类似于人人网可滑动的侧边菜单栏-----android-menudrawer。使用方法也很简单。1.将下载的包解压放入你的工作目录下2.利用Eclipse通过new-->project...->Android Project from Existing Code&#xff0c;找到项目目录&#xff0c;…

第三四五章(PTA复习)

第三四五章类的构造与继承异常线程类的构造与继承 加 final 唯一可以说明的是该类不可被继承&#xff0c;另外和其它类是一样的 abstract类是抽象类&#xff0c;必须要被继承才能实现&#xff0c;而final修饰的类不能被继承 异常 由于未捕获到异常&#xff0c;所以执行完final…

Redis 属于单线程还是多线程?不同的版本有什么区别?

Redis 是普及率最高的技术之一&#xff0c;同时也是面试中必问的一个技术模块&#xff0c;所以从今天开始我们将从最热门的 Redis 面试题入手&#xff0c;更加深入的学习和了解一下 Redis。 我们本文的面试题是 Redis 属于单线程还是多线程&#xff1f; 典型回答 本文的问题…

【原创】STM32下波特率计算详解

波特率的计算STM32下的波特率和串口外设时钟息息相关&#xff0c;USART 1的时钟来源于APB2&#xff0c;USART 2-5的时钟来源于APB1。在STM32中&#xff0c;有个波特率寄存器USART_BRR&#xff0c;如下&#xff1a; STM32串口波特率通过USART_BRR进行设置&#xff0c;STM32的波特…

java对数组进行排序_用Java对数组进行排序所需的最少交换

java对数组进行排序Problem: 问题&#xff1a; In this problem, we would have an unordered array with consecutive distinct natural numbers [1,2,3,..n], where n is the size of the array. We have to find the minimum number of swaps required to sort the array i…

如何实现查询附近的人?

查询附近的人或者是附近的商家是一个实用且常用的功能,比如微信中“附近的人”或是美团外卖中“附近商家”等,如下图所示: 那它是如何实现的呢?我们本文就一起来看。 我们本文的面试题是,使用 Redis 如何实现查询附近的人? 典型回答 在说如何实现地理位置查询之前,首…

第五六七章(PTA复习)

第五六七章图形界面线程IO图形界面 主要的布局管理器类包括流布局(FlowLayout)、边界布局(BorderLayout)、网格布局(GridLayout)、卡 片 布 局 (CardLayout) 、 网 格 包 布 局(CardBagLayout) 线程 答案&#xff1a;B IO

Redis 有哪些数据类型?

Redis 的数据类型可谓是 Redis 的精华所在&#xff0c;同样的数据类型&#xff0c;例如字符串存储不同的值对应的实际存储结构也是不同&#xff0c;当你存储的 int 值是实际的存储结构也是 int&#xff0c;如果是短字符串&#xff08;小于 44 字节&#xff09;实际存储的结构为…

导出/入数据库

导出/入数据库1、以SQL文件的方式1.1导出1.2 导入2、以mdf和ldf数据库文件的方式2.1导出2.1.1 脱机2.1.2 到数据库的数据路径&#xff0c;拷贝出mdf,ldf文件2.1.3 将原数据库设置为online状态即可正常使用2.2导入数据库&#xff08;切记导入之前要先将控制权限打开&#xff09;…