冯诺依曼
- 程序和数据都以二进制存储在存储器中,存放在存储器的位置由存储器指定。
- 计算机工作的时候能够自动从存储器中取出指令然后执行。
进程
进程是操作系统分配时间片、内存等资源的基本单位(最小单位),每个进程都有自己的状态、有独立的地址空间。
- 程序:代码 + 数据
- 进程:代码 + 数据 + PCB(操作系统通过PCB感知一个进程的存在,PCB能够将代码和数据有效地整合)
ps aux
查看进程状态
linux的进程状态:
R
正在运行或就绪S
可中断的睡眠状态D
不可中断睡眠Z
僵尸状态T
停止状态
创建进程fork()
:
- 给进程分配pid,创建PCB
- 复制父进程的环境
- 为新进程分配资源
- 拷贝父进程的地址时间内容
- 放入就绪队列
fork()
创建一个子进程,一次调用两次返回,父进程的返回值是子进程的的进程id,子进程的返回值是0。
//创建一个进程
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void){
printf("before fork()\n");
pid_t pid = fork();//-->创建进程
if(pid == 0){
printf("child porcess: gtepid() = %d, return value = %d\n", getpid(), pid);
}else{
printf("parent porcess: gtepid() = %d, return value = %d\n", getpid(), pid);
}
getchar();
}
//运行结果
/*
before fork()
parent porcess: gtepid() = 3944, return value = 3945
child porcess: gtepid() = 3945, return value = 0
*/
多进程调试:set-fllow-mode parent/child
(默认走父进程)
//设置进程之跑固定CPU上
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sched.h>
int main(void){
cpu_set_t cpu;
pid_t pid = fork();
if(pid == 0){
CPU_ZERO(&cpu);//把cpu变量清空
CPU_SET(0, &cpu);//把变量cpu放到0号cpu上
sched_setaffinity(0, sizeof(cpu_set_t), &cpu);//设置进程之跑固定CPU上
while (1){
}
}else{
CPU_ZERO(&cpu);
CPU_SET(1, &cpu);
sched_setaffinity(0, sizeof(cpu_set_t), &cpu);
while (1){
}
}
}
错误处理
int setjmp(jmp_buf env);
保存程序堆栈信息的上下文到变量env,首次调用返回值为0void longjmp(jmp_buf env, int val);
恢复env保存的点,并设置setjmp()的返回值为valchar *strerror(int errnum);
返回错误号的字符串
#include <stdio.h>
#include <setjmp.h>
#include <stdlib.h>
jmp_buf buf;
void func(int s){
printf("func(int s)\n");
if (s == 1){
longjmp(buf, 1);//跳回20行,setjmp(buf))返回值变为1
}
printf("fun finsh\n");
}
int main(void){
int r;
printf("int main(void)\n");
if ((r = setjmp(buf)) == 0){//首次调用返回值为0
func(1);
}else if (r == 1){
printf("exception 1\n");
}
printf("main finish\n");
}
/*运行结果
int main(void)
func(int s)
exception 1
main finish
*/