当前位置: 首页 > news >正文

操作系统(多线程)

1.概述

每个线程是CPU使用的一个基本单元,包括线程ID、程序计数器、寄存器组和堆栈。

传统单线程:

多线程进程:


2.动机

  在某些情况下,单个应用程序可能需要执行多个类似的任务。例如,一个Web服务器接受有关网页、图像、声音等的客户请求。一个繁忙的Web可能有多个用户并发访问它。如果一个Web服务器作为单个线程的传统进程来执行,那么只能一次处理一个请求,这样客户需要等待很长时间。一种解决方法是让服务器作为单个进程运行,以便接受请求。当服务器收到请求时,它会创建一个进程以便处理请求,但是创建进程很耗费时间和资源。如果新进程与原进程执行同样的任务,为什么要承担这些开销呢?通常,使用一个包含多个线程的进程更加有效。如果服务器是多线程的,那么可以创建一个单独的线程,以便监听客户需要。

3.优点

  1. 提高程序的响应速度。在多线程程序中,可以将一个耗时的任务放在一个线程中执行,另一个线程可以执行其他任务,从而提高了程序的响应速度。
  2. 提高系统的资源利用率,在多线程程序中,多个线程可以共享计算机的资源,如CPU、内存、硬盘等,提高了系统的资源利用率。
  3. 线程的创建更加经济,线程创建所需内存和资源比进程的创建要少很多,而且线程间的切换也更加迅速
  4. 对于多核CPU,多线程可以在多核上并行运行。


4.多核编程

大体意思就是不是CPU的核越多越好,一个程序中串行代码,和并行代码,如下:

a=b+1;
c=a*c;//c的处理要等到a计算完成
————————————————————————————————————
a=3;
c=4;//并行算法,两个可以并发执行

代码中如果串行代码较多,代码要等到其需要的过程执行完成,才能进行下一步。即使有再多的核,也需要“排队执行”。

Amdahl定律:

5.多线程模型

有两种不同的方法来支持线程,一种是用户层的用户线程、一种是内核层的内核线程。用户线程位于内核之上,它的管理不需要内核支持,而内核线程由操作系统直接支持与管理。

5.1多对一模型

映射多个用户线程到一个内核线程。线程管理是由用户空间的线程库来完成的,因此效率较高。但是如果一个线程执行阻塞系统调用,那么整个线程将会阻塞。再者因为一个时间只有一个线程可以访问内核,所以多个线程不能在多核系统上并行运行

5.2一对一模型

  映射每个用户线程到一个内核线程,一个线程阻塞时另一个线程可以继续执行,有更好的并发性,也允许多个线程并行地在处理器上运行。唯一缺点是每创建一个用户线程就要创建一个相应的内核线程,由于创建系统线程的开销可能会影响程序性能,所以大多数模型限制了支持线程数量。

5.3多对多模型

实现难度高,需要根据用户和程序来创建线程。

6.线程池

在进程开始时创建一定数量的线程,并加到池中等待工作(若每请求一次创建一次,耗费时间太多)。当服务器收到请求时,它会唤醒池内的一个线程,并将需要的服务传递给它。

相关文章:

  • 基于单片机的车载酒精含量自检系统设计与实现
  • Selenium 学习(0.20)——软件测试之单元测试
  • 综合知识篇02-UML统一建模语言(2024年软考高级系统架构设计师冲刺知识点总结系列文章)
  • ChatGPT-Next-Web SSRF漏洞+XSS漏洞复现(CVE-2023-49785)
  • UE4案例记录
  • 二 centos 7.9 磁盘挂载
  • Unreal发布Android在刘海屏手机上不能全屏显示问题
  • CompletableFuture原理与实践-外卖商家端API的异步化
  • 爬虫3_爬取翻页URL不变的网站
  • ETAS工程在ISOLA软件中如何看到OS中断的配置
  • bootstrap企业网站前端模板
  • COX回归影响因素分析的基本过程与方法
  • Jmeter——循环控制器中实现Counter计数器的次数重置
  • C/C++动态链接库的封装和调用
  • Nginx、LVS、HAProxy工作原理和负载均衡架构
  • 【译】JS基础算法脚本:字符串结尾
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【笔记】你不知道的JS读书笔记——Promise
  • CentOS 7 修改主机名
  • Create React App 使用
  • ES6 ...操作符
  • extract-text-webpack-plugin用法
  • js递归,无限分级树形折叠菜单
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • supervisor 永不挂掉的进程 安装以及使用
  • text-decoration与color属性
  • ucore操作系统实验笔记 - 重新理解中断
  • Vim Clutch | 面向脚踏板编程……
  • vue-router的history模式发布配置
  • vue脚手架vue-cli
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • !!java web学习笔记(一到五)
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #if 1...#endif
  • #在 README.md 中生成项目目录结构
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (八)c52学习之旅-中断实验
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)程序员技术练级攻略
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net Core和.Net Standard直观理解
  • .NetCore部署微服务(二)
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • @AutoConfigurationPackage的使用
  • [<MySQL优化总结>]
  • [2016.7 test.5] T1