计算机-编程相关

在 Linux 中、一切都是文件、硬件设备是文件、管道是文件、网络套接字也是文件。

for

https://juejin.cn/post/6844904103437582344

fork 进程的一些问题

fork 函数比较特殊、一次调用会返回两次。在父进程和子进程都会返回。

每个进程在内核中都是一个 taskstruct 结构、fork 的时候、内核把内核中原来的 task_struct 拷贝了一份

还创建了一个全新的地址空间和堆栈

在这里插入图片描述

进程的地址空间没有拷贝,子进程和父进程是在共享内存空间的。都是映射到同一个物理内存页上的

在这里插入图片描述

内核把这些页面都设置成只读、如果你们是读的话、不会有问题、但是有一方尝试写入、就会触发异常。内核发现异常后再分配一个新的页面让你们分开使用。这个就是写时复制。

在这里插入图片描述

线程的栈

线程的栈默认是 8M、实际上一开始分配给栈并不是那么大的空间。会按需自动增大。直到大于 8M 就会栈溢出。

进程间如何通信

信号

信号时 Linux 上的一种软中断通信机制、可以向制定进程发送通知。总共有 64 种信号、不过信号只能作为通知使用。没办法传输数据。

socket 套接字

网络通信使用。可以将连接的地址设置为 127.0.0.1 作为本地计算机通信。这样子的话、不需要经过网卡、因为 127.0.0.1 是本地回环地址,数据在协议栈就转发。 但是抓包可以抓到、因为在虚拟的回环网卡lo上抓到。

匿名管道

单向。满了会阻塞

需要有亲缘关系的进程继承指挥才能通信。

命名管道

只要指明管道名称就能通信。不需要进程间有关系。

消息队列

共享内存

IO 多路复用

自己写了一个 web 服务进程。监听某个端口、如何处理客户端的连接请求。(单线程 while 去接受处理客户端连接请求)

当客户连接成功之后、但是一直不传输数据、线程会一直卡在那里、并且没法再处理其他客户的连接请求了

多线程去应对

每一个连接过来都去创建一个新的线程去处理。

select 模型

越来越多的连接过来了、线程越来越多、终于顶唔住了。。。。

I/O 多路复用

有个叫 select 的函数、你把文件描述符批量传给他,平时他阻塞在那里、只要其中有一个有消息来、它就会返回,你这个时候去检查睡来消息,并去处理就行了。

select 函数是怎么做到的?

它会遍历所有的文件描述符、把你挂入与这些文件描述符相关联的设备等待队列中、如何交出执行权进入阻塞,等后面这些设备来消息、然后通过回调函数通知你。把你唤醒。

但是 select 函数底层时使用位图数组来存储要管理的文件描述符的、容量有上线。最多只能同时处理 1024 个文件描述符。

poll

但是 poll 和 select 一样。慢!!

为啥慢?

1、 每次返回后不告诉程序到底是哪一个文件描述符有消息、需要程序一个个遍历。耽搁了不少时间

2、每次调用他们的时候、都要把所有的文件描述符从用户态地址空间拷贝到内核中,这样子经常拷贝也费时间。

epoll

epoll 这个多路复用模型、不需要每次拷贝全部的数据、只需要增减就行。因为它内部采用红黑树来管理监听的文件描述符,所以查找起来很快。而且它内部还有一个队列、所有就绪的文件描述符都会进入中国队列。程序不再需要遍历所有的文件描述符去找来消息的那个了。

像访问内存一样读写文件

在这里插入图片描述

因为磁盘太慢了、所以在内核空间中给每一个要读取的文件建立一个数据结构。里面记录了已经缓存的文件数据块信息。从硬盘读过来的数据就缓存到内存。并记录到这个数据结构中。

以后读取文件的时候、先通过这个数据结构去查询、查到就直接拷贝给应用、查不到才去找磁盘要。

CPU的局部性原理在这里也适用。

