操作系统导论
Hello World
- 安装gcc用来编译c代码
sudo yum install gcc
- 编写
Hello World
#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}
- 使用
gcc
编译
-o 是指定出处文件的名字——也就是编译完的文件会叫hello
gcc hello.c -o hello
- 运行
./hello
运行
开篇
虚拟化CPU
- 编写一段代码,效果为反复打印用户启动程序时传入的字符串
vim cpu.c
#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
void spin(int seconds){usleep(seconds *1000000);
}
int main(int argc,char *argv[]) {if(argc!=2){fprintf(stderr,"usage:cpu<string>\n");exit(1);}char* str=argv[1];while(1){spin(1);printf("%s\n",str);}return 0;
}
- 编译
gcc -o cpu cpu.c
- 启动一个
./cpu A
- 同时启动多个
./cpu A & ./cpu B & ./cpu C & ./cpu D
- 终止运行
killall cpu
虚拟化内存
并发
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h> // 确保包含pthread库的头文件volatile int counter = 0; // 共享计数器,使用volatile以防止编译器优化
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 <value>\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;
}
加互斥锁
#include <pthread.h>pthread_mutex_t lock; // 声明一个互斥锁void *worker(void *arg) {int i;for (i = 0; i < loops; i++) {pthread_mutex_lock(&lock); // 加锁counter++;pthread_mutex_unlock(&lock); // 解锁}return NULL;
}int main(int argc, char *argv[]) {pthread_mutex_init(&lock, NULL); // 初始化互斥锁...pthread_mutex_destroy(&lock); // 销毁互斥锁
}