进程与线程
进程是要占用系统资源的,进程包含多个线程,一个进程的启动包含主线程的启动
了解概念
cpu好比一个工厂,每个车间是一个进程,车间里面的工人是线程
一个进程的内存空间是共享的,每个线程都可以使用这些共享的内存,特别的:某些内存空间,当一个线程使用时,其他线程必须等待它结束,才能使用这块内存,这就需要加**“互斥锁”(Mutex),防止多个线程同时读写某一块内存区域;某些内存空间,可以提供给固定数目的线程使用,这时候需要“信号量”(Semaphore)**,用来保证多个线程不会互相冲突,Mutex 是 Semaphore 的 一种特殊情况。
操作系统的设计,可以归结为三点
- 以多进程形式,允许多个任务同时执行;
- 以多线程形式,允许单个任务分成不同的部分运行;
- 提供协调机制,一方面阻止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源;
命令相当于进程 进程间可以进行通讯(通讯机制)
实现进程之间的通讯方法:管道通讯 、socket套节字、 信号 、消息队列
进程(process)
终端下对进程的操作:(需要包含头文件unistd.h)(简称few)
- fork 创建一个新的子进程(通过系统调用流程,由内核来完成创建) 返回进程ID
(返回0代表子进程,返回1代表父进程,返回值 <0 代表出现错误) - getpid : 获取当前进程的id
- gitppid : 获取父进程的id
- exec : (把进程中的文本段进行替换)在进程中调用别的程序或命令
- wait 收尸 进程结束后,父进程要对子进程收尸,保证资源不会被浪费掉,一般父进程会晚于子进程挂掉 (结束状态为0表示正常退出)
- sleep(100); :不让进程结束
进程与进程之间的内存空间是彼此独立的,父进程与子进程刚开始创建的时候公用数据,但是一旦创建了,就会彼此独立,子进程是被父进程创建的。
防御式编程,先把错误的情况写出来
广义的定义:具有独立功能的程序对某个数据集合的一次运行活动,是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元
主要两点:
第一、进程是一个实体 包括文本区域、数据区域、堆栈
- 文本区域(text region):存储处理器执行的代码
- 数据区域(data region):存储变量和动态分配的内存
- 堆栈区域(stack region):存储着活动过程中调用的指令和本地变量
第二、进程是一个“执行中的程序”
进程的缺点
- 不同的进程之间共享状态信息困难 (需要显式的使用)
- 进程之间通讯比较慢
线程
线程是一个独立的执行单元
cpu通过优先级和时间片对多个线程进行控制,有一些调度算法,来切换线程。
线程中没有父子关系
线程之间的切换,需要开销时间,但是很小。