进程与线程

2016-08-16  本文已影响0人  a4e794140953

注意:

进程

进程七状态转换图
活动就绪------suspend------>静止就绪
活动就绪<------active------静止就绪
活动阻塞------suspend------>静止阻塞
活动阻塞<------active------静止阻塞
运行-->就绪 原因:时间片用完/被抢占(优先级等)
进程挂起的原因有:
1、终端用户的请求
2、父进程的请求
3、负荷调节的需要
4、操作系统的需要
进程出现故障将进入终止状态

创建进程

  1. 申请空白PCB(进程控制块);
  2. 为新进程分派资源;
  3. 初始化PCB;
  4. 将新进程插入就绪队列;

进程控制块PCB(Process Control Block)

注意:

Unix操作系统的进程控制块中常驻内存的是proc
Linux创建进程的时候,同时创建进程控制块和进程对应的堆栈。该堆栈分为用户栈和系统栈,也就是核心栈。用户栈在用户态使用,用来保存局部变量,函数参数等,而系统栈在进程陷入内核态使用,里面保存的是用户栈的地址,以及在进行进程上下文切换时需要保存的参数,返回值等。因为每个进程都有可能发生系统调用陷入内核,从用户态到内核态发生一个中断,那么内核栈就会保存这个进程操作内核的调用信息,如果常驻内存的话就会被下个进程发生的系统调用的信息覆盖掉,所以内核栈是不会常驻内存的
proc存放的是系统经常要查询和修改的信息,需要快速访问,因此常将其装入内存 。

PCB一般包括

  1. 程序ID(PID、进程句柄):它是唯一的,一个进程都必须对应一个PID。PID一般是整型数字
  2. 特征信息:一般分系统进程、用户进程、或者内核进程等
  3. 进程状态:运行、就绪、阻塞,表示进程现的运行情况
  4. 优先级:表示获得CPU控制权的优先级大小
  5. 通信信息:进程之间的通信关系的反映,由于操作系统会提供通信信道
  6. 现场保护区:保护阻塞的进程用
  7. 资源需求、分配控制信息
  8. 进程实体信息,指明程序路径和名称,进程数据在物理内存还是在交换分区(分页)中
  9. 其他信息:工作单位,工作区,文件信息等

Linux下多线程编程常用的pthread库提供的函数名和意义
pthread_create 创建一个线程
pthread_join用来等待一个线程的结束
pthread_mutex_init 初始化一个线程互斥锁
pthread_exit结束一个线程

进程间通信(IPC,InterProcess Communication)

通信方法:

  1. 高级通信: 文件记录及锁定,管道、信号、共享内存、Socket通信、远程过程调用(RPC),消息传递(直接:消息缓冲区;间接:信箱)等。
  2. 低级通信:管程,信号量

fork

fork()
使用fork函数得到的子进程从父进程的继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。
子进程与父进程的区别在于:
1、父进程设置的锁,子进程不继承(因为如果是排它锁,被继承的话,矛盾了)
2、各自的进程ID和父进程ID不同
3、子进程的未决告警被清除;
4、子进程的未决信号集设置为空集。 -mickole博客

进程互斥实现机制

信号量
对于记录型信号量,当 s<0 的时候,请求进程会阻塞
对于整型信号量,当s<=0的时候,请求进程不会阻塞,而是进入盲等状态

#define N 100
typedef int semaphore;
semaphore empty = N;
semaphore full = 0;
void producer(void)
{
    int item;
    while(TRUE){
        item = produce_item();
        down(&empty);
        insert_item(item);
        up(&full);
    }
}
void consumer(void)
{
    int item;
    while(TRUE){
        down(&full);
        item = remove_item();
        up(&empty);
        consume_item(item);
    }
}

多生产者多消费者:

#define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void producer(void)
{
    int item;
    while(TRUE){
        item = produce_item();
        down(&empty);
        down(&mutex);
        insert_item(item);
        up(&full);
        up(&mutex);
    }
}
void consumer(void)
{
    int item;
    while(TRUE){
        down(&full);
        down(&mutex);
        item = remove_item();
        up(&empty);
        up(&mutex);
        consume_item(item);
    }
}

低级调度

上一篇下一篇

猜你喜欢

热点阅读