计算机-编程相关

在 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,一经查实,立即删除!

相关文章

ECMAScript、BOM与DOM:网页开发的三大基石

在深入Web开发的世界时,有三个核心概念构成了理解网页如何工作以及如何与之交互的基础:ECMAScript、BOM(Browser Object Model),以及DOM(Document Object Model)。本文旨在简要介绍这三个概念&a…

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 请求头…

Buzz库网络爬虫实例:快速爬取百度搜索实时热点

前言 随着互联网的发展,信息获取已经成为了人们日常生活和工作中的重要一环。而在信息获取的过程中,网络爬虫作为一种自动化的数据采集工具,为我们提供了极大的便利。本文将介绍如何利用PHP编写一个简单而高效的网络爬虫,实现快速…

R实验 参数检验(二)

实验目的:掌握正态分布和二项分布中,功效与样本容量之间的关系;学会利用R软件完成一个正态总体方差和两个正态总体方差比的区间估计和检验。 实验内容: (习题5.28)一种药物可治疗眼内高压,目的…

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、盲…

C#实现KMP算法,在长字符串中找到第一个符合要求的子字符串

KMP(Knuth-Morris-Pratt)算法是一种高效的字符串搜索算法,它可以在一个文本字符串(Text)中搜索一个词(Pattern),时间复杂度为O(nm),其中n是文本字符串的长度,…

vite前端UI框架使用详解(2024-05-24)

Vite(发音同 "veet")是一种新型前端构建工具,能够显著提升前端开发体验。它主要由两部分组成: 一个开发服务器,它基于原生的ES模块提供了丰富的内建功能,如速度快到惊人的 模块热更新&#xff08…

【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 发…

表现层框架设计之使用XML设计表现层

使用XML设计表现层,统一Web Form与Windows Form的外观。 1.XML(可扩展标记语言) XML(可扩展标记语言)与HTML类似,是一种标记语言。与主要用于控制数据的显示和外观的HTML标记不同,XML标记用于定…

PostgreSQL的扩展(extensions)-常用的扩展之pg_rman

PostgreSQL的扩展(extensions)-常用的扩展之pg_rman pg_rman 是 PostgreSQL 社区提供的一个备份和恢复管理工具。它能够简化和自动化 PostgreSQL 数据库的备份和恢复过程,并支持全量备份、增量备份和差异备份。pg_rman 提供了方便的命令行接…