操作系统(第五周 第一二堂总结)

目录

回顾

前景知识

概述

定义

进程和线程的关系

进程和线程的区别

线程优缺点 

优点:

缺点:

易混概念

 线程实现方式

线程的类型:

​编辑

多线程模型:

线程函数

头文件:

线程创建函数:

线程退出函数:

进程等待线程函数:

终止线程函数:

线程的使用 

线程基本操作(一)

线程基本操作(二)

并发运行 

总结


回顾

上一篇文章讲了两个点:1、进程的运行 2、进程的通信

其中,进程的运行相对更加重要,进程通信中共享内存法的实现相对更加重要

进程的运行包括:进程的创建、工作、被调度、销毁

1、创建:核心在两个函数:fork()创建子进程;exec()让子进程“脱离”父进程,变为相对独立

2、工作:核心在于理解父子进程的并行

3、被调度:核心在于理解进程的五个状态以及状态之间的转变原因

4、销毁:分为主动销毁以及异常销毁

进程的通信 :共享内存法、消息通信法

1、共享内存法:利用双指针模拟的方式实现进程之间的“消息”通信(本质就是一直用while循环,是一种拟通信)

2、消息通信法:需要内核参与,是一种实质性的进程间消息通信

本篇我们就来讲讲线程

前景知识

多个进程之间是并发运行的,多个线程之间是并行运行的

概述

定义

1、线程是CPU使用的一个基本单元,是程序执行基本单位(不代表进程本身不可以执行程序,这个理解很关键!!)

2、线程是进程中的⼀个执⾏单元,负责当前进程中程序的执⾏

进程和线程的关系

1、一个进程可以有很多个线程,但是一个线程只能属于一个进程

2、线程算是进程上下文的一部分

3、一个程序至少有一个进程

进程和线程的区别

1、线程是程序执行的基本单位,进程是CPU分配资源基本单位

2、进程一定归于操作系统管理,线程不一定

3、进程是程序运行的一个实体,程序运行结束进程将自动被收回;线程是进程运行中的一个执行路径(子序列)

线程优缺点 

优点:

1、多条线程在进程中并发运行,由于线程的切换比进程更快,所以在使用者看来线程比进程更接近于并行状态(本质上仍是并发的)

2、响应性好:既然线程更接近并行状态,那么多条线程并行时,其中一条线程堵塞了,其他线程看起来仍处于运行状态,所以仍会给用户提供服务

3、资源共享:线程之间的资源是共享的(例如代码、数据等),而进程需要通过通信来实现共享

4、经济:由于资源共享,所以创建线程更加经济,并且线程的切换所切换的资源也更少

缺点:

1、 编写多线程程序需要非常仔细的设计。在多线程程序中,因时序上细微的偏差或无意造成的变量共享而引发错误的可能性是很大的。
2、 对多线程程序的调试要比单个线程程序的调试困难得多,因为线程之间的交互难以控制。
3、 将大量计算分为两个部分,并把这个两个部分作为不同的线程来运行的程序在一台单处理器机器上并不一定运行得更快(因为本质上CPU一次仍然只能运行一个线程/一个进程),除非是多处理器真正实现多线程并行执行

易混概念

1、线程和进程在一个处理器中是并发执行的,不是并行运行的

2、线程出现后比进程节省资源的重要原因在于:在一个线程被阻塞后CPU切换其他线程的速度更快

3、进程创建线程后,进程本身也仍然和线程并发执行,共同抢占CPU资源

 线程实现方式

线程的类型:

1、完全由用户创建并管理(用户线程) 

2、完全由内核创建并管理(内核线程)

3、由内核和用户共同管理(组合线程)

多线程模型:

1、多对一模型:多个用户线程映射到一个内核线程

2、一对一模型:一个用户线程映射到一个内核线程

3、多对多模型:多个用户线程映射到多个内核线程

上图中:(a)中就是多对一模型(b)中就是一对一模型 (c)中就是多对多模型 

线程函数

头文件:

#include<pthread.h>

线程创建函数:

int pthread_create(pthread_t* thread,const pthread_attr_t* attr,void* (*start_routine)(void*),void* arg);
  • 作用:创建一个线程
  • 参数:
    • 第一个参数thread是新线程的标识符,后续pthread_*函数通过它来引用新进程。其类型的pthread_t定义为:
    • 第二个参数attr用于设置新线程的属性。传递NULL表示使用默认线程属性
    • 第三个参数是返回值、参数变量都为void*的函数指针
    • 第四个参数arg表示新线程的参数

线程退出函数:

        线程函数在结束时最好调用如下函数,该函数通过retval参数向进程的回收者传递其退出信息

void pthread_exit(void* retval);

进程等待线程函数:

int pthread_join(pthread_t thread,void**retval);

作用:阻塞进程直到其所有线程运行结束,再开始执行进程
参数:
        thread是目标现成的标识符
        retval是目标线程返回的退出信息
        返回值:成功0,失败返回错误码

终止线程函数:

int pthread_cannel(pthread_t thread);

作用:终止一个线程,即取消线程
参数:
        thread是目标线程标识符
        返回值:成功0,失败返回错误码

