八、多进程编程
- 进程间通讯,叫ipc(interprocess communication)
- 基于通讯的ipc方法
- 以数据传送为手段的ipc方法
- 管道(pipe),管道可以用来传送字节流。
- 消息队列(queue),消息队列可以传送结构化的消息对象。
- 以共享内存为手段的ipc方法
- 以共享内存区的方法
- 以数据传送为手段的ipc方法
- 基于信号的ipc方法
- 操作系统的信号量机制(signal),是唯一一种异步的ipc 方法。
- 基于同步的ipc方法
- 信号灯(semaphore),是信号量的结合,属于进程间通信的方式。
九、进程
-
进程概念
- 指一个程序的执行称为进程,是unix操作系统的根本。
- 程序和进程分别描述了 程序的静态形式和动态特征。
-
进程的衍生
- 进程可以用系统调用fork创建若干新的进程,前者为父进程,后者为子进程。
- 子进程获得父进程的 数据段、堆、栈的副本,并与父进程共享代码段。
- 子进程 可以通过系统调用exec 把新的程序加载到自己的内存,原先的数据段、堆、栈以及代码段被替换掉。
- 此时,子进程就是那个新程序
- unix/linux系统中,每个进程都有父进程,所有进程组成一个树状结构。内核启动进程作为树根负责系统的初始化,该进程的父进程是它自己。
- 如果进程先于子进程结束,子进程将被内核启动进程收养。
3.进程的标识
- 进程的描述符,内核堆进程的属性和行为记录,包括进程的优先级,状态,虚拟地址以及访问权限等。
- 进程描述符是一个复杂的数据结构,包含进程pid,父进程ppid。
- 进程pid对用户态的程序很重要,可以shell命令kill终止某个进程,或通过pid 发送信号量。
4.进程的状态
- 进程在操作系统中不同时刻状态不同,可运行状态,可中断的睡眠状态,不可中断的睡眠状态,暂停状态或跟踪状态,僵尸状态,退出状态。
- 可运行状态(task runging)R,等待进程调度器 调度 进入运行态
- 可中断的睡眠状态(task interruptible)S,进程正在等待某个事件(网络连接,信号灯)的发生 会进入此状态,并放入对应事件的等待队列中。当事件发生时,对应的等待队列中的进程会被唤醒。
- 不可中断的睡眠状态(task uninterruptible)D,与可中断的睡眠状态区别在于它不可以被打断。它在等待特殊事件,比如同步i/o操作。
- 暂停状态/跟踪状态(task stopped/task traced)T,向进程发送sigstop信号会使进程转入暂停状态,除非进程处于不可中断的睡眠状态,向处于暂停状态的进程发送sigcont信号会使转向可运行状态。
- 僵尸状态(task dead exit zombie)Z,该状态的进程将要结束,该进程的大多数进程都被收回,退出码和统计信息还未删除。
- 退出状态(task dead exit dead)X,此状态内核给父进程发送一个sigchld信号,分离后的
- [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJLlwI5x-1666106536851)(C:\Users\xpc\AppData\Roaming\Typora\typora-user-images\image-20220917142523153.png)]
5.进程的空间
-
用户进程生存于用户空间,不能与硬件交互。内核可以与硬件交互。用户进程不能直接访问内核空间,用户空间和内核空间 共同瓜分了内存区域。
- 内存区域每个单元都有地址,由指针来标识和定位。通过指针寻找内存单元的操作叫 内存寻址。
- 指针长度由cpu的字长决定,32位操作系统中可以寻址 2的32次方,即4GB。
- 这里说的地址 不是物理地址,而是虚拟地址。用户空间虚拟地址范围,0-task_size.内核空间,task_size-2的32次方。
- 内核与cpu会维护虚拟内存到物理内存之间的映射。
- 虚拟内存几乎彼此独立,互不干扰。但在物理上可能指向同一块内存。这是ipc进程通信的共享内存的基础。
6.系统调用
-
内核会暴露能力接口共用户程序使用,用户进程调用这些接口叫 系统调用。
- cpu在用户态下运行的用户进程不能与内核接触。当用户进程发出系统调用时,内核会把cpu从用户态切换到内核态,让cpu执行对应的内核函数。当内核函数执行完毕,内核会把cpu从内核态切换到用户态。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6iIRTjRs-1666106536853)(https://gimg2.baidu.com/image_search/src=http%3A%2F%2Finews.gtimg.com%2Fnewsapp_bt%2F0%2F14732036457%2F641&refer=http%3A%2F%2Finews.gtimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1665990612&t=fba99ee118e73a72c1343b97d538da4c)]
7.进程的切换与调度
1. linux操作系统通过cpu的能力,快速的在多个进程之间进行切换(进程间的上下文切换),产生多个进程在同时运行的假象。 2. 内核把在cpu上运行的进程A换下,让cpu运行进程B。内核需要及时把进程A的状态保存,把进程B之前的状态恢复。