代码编织梦想

1. 虚拟化CPU

#include <stdio.h>
#include <stdlib.h>
#include "common.h"

int main(int argc, char *argv[])
{
    if (argc != 2) {
	fprintf(stderr, "usage: cpu <string>\n");
	exit(1);
    }
    char *str = argv[1];

    while (1) {
	printf("%s\n", str);
	Spin(1);
    }
    return 0;
}

编译:gcc -o cpu cpu.c -Wall
运行:./cpu A & ./cpu B & ./cpu C & ./cpu D &
假设上述代码在单处理器上面运行,也会输出:A,B,C,D,A,B,D,C…等等;事实证明,在硬件的帮助下,操作系统负责这种假象,即系统拥有非常多的虚拟CPU的假象.将单个CPU(或其中一小部分)转换为看似无限量的CPU,这就是所谓的虚拟化CPU

2.虚拟化内存

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include "common.h"

int main(int argc, char *argv[]) {
    if (argc != 2) { 
	fprintf(stderr, "usage: mem <value>\n"); 
	exit(1); 
    } 
    int *p; 
    p = malloc(sizeof(int));
    assert(p != NULL);
    printf("(%d) addr pointed to by p: %p\n", (int) getpid(), p);
    *p = atoi(argv[1]); // assign value to addr stored in p
    while (1) {
	Spin(1);
	*p = *p + 1;
	printf("(%d) value of p: %d\n", getpid(), *p);
    }
    return 0;
}

编译:gcc -o mem mem.c -Wall
运行:./mem 1 ./mem 2
输出:
(13294) addr pointed to by p: 0x55d1b89772a0
(13295) addr pointed to by p: 0x5571867272a0
(13294) value of p: 2
(13295) value of p: 3
(13294) value of p: 3
(13295) value of p: 4
虚拟化内存:每个进程访问自己的私有虚拟地址空间,操作系统以某种方式映射到机器的物理内存上,一个正在运行的程序中的内存引用不会影响其他进程的地址空间;

2.3并发

#include <stdio.h>
#include <stdlib.h>
#include "common.h"
#include "common_threads.h"

volatile int counter = 0; 
int loops;

void *worker(void *arg) {
    int i;
    for (i = 0; i < loops; i++) {
	counter++;
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    if (argc != 2) { 
	fprintf(stderr, "usage: threads <loops>\n"); 
	exit(1); 
    } 
    loops = atoi(argv[1]);
    pthread_t p1, p2;
    printf("Initial value : %d\n", counter);
    Pthread_create(&p1, NULL, worker, NULL); 
    Pthread_create(&p2, NULL, worker, NULL);
    Pthread_join(p1, NULL);
    Pthread_join(p2, NULL);
    printf("Final value   : %d\n", counter);
    return 0;
}

编译:gcc -o threads threads.c -Wall -pthread
运行:./thread 1000
输出:
Initial value : 0
Final value : 2000
主程序利用Pthread_create创建了两个线程,你可能会猜到两个线程完成时候,计数器最终值为2000;

但是当你输入:./thread 10000时候发现输出为:

Initial value : 0
Final value   : 10901

并且每次结果还不一样,这些结果与指令如何执行有关,上面程序关键是增加共享计数器的地方,需要三条指令:一条将计数器的值从内存加载到寄存器,一条将其递增,另一条将其保存回内存,因为这三条指令不是以原子方式执行,所以结果会很奇怪;

2.4持久性

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/L_H_L/article/details/111090630

操作系统:独立磁盘冗余阵列(RAID)的相关介绍-爱代码爱编程

一、RAID的相关概念及介绍: 什么是RAID? ——RAID是一种把多块独立的硬盘(物理硬盘)按不同方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据冗余的技术。 ——1987年由加利福尼亚大学伯克利分校提出。 ——组成磁盘阵列的不同方式成为RAID级别(RAID Levels)。   什么是数据冗余? ——

Stanford Pintos Project2源代码分析&实现思路-爱代码爱编程

0. 引言 本文是对以下仓库中Pintos Project2源代码的思路分析,截取了重要的核心函数,以方便读者理解整个的实现思路。仅供参考,完成作业记得自己深入理解噢~ https://github.com/NicoleMayer/pintos_project2 1. 打印进程终结信息 1.1 process_exit void pro

第四章-存储器管理 (地址变换必考!SWUST操作系统期末复习试题+历届真题)-爱代码爱编程

1.何谓装入时动态链接?装入时动态链接方式有何优点? 装入时动态链接是指用户将源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的一种链接方式,即在装入一个目标模块时,若发生一个外部的模块调用事件,将引入装入程序去相应的外部目标模块,把它装入内存中,并修改目标模块中的相对地址。 优点:①便于修改和更新②便于实现对目标模块的共享2.何谓运行时动

Python网络编程之六:操作系统发展史及网络编程总结-爱代码爱编程

Python网络编程之六:操作系统发展史及网络编程总结 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成。 现代计算机系统是一个复杂的系统。 一、为什么要有操作系统 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作,这个繁琐的工作就是操作系统来干的

【自制操作系统】一、搭建开发环境-爱代码爱编程

开发环境 平台: Ubuntu 20.01.1 LTSC语言编译器GCC汇编语言编译器NASMBochs虚拟机1、GCC和NASM的安装 $ sudo apt install gcc $ sudo apt install g++ $ sudo apt install nasm 或者: $ sudo apt install build-essent

【翻译】在代码指针完整性(CPI)上攻击的可能性——On the Feasibility of Attacks on Code-Pointer Integrity-爱代码爱编程

文章目录 摘要 1.指针完整性 1.1基于硬件分段的实现 1.2基于软件故障隔离的实现 1.3基于信息隐藏的实现 2.对CPI实施最简单的攻击 参考 摘要 尽管进行了许多研究来减轻控制流劫持攻击,但仍是一个主要的安全问题。 代码指针完整性(