文章目录
- 进程概念
- 1、冯诺依曼体系结构
- 2、进程
- 2.1基本概念
- 2.2描述进程-PCB
- 2.3组织进程
- 2.4查看进程
- 2.5通过系统调用获取进程标识符
- 2.6通过系统调用创建进程-fork初识
进程概念
1、冯诺依曼体系结构
目前我们认识的计算机中,都是由一个个硬件构成
- 输入单元:键盘、鼠标、写字板等
- 中央处理器(CPU):含有运算器和控制器等
- 输出单元:显示器,打印机等
对于冯诺依曼一些结构,有以下几点注意:
- 存储器指的是内存
- 不考虑缓存情况,这里的CPU能且只能对内存进行读写, 不能访问外设
- 外设(输入设备或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取
- 总结就是:所有设备只能直接和内存打交道
总的来说,对冯诺依曼体系结构的理解,不能停留在概念上,要深入到对软件数据流的理解上,例如,解释从登陆上qq开始和某个好友聊天这个过程中数据的流动过程:
2、进程
2.1基本概念
程序的一个执行实例,正在执行的程序等。担当分配系统资源(CPU时间,内存)的实体。
2.2描述进程-PCB
进程信息被放在进程控制块(一个数据结构),叫做PCB,Linux操作系统下的PCB是task_struct
task_struct内容分类
- **标识符:**描述本进程的唯一标识符,用来区别其他进程
- **状态:**任务状态,推出代码,推出信号
- **优先级:**相对于其他进程的优先级
- **程序技术器:**程序中即将被执行的下一条指令的地址
- **内存指针:**包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- **上下文数据:**进程执行时处理器的寄存器中的数据
- **io状态信息:**包括显示器的io请求,分配给进程的io设备和被进程使用的文件列表
- **记账信息:**可能包括处理器时间总和,使用的时钟数总和,时间限制,记帐号等
2.3组织进程
可以在内核源代码里找到,所有运行系统里的进程都以task_struct链表的形式存在内核里
2.4查看进程
如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。
大多数进程信息同样可以使用top和ps这些用户级工具来获取
2.5通过系统调用获取进程标识符
- 进程id(PID)
- 父进程id(PPID)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("pid: %d\n", getpid());
printf("ppid: %d\n", getppid());
return 0;
}
2.6通过系统调用创建进程-fork初识
- 使用man手册运行man fork认识fork函数
- fork有两个返回值
- 父子进程代码共享,数据各自开辟空间,私有一份(采用写时拷贝)
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}
-
使用fork后需要用if来进行父子进程分流
#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; }