目录
1.程序
程序 = 数据结构 + 算法
数据:用来表示人们思维对象的抽象概念的物理表现叫做数据
数据处理的规则叫做操作(指令)
对某一有限数据的集合所实施的,目的在于解决某一个问题的一组有限的指令的集合称为一个计算
计算机就是用指令来进行计算(处理数据)
程序就是数据和指令的集合,一个程序的执行过程就是一个计算
2.程序的执行方式
(1)顺序执行
一个程序完全执行完毕之后,才能执行下一个程序
假如:
一个程序分为四个步骤
1.输入数据 ==》 2. 发送给对方 ==》 3.接收对方的数据 ==》4.结束通信
缺点:
CPU利用率低
(2)并发执行
为了提高CPU的利用率,吞吐量提高
现代操作系统为了能够让程序并发执行,特地的引入了“进程”的概念。
3. 进程
进程是具有独立功能的程序关于某个数据集合上的一次运行活动
4. 程序与进程
(1)进程是动态的概念,程序是静态的概念
(2)进程是一个独立的活动单位
进程是竞争系统资源的基本单位
(3)一个程序可以对应多个进程
5.进程的状态
就绪态
执行态
阻塞态(等待)
6.Linux进程地址空间布局
Linux对进程的数据进行分段管理,不同的数据存储在不同的“内存段”
不同的“内存段”数据及管理方法不一样
.init :用来存储系统给每一个执行程序自动添加的“初始化”代码
.text : 主要存放用户代码
只读并且共享,这段内存在程序运行期间不会释放
.bss :数据段
主要存放程序未初始化的全局变量和未初始化的static变量
可读可写,这段内存在程序运行期间一直存在
.bss ,在进程初始化的时候 (可能)全局初始化为0
.data :数据段
主要存放程序已初始化的全局变量和已初始化的static变量
可读可写,这段内存在程序运行期间一直存在
.rodata:只读数据段
主要存放程序中的只读数据
栈空间(stack):
主要存放局部变量
可读可写,这段空间自动释放(代码块指定完毕,代码块中的局部变量空间就会自动释放)
堆空间:自由内存,在这个区域定义和释放变量完全由用户决定
主要是malloc/realloc/calloc 动态分配空间
可读可写,这段内存在程序运行期间一直存在,直到你手动free
7. Linux下进程相关的API函数
(1)创建一个新进程
fork
NAME
fork - create a child process
SYNOPSIS
#include <sys/types.h>
#include <unistd.h>
fork是用来创建一个子进程,要创建一个进程,首先得知道一个进程里面包含什么东西?
数据(用户数据和系统数据) + 指令
创建一个新进程的时候,新进程的数据和指令 来源于父进程
fork这个函数在创建子进程时候,把父进程的数据和指令拷贝
父进程的变量,数据对象
标准IO缓冲区
文件描述符
...
一旦拷贝完毕,父子进程独立
也就相当于fork成功就会有两个进程在执行当前的代码
所以为了区分父子进程,fork调用一次又两次返回
一次是父进程返回
一次是子进程返回
pid_t 是用来描述进程ID
pid_t fork(void);
返回值:
成功 :
父进程返回 子进程的pid( >0 )
子进程返回 0
失败返回-1.同时errno被设置
==============
fork的伪代码
pid_t fork()
{
clone();//拷贝,一旦成功,就会有两个进程往下执行
父进程 子进程
if(父进程)
{
return 子进程的pid(>0)
}
else if(子进程)
{
return 0;
}
}
8. 示例代码:
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main()
{
printf("hello,world");
int a = 6;
a++;
printf("%d\n",getpid());
pid_t pid = fork();
if(pid == -1)
{
perror("fork error:");
return -1;
}
else if(pid == 0)//子进程
{
printf("son :%d\n",getpid());
printf("father_son :%d\n",getppid());
//printf("son : a = %d\n",a);
printf("hello,son\n");
exit(-2);
}
else //父进程
{
a++;
int statu;
wait(&statu);
if(WIFEXITED(statu))
{
printf("WEXITSTATUS(status) = %u\n",WEXITSTATUS(statu));
}
printf("father :%d\n",getpid());
printf("father_father :%d\n",getppid());
//printf("father:a = %d\n",a);
printf("hello,father\n");
}
printf("we are family\n");
}