线程的使用 

线程基本操作(一)

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
 
void* fun(void* arg)
{
	for(int i=0;i<5;i++)
	{
		printf("fun run\n");
		sleep(1);
	}
}
 
int main()
{
	pthread_t id;
	pthread_create(&id,NULL,fun,NULL);
	for(int i=0;i<2;i++)
	{
		printf("main run\n");
		sleep(2);
	}
	exit(0);
}

执行结果: 

关键点:

1、进程和线程并发运行,抢占CPU资源

2、进程运行结束后,其线程也会被强制结束

3、线程创建需要一定的时间

线程基本操作(二)

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
 
void* fun(void* arg)
{
	for(int i=0;i<5;i++)
	{
		printf("fun run\n");
		sleep(1);
	}
	pthread_exit("fun over\n");//结束时会发送信息给进程
}
 
 
int main()
{
	pthread_t id;//存储线程的id
	pthread_create(&id,NULL,fun,NULL);
	for(int i=0;i<2;i++)
	{
		printf("main run\n");
		sleep(1);
	}
	char* s=NULL;
    pthread_join(id,(void**)&s);//阻塞进程等待线程结束,并得到线程的结束信息
    printf("s=%s",s);
	exit(0);
}

执行结果:

关键点: 

1、利用pthread_join来阻塞进程

2、利用pthread_exit来实现进程和线程的通信(消息传递)

并发运行 

#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
 
void* fun(void* arg)
{
	int index=*(int*)arg;
	for(int i=0;i<3;i++)
	{
		printf("index=%d\n",index);
		sleep(1);
	}
 
}
 
int main()
{
	pthread_t id[5];
	int i;
	for(i=0;i<5;i++)
	{
        index[i]=i;
		pthread_create(&id[i],NULL,fun,(void*)&index[i]);//进程先运行结束后,等待线程运行
	}	
	for(i=0;i<5;i++)
	{
        	pthread_join(id[i],NULL);//等待五个线程
	}
	exit(0);
}

执行结果 :

关键点:

1、不同线程并发运行

2、线程创建需要时间,按照现在的CPU速度,进程早已走完了5个循环 

总结

本文到这里就结束啦~~这堂课的内容较为杂乱、复杂,但是学一学拓展一下知识是非常好的呀~~
如果觉得对你有帮助,辛苦友友点个赞哦~

知识来源:操作系统概念(黑宝书)、山东大学高晓程老师PPT及课上讲解。不要私下外传

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【高录用-快速见刊】2024年数字化经济与金融创新国际学术会议(ICDEFI 2024)

会议简介 2024年数字经济与金融创新国际学术会议即将召开。此次会议旨在汇集全球数字经济与金融创新领域的专家学者&#xff0c;共同探讨数字经济的发展趋势以及金融创新的路径。与会者将分享前沿研究成果&#xff0c;讨论数字技术在金融领域的应用与创新&#xff0c;并推动数…

CSS导读 (元素显示模式 上)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 三、CSS的元素显示模式 3.1 什么是元素显示模式 3.2 块元素 3.3 行内元素 3.4 行内块元素 3.5 元素…

星邦生化设备有限公司将出席2024第13届生物发酵展

参展企业介绍 宁波星邦生化设备有限公司&#xff0c;致力于发酵空气处理、发酵尾气处理及发酵罐节能环保装备的研发制造达30余年。公司拥有20多项自主开发的具有竞争力的国家发明专利技术及核心专有技术。连续三届被中国生物发酵产业协会评为——节能环保重点推荐企业。公司用…

超声波清洗机有用吗?无广推荐清洁力比较强超声波清洗机

超声波清洗机利用超声波在液体中产生的微小气泡爆炸&#xff0c;产生强大的冲击力&#xff0c;能够深入物品的各个角落&#xff0c;有效去除油污、灰尘和细菌。与传统的手工清洗相比&#xff0c;不仅清洁效率高&#xff0c;而且能够保护眼镜不受损伤&#xff0c;特别适合清洗眼…

Java安全管理器-SecurityManager

定义&#xff1a; SecurityManager是Java中的一个类&#xff0c;用于实现安全管理功能。它允许应用程序在运行时对安全策略进行动态管理&#xff0c;并控制哪些操作可以执行&#xff0c;哪些应该被拒绝。主要功能包括&#xff1a; 安全策略管理&#xff1a;SecurityManager允许…

JavaEE之锁策略,cas 和 synchronized 优化过程深入浅出

目录 题外话 正题 锁策略 乐观锁和悲观锁 轻量锁和重量锁 CAS算法(Compare And Swap) 自旋锁和挂起等待锁 普通互斥锁和读写锁 公平锁和非公平锁 可重入锁和不可重入锁 synchronized原理 基本特点 锁升级 其它锁优化 锁消除 锁粗化 小结 题外话 时间紧任务重,直…

C++-基础

C语言介绍 C 是一种通用编程语言&#xff0c;具有高性能、灵活性和广泛的应用领域。它是在 1979 年由 Bjarne Stroustrup 开发的&#xff0c;最初被称为“C with Classes”&#xff0c;随后在 1983 年正式更名为 C。C 基于 C 语言&#xff0c;同时引入了面向对象编程&#xff0…

【MATLAB源码-第51期】基于matlab的粒子群算法(PSO)的栅格地图路径规划。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 粒子群算法&#xff08;Particle Swarm Optimization&#xff0c;简称PSO&#xff09;是一种模拟鸟群觅食行为的启发式优化方法。以下是其详细描述&#xff1a; 基本思想&#xff1a; 鸟群在寻找食物时&#xff0c;每只鸟都…

003 【笔记神器】Obsidian:打造属于自己的万能工作台

前言&#xff1a;Obsidian 是一款很多大神都在用的笔记软件&#xff0c;具有强大的功能&#xff0c;能够满足日常各种笔记的需求。强大之处在于&#xff1a;Obsidian 能够安装各种强大的插件&#xff0c;实现各种功能。 废话不多说&#xff0c;玩转 Obsidian 仅需这篇文章足矣&…

Linux/Iclean

Iclean Enumeration nmap 先使用默认规则扫描常用的端口&#xff0c;发现对外开放了 22 和 80 端口&#xff0c;然后扫描这两个端口的详细信息&#xff0c;结果如下&#xff0c;很常规的结果&#xff0c;没发现什么有趣的东西 ┌──(kali㉿kali)-[~/vegetable/HTB/Iclean] …

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024)

2024年文化、历史与人文艺术与社会发展国际会议(CHHASD2024) 会议简介 2024年国际文化、历史、人文、艺术与社会发展会议&#xff08;CHHASD2024&#xff09;将在中国武汉举行&#xff0c;主题为“文化、历史&#xff0c;人文、艺术和社会发展”。CHHASD2024汇集了来自世界各…

反爬虫之代理IP封禁-协采云IP池

反爬虫之代理IP封禁-协采云IP池 1、目标网址2、IP封禁4033、协采云IP池 1、目标网址 aHR0cDovL3d3dy5jY2dwLXRpYW5qaW4uZ292LmNuLw 2、IP封禁403 这个网站对IP的要求很高&#xff0c;短时间请求十几次就会遭关进小黑屋。如下图&#xff1a; 明显是网站进行了反爬处理&…

ubuntu22安装snipaste

Ubuntu 22.04 一、Snipaste 介绍和下载 Snipaste 官网下载链接: Snipaste Downloads 二、安装并使用 Snipaste # 1、进入Snipaste-2.8.9-Beta-x86_64.AppImage 目录&#xff08;根据自己下载目录&#xff09; cd /home/jack/Downloads/softwares/AppImage# 2、Snipaste-2.8.9-…

图像分类——综合车辆数据集

一、重要性及意义 智能交通管理&#xff1a;车辆图像分类是智能交通系统&#xff08;ITS&#xff09;中的关键组成部分。通过对监控摄像头捕捉到的车辆图像进行自动分类&#xff0c;系统能够实时识别车辆类型、颜色、品牌等信息&#xff0c;进而实现交通流量监控、违章行为检测…

在线知识库如何从零开始搭建?这篇文章来教你!

引言&#xff1a; 有没有想过把那些零散在脑海中的点点滴滴整理起来&#xff0c;建立一个属于自己的在线知识库&#xff1f;无论是个人学习&#xff0c;团队协作&#xff0c;还是企业管理&#xff0c;一个良好的知识库都能帮我们更高效地存储和分享知识。如果你还在为“怎么建知…

YesPMP众包平台 | 活动有礼,现金奖励点击领取!

YesPMP众包平台在线发福利啦&#xff0c;4月16日活动火热开启&#xff0c;现金奖励等你来领&#xff0c;最高可领千元&#xff0c;赶快参与将奖励收入囊中&#xff0c;一起来了解活动细节吧&#xff01; 一、活动内容&#xff1a; 活动一&#xff1a;【项目征集令】活动&…

告别传统开发,用这11个网站模板搭建的零售线上商城,制作成本都大幅降低了

随着人工智能时代的到来&#xff0c;很多复杂的工作再日益变得简单。比如20年前开发一个在线商城完成支付交易&#xff0c;那是一个不得了的事情&#xff0c;现在的零售巨头淘宝和京东就是在那个时代崛起的。新时代涌现出了许多新的工具&#xff0c;比如使用低代码平台搭建的自…

【网站项目】驾校报名小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

使用Python生成二维码

1、背景 上一次我们介绍了什么是二维码&#xff0c;读过这篇文章以后&#xff0c;相信大家对二维码已经有了一定的认识&#xff0c;那么有没有想过如何自己动手生成二维码呢&#xff1f;二维码在我们的生活与工作中&#xff0c;都能够做什么呢&#xff1f;今天我们来探讨一下用…

2.Mysql 多实例的部署和应用

Mysql多实例的概念&#xff1a; MySql多实例就是在一台机器上开启多个不同的服务端口&#xff0c;运行多个MySql服务进程&#xff0c;通过不同的socket监听不同的服务端口来提供各自的服务。 这些Mysql多实例共用一套MySql安装程序&#xff0c;使用不同的my.cnf&#xff08;也可…