> 作者简介:?旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。> 目标:了解冯诺依曼体系结构与操作系统,掌握Linux的进程
> 毒鸡汤:一花凋零荒芜不了整个春天,一次挫折也荒废不了整个人生。
> 望小伙伴们点赞👍收藏?加关注哟💕💕?
????????我们最初学习Linux指令已经可以用户与操作系统交互了,往后面我们用Xshell可以编写一些简单的代码,这些只能算是入门,咱们学习Linux可不是这些,如果只学习这些的话,那在C语言中这些我们已经掌握的比较熟练了😏😏。学习Linux掌握的是各种代码底层是如何运行和使用的。
我们从以下学习冯诺依曼体系结构与操作系统及其进程🤗🤗。
????????冯·诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。
????????数学家冯·诺依曼提出了计算机制造的三个基本原则,即采用二进制逻辑、程序存储执行以及计算机由五个部分组成(运算器、控制器、存储器、输入设备、输出设备),这套理论被称为冯·诺依曼体系结构。
截至目前,我们所认识的计算机,都是有一个个的硬件组件组成:
关于冯诺依曼,必须强调几点:
这里说的光用文字是很难理解冯诺依曼体系结构的,大家可搜说相关图片用图来了解冯诺依曼体系结构。
什么是操作系统:
为什么要有操作系统:
用图解释操作系统:
操作系统本质对数据做管理,而管理的模用一句话来概括:先描述,在组织。
总结:
计算机管理硬件
系统调用和库函数概念描述:
那在还没有学习进程之前,就问大家,操作系统是怎么管理进行进程管理的呢?很简单,先把进程描述起来,再把进程组织起来!
task_struct-PCB的一种,在Linux中描述进程的结构体叫做task_struct。task_struct是Linux内核的一种数据结构,它会被装载到RAM(内存)里并且包含着进程的信息 。
使用 ps ajx (a:所有,j:任务,x:把所有的信息全部输出)
一般搭配管道进行使用,如:ps ajx | head -1 && ps ajx | grep test
,其中?ps ajx | head -1
?是把?ps ajx
?输出的信息中的第一行信息(属性列)输出。
我们可以用以下查看当前目录下的进程:ls /proc/
那我们如何查看我们的进程???
运行结果:
ps ajx | head -1 && ps ajx | grep "mypro" //查看自己的进程
再次修改我们的myproc.c文件
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
if(ret < 0){
perror("fork");
return 1;
}
else if(ret == 0){ //child
printf("I am child : %d!, ret: %d\n", getpid(), ret);
}else{ //father
printf("I am father : %d!, ret: %d\n", getpid(), ret);
}
sleep(1);
return 0;
}
运行结果:
用下面指令搜索自己的进程:ps axj | grep 1889
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("before fork: I am a prcess, pid: %d, ppid: %d\n", getpid(), getppid());
sleep(5);
printf("开始创建进程啦!\n");
sleep(1);
pid_t id = fork();
if(id < 0) return 1;
else if(id == 0)
{
// 子进程
while(1){
printf("after fork, 我是子进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
sleep(1);
}
}
else{
// 父进程
while(1){
printf("after fork, 我是父进程: I am a prcess, pid: %d, ppid: %d, return id: %d\n", getpid(), getppid(), id);
sleep(1);
}
}
sleep(2);
return 0;
}
????????fork()之后,会有父进程+子进程两个进程在执行后续代码,fork()后续的代码,被父子进程共享,通过返回值不同,让父子进程执行共享代码的一部分,这就是并发式编程。
? ? ? ?今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。