进程控制编程

内存和cpu 以进程为单位作为资源分配的单位。
进程由系统内核管理
线程为进程服务,内核不管理他。
进程是一个具有一定独立功能的程序的一次运行活动,同时也是资源分配的最小单元。
程序是放到磁盘的可执行文件。
进程是指程序执行的实例
在liunx系统中,当一个程序开始执行后,在开始执行到执行完毕退出这段时间里,它在内存中的部分就被称作一个进程。
进程是一个状态变化的过程,程序是可长久保存的。
进程的组成包括程序,数据,和进程控制块。
进程是动态的。程序是静态的。
进程和程序的对应关系:通过多次执行,一个程序可应对多个进程;通过调用关系,一个进程可包括多个程序。

进程分为用户进程和系统进程。所有用户进程的父进程是 init, 他是由系统进程产生的。


命令 ps -ep pid,ppid,comn,cmd是列出当前所有进程,父进程。途中[ ]
代表系统进程。

创建
每个进程都是由父进程创建,进程可以创建子进程,子进程又可以创建子进程的子进程,多个进程可以同时存在,进程间可以通信。进程可以撤销,从而结束一个进程的运行。

进程的状态
执行态:进程正在使用CPU
就绪态:进程具有一切条件,就等着cpu分配时间片
等待态:进程不能使用CPU,若等待事件发生则可将其唤醒。
在这里插入图片描述
在这里插入图片描述
liunx中的进程包含3个段,分别为“数据段”,代码段,堆栈段。
数据段:存放的是全局变量,常数,以及动态数据分配的数据空间。
代码段:存放的是程序代码的数据
堆栈段:存放 的是子程序的返回地址,子程序的参数以及程序的局部变量。
在这里插入图片描述
进程ID
进程ID ( PID ) 父进程的ID (PPID) 启动进程的用户ID(UID)

进程互斥是指当有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其他进程必须等待,用完了在用。
操作系统中将一次只允许一个进程访问的资源称为临界资源。
进程中访问临界资源的那段代码称为临界区。

调度有高级调度,中级调度,和低级调度
高级调度:作业调度
中级调度:虚拟内存和物理内存的调度。
低级调度:进程调度
进程调度方式有抢占式和非抢占式。在这里插入图片描述
在这里插入图片描述
获取ID
#include <sys/types.h>
#include <unistd.h>
pid_t getpid(); //获取本进程ID
pid_t getppid(); //获取父进程ID
在这里插入图片描述
进程的创建

#include <unistd.h>
pid_t fork();   //创建子进程

功能:创建子进程
fork() 函数被调用一次,返回两次,可能有三种不同的返回值。
返回给父进程的是创建子进程的id
返回给子进程的是0,相当于告诉子进程自己没有子进程
返回-1就是子进程创建失败。

#include <sys/typrs.h>
#include <unistd.h>

int main()
{
    pid_t pid;
    pid = fork();  //这句话之前有一个进程,这句话之后就有两个进程
    
    if(pid < 0)
    {
        printf("error in fork!");
    }
    else if(pid == 0)
    {
         printf("child process: id is %d\n",getpid());   
    }
    else
    {
        printf("parent process: id is %d\n",getppid());
    }
}

父进程与子进程的区别在于进程标识符不同。
子进程的数据空间,堆栈空间都会从父进程得到拷贝,而不是共享。所以两个执行不受影响。

vfork() 函数也是创建子进程

fork() 和 vfork() 区别
1.fork: 子进程拷贝父进程的数据段
vfork:子进程与父进程共享数据段
2. fork:父子进程谁先执行是随机的,不确定。
vfork: 子进程先运行,父进程后运行。

结束进程
exit(0);是C库的函数,在stdlib缓冲区中会清空文件缓冲区
_exit(0);是系统调用缓冲区,在unistd.h中,不会清空文件缓冲区。

exec函数族
exec用被执行的程序替换调用它的程序。
区别:fork创建一个新程序,替换原有的进程,因此进程的PID不会变。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
一共有六个execl(),execv(),execlp(),execvp(),execle(),execve();

进程等待
pid_t wait()
功能:阻塞这个进程,直到某个子进程退出。
waitpid()
pid取法:
1.小于-1的值,取负数的绝对值,看进程组的id等于这个数的绝对值。
2.为-1时,等于任何子进程
3.为0时,等于当前进程所在进程组所在的其他进程
4.大于0时,所表示等这个进程结束。
这些只是大概,后面还要详解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值