在写文件的时候是先写到这个缓存里面、并不会立即同步刷到磁盘的、这时候突然断电、缓存的数据就会丢掉了。

sync 函数、只要你调用它、就会马上进行同步、写入硬盘。

内存映射文件

读取文件时需要进行两次拷贝、第一次从磁盘拷贝到内核的缓存页中、第二次把它从缓存中拷贝到应用程序的缓冲区中。

写的时候也是同理。

把文件的数据缓存页映射到用户态地址空间、这样用户态地址空间的缓冲区和缓存页就能映射到同一个物理内存页。

在这里插入图片描述

再进一步的话就是

在进程的地址空间划分一块区域和文件内容简历映射关系、等到应用程序访问这部分区域的时候、会发生缺页中断错误、这时我们把数据从硬盘读取到缓存页中、再把缓存页和进程中缺页中断的页面关联起来。

这样子对应用无感。不用再使用 read、write、fseek 这样麻烦地读写文件。

在这里插入图片描述

这个 api 叫 mmap 内存映射文件。

协程

A:Java 线程执行阻塞函数时被操作系统挂起、切换到别的线程。

B:线程切换是否需要成本?如果大量线程频繁切换、成本又当如何?

A:如果担心这个问题、那就不用阻塞函数、通过异步回调进行。

B:异步回调确实不用阻塞、不过它有两点不好、其一就是割裂了原来的业务代码、其二就是回调地狱。

协程

线程可以在执行函数遇到阻塞后,保存执行的上下文、转而执行别处到代码。待阻塞请求完成后、再回去继续执行。

线程是有操作系统统一调度管理的。那么在一个线程中、同样可以抽象出多个执行流、由线程来统一调度管理、这线程智商抽象的执行流就是协程。

在这里插入图片描述

线程时操作系统在调度管理、那线程里抽出来的执行流、也就是协程、该怎么调度管理?

OS 通过时钟中断和系统调用进入内核来剥夺线程的执行权、那线程如何剥夺协程的执行权来实现调度管理?

协程:协作式程序。它会主动交出执行权。

Java19 已经支持了虚拟线程(协程)、或者使用第三方协程框架 Quasar

https://zhuanlan.zhihu.com/p/425978232

https://book.douban.com/subject/36428782/

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

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

相关文章

Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解

系列文章目录 Python数据类型:编程新手的必修课深入探索Python字符串:技巧、方法与实战Python 函数基础详解Python正则表达式详解:掌握文本匹配的魔法Python文件操作宝典:一步步教你玩转文件读写Python面向对象基础与魔法方法详解…

实验五:实现循环双链表各种基本运算的算法

实验五:实现循环双链表各种基本运算的算法 一、实验目的与要求 目的:领会循环双链表存储结构和掌握循环双链表中各种基本运算算法设计。 内容:编写一个程序cdinklist.cpp,实现循环双链表的各种基本运算和整体建表算法(假设循环双链表的元素类型ElemType为char),并…

【加密与解密(第四版)】第十七章笔记

第十七章 软件保护技术 17.1 防范算法求逆 17.2 抵御静态分析 反汇编算法:线性扫描(无法正确地将代码和数据分开)、递归进行 巧妙构造代码和数据,在指令流中插入很多“数据垃圾",干扰反汇编软件的判断&#xf…

百度手机号登录iApp源码V3

本源码直接对接百度网页版登录接口,无需跳转第三方APP或者网页,可直接进行输入手机号获取验证码的步骤,登录后可获取到用户的UID,名称,BDUSS,PTOKEN,STOKEN,头像直链。 源码下载&…

若依nodejs版本过高问题解决方案

由于nodejs版本过高,可能会导致vue-cli项目运行报错。 目录 方法1:每次启动项目前,输入配置命令 方法2:修改package.js

docker 网络模式

四种模式介绍 宿主机可上网,容器内便可上网.且能ping通宿主机同网段服务 Docker网络模式 配置 说明 host模式 --nethost 容器和宿主机共享Network namespace。 container模式 --netcontainer:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod…

