- 博客(35)
- 收藏
- 关注
原创 重谈地址空间
页表分为两级 虚拟地址的前十位为一级页表对应的位置, 次10位表示对应二级页表的位置, 最后12位, 表示对应物理地址页框的偏移量, (二级页表大部分情况下是不全的, 进程一般用不完所以空间)32 位的虚拟地址 分为三个部分 为 10 + 10 + 12;32 为计算机的虚拟地址就是32位。这是由页表内部的结构决定的。我们以32位计算机为例子。
2024-08-30 19:06:02
233
原创 Linux信号捕捉
要处理信号, 我们进程就得知道自己是否收到了信号, 收到了哪些信号, 所以进程需要再合适的时候去查一查自己的, 什么时候进行检测呢?当我们的进程从内核态返回到用户态的时候, 进行信号的检测和处理。我们就先简单的解释一下嘛, 内核态最常见的时候就是我们在使用系统调用的时候, 此时不仅仅我们要去执行系统调用里的代码, 我们还得有资格去访问操作系统内的资源, 所以此时操作系统会自动将我们的身份变化为内核身份, 这就是我们的内核态, 而用户态就是我们在执行我们自己编写的代码的时候的状态。
2024-05-07 21:52:13
859
1
原创 Linux进程地址空间第三讲
至今为止, 我们所学到的大多数的知识, 包括语言, 数据结构, 动静态库等等的 都是在下面这3G, 也就是用户空间里的(进程等待, 信号之类的与内核有关的是在上面那1G里的)所以对于我们来说, 我们并没有怎么接触上面的这些部分。上面这部分(1G)映射的是操作系统的代码和数据。
2024-05-07 21:52:04
403
原创 Linux消息队列信号量(了解)
要实现进程间通信我们必须得让不同的进程看到同一份资源, 根据这个资源的不同(文件缓冲区, 内存块, 队列) 我们将通信方式分为管道,共享内存,以及我们接下来要讲的消息队列。消息队列的原理就是让不同的进程能看到同一个队列, 每当想发送数据就将链入队列中, 这样每个进程都能从队列中拿到发送给自己的数据。这种通信方式和之前将的共享内存一样是system V标准。
2024-04-25 20:37:09
802
原创 Linux共享内存
操作系统在物理内存处开辟一段空间, 在修改页表将这段空间映射到一个进程的共享区, 然后将对应的虚拟地址的起始地址显示给应用层, 对另外一个进程也做同样的操作, 这样两个进程就可以通过页表访问这一段内存了。我们看上面的那个图, 其中perms代表的是该共享内存的权限, nattch代表的是有多少个进程和这个共享内存关联。首先, 我们发现, 我们直接运行用户端, 发现用户端没有等客户端输入消息, 直接就开始读取, 所以读到的是空。我们通过查看系统内共享内存发现, 原来是我们之前创建的共享内存没有被释放导致的。
2024-04-17 23:14:02
817
原创 Linux 用管道实现一个简易版的进程池
进程池其实就是我们提前创建好一批进程, 当有任务的时候再将进程指派过去完成那个任务。中间的这框框就是管道, 当父进程没有给子进程发送任务的时候, 子进程就会一直阻塞着, 于是就形成了这样的结构。
2024-04-10 01:36:42
274
原创 怎么将本地VScode与Linux云服务器上的Vscode联动起来
点进来后就可以看到主机已经加载进来了(如果没有, 关闭VScode重进就好了)如果点击后还有continue和cancel的选项就选择。首先我们打开本地刚刚下好的VScode, 下载。此时你的VScode左侧栏里就会出现这个图标。当我们看到这样的时候就说明链接成功了。登上之后就有了当前目录下的所有文件了。保存后就可以在服务器上看到这个文件了。然后输入ssh 用户名@公网地址。如果我们要对代码进行编译可以使用。此时在使用命令行编译代码即可。我们新建文件编写好代码后按。右键点击后选择第一个选项。
2024-04-07 16:25:37
536
原创 Linux进程地址空间第二讲
程序编译好之后, 内部有地址的概念吗?有的, 当程序在编译好后, 内部的诸如变量, 函数等等都变成的地址;而这个地址其实就是虚拟地址, 但是为了做区分我们把他叫做逻辑地址。
2024-04-07 09:31:20
311
原创 Linux中的动静态库
现在我们想把我们刚刚写的这个方法给别人使用我们有两种选法:1 我把源文件直接给他2 我把源代码想办法打包成库发给他库 + .h头文件我们先生成一个库可以看到我们的库已经生成了。接下来我们站在使用者的角度, 来使用一下我们这个静态库。
2024-04-07 09:31:08
1108
原创 补充知识
1 一个磁盘对应的文件他在访问之前部分的属性已经加载到内存了。2 进程打开文件时, 本质上就是进一步在磁盘中把对应的文件打开 –属性往struct inode放, 内容保存好, 最终在用户层写入的时候, 经过系统调用, 进过一系列数据结构找到对应的page然后将数据刷新进物理内存。
2024-04-02 23:36:50
561
原创 Linux中的文件操作
在讲文件操作之前, 我们先形成一个共识1 文件 = 内容 + 属性2 文件分为打开的文件 和 没打开的文件3 打开的文件是谁打开的?进程!!– 研究文件操作本质是研究进程和文件的关系!4 没打开的文件:在哪里放着?在磁盘上, 我们最关注什么问题?没有被打开的文件非常多, 文件如何被分门别类的放置好 – 我们要快速的进行增删查改5 文件被打开, 必须先被夹在到内存!(属性一定要加载, 内存取决于是否要进行修改)6 一个进程可以打开多个文件。
2024-03-30 21:24:17
775
原创 Linux进程程序替换
我们之前创建的子进程, 虽然能够与父进程分工干不同的事, 但是其代码还是与父进程是同一份的, 而如果我们希望子进程和父进程跑完全不一样的代码, 我们就需要使用程序替换这个技术。
2024-03-28 14:45:18
767
原创 Linux进程控制(等待)
到目前为止:我们必须对子进程进行回收, 因为如果不回收会造成内存泄漏wait()等待的是该进程的所有子进程这段代码就是回收多个子进程的示例。
2024-03-26 21:30:38
856
原创 Linux的进程控制(创建和终止)
我们前面已经认识过fork函数, 用fork创建新进程后, 新建立的进程为子进程, 该进程为父进程。fork给父进程返回的是子进程的pid, 给子进程返回的是0, 出错时返回-1进程调用fork。
2024-03-25 21:24:51
992
原创 Linux中的进程地址空间
我们在学习c语言的时候一定是看到过这张图的当时我们的理解是认为这张图描述的是内存空间, 但其实不是的。我们用这个代码来打印出上图所对应的地址可以看到确实地址是从低到高的在开辟空间是, 栈区是自上向下开辟(大地址到小地址) 而堆区是自下向上开辟的(小地址到大地址)可以看到栈的地址是从大到小的可以看到堆区的地址是从小到大的我们知道当我们给变量定义static时, 该变量不会随着函数的释放而被释放为什么呢?我们打印一下他的地址。
2024-03-21 15:16:20
695
1
原创 Linux中的进程(概念,状态)
我们的系统中通常会有多个进程, 调度器就是觉得将哪一个进程放进CPU里运行的那个东西, 调度器的调度原则一般都是要尽可能的平均或则公平的;运行状态凡是在运行队列中的进程,我们称为运行态(R), 表示该进程已经准备好了, 可以随时被调度。
2024-03-12 22:45:31
787
1
原创 指令的运行原理 - 简单理解
指令的本质就是编译好的程序和脚本, 一定会在系统的特定路径下存放。2 保护OS, 对于用户的非法请求, 直接拦截。输入指令的过程其实本质是输入字符串。等等是不同解释器的具体称呼。是所有命令行解释器的统称,
2024-03-05 20:59:38
411
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人