进程解析

介绍进程

    进程具有动态性,并发性,独立性,异步性,一次性活动可执行活动的程序。 而程序具有静态性。


 
 

    此图的顺序为就绪——执行——阻塞。

     进程ID是标识进程唯一的数字。

     在父进程PPID与启动用户进程DID之间,不能两者同时的使用一个进程,在进程互斥中,他是操作系统的控制部分,在一时刻只允许一个进程使用,即操作系统只允许一个用户访问,操作系统让他们分开对资源的访问。这就是临界资源。在访问临界资源的那段程序代码保证访问者进入各自的临界区。

进程的同步由一组并发的进程按一定的顺序执行的过程,在调度的算法中,他是按一定的算法,只有一个执行状态,占有cpu。分为:

先来先服务;短进程优先;高级优先;时间片轮转。前面三者很容易理解,第四种解释如图:




 
 

假设A进程先运行0.5s后,A进程必须释放cpu,将A进程放入堆栈中,接着C进程的后面,B进程运行0.5s,B进程必须释放cpu。将B进程放入堆栈中,接着A进程的后,C进程运行0.5后,像这样循环的工作,一直完成每个进程需要工作的时间。

     多个进程因竞争资源而形成一种僵持的状态,称为进程死锁。如图:



 

A进程占有资源1B进程占有资源2A进程试图占有资源2B进程试图占有进程1,导致进程出现了死锁。进程死锁的解决措施就是让两个进程获取资源保持一致,同时去获取一个资源。

      系统调用获取正在运行的进程PIDpid_t  getpid(void))和PPID(pid_t  getppidvoid)

     创建子进程 pid_t  fork(void),他是进程的核心。fork被调用一次,返回两次,它有可能返回三中值。在父进程中,pid返回新创建的子进程的PID,在子进程中,pid返回0,在错误中,pid返回负数。




 
         int  main(){

    //创建进程

    pid_t  pid;]

    int count =0

     //调用进程

     pid=fork();

    count++;

    //printf会输出几次,从count的值

    printf("count %d\n",count)

}




 

Printf会输出两次,每一次的count都是1


 

fork()之前打印,不会有输出,因为不会运行,main函数是从上至下的,还有他是产生的是共享代码,拷贝了空间数据段,堆栈数据段。所以父进程只算父进程对应的count,而子进程只算子进程对应的count。而每一次count都会是1。可是vfork()就不一样了。如下表格分析:

fork

子进程拷贝父进程的数据段

vfork

子进程与父进程共享数据段

fork

父子进程执行的次序没有确定

vofrk

子进程先运行,父进程后运行

vfork代替fork的话,count子进程是2,父进程是1,因为他是共享父进程的数据段,即是子进程共享count

 

 

 

<!--EndFragment-->

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值