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

目录

回顾

前景知识

概述

定义

进程和线程的关系

进程和线程的区别

线程优缺点 

优点:

缺点:

易混概念

 线程实现方式

线程的类型:

​编辑

多线程模型:

线程函数

头文件:

线程创建函数:

线程退出函数:

进程等待线程函数:

终止线程函数:

线程的使用 

线程基本操作(一)

线程基本操作(二)

并发运行 

总结


回顾

上一篇文章讲了两个点: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,一经查实,立即删除!

相关文章

【团体程序设计天梯赛 往年关键真题 详细分析完整AC代码】L2-003 月饼(贪心) L2-004 这是二叉搜索树吗? (数据结构)

L2-003 月饼 贪心 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出的…

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.…

C#中的this关键字:详解与使用

在C#编程中&#xff0c;类和对象是构建应用程序的基础。面向对象编程的核心是封装、继承和多态。在类的内部&#xff0c;我们定义了成员变量和成员方法&#xff0c;这些成员变量和方法构成了对象的状态和行为。然而&#xff0c;在类的成员方法中&#xff0c;我们经常需要访问对…

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

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

linux运行node项目

文章目录 1、安装node2、安装forever node的守护进程3、forever操作3.1 启动相关3.2 停止操纵3.3 重启操作 1、安装node 下载node包&#xff0c;wget node链接进行解压增加配置文件 export PATH$PATH:node解压路径刷新配置文件node -v 查看node版本 2、安装forever node的守护…

我这10年的“搞站”路

我叫老牛&#xff0c;是高中室友给起的&#xff0c;原因很简单&#xff0c;我在8人寝室年龄排第六&#xff0c;四川话“老6”和“老牛”读音相仿。 后来我就把我的qq昵称改成了“L.N.”&#xff0c;我接受了这个称呼&#xff0c;因为自我审视&#xff0c;性格的确有执拗的一面&…

【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操作…

Mongodb入门--头歌实验MongoDB 实验——数据备份和恢复

在实际的应用场景中&#xff0c;经常需要对业务数据进行备份以做容灾准备&#xff0c; MongoDB 提供了备份和恢复的功能&#xff0c;分别是 MongoDB 下的 一、数据备份 任务描述 本关任务&#xff1a;按照编程要求备份数据库。 相关知识 为了完成本关任务&#xff0c;你需要掌…

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

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

微服务架构核心组件介绍

微服务架构是一种设计方法&#xff0c;它将应用程序分解为一组小型、松散耦合的服务。每个服务运行在自己的进程中&#xff0c;并通常围绕业务能力组织。这种架构风格使得服务可以独立地部署、扩展和维护。在微服务架构中&#xff0c;有几个核心组件是至关重要的&#xff0c;它…

android 修改kernel编译版本信息

1&#xff0c;android版本&#xff1a; 在android/build/core/version_defaults.mk中红色部分 ifeq "" "$(BUILD_NUMBER)" # BUILD_NUMBER should be set to the source control value that # represents the current state of the source code. E.g…

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;源文档在这…

项目管理-Jiar Software

Jira Software是澳大利亚公司Atlassian出品的一款项目与事务跟踪工具&#xff0c;被广泛应用于需求管理、项目追踪、任务追踪、缺陷追踪、流程审批、敏捷项目管理等软件研发领域。它不仅是一个强大的项目管理工具&#xff0c;还是一个适用于各种类型用例的工作管理工具。 在项…

Mysql-模糊匹配度排序分页

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

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

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

数据库字段命名指南:为大型ERP系统提供通用性中英文对照表

当设计数据库时&#xff0c;良好的字段命名是确保系统可维护性和可扩展性的关键之一。在大型ERP系统开发中&#xff0c;尤其需要注意数据库字段的命名规范&#xff0c;以确保系统的可读性和可维护性。本文将探讨在数据库设计中使用拼音和英文单词命名的优缺点&#xff0c;并提供…