预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共40页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Linux多进程、多线程及网络编程指南 进程(多进程) 线程(多线程) 进程间通信 并发程序的同步 socket网络编程 1、进程 1.1进程定义 进程是程序在计算机上的执行活动,是一个运行着一个或多个线程的地址空间和这些线程所需要的系统资源,其中包括程序代码、数据、变量、打开文件的文件描述符、和环境。 1.2进程的五种状态 在五状态进程模型中,进程状态被分成下列五种状态。进程在运行过程中主要是在就绪、运行和阻塞三种状态间进行转换。创建状态和退出状态描述进程创建的过程和进程退出的过程。 1)运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。 2)就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。 3)阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态。 4)创建状态(New):进程正在创建过程中,还不能运行。操作系统在创建状态要进行的工作包括分配和建立进程控制块表项、建立资源表格(如打开文件表)并分配资源、加载程序并建立地址空间表等。 5)退出状态(Exit):进程已结束运行,回收除进程控制块之外的其他资源,并让其他进程从进程控制块中收集有关信息(如记帐和将退出代码传递给父进程)。 进程三种状态的转换如图所示: 就绪 执行 等待 时间片到 因等待时间发生而唤醒 因等待时间发生而睡眠 调度到 进程三种状态的转换关系 1.3进程的结构 Linux系统是一个多进程的系统,进程间有并行性、互不干扰等特点。通俗的说进程间是分离的任务,拥有各自的权力和责任,每个进程运行在各自独立的虚拟地址空间,一个进程发生了异常,它也不会影响到系统中的其他进程。 Linux进程包含三个段:数据段、代码段、堆栈段。 数据段:存放的是全局变量、常数、static定义的静态变量和动态分配的数据(malloc函数取得的空间)等。 代码段:存放的是程序代码的数据。 堆栈段:存放的是子程序的返回地址、子程序的参数以及程序的局部变量。 1.4进程的执行模式 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。在内核模式下运行的进程可以执行机器的特权指令,并且此时该进程的运行不受用户的干扰,即使是root用户也不能干扰内核模式下程序的运行。 进程上下文和中断上下文处理器总处于以下状态中的一种:1、内核态,运行于进程上下文,内核代表进程运行于内核空间;2、内核态,运行于中断上下文,内核代表硬件运行于内核空间;3、用户态,运行于用户空间。 1.4创建新进程 通过fork调用创建一个新进程,这个系统调用复制当前进程在系统表中创建一个新的表项,新表项中的许多属性与当前进程是相同的。新进程与原进程几乎一样,但还是有不同之处。父子进程的异同: 继承属性差异真实的用户ID和组ID,有效用户ID和组ID 进程组ID SESSIONID 所打开文件及文件的偏移量 控制终端 设置用户ID和设置组ID标记位 根目录与当前工作目录 文件缺省创建的权限掩码 可访问的内存段 环境变量及其他资源分配进程ID 父进程ID 子进程运行的时间记录 父进程对文件的锁 fork和exec函数族结合在一起使用就是创建新进程所需要的一切了,值得注意的是exec函数执行之后原进程之后的代码将不会被执行。 创建一个新进程也可以使用vfork,但vfork并不完全拷贝父进程的数据段而是和父进程共享数据段。这是因为vfork函数是与exec函数族相连,创建执行另一个程序的新进程。并且调用vfork对于父子进程的执