【DevOps】深入浅出:Jenkins 性能监控全解析

目录 一、监控指标:把握系统健康状况 1、资源利用率: 2、 任务执行效率: 3、系统稳定性: 二、监控工具:选择合适的利器 1、Jenkins 内置监控 1.1、Jenkins Performance Plugin:系统性能指标的直观展…

性能测试工具

性能测试工具 1.Jmeter 环境搭建1.安装JDK2.安装Jmeter1.下载2.安装3.环境配置 3.Jmeter 文件目录介绍1.bin目录2.docs 目录3.printable_docs目录4.lib目录 4.修改默认配置1.汉化配置2.修改主题 5.元件的基本介绍6.元件的作用域作用域的原则 7.元件的执行顺序 1.Jmeter 环境搭建…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

ubuntu22.04下 easyconnect+输入法安装

先使用对应ubuntu版本的easyconnect安装 sudo dpkg -i EasyConnect_x64_7_6_7_3.deb 下载压缩包servicePack,并解压缩 cd 下载路径/servicePack sudo cp * /usr/share/sangfor/EasyConnect/ 打开easyConnect /usr/share/sangfor/EasyConnect/EasyConnect 此处…

Windows安全应急--反隐身术

NO.1 dir命令 首先做个演示,把演示01这个文件夹隐藏起来, 在文件夹上是看不到了, 我们可以使用dir命令查看, NO.2 文件夹选项–显示隐藏 这个是非常常规的了, 这里不做过多介绍 有些隐藏文件很顽固,上面…

mysql基础概念

一 基本操作 1 SQL分类 数据库:database 表:table,行:row 列:column 索引:index 视图:view 存储过程:procedure 存储函数:function 触发器:trigger 事…

使用HiBurn烧录鸿蒙.bin文件到Hi3861开发板

鸿蒙官方文档的“Hi3861开发板第一个示例程序”中描述了——如何使用DevEco Device Tool工具烧录二进制文件到Hi3861开发板; 本文将介绍如何使用HiBurn工具烧录鸿蒙的.bin文件到Hi3861开发板。 获取HiBurn工具 通过鸿蒙官方文档我们知道DevEco Device Tool是一个V…

Docker访问文件权限受限问题解决

问题描述 运行项目的docker环境,新添加了一个数据集,但是数据集的访问权限受限(Permission dinied),运行的命令如图所示 问题解决 chmod 777 xxx YYDS!!!但是单纯直接运行会因为权限…

5.22R语言初步学习-1

今天上课讲R语言,要干什么没讲,分析什么,目的是什么没讲。助教基本上就是让我们打开窗口,按要求抄代码指令,代码原理也没讲......再加上最近正好在学概率论与数理统计,肯定是有用的,所以还是学习…

CLIP论文学习

学习来自B站bryanyzhu

【list】list库介绍 + 简化模拟实现

本节博客先对list进行用法介绍,再在库的基础上简化其内容和形式,简单进行模拟实现,有需要借鉴即可。 目录 1.list介绍1.1 list概述1.2相关接口的介绍 2.简化模拟实现3.各部分的细节详述3.1结点3.2迭代器细节1:迭代器用原生指针还是…

风控指南:国内车险欺诈呈现四大趋势

目录 车险欺诈呈现内外勾结的团伙化 防范车险欺诈需要多重合作 保险企业需要提升反欺诈能力 监管部门需要加强协同合作 2024年4月11日,国家金融监督管理总局官网发布国家金融监督管理总局关于《反保险欺诈工作办法(征求意见稿)》公开征求意见…

Spark-广播变量详解

Spark概述 Spark-RDD概述 1.为什么会需要广播变量? 广播变量是为了在分布式计算环境中有效地向集群中的所有节点广播大型只读数据集而设计的。 在分布式环境中,通常会遇到需要在所有节点上使用相同的数据集的情况,但是将这些数据集复制到每个…

ChatGPT移动应用收入在GPT-4o发布后迎来最大涨幅

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…