LINUX进程程序设计
----------------------------------------------------------------------------
基本概念=>
进程定义:一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。
也可以简单地把进程看做是正在运行的程序。
进程组成:程序代码、数据、变量(占据系统内存)、文件描述符和环境。
进程的访问:通过文件描述符,即PID。
进程特点:动态性
并发性
独立性
异步性
进程三态:进程三态也即是操作系统的三态,就绪态、执行态和阻塞态。
进程互斥:进程互斥是指当有若干进程要使用某一共享资源时,任何时刻该资源最多只
能被一个进程使用,其他要使用该资源的进程必须等待,直到使用该资源的
进程释放它为止。
临界资源:进程在互斥的时候访问的资源称为临界资源。
临界区: 进程中用来访问访问临界资源的那部分代码称为临界区。为了实现临界资源
的互斥访问,应保证进程互斥地进入各自的临界区。
进程同步:一组并发的进程按照一定的顺序执行程序的过程称为进程的同步。具有同步
关系的一组进程叫做合作进程,合作进程间互相发送的信号称为消息或事件。
在一台单处理器的主机上,同一时间只有一个程序可以运行,其他进程处于
等待运行状态(即阻塞态)。每个进程轮到的运行时间(即时间片)是相当
短暂的,这就给人多个程序在同时运行的假象。
进程调度:按照一定的算法,从一组待运行的进程中选出一个来抢占CPU的运行。
调度方式:调度方式又称调度算法。
先来先服务=> 谁先来就先服务谁。
短进程优先=> 谁执行的时间段就先执行谁。
高优先级优先=> 根据高优先级来判断谁先执行
时间片轮转法=> 操作系统运用的最多的一种调度算法。
进程死锁:多个进程因竞争资源而形成的一种僵局,若无外力的作用,这些进程将永远
不能向前执行。
防止死锁的方法=>可以让进程获取资源的顺序一致即可。
进程维护的空间:数据空间、堆栈空间、环境空间和程序计数器。
---------------------------------------------------------------------------
进阶编程=>
如何获取进程PID? => getpid() 和 getppid() 系统调用。
如何启动一个进程?=> system()系统调用。
如何替换进程映像?=> exec() 函数族系统调用。
如何复制进程映像?=> fork() 和 vfork() 系统调用。
#include
#include
pid_t fork(void);
fork() 调用创建一个新进程。这个系统调用复制当前进程,在进程表中创建一个新
的表项,新表项中的许多属性与当前进程相同。新进程执行的代码是父进程 fork()
调用之后的代码,执行的代码跟父进程一样,但新进程有自己的数据空间、堆栈空间
环境空间和文件描述符。在父进程中的 fork() 调用返回的是新的子进程的 PID ,子
进程的 fork() 调用返回的是0,父进程可以通过这一点来判断究竟谁是父进程,谁是
子进程,因为 fork() 调用之后程序的执行顺序是不确定的,有可能是父进程也有可能
是子进程。fork() 调用的奇妙之处就在于它调用一次却返回两次。
fork() PK vfork()
1、fork(): 子进程拷贝父进程的数据段。
vfork(): 子进程共享父进程的数据段。
2、fork(): 父子进程执行顺序不确定。
vfork(): 子进程先运行,父进程后运行。
如何等待一个进程?=> wait() 和 waitpid() 系统调用。
---------------------------------------------------------------------------
进阶通讯=>
阅读(1888) | 评论(0) | 转发(1) |