![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
操作系统
btc_runes
没什么意思的人!
展开
-
CSAPP第四章 优化程序性能:循环展开
计算一个前缀和的用时,利用循环展开写法和非循环展开未循环展开代码:循环展开代码:性能对比:未循环展开性能耗时:循环展开性能耗时:可以看出相同的数据量下,循环展开的写法可以让程序性能更优,但注意处理边界问题。...原创 2022-05-16 15:05:56 · 333 阅读 · 2 评论 -
Linux 静态库和动态库的制作
静态库的制作:Lib.h#ifndef LIB_H#define LIB_Hvoid show();#endifLib.c#include "Lib.h"#include <stdio.h>void show() { printf("Hello Wrold!\n");}Program.c#include "Lib.h"int main() { show(); return 0;}首先将Lib.c编译成Lib.ogcc -c Lib.c -o Li原创 2022-04-19 20:37:35 · 251 阅读 · 0 评论 -
《程序员的自我修养——装载、链接与库》段地址对齐
根据上面的例子我们看它是如何对齐的。以上方案采用了一页为单位向上取整的方案,但是这个方案有一个缺点,当一页是4096,但是我们呢这个段有4097个字节,那难道要用一页占一个字节?显然这种方案效率十分低。以下是UNIX解决这个方案的方法。由上图,从我的理解角度,可以得出一个一个结论来,为了减少页内碎片,提高内存利用率,UNIX采取了在一个物理页可以存储多个段,多个段被映射到虚拟内存空间上,提高内存的利用率。...原创 2022-04-09 11:12:48 · 422 阅读 · 0 评论 -
UNIX环境高级编程ls的实现
如上图,由于apue.h是作者自己实现的,所以我们可以去网上拷贝一份apue.h/* Our own header, to be included before all standard system headers */#ifndef _APUE_H#define _APUE_H#if defined(SOLARIS)#define _XOPEN_SOURCE \ 500 /* Single UNIX Specification, Version 2 for Solaris 9 *.原创 2022-04-08 21:42:29 · 145 阅读 · 0 评论 -
Common块和Bss段的区别
昨天看《程序员的自我修养——链接,装载与库》发现不是很理解为什么要用common块,然后仔细看了一番,有了自己的理解。common块:用来存放弱符号,而全局未初始化变量是弱符号,但是难道不是应该存放在.bss段吗,为什么要有common块呢?原因:首先链接器是无法识别符号的类型的,它支持存在多个相同的弱符号存在,但是如果存在多个相同的弱符号,没有强符号存在的情况下,会默认最大的弱符号的内存大小是我们要分配的内存。但是在多文件链接的时候,可能在其他文件中会存在相同的弱符号但是类型可能会不同,所以当一个文件原创 2022-04-05 11:47:55 · 889 阅读 · 0 评论 -
《程序员的自我修养——链接,装载与库》内联汇编实现printf在终端打印字符串
由于我的虚拟机是64位Ubunt20.04,所以和书中所述环境不一致,系统调用号,不一致,所以我看了一遍知乎上的内容,了解了关于64位系统下的环境,然后实现这个过程。先看代码:nomain.cchar* str = "Hello World!\n";void exit() { asm("movq $42,%rdi \n\t" "movq $60,%rax \n\t" "syscall \n\t");}void printf() { asm("movq $13,原创 2022-04-03 13:26:29 · 5929 阅读 · 0 评论 -
linux 无法导入 import rpool的问题已解决
变成如下原因是,电脑死机了,非主动关机磁盘数据丢失了!报如上错误时首先输入一个 zpool import然后会显示你的rpool的信息,我的电脑显示的时bpool,然后使用 zpool import bpool,再重启就完成了,最后变成如下:...原创 2022-03-21 19:19:42 · 1466 阅读 · 1 评论 -
(Linux) 使用裸ld手动链接c程序
最近在看《程序员的自我修养——链接,装载与库》,然后看到了链接部分,当然之前看csapp某一章节时,也看到了链接部分,本想手动实验一下,但是,到关键的链接部分了给了如下程序:!!!ld -o prog [system object files and args] /tmp/main.o /tmp/sum.o[system object files and args]? 这玩意是个啥,咋不说清楚?然后我就从《程序员的自我修养——链接,装载与库》跳章节开始找答案,找到这一章,看了他说Linux 的/u原创 2022-03-18 18:06:41 · 2192 阅读 · 1 评论 -
进程的虚拟地址空间
进程的虚拟地址空间分为两部分:内核空间和用户空间每个进程都有各自的虚拟地址空间,这个是说用户空间,而内核空间是所有进程共享的,内核在初始化时,就创建内核空间的映射(因为所有进程共享,有一份就够了),并且,采用的就是线性映射,所谓线性, 就是内核一整块内核空间页, 一对一地映射到一块物理内存上。当程序进行系统调用时,产生中断,从用户态切换到内核态,切换用户栈为内核栈,将用户栈信息放到内核栈里,中断结束后恢复现场,这里内核空间的资源都是共享的。...原创 2022-03-14 21:52:31 · 2459 阅读 · 0 评论 -
王道408操作系统:虚拟内存技术的实现
虚拟内存技术允许将一个作业分多次调入内存。采用连续分配方式时,会使相当一部分内存空间处于暂时或永久性 “空闲状态",造成内存资源的严重浪费,而且也无法从逻辑上扩大内存容量。因此虚拟内存的实现需要建立在离散分配的内存管理方式基础上。虚拟内存的实现有一下三种方式:请求分页式存储管理。请求分段式存储管理。请求段页式存储管理。不管哪种方式,都需要一定的硬件支持。一般需要的支持有以下几个方面:一定容量的内存和外存。页表机制(或段表机制),作为主要的数据结构。中断机构,当用户要访问到的部分尚未.原创 2022-02-09 18:18:48 · 562 阅读 · 0 评论 -
考研 操作系统:银行家算法
最近复习到死锁这一张了,之前找工作背八股的时候,这个知识点,背的挺溜的,但是思想什么的虽然都理解了,但是不如动手实现一下来的方便,所以用编程语言实现了一个银行家算法来解决死锁问题。编写的代码:#include <iostream>#include <queue>#include <vector>/*进程个数和资源个数*/int n, m;class Bank { public: Bank(int pid, std::vector<原创 2022-01-27 16:32:48 · 912 阅读 · 0 评论 -
多进程图像
多进程使用cpu的图像进程控制块(process control block,PCB)如何使用cpu呢?让程序执行起来如何充分利用cpu呢?启动多个程序,交替执行启动的程序就是进程,所以是多个进程推进操作系统只需要把这些进程记录好,要按照合理的次序推进(分配的资源,进行调度)这就是多进程图像多进程如何组织多个进程对应的pcb放在不同队列里,用状态转移进行推进多进程的组织:pcb+状态+队列进程状态转移:就绪—>运行,运行—>就绪,运行—>等待,等原创 2021-03-07 22:29:26 · 173 阅读 · 0 评论