【计算机基础】

article/2025/9/22 6:41:15

文章目录

    • 线程、协程的状态
  • 计算机网络
      • DNS解析
  • 计算机基础
      • 进程间通讯的7种方式
      • 讲一下程序的虚拟内存、常驻内存和逻辑内存。
      • 堆和栈是存啥的?
      • 什么是大小端?
    • 什么是死锁?什么情况下会发生(避免)死锁?
      • 死锁产生的4个必要条件?
      • 解决死锁的基本方法
        • 顺序获得锁(golang 互斥锁正常、饥饿模式)
        • 超时放弃
        • 死锁检测
      • 线程在切换过程中干了啥?

线程、协程的状态

二. 线程的状态

  • ①. 新建状态(NEW)
    新建(NEW):新创建了一个线程对象。
    实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了新建状态。

  • ②. 就绪状态(RUNNABLE/READY)
    可运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU 的使用权 。

  • ③. 运行中状态(RUNNING)
    运行(RUNNING):可运行状态(runnable)的线程获得了cpu 时间片(timeslice) ,执行程序代码

  • ④. 阻塞状态(BLOCKED)
    阻塞(BLOCKED):阻塞状态是指线程因为某种原因放弃了CPU 使用权,也即让出了CPU时间片,暂时停止运行。直到线程进入可运行(runnable)状态,才有机会再次获得CPU时间片转到运行(running)状态。阻塞的情况分三种:

    • 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放入等待队列(waitting queue)中。
    • 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。
    • 超时等待:运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。
  • ⑤. 终止状态(TERMINATED)
    死亡(DEAD):线程run()、main() 方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

从运行态的线程怎么变成阻塞态

计算机网络

https://blog.csdn.net/weixin_43746433/article/details/115839931

DNS解析

client 提出域名解析请求,并发送给本地域名服务器
本地域名解析服务器收到请求,先查询缓存(有缓存直接返回),若没有缓存,就去根域名服务器找
根域名服务器告诉本地域名服务器一个主域名服务器的地址
本地域名服务器又去找主域名服务器,若主域名服务器没有缓存,则告诉一个具体的解析服务器地址
本地域名服务器最后去找解析服务器地址,获取到解析结果

在这里插入图片描述

计算机基础

进程间通讯的7种方式

1、常见的通信方式

  • 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    命名管道FIFO:有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。

  • 消息队列MessageQueue:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  • 共享存储SharedMemory:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。

  • 信号量Semaphore:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

  • 套接字Socket:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

  • 信号 ( sinal ) : 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。

讲一下程序的虚拟内存、常驻内存和逻辑内存。

虚拟内存(VIRT):程序占用的内存大小。程序申请多少内存,就增长多少内存。
常驻内存(RES):实际上当前占用的内存大小(部分未使用到的虚拟内存可能被写入磁盘上)
共享内存(SHR):除了自身进程的共享内存,也包括其他进程的共享内存。虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小。计算某个进程所占的物理内存大小公式:RES – SHR。swap out后,它将会降下来

逻辑内存:虚拟内存所创建出来的展示给开发者的内存空间即为逻辑内存。虚拟地址即为逻辑地址。
物理内存:实际的硬盘的内存

虚拟内存和常驻内存的存在,需要引入页表,来记录哪些存在与内存中,哪些不存在。当进程访问的数据不在物理内存上的时候,需要缺页中断。将磁盘上面的数据读入内存。而这个过程是操作系统自动完成的,不需要开发人员感知。

堆和栈是存啥的?

  • 堆:程序用来动态分配和释放的空间,一般可以达到4个G。
  • 栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。

栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

堆内存: 存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

  • 堆自底向上生长,栈自顶向下生长。堆是动态分配的。栈可以是静态分配和动态分配两种,但是栈的动态分配由编译器释放。

堆栈中数据插入、删除遵循 后进先出的规则,因此插入数据向上增长和向下增长需要注意插入的方向。

堆是一个二叉树,以最大堆为例,建堆的本质是让这颗二叉树满足父节点的值大于等于子节点节点。
自底向上本质上就是一个倒序的层次遍历,每个层上的元素与自己的孩子比较一下,保证自己大于子节点,最后堆顶一定是最大值。通过层层向上的方式,符合堆性质的区域从底层向上扩张,最终建堆完成。
如果是自顶向下,当第i层和他的孩子i+1层比较中出现交换,交换后的i层不能保证小于i-1层,于是又要向上验证,最坏情况是验证到顶。正常建堆的时间复杂度是log2n,自顶向下这么一搞,相当于二叉树上每条路径要做一个冒泡排序,复杂度还不得上天(懒得算)。当然要自底向上

在这里插入图片描述

什么是大小端?

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:

一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;

另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。

总结:

表示数据在存储器中的存放顺序

  • 小端模式:数据的高字节,存放在高地址中。计算机读取数据的方向,是从高地址开始读取的;
  • 大端模式:数据的高字节,存放在低地址中。计算机读取数据的方向,是从低地址开始读取的;

记忆口诀:“小端低低”
iOS都是小端模式。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

