学习笔记十一——进程控制,线程,临界区与锁

进程控制

linux

  • fork()—位于/kernel/fork.c中;

    新进程是当前进程的子进程(子进程是父进程的复制,并发远行,仅仅是时间信息,ID号不一样),子进程与父进程谁先输出谁后输出是不知道的。
    子进程中的pid为0,而父进程中的pid为子进程的ID号。
    子进程会“灰掉”fork()及以上的代码 。
    init进程是所有进程的父进程。
  • exec函数簇

    使子进程与父进程有不同的功能。

线程

“先画圆后画方”不是线程,不是并发

  • 概念

    1. 线程使可由CPU直接运行的实体
    2. 一个进程可以创建多个线程
    3. 多个线程共享CPU可以实现并发运行
  • 创建线程

    windows: CreateThread()。如:
    CreateThread(0,0,DrawCircle,0);
    CreateThread(0,0,DrawRect,0);
    
    linux: #include
  • 单线程与多线程

    单线程: 缺省main();
    多线程: 一个主线程和至少一个用户进程;
  • 多线程现实场景

    1. 需要并发运行多个线程(例如:暴风影音要解码视频、音频,还要接收网络数据)
    2. 交互性的程序(例如:登陆程序以及拷贝过程)
    3. 需要改善程序结构的地方
    4. 电脑多核时,多线程可以提高CPU性能
  • 线程的麻烦

    1. 程序难以调试
    2. 并发过程难以控制
    3. 线程的安全问题

临界区和锁

  • 临界区与临界资源

    1. 临界资源:一次只允许一个进程访问的资源
    2. 临界区:进程中访问临界资源的代码段
      特点: 排他性。
  • 设计临界区的四大原则

    1. 忙则等待
    2. 空闲让进
    3. 有限等待(临界区设置小些好)
    4. 让权等待:等待进程放弃CPU
  • 锁机制

    基本原理: 设置一个标志“S”,进入临界区之前检查标志是否可用,退出临界区,退出临界区要把标志改为可用状态。
    LOCK(S):
    LOCK(S)
    {
        text:if(S==0)
                   goto:text;
               else
                   S=0
    }
    
    步骤:
    1. 初始化的锁状态S=1;
    2. 进入临界区之前执行上锁Lock(s)操作;
    3. 离开临界区之后执行开锁Unlock(s)操作。

你可能感兴趣的:(个人学习笔记)