操作系统实验——线程与进程
如果代码或文章中,有什么错误或疑惑,欢迎交流沟通哦~
## 进程与线程的区别 1. **各自定义**:
进程是操作系统进行资源分配和调度的一个独立单位,具有一定独立功能的程序关于某个数据集合的依次运行活动。
线程被称为轻量级的进程,是进程中的实体,是被操作系统独立调度和分派的基本单位。
-
内存:
进程每启动一个新的,就需要分配独立的内存空间,而线程是在同一个进程下,共享相同的内存空间,因此线程的启动和关闭以及切换的除存需要的系统开销都要比进程小。
-
通信方式:
进程间需要使用进程间通信(IPC, Inter-Process Communication)的方式来进行通信,例如:**管道,信号,消息队列,共享内存,信号量等。**而同一进程中的线程共享相同的内存空间,所以线程之间可以直接访问同一进程内的全局变量,静态变量等数据,线程间通信比进程间通信要容易得多。
-
影响范围:
由于进程具有独立的内存空间,所以一个进程崩溃后,在保护模式下,不会对其他进程产生影响,但是一个线程崩溃后,会导致整个进程崩溃。
-
改变环境:
每个独立的进程有一个完全独立的运行环境,改变自己的运行环境(如改变文件打开方式、改变信号处理方式等)不会影响其他进程。而线程则不同,一个线程改变其运行环境会影响到同在一个进程中的其它线程。
fork()
用fork( )创建进程必须的几个要点:
- 要有一段程序供该进程运行
- 有进程专用的系统堆栈空间
- 有进程控制块PCB,在linux中具体实现是task_struct
- 有独立的内存空间
如果没有自己独立的内存空间,就称为线程。
线程与进程的区别,在于线程没有独立的内存空间。
使用fork()来创建进程
//testFork.c
#include<stdio.h>
#include<unistd.h>
int main()
{ int count=1;int child;
if(!(child=fork()))
printf("This is son, his count is: %d. and his pid is: %d\n", ++count, getpid());
else printf("This is father, his count is: %d, his pid is: %d\n", count, getpid());
}显示结果:
This is son, his count is: 2. and his pid is: 302
This is father, his count is: 1, his pid is: 301
fork() 调用会创建一个新的进程,这个新的进程是当前进程的复制品,被称为子进程。
fork() 函数在父进程中返回新创建的子进程的进程ID,而在子进程中返回0。
也就是说,如果child = fork()
的值为0,则说明在子进程中,将执行
printf("This is son, his count is: %d. and his pid is: %d\n", ++count, getpid());
语句。
否则说明在父进程中,将执行
printf("This is father, his count is: %d, his pid is: %d\n", count, getpid()); }
语句。
这两行打印语句的区别在于,子进程的count
值会加一,且父子进程的pid
是不同的。
vfork()
- 在Unix和类Unix系统中,vfork()是一种特殊的fork()。
- vfork()创建的子进程可能与父进程共享内存,这意味着子进程可以修改父进程的内存空间,这与fork()是不同的。
- 执行vfork()函数创建的进程,仍然是父进程和子进程的关系,有各自独立的进程ID,但在一些系统(如早期的Unix系统)中,vfork()创建的子进程和父进程共享同一地址空间,父进程在子进程结束执行或者调用exec系列函数之前停止执行。这一点与fork()存在明显的差异。
使用vfork()创建子进程
//testVfork.c
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main( )
{ int count=1; int child;printf("Before create son, the father's count is:%d\n", count);
if(!(child=vfork())){ printf("This is son, his pid is: %d and the count is: %d\n", getpid(), ++count);exit(0); }else printf("After son, This is father, his pid is: %d and the count is: %d,
and the child is: %d\n", getpid(), count, child);
}显示结果:
Before create son, the father's count is:1
This is son, his pid is: 4185 and the count is: 2
After son, This is father, his pid is: 4184 and the count is: 2, and the child is: 4185
注意这里有三个打印语句,其中两个打印语句是在父进程当中,
printf("Before create son, the father's count is:%d\n", count);
和printf("After son, This is father, his pid is: %d and the count is: %d, and the child is: %d\n", getpid(), count, child);
这两个语句。
而子进程中的打印语句 printf("This is son, his pid is: %d and the count is: %d\n", getpid(), ++count);
,将父子进程共享空间里的count++
了,所以父进程后一条打印语句也会打印得到count=2
。
用vfork创造线程和父子进程的同步问题
在使用 vfork()
创建子进程后,父进程将会被挂起。父进程的执行只会在子进程调用 exit()
或者执行 execve()
开始新程序后才会继续。这是 vfork()
与 fork()
的一个主要区别。
//testVfork.c
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
int main()
{ int count=1,i; int child;printf("Before create son,the father's count is:%d\n",count);
if(!(child=vfork())){ for(i=0;i<100;i++)
{ printf("This is son, The i is: %d\n", i);if(i==70) break; }printf("This is son, his pid is: %d and the count is: %d\n", getpid(), ++count);exit(0);
}
else
printf("After son, This is father, his pid is: %d and the count is: %d,and the child is: %d\n",getpid(),count,child);
}显示结果:
…… ……
This is son, The i is: 68
This is son, The i is: 69
This is son, The i is: 70
This is son, his pid is: 4434 and the count is:2
After son, This is father, his pid is: 4433 and the count is: 2, and the child is: 4434
相关文章:
操作系统实验——线程与进程
如果代码或文章中,有什么错误或疑惑,欢迎交流沟通哦~ ## 进程与线程的区别 1. **各自定义**: 进程是操作系统进行资源分配和调度的一个独立单位,具有一定独立功能的程序关于某个数据集合的依次运行活动。 线程被称为轻量级的进程…...

最强端侧多模态模型MiniCPM-V 2.5,8B 参数,性能超越 GPT-4V 和 Gemini Pro
前言 近年来,人工智能领域掀起了一股大模型热潮,然而大模型的巨大参数量级和高昂的算力需求,限制了其在端侧设备上的应用。为了打破这一局限,面壁智能推出了 MiniCPM 模型家族,致力于打造高性能、低参数量的端侧模型。…...

Spring Boot中如何查询PGSQL分表后的数据
数据库用的pgsql,在表数据超过100w条的时候执行定时任务进行了分表,分表后表名命名为原的表名后面拼接时间,如原表名是card_device_trajectory_info,分表后拼接时间后得到card_device_trajectory_info_20240503,然后分…...
如何学习一个新技能
1. 提出想法 2.找到学习方法,学习路径 3.开始学 参考视频:如何成为超速学习者?快速学会任何新技能!_哔哩哔哩_bilibili...
sklearn之logistic回归
文章目录 logistic回归logit logistic回归 logistic regression被称之为logistic回归,对于logistic这个单词来说,他本身的翻译其实不太容易,比较有名的译法是对数几率回归,我也认为这种译法是比较合适的,虽然并非logi…...

Warning: Each child in a list should have a unique “key“ prop.
问题描述: 使用ProTable的时候,报错如下 原因分析: 根据报错内容可以分析出,表格数据缺少唯一key, <PaginationTablecolumns{columns}pagination{{pageSize: 10,current: 1,showSizeChanger: true,showQuickJum…...

JavaSE:StringBuilder和StringBuffer类
1、引言 在上一篇文章中,我们理解了字符串的常用方法,细心的同学大概已经发现,不管是将字符串中的字符转变为大写或小写,或是完成字符串的替换,又或是去除空白字符等等,只要涉及到字符串的修改,…...
C语言在线编程网站:探索编程的奥秘与深度
C语言在线编程网站:探索编程的奥秘与深度 在数字世界的浩瀚海洋中,编程已成为连接现实与虚拟的桥梁。而C语言,作为编程领域的经典之作,其深度与广度令无数探索者着迷。为了满足广大编程爱好者的需求,C语言在线编程网站…...
Android 之广播监听网络变化
网络状态变化监听帮助类 NetBroadcastReceiverHelper public class NetBroadcastReceiverHelper {private static final String TAG "NetBroadcastReceiverHelper";private static final String NET_CHANGE_ACTION "android.net.conn.CONNECTIVITY_CHANGE&qu…...

Hono 框架使用经验谈
Hono🔥是一个小型、快速并开源的 Serverless Web 框架,用 TypeScript 写就。它适用于任何JavaScript运行时:Cloudflare Workers,Fastly ComputeEdge,Deno,Bun,Vercel,Netlify&#x…...
mac 下配置mysql的全局环境变量
前言 如果你还没有安装mysql,请参考这篇文章手把手教你MAC本地数据库的安装与使用:mysql python (pymysql)【一】 - 知乎 正文 1.打开终端,输入命令”echo $SHELL“,显示当前的shell ⚠️本人使用的终端shell是zsh,如果你使用…...

小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩
面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时,小红书大数据存储团队采取云原生架构实践:通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」,成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…...
Python实现解码二进制数据以匹配给定的C++结构体
要在Python中实现解码二进制数据以匹配给定的C结构体Ytest,你需要了解每个字段在结构体中的偏移量(由于结构体内存对齐,这些偏移量可能与字段的顺序和大小不完全对应)。不过,在没有指定内存对齐的情况下,我…...

实施阶段(2024年5月)
【项目活动1】斐波拉契数列第n项的值? 数学思想:第一项和第二项的值都为1,从第三项开始值为前两项的和。 方法一:迭代 迭代变量:f1和f2 迭代表达式:f1,f2f2,f1f2 计数器:i 迭代表达式运算…...
(delphi11最新学习资料) Object Pascal 学习笔记---第13章第3节 (弱引用是系统托管的 )
13.4.2 弱引用是系统托管的 弱引用的托管是一个非常重要的内容。换句话说,系统会在内存中保存一个弱引用列表,当对象被销毁时,系统会检查是否有任何弱引用指向该对象,如果有,系统会将实际引用赋值为 nil࿰…...
安装WordPress
第 1 步:下载并解压 wget https://wordpress.org/latest.tar.gz 然后使用以下命令提取包: tar -xzvf latest.tar.gz 第 2 步:创建数据库 比如数据库名称为wordpress,编码格式为 utf8mb4_general_ci 第 3 步:设置wp-con…...

【STL库源码剖析】list 简单实现
从此音尘各悄然 春山如黛草如烟 目录 list 的结点设计 list 的迭代器 list 的部分框架 迭代器的实现 容量相关相关函数 实现 insert 在指定位置插入 val 实现 push_back 在尾部进行插入 实现 erase 在指定位置删除 实现 pop_back 在尾部进行删除 实现 list 的头插、头删 实现…...

web前端框架设计第十一课-常用插件
web前端框架设计第十一课-常用插件 一.预习笔记 1.路由的基础使用 2.动态路由 3.嵌套路由 二.课堂笔记 三.课后回顾 –行动是治愈恐惧的良药,犹豫拖延将不断滋养恐惧...

Java基础-注解
注解本质是继承了Annotation接口的一个接口 首先,我们通过键值对的形式可以为注解属性赋值,像这样:Hello(value “hello”)。 接着,你用注解修饰某个元素,编译器将在编译期扫描每个类或者方…...

SpringCloud之SSO单点登录-基于Gateway和OAuth2的跨系统统一认证和鉴权详解
单点登录(SSO)是一种身份验证过程,允许用户通过一次登录访问多个系统。本文将深入解析单点登录的原理,并详细介绍如何在Spring Cloud环境中实现单点登录。通过具体的架构图和代码示例,我们将展示SSO的工作机制和优势&a…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
GeoServer发布PostgreSQL图层后WFS查询无主键字段
在使用 GeoServer(版本 2.22.2) 发布 PostgreSQL(PostGIS)中的表为地图服务时,常常会遇到一个小问题: WFS 查询中,主键字段(如 id)莫名其妙地消失了! 即使你在…...