三、为什么有大小端模式之分呢?
由于各硬件商,按自己的构想设计硬件,导致了硬件设计不同,工作原理也有差异。所以有的硬件采用了大端模式,有的硬件采用了小端模式。都认为各自采用的模式是更优秀;

什么是死锁?什么情况下会发生(避免)死锁?

线程死锁是指由于两个或者多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法前往执行。

当线程互相持有对方所需要的资源时,会互相等待对方释放资源,如果线程都不主动释放所占有的资源,将产生死锁。

死锁产生的4个必要条件?

互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源在未使用完之前,不能剥夺,只能在使用完时由自己释放。
环路等待条件:在发生死锁时,必然存在一个进程–资源的环形链。

解决死锁的基本方法

顺序获得锁(golang 互斥锁正常、饥饿模式)

当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。
如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生

超时放弃

另外一个可以避免死锁的方法是在尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求。

若一个线程没有在给定的时限内成功获得所有需要的锁,则会进行回退并释放所有已经获得的锁,然后等待一段随机的时间再重试。这段随机的等待时间让其它线程有机会尝试获取相同的这些锁,并且让该应用在没有获得锁的时候可以继续运行(译者注:加锁超时后可以先继续运行干点其它事情,再回头来重复之前加锁的逻辑)。

死锁检测

死锁检测是一个更好的死锁预防机制,它主要是针对那些不可能实现按序加锁并且锁超时也不可行的场景。

每当一个线程获得了锁,会在线程和锁相关的数据结构中(map、graph等等)将其记下。除此之外,每当有线程请求锁,也需要记录在这个数据结构中。

当一个线程请求锁失败时,这个线程可以遍历锁的关系图看看是否有死锁发生。例如,线程A请求锁7,但是锁7这个时候被线程B持有,这时线程A就可以检查一下线程B是否已经请求了线程A当前所持有的锁。如果线程B确实有这样的请求,那么就是发生了死锁(线程A拥有锁1,请求锁7;线程B拥有锁7,请求锁1)。

Go 1.14 版本之前,没有实现抢占式调度,必须某个 goroutine 交出控制权,因此自旋锁会导致死锁。如下图:A等待B释放锁,但是执行了GC,然后B被挂起,runtime需要等待A挂起,但是A在执行自旋锁,就发生了死锁。需要在自旋锁内部调用一次 runtime.GoSched 来交出 CPU 控制权

在这里插入图片描述

线程在切换过程中干了啥?

进程调度,切换进程上下文,包括分配的内存,包括数据段,附加段,堆栈段,代码段,以及一些表格。
线程调度,切换线程上下文,主要切换堆栈,以及各寄存器,因为同一个进程里的线程除了堆栈不同,其余基本上共享。
协程又称为轻量级线程,每个协程都自带了一个栈,可以认为一个协程就是一个函数和这个存放这个函数运行时数据的栈,这个栈非常小,一般只有几十kb。

进程切换分两步:
1.切换页目录以使用新的地址空间
2.切换内核栈和硬件上下文
对于linux来说,线程和进程的最大区别就在于地址空间,对于线程切换,第1步是不需要做的,第2是进程和线程切换都要做的。

切换的性能消耗:
1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。
2、另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))或者相当的神马东西会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题


http://chatgpt.dhexx.cn/article/gqAsHe6l.shtml

相关文章

计算机基础(1)

目录 一、计算机发展 1.1计算机发展史 1.2计算机分类 1.2.1按规模划分 1.2.2服务器与客户机 1.2.2.1 服务器按外形分类 1.3服务器硬件 一、计算机发展 1.1计算机发展史 1、第一代计算机(1946-1957) 电子管时代 冯诺依曼体系结构:数字计算机的数制采用二进…

计算机基础介绍

1、组成部分 中央处理器、内存、存储设备、输入/输出设备、通信设备(各部分通过总线来连接) 2、冯诺依曼体系结构:现代计算机的基础 3、中央处理器(CPU)——计算机的大脑 (1)作用&#xff1a…

C语言基础入门——自定义类型

学习目标: 学习并了解C语言自定义类型 目录 学习目标: 一、结构体 ●结构体的声明 ●结构体的引用 ●结构体的定义和初始化 ●结构体的内存对齐 ●结构体的传参 ●结构体的位段(位段的可填充和可移植性) 二、枚举 ●枚举的定…

1.计算机基础

目录 1.1计算机系统 1.3 计算机硬件 1.4 计算机常用计数制 1.5 数据表示 1.1计算机系统 计算机多种形式:电脑,笔记本,智能手机,服务器等; 两部分组成:硬件系统和软件系统。 1.1.1 世界上第一台计算机 世…

一、计算机基础

计算机基础 一、第 1 章 计算机基础知识1-1 计算机概述1-1-1 计算机的产生与发展(一)计算工具的发展(二)现代计算机的发展(三)计算机的分代(四)计算机新技术的发展 1-1-2 计算机的特…

计算机基础及入门

