并发机制
- 和并发相关的关键术语
1.临界区:是一段代码,在这段代码中进程将访问共享资源,当另一个进程已经在这段代码中运行时,这个进程就不能再这段代码中运行。
2.死锁:两个或两个以上的进程因其中的每个进程都在等待其它的进程做完某些事情而不能继续执行,这样的情形叫做死锁。
3.互斥:当一个进程在临界区访问共享资源时,其它进程不能进入该临界区访问任何共享资源,这种情形叫做互斥。
4.竞争条件:多个线程或进程在读写一个共享数据时结果依赖于它们执行的相对时间,这种情形叫做竞争。
5.饥饿:是指一个可运行的进程尽管能继续执行,当被调度器无限制的忽略,而不能被调度执行的情况。
进程
一个正在执行的程序,或一个正在计算机上执行的程序实例,或能分配给处理器并由处理器执行的实例等,都可以称之为进程。它主要用于并行多任务,使程序更健壮,或者可以直接利用自己已有的其他程序。
// 进程的一些常用命令:
./r &:表示将程序转换到后台运行
ps:可以查看用户后台运行程序
ps -A: 可以查看系统和用户后台运行的程序
kill -9 PID(进程ID):中断后天程序的运行
- 进程五状态模式:
运行态:该进程正在执行;
就绪态:做好执行的准备,若有机会就会执行;
阻塞态:进程在某些事件发生前不能执行;
新建态:刚刚创建的进程,操作系统还没有将它加入到可执行进程中,通常是进程控制块已经创建但喊没有加载到主存中的新进程;
退出态:操作系统从可执行进程中释放的进程,或者是因为它自身停止了,或者是因为某种原因而被取消。 - 进程结束方式:
1.正常结束
2.自杀:exit,return
3.他杀:kill -9 pid;
4.意外:段错误,abort实现核心已转储 - 进程控制结构
操作系统在管理和控制进程时,首先必须知道进程的位置;然后,它必须知道在管理时所必需的进程属性(进程ID、进程状态)。
进程控制块:一个进程至少包括足够的内存空间,以保存该进程的程序和数据;此外,程序的执行通常涉及到用于跟踪过程调用和过程间参数传递的栈。最后,与每个进程相关的还有操作系统用于控制精华才能的许多属性,通常,属性的集合称为进程控制块。
进程控制块信息可以分为三类:
1.进程标识号:每一个进程分配了一个唯一的数字标识号;
2.进程状态信息:包括处理器的寄存器的内容;
3.进程控制信息操作系统控制和协调各种活动进程所需要的额外信息。
进程控制块的作用:它是操作系统中重要的数据结构。每个进程控制块包含操作系统所需要的关于进程的所有信息。实际上,操作系统中的每个模块,包括哪些涉及到调度、资源分配、中断处理、性能监控和分析的模块,都可能读取和修改它们。换而言之,资源控制块集合定义了操作系统的状态。
- 进程ID
进程ID是一个16位的数字,有Linux在创建进程的时候自动依次分配;每个进程都有一个父进程(除了特殊的init进程)
getpid() 和 getppid():
头文件:#include <sys/types.h>/<unistd.h>
函数的一般形式:
pid_t getpid(void); // 获取当前进程的进程ID号
pid_t getppid(void); // 获取当前进程的父进程的进程ID号
// 案例:
#include <sys/types.h>
#include <unistd.h>
int main()
{
printf("The parent process ID is %d\n", (int)getppid());
printf("The process ID is %d\n", (int)getpid());
return 0;
}
- 查看进程
ps:可以查看用户后台运行的程序,即进程ID号
ps -A:可以查看系统和用户后台运行的程序,即进程ID号