计算机-编程相关

在 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.mzph.cn/diannao/14030.shtml

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

相关文章

Thingsboard规则链:Entity Type Switch节点详解

在物联网(IoT)领域,随着设备数量的爆炸式增长和数据复杂性的增加,高效、灵活的数据处理机制变得至关重要。作为一款先进的物联网平台,ThingsBoard提供了强大的规则链(Rule Chains)功能&#xff…

第四节 Starter 加载时机和源码理解

tips:每个 springBoot 的版本不同,代码的实现存会存在不同。 上一章,我们聊到 mybatis-spring-boot-starter; 简单分析了它的结构。 这一章我们将着重分析 Starter 的加载机制,并结合源码进行分析理解。 一、加载实际…

问题与解决:element ui垂直菜单展开后显示不全

比如我这个垂直菜单展开后,其实系统管理下面还有其他子菜单,但是显示不出来了。 解决方法很简单,只需要在菜单外面包一层el-scrollbar,并且将高度设置为100vh。

Laravel 11 PHP8

一直都是用laravel 7 左右的,现在要求将项目升级到laravel 11 和使用PHP8,随手记录一些小问题,laravel 11的包是领导给的,没有使用composer 安装,所以我也不确定和官方的是否一致 遇到这问题 可以这样 env 中默认的数…

基于若依的旅游推荐管理系统(spring boot+vue+mybatis+Ajax)

一、项目目的 随着社会的高速发展,人们生活水平的不断提高,以及工作节奏的加快,旅游逐渐成为一个热门的话题,因为其形式的多样,涉及的面比较广,成为人们放松压力,调节情绪的首要选择。 传统的旅…

上位机图像处理和嵌入式模块部署(mcu的按键输入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 做技术的同学,大部分都会把精力放在技术本身,却忽视了学的东西有什么实际的用途。就拿gpio来说,一般我们点灯也…

正确认识IP地址和子网掩码的联系

IP地址和子网掩码是计算机网络中两个非常重要的概念,它们共同确定了设备在局域网中的地址以及该地址所属的子网,只要两者结合,就能确定唯一地址IP66_ip归属地在线查询_免费ip查询_ip精准定位平台。 IP地址是用于标识计算机网络中的每台设备的…

Ajax用法总结(包括原生Ajax、Jquery、Axois)

HTTP知识 HTTP(hypertext transport protocol)协议『超文本传输协议』,协议详细规定了浏览器和万维网服务器之间互相通信的规则。 请求报文 请求行: GET、POST /s?ieutf-8...(url的一长串参数) HTTP/1.1 请求头…

Mac安装 Intellij IDEA,亲测有效M1、M2可用

引言 最近开始学习使用spring boot写一个简单的后端项目,使用Intellij IDEA软件,Intellij IDEA为新用户提供了30天的免费试用。 方案 1.官网下载Intellij IDEA IntelliJ IDEA – the Leading Java and Kotlin IDE 或者直接网盘连接下载:…

第一份工资

当我拿到我人生的第一份工资时,那是一种难以言表的激动。我记得那个下午,阳光透过窗户洒在了我的办公桌上,我看着那张支票,心中满是欣喜和自豪。那是我独立生活的开始,也是我对自己能力的一种肯定。 我记得我是如何支配…

SQL注入:pikachu靶场中的SQL注入通关

目录 1、数字型注入(post) 2、字符型注入(get) 3、搜索型注入 4、XX型注入 5、"insert/update"注入 Insert: update: 6、"delete"注入 7、"http header"注入 8、盲…

【Linux安全】Firewalld防火墙

目录 一.Firewalld概述 二.Firewalld和iptables的关系 1.firewalld和iptables的联系 2.firewalld和iptables的区别 三.Firewalld区域 1.概念 2.九个区域 3.区域介绍 4.Firewalld数据处理流程 四.Firewalld-cmd命令行操作 1.查看 2.增加 3.删除 4.修改 五.Firewa…

arping 一键检测网络设备连通性(KALI工具系列二)

目录 1、KALI LINUX简介 2、arping工具简介 3、在KALI中使用arping 3.1 目标主机IP(win) 3.2 KALI的IP 4、操作示例 4.1 IP测试 4.2 ARP测试 4.3 根据存活情况返回 5、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发…

【机器学习与大模型】驱动下的电子商务应用

摘要: 随着信息技术的飞速发展,电子商务已经成为当今商业领域中最为活跃和重要的部分之一。而机器学习和大模型的出现,为电子商务带来了新的机遇和挑战。本文深入探讨了机器学习与大模型在电子商务中的应用,包括个性化推荐、精准营…

基于双向长短期记忆 Bi-LSTM 对消费者投诉进行多类分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

CSS transform 三大属性 rotate、scale、translate

transform 浏览器支持定义和用法translate位移函数rotate旋转函数scale缩放函数 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 紧跟在 -webkit-, -ms- 或 -moz- 前的数字为支持该前缀属性的第一个浏览器版本号。 定义和用法 transform 属性向元素应用 2D…

在chrome中查找和验证xpath

1、快速获取XPath表达式 按F12打开chrome浏览器的开发者模式,点击选择光标,选择页面上的元素位置,在控制台右键选择Copy XPath,表达式就复制到粘贴板中了。 获取到的xpath路径://*[id"hotsearch-content-wrapper…

iOS App上架全流程及审核避坑指南

App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流程开始梳理,详细了解下iOS app上架的那些…

6.1 if语句

计算机语言和人类语言类似,人类语言是为了解决人与人之间交流的问题,而计算机语言是为了解决程序员与计算机之间交流的问题。程序员编写的程序就是计算机的控制指令,控制计算机的运行。借助于编译工具,可以将各种不同的编程语言的…

冯喜运:5.24黄金今日能否回调?日内国际黄金美原油操作策略

【黄金消息面分析】:在过去的半个世纪里,美国国债作为买入持有的投资手段,轻松超越了黄金。然而,如今债券作为终极避险资产的地位正面临着前所未有的挑战。传统上,投资者将美国国债视为一种超安全的投资,因…