1、计算机基本概念 1.1、计算机是什么 计算机(computer): 俗称电脑,是现代一种用于高速计算的电子计算机器 特点: 数值计算;逻辑计算;存储记忆;能按照程序运行、自动、高速处理处理…

计算机基础入门

说明:计算机包含硬件(hardware)和软件(software)两部分。 计算机分为6大硬件: 1.CPU 即中央处理器(central processing unit,简称CPU)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。…

计算机基础的介绍

计算机概念 这是一个家用计算机的硬件和软件组成: 计算机软件代码最基层 — 固件,在计算机首次启动时由处理器运行一些引导加载程序,比如从U盘、光盘等读取操作 系统。这些程序永久储存在计算机内存中,所以称作固件。嵌入式操作…

计算机基础

文章目录 一、数据结构1. 排序算法快排归并排序堆 2. 结构堆和栈区别数组与链表数据库相关的B树、B树跳表LSM树红黑树前缀树 二、Java基础0 基础问题1. 抽象类和接口的区别2. final关键字、内部类、static3. 多态4. 成员变量和局部变量5. String类、StringBuilder类6. Java集合…

计算机基础知识——基础入门(一)

目录 CPU 一、CPU是什么 二、CPU 实际做什么 三、CPU 的内部结构 CPU 是寄存器的集合体 四、CPU 指令执行过程 内存 一、什么是内存 二、内存的物理结构 内存的读写过程 内存的现实模型 三、内存的使用 指针 数组是内存的实现 栈和队列 链表 二叉树 磁盘 认…

计算机基础教程(一)

《大学计算机基础教程PDF》下载链接 链接:https://pan.baidu.com/s/1PGsvh1oRD1euWUedEXNl8w 密码:zt4x 推荐先看下面的两本: 计算机是怎样跑起来的 程序是怎样跑起来的 这两本百度云连接,CSDN审核不通过,可以自己…

韩漫《绿色镌像》又名《绿色镌刻》

雕塑专业的学生马修在第一眼遇到陈时感受到了命运,而陈青宇看透了充满肮脏金钱和背叛的冷酷世界,他不断忍受着心中的疼痛,直到与马修相见,他开始展露自己的欲望...隐藏着不同欲望的两个男人的故事自此开幕——

推荐几个免费看漫画的资源网站,请低调收藏

1、木马动漫 https://omyschool.com/ 2、第6夜漫画 http://www.d6ye.com/ 3、土豪漫画 https://www.tohomh123.com/ 4、动漫屋 http://www.dm5.com/ 5、漫画柜 https://www.manhuagui.com/

电子漫画 - 轻轻松松

▲ 有的器件的功能只有在它损坏的时候才能够体现 1970,5 《大众电子》 ▲ 欧姆定律漫画 ▲ 另外一个欧姆定律漫画 ▲ LED应用时总是需要串联一个限流电阻 LED:你使我闪亮,否则我会灭亡 电阻:你是那么漂亮,直戳我的新房

有哪些漫画在线观看?最好是好看的完结漫画

在线漫画就是指把原有的漫画书籍以图片加文字的形式绘画出来,再连载于各大漫画网站或者漫画软件上,漫画在线观看,不用下载。而现在好看的漫画太多了,有些漫画是新番,有些漫画是完结作品。机智的我,当然是要…

【破解软件】知音漫客免费看更多漫画

历史文章推荐: 1、漫客栈破解版 2、漫画岛破解版 3、漫画台破解版 4、二次元漫画破解版 【软件名称】: 知音漫客(免费版) 【软件版本】: v_4.9.5 【软件大小】: 23.25MB 【支持系统】: 安卓系统 【亲测演示】: 软件无需登录包含更多漫画…

没有好看的百合漫画,纯纯的校园爱情漫画也不错

百合漫画一般都是指女孩与女孩之间的爱情故事,有很多漫迷小伙伴喜欢看这一类好看的百合漫画。现在动漫为了迎合读者的口味,越来越多的动漫作品中也加入了百合情节。不过呢,没有找到好看的百合漫画的同学,其实纯纯的校园爱情漫画也…

专属EE的精美电子漫画

关注、星标公众号,精彩内容每日送达 来源:网络素材 ▲ 图1 硬盘表面的指纹 ▲ 图2 电路中的维修人员 ▲ 图3 电路中的拆卸工人 ▲ 图4 电路进行局部维修 ▲ 图5 电路环境下的钻探工 ▲ 图6 磁盘表面的施工人员 ▲ 图7 搬运电阻 ▲ 图8 这个电容与有问题 …

HGAME

Week1 前端游戏 看代码 通关之后调用mota()方法 mota方法是一个算法,计算flag 想办法先调用mota方法就可以了 改一下代码即可(源代码dump一下,重新跑一下) 身份伪造类型 补充知识点 headers(…

免费、纯净、开源、无广告的全网漫画APP,可自定义32个漫画源!

之前Aliwen给大家分享过不少的看漫画的资源神器,不过有的之前解锁的神器,居然有的失效了,用不了了!,满足不了大家的需求了!😭 所以,Aliwen特地的找了一款在github上面的一款的开源神…