八、多进程编程

  1. 进程间通讯,叫ipc(interprocess communication)
  2. 基于通讯的ipc方法
  1. 以数据传送为手段的ipc方法
  1. 管道(pipe),管道可以用来传送字节流。
  2. 消息队列(queue),消息队列可以传送结构化的消息对象。
  1. 以共享内存为手段的ipc方法
  1. 以共享内存区的方法
  1. 基于信号的ipc方法
  1. 操作系统的信号量机制(signal),是唯一一种异步的ipc 方法。
  1. 基于同步的ipc方法
  1. 信号灯(semaphore),是信号量的结合,属于进程间通信的方式。

九、进程

  1. 进程概念
  1. 指一个程序的执行称为进程,是unix操作系统的根本。
  2. 程序和进程分别描述了 程序的静态形式和动态特征。
  1. 进程的衍生
  1. 进程可以用系统调用fork创建若干新的进程,前者为父进程,后者为子进程。
  2. 子进程获得父进程的 数据段、堆、栈的副本,并与父进程共享代码段。
  3. 子进程 可以通过系统调用exec 把新的程序加载到自己的内存,原先的数据段、堆、栈以及代码段被替换掉。
  4. 此时,子进程就是那个新程序
  5. unix/linux系统中,每个进程都有父进程,所有进程组成一个树状结构。内核启动进程作为树根负责系统的初始化,该进程的父进程是它自己。
  6. 如果进程先于子进程结束,子进程将被内核启动进程收养。

3.进程的标识

  1. 进程的描述符,内核堆进程的属性和行为记录,包括进程的优先级,状态,虚拟地址以及访问权限等。
  2. 进程描述符是一个复杂的数据结构,包含进程pid,父进程ppid。
  3. 进程pid对用户态的程序很重要,可以shell命令kill终止某个进程,或通过pid 发送信号量。

4.进程的状态

  1. 进程在操作系统中不同时刻状态不同,可运行状态,可中断的睡眠状态,不可中断的睡眠状态,暂停状态或跟踪状态,僵尸状态,退出状态。
  2. 可运行状态(task runging)R,等待进程调度器 调度 进入运行态
  3. 可中断的睡眠状态(task interruptible)S,进程正在等待某个事件(网络连接,信号灯)的发生 会进入此状态,并放入对应事件的等待队列中。当事件发生时,对应的等待队列中的进程会被唤醒。
  4. 不可中断的睡眠状态(task uninterruptible)D,与可中断的睡眠状态区别在于它不可以被打断。它在等待特殊事件,比如同步i/o操作。
  5. 暂停状态/跟踪状态(task stopped/task traced)T,向进程发送sigstop信号会使进程转入暂停状态,除非进程处于不可中断的睡眠状态,向处于暂停状态的进程发送sigcont信号会使转向可运行状态。
  6. 僵尸状态(task dead exit zombie)Z,该状态的进程将要结束,该进程的大多数进程都被收回,退出码和统计信息还未删除。
  7. 退出状态(task dead exit dead)X,此状态内核给父进程发送一个sigchld信号,分离后的
  8. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aJLlwI5x-1666106536851)(C:\Users\xpc\AppData\Roaming\Typora\typora-user-images\image-20220917142523153.png)]

5.进程的空间

  1. 用户进程生存于用户空间,不能与硬件交互。内核可以与硬件交互。用户进程不能直接访问内核空间,用户空间和内核空间 共同瓜分了内存区域。
  1. 内存区域每个单元都有地址,由指针来标识和定位。通过指针寻找内存单元的操作叫 内存寻址。
  2. 指针长度由cpu的字长决定,32位操作系统中可以寻址 2的32次方,即4GB。
  3. 这里说的地址 不是物理地址,而是虚拟地址。用户空间虚拟地址范围,0-task_size.内核空间,task_size-2的32次方。
  4. 内核与cpu会维护虚拟内存到物理内存之间的映射。
  5. 虚拟内存几乎彼此独立,互不干扰。但在物理上可能指向同一块内存。这是ipc进程通信的共享内存的基础。

6.系统调用

  1. 内核会暴露能力接口共用户程序使用,用户进程调用这些接口叫 系统调用。
  1. 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之前的状态恢复。