1.进程概念
1.冯诺依曼体系结构
- 输⼊单元:包括键盘,⿏标,扫描仪,写板等
- 中央处理器(CPU):含有运算器和控制器等
- 输出单元:显⽰器,打印机等
- 这⾥的存储器指的是内存
⼀句话,所有设备都
只能直接和内存打交道
。!!!
对冯诺依曼的理解,不能停留在概念上,要深⼊到对软件数据流理解上,请解释,从你登录上qq开始和某位朋友聊天开始,数据的流动过程。
解释图如下:
2.操作系统
任何计算机系统都包含⼀个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:
- 内核(进程管理,内存管理,⽂件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
1. 设计OS的⽬的
• 对下,与硬件交互,管理所有的软硬件资源
• 对上,为⽤⼾程序(应⽤程序)提供⼀个良好的执⾏环境
2. 核心功能
在整个计算机软硬件架构中,操作系统的定位是:⼀款纯正的“搞管理
”的软件
3. 系统调⽤
- 在开发⻆度,操作系统对外会表现为⼀个整体,但是会暴露⾃⼰的部分接⼝,供上层开发使⽤,
这部分由操作系统提供的接⼝,叫做系统调⽤
。 - 系统调⽤在使⽤上,功能⽐较基础,对⽤⼾的要求相对也⽐较⾼,所以,有⼼的开发者可以对部
分系统调⽤进⾏适度封装,从⽽形成库,有了库,就很有利于更上层⽤⼾或者开发者进⾏⼆次开
发。
3.进程
进程概念理解:
总结:
其中内核数据结构对象有特定的名字————PCB
课本上称之为PCB
(processcontrolblock),Linux操作系统下的PCB是:task_struct
1.所有指令,工具,自己的程序,运行起来都是进程
ls,pwd…只要执行都是进程
4.进程调用
1.getpid()------函数
为了演示,先创建一个procss.c,并用vim写入以下程序:
#include<stdio.h>2 #include<unistd.h> //sleep需要包含的头文件3 #include<sys/types.h> //getpid的头文件4 int main()5 {6 while(1)7 {8 sleep(1);9 printf("我是一个进程,我的pid:%d\n",getpid());10 } 11 12 return 0;13 }
- 编译并运行可以发现,正在运行的程序也是一个进程,也会有他的id:
- 可以看到pid是541。
2. ps axj--------指令
在 根目录
下使用ps axj 可以展示所有进程,那如果我只想要我刚刚运行的a.out程序的进程咋办呢?
- 只需在
“ps axj”
后加上“ | grep + 程序文件 ”
: - 也可以再加上
ps axj | head -1
来展示各个信息的名称,-----------注意两个指令要用“;
”断开
- 可以看到这里有两行,因为grep自己也算一个进程
3. kill -9 + 进程id-------杀掉进程
- 当然可以直接使用
ctrl + c
直接杀掉进程
4. ls /proc----------要在根目录下使用
也可以用来查看进程
- 这些蓝色的文件都是目录,我们只需要找到我们需要的文件的id文件就行,刚刚为了演示杀掉了一次进程,现在id为907
如果程序退出,那么它就不再是一个进程了,就不会有id了
- cwd - 记录进程路径
- exe 为可执行程序
5.进程创建
所有进程都由它的父进程创建
1.获取父进程-------------getppid()
#include<stdio.h>2 #include<unistd.h>3 #include<sys/types.h>4 int main()5 {6 while(1)7 {8 sleep(1);9 printf("我是一个进程,我的pid:%d 我的父进程pid:%d \n",getpid(),getppid());10 }11 12 return 0;13 }
- 可以看到每次运行程序我的pid都发生变化,但ppid却不变。
2.创建子进程-------fork()------无参数,无返回值
- 默认创建的子进程默认使用父进程的代码和数据,但PCB和父进程不一致
fork()有返回值:
- (1).
子进程的pid
会返回给父进程,(2).0
会被返回给子进程-----------所以fork有两个返回值!!!!
- 如果调用失败,-1会被返回给父进程
运行结果类似如上:
提出问题:
- 1.因为孩子只有一个父亲,而父亲可以有多个孩子,所以父进程需要子进程id来区分不同的子进程,子进程一定知道父进程是什么,所以直接给0就行
- 2.
- 因为在fork函数里在return前子进程已经创建,所以父和子进程都走了一遍return,所以会返回两次
小结论:进程具有独立性
- 以上代码中子进程会把gval修改,但父进程中gval不会改变
可以理解为,如果两个进程共用同一份数据,但若其中一个修改了数据,那么内存会重新开辟一个数据给那个进程修改,促使两个进程独立