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

目录

回顾

前景知识

概述

定义

进程和线程的关系

进程和线程的区别

线程优缺点 

优点:

缺点:

易混概念

 线程实现方式

线程的类型:

​编辑

多线程模型:

线程函数

头文件:

线程创建函数:

线程退出函数:

进程等待线程函数:

终止线程函数:

线程的使用 

线程基本操作(一)

线程基本操作(二)

并发运行 

总结


回顾

上一篇文章讲了两个点: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;//存储线程的idpthread_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及课上讲解。不要私下外传

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

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

相关文章

vscode i18n Ally插件配置项

.vscode文件&#xff1a; {"i18n-ally.localesPaths": ["src/lang"], //显示语言&#xff0c; 这里也可以设置显示英文为en,// 如下须要手动配置"i18n-ally.keystyle": "nested", // 翻译路径格式 (翻译后变量格式 nested&#xff1a…

氟化钡与盐酸反应不

结论&#xff1a;反应 氟化钡 名称   中文名称&#xff1a;氟化钡   英文别名&#xff1a;Bariumfluoride 化学式   BaF2 相对分子质量   175.32 性状   无色透明立方结晶或白色粉末。溶于盐酸、硝酸、氢氟酸和氯化铵溶液&#xff0c;微溶于水。 相对密度4.83。 熔…

MongoDB 使用

1 引用依赖包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>2 配置文件配置mongodb资料 # MongoDB连接信息 spring.data.mongodb.host 192.168.23.…

(二)使用VS2022克隆下载C++自制植物大战僵尸游戏教程

植物大战僵尸游戏开发教程专栏地址http://t.csdnimg.cn/uzrnw 本文将介绍如何使用VS2022克隆下载《植物大战僵尸C自制版本》。 Gitee项目地址&#xff1a; Gitee仓库地址https://gitee.com/GITLZ/PlantsVsZombies Github项目地址&#xff1a; Github仓库地址https://github…

【JS】querySelectorAll和getElementsByClassName

现有一段代码&#xff0c;li的类名均为item&#xff0c;有一按钮可动态添加类名为item的li。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge…

【C++从练气到飞升】07---内存管理

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 一、 C/C内存分布 二、 C语言中动态内存管理方式 三、 C中动态内存管理 1. new/delete操作内置类型 2. new和delete操作…

前端二维码工具小程序:营销裂变的好助手

一、摘要 在数字化营销日益盛行的今天&#xff0c;如何以新颖、高效的方式吸引用户&#xff0c;成为了每一个营销者所追求的目标。前端二维码工具小程序&#xff0c;作为一款集二维码生成、AI助手与绘图画画功能于一体的综合性工具&#xff0c;不仅为营销人员提供了全新的思路…

0101tomcat部署war访问mysql失败-容器间通信-docker项目部署

文章目录 一、简介二、部署1、mysql数据迁移2、docker部署redis3、docker部署tomcat并运行war包 三、报错四、解决1 分析2 解决 结语 一、简介 最近参与开发一个项目&#xff0c;其中一部分系统需要迁移。从阿里云迁移到实体服务器&#xff0c;使用docker部署。系统使用Java语…

openssl密钥证书管理(Key and Certificate Management)

前言 前两日应别人要求提供一份CSR文件过去&#xff0c;方便他们生成相关证书&#xff0c;对于这一块本来也不熟&#xff0c;于是找到openssl官网&#xff0c;想找找相关的教程看看&#xff0c;一番小找&#xff0c;果有收获&#xff0c;是个宝藏&#xff0c;源文档在这…

Mysql-模糊匹配度排序分页

Mysql-模糊匹配度排序分页 抛出问题 在使用模糊匹配分页的时候想根据匹配度高进行排序应该如何实现呢&#xff1f; 上面是添加的模拟数据&#xff0c;根据匹配度高的情况下张三的优先级肯定是最高的&#xff0c;首先直接使用模糊搜索分页看看效果吧。 很明显的可以看到&#…

【解决】Spring Boot创建项目常见问题

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 idea无maven选项 无效发行版17 类⽂件具有错误的版本 61.0, 应为 …

海外云手机为什么适合社媒运营?

如今&#xff0c;社媒营销如果做得好&#xff0c;引流效果好的账号&#xff0c;可以用来带货变现&#xff0c;而外贸、品牌出海也同样都在做社媒营销&#xff0c;Tik Tok、facebook、ins等热门的海外社媒平台都是行业密切关注的&#xff0c;必要的时候&#xff0c;大家会使用海…

「51媒体」权重高新闻源央级媒体邀约资料有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 权重高的央级媒体邀约资源包括了中国一些最具影响力和权威性的新闻机构。具体如下&#xff1a; 人民日报&#xff1a;作为中国共产党中央委员会的机关报&#xff0c;人民日报具有极高的权…

硬件测试学习——电源纹波测试(2024.04.15)

参考链接1: 测试开关电源的纹波 在此感谢各位前辈大佬的总结&#xff0c;写这个只是为了记录学习大佬资料的过程&#xff0c;内容基本都是搬运的大佬博客&#xff0c;觉着有用自己搞过来自己记一下&#xff0c;如果有大佬觉着我搬过来不好&#xff0c;联系我删。 硬件测试学习—…

腾讯EdgeOne产品测评体验—Web安全的攻与防:云端防护一体化

目录 简介接入准备EdgeOne购买及接入服务器环境配置添加测试站点关闭防护 安全性能测试XSS攻击sql注入 站点加速测试代码测试通过在线工具对比测试Ping检测tcping网站测速 HTTPS证书 操作步骤优点 总结EdgeOne的优缺点 简介 EdgeOne&#xff0c;作为腾讯云推出的全新CDN解决方…

Linux之 USB驱动框架-usb-skeleton.c usb驱动源码分析(3)

一、usb 驱动框架图 二、 usb 设备经典驱动&#xff1a;usb-skeleton.c 驱动 路径&#xff1a; drivers/usb/usb-skeleton.c USB骨架程序可以看做一个最简单的USB设备驱动的实例&#xff0c;其分析流程大致如下&#xff1a; static struct usb_driver skel_driver { …

揭示边缘计算网关的市场价格趋势(购买指南)-天拓四方

在数字化转型的大潮中&#xff0c;边缘计算网关作为连接云端与终端设备的核心节点&#xff0c;其重要性日益凸显。然而&#xff0c;面对市场上琳琅满目的边缘计算网关产品&#xff0c;对于许多企业和个人用户来说&#xff0c;边缘计算网关的价格成为选择产品时的重要考量因素。…

KT-105小动物人工呼吸机

咳咳&#xff0c;请各位小伙伴们注意啦&#xff01;我们要聊的主题可是相当高大上——小动物呼吸机&#xff01; 我们得先了解一下什么是小动物呼吸机。这可不是一般的机器哦&#xff0c;它是一种实验设备&#xff0c;主要用于各种各样的科学研究实验中。比如&#xff0c;在基…

【C++类和对象】类和对象的引入

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

mysql查找binlog的删除记录时间

需求&#xff1a;数据库某表的数据没有了&#xff1b;如何找是什么时修改清掉的&#xff1b; 思路&#xff1a; 1. 查代码&#xff0c;找某表的删除接口&#xff0c;分析是在哪里调用&#xff1b;【部分服务log不全】 2. 查服务的log&#xff1b;【部分服务log不全】 